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/03/29 20:34:44 UTC

(airavata) branch master updated: refactor: collapse servers, flatten modules, MapStruct, parallel tests (#601)

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

yasith pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata.git


The following commit(s) were added to refs/heads/master by this push:
     new b41fbfa93f refactor: collapse servers, flatten modules, MapStruct, parallel tests (#601)
b41fbfa93f is described below

commit b41fbfa93ff224144a7eeae55f051e06d28a7277
Author: Yasith Jayawardana <ya...@gatech.edu>
AuthorDate: Sun Mar 29 15:34:39 2026 -0500

    refactor: collapse servers, flatten modules, MapStruct, parallel tests (#601)
    
    * refactor: move module libraries under airavata-api as sub-modules
    
    * refactor: collapse server modules into airavata-server sub-modules
    
    Move airavata-rest-server, airavata-grpc-server, and airavata-thrift-server
    into airavata-server/{rest,grpc,thrift}/ sub-modules with unified package
    namespace org.apache.airavata.server.{rest,grpc,thrift}.
    
    * refactor: replace RegistryService Thrift clients with direct handler injection
    
    Replace all internal ThriftClientPool<RegistryService.Client> and
    RegistryServiceClientFactory usages in airavata-api with direct calls
    to the RegistryServerHandler @Component via RegistryService.Iface.
    
    The handler is registered as a global static reference via Utils.setRegistryHandler()
    from a @PostConstruct in RegistryServerHandler. All pool/factory patterns
    (getResource/returnResource/returnBrokenResource, ThriftUtils.close) are removed.
    
    * refactor: replace CredentialStore and Profile Thrift clients with direct injection
    
    - Replace CredentialStoreClientFactory usages with direct CredentialStoreServerHandler
      instantiation in SSHAccountManager, GatewayGroupsInitializer, AgentUtils,
      IamAdminServicesHandler, TenantProfileServiceHandler, and AiravataDataMigrator
    - Replace ProfileServiceClientFactory usages:
      - AiravataTask/TaskContext: use UserProfileRepository directly instead of
        UserProfileService Thrift client (avoids circular dep with airavata-server)
      - UserProfileServiceHandler: use IamAdminServicesHandler directly
      - AiravataDataMigrator: use TenantManagementKeycloakImpl directly
      - AiravataService (research-service): use UserProfileRepository directly
    - Remove unused getCredentialStoreServiceClient from KeyCloakSecurityManager
    - Delete CredentialStoreClientFactory (no remaining references)
    - Keep ProfileServiceClientFactory (still used by example clients)
    
    * refactor: replace remaining Thrift client factories with direct injection
    
    Replace RegistryServiceClientFactory usages in SSHAccountManager,
    AiravataDataMigrator, KeyCloakSecurityManager, GatewayGroupsInitializer,
    OrchestratorServerHandler, and IamAdminServicesHandler with direct
    RegistryServerHandler instantiation. Remove SharingRegistryServiceClientFactory
    and update GroupManagerServiceHandler and SharingServiceDBEventHandler likewise.
    
    * refactor: replace Thrift clients in sub-modules with direct service calls
    
    * refactor: update Tiltfile for restructured module layout
    
    * style: apply spotless formatting
    
    * refactor: consolidate 6 persistence units into single Spring-managed EntityManagerFactory
    
    - Delete 7 JPAUtils classes, 4 catalog-specific abstract repos, 6 JDBCConfig impls
    - Create EntityManagerFactoryHolder (static bridge) + EntityManagerFactoryRegistrar (@Component)
    - 52 concrete repos now extend base AbstractRepository directly
    - Fix ~70 entity classes for Hibernate 6 column mapping strictness
    - Test persistence.xml (test-scope) with single "airavata" unit
    - 199 unit tests pass, 0 failures
    
    * fix: resolve Hibernate 6 entity mapping errors for @IdClass entities
    
    Replace @Transient with proper @ManyToOne @JoinColumn(insertable=false, updatable=false)
    on 48 fields across 47 entity files. Fix duplicate column mappings.
    Integration tests: 50 pass, 18 errors (test data issues), 33 skipped.
    
    * refactor: restore non-Java modules at top level, move proto to src/main/proto
    
    Recover directories lost in 384281df7a when modules/ was removed:
    - modules/agent-framework/airavata-agent → airavata-agent/
    - modules/agent-framework/airavata-fuse → airavata-fuse/
    - modules/research-framework/research-hub → airavata-jupyterhub/
    - modules/research-framework/simexr_mod → dev-tools/simexr_mod/
    
    Move agent-service proto files to src/main/proto/ for consistency
    with research-service layout, and update pom.xml sourceDirectory.
    
    * build: configure surefire to fail on first error (skipAfterFailureCount=1)
    
    * fix: resolve all integration test failures for Hibernate 6
    
    - Fix JPQL alias case mismatch (dp → DP) in QueryConstants
    - Fix ComputeResourceRepository remove operations using orphanRemoval
    - Fix SharingRegistry cascade (remove CascadeType.PERSIST from UserGroupEntity.groupAdmins)
    - Fix AbstractRepository.get() with FlushMode.MANUAL to prevent cascade-persist
    - Fix AbstractRepository.select() to call initializeEntity on results
    - Replace PersistentMap with HashMap in DataReplicaLocationRepository.initializeEntity
    - Fix DataReplicaLocationRepositoryTest to avoid duplicate key insertion
    
    Integration tests: 102 run, 0 failures, 0 errors, 33 skipped
    Unit tests: 199 run, 0 failures, 0 errors, 26 skipped
    
    * build: upgrade surefire 3.5.5, JUnit parallel, clean test profiles, merge integration-tests
    
    - Surefire 3.5.5 with forkCount=1C (1 fork per CPU)
    - JUnit 5 parallel execution for unit tests (concurrent classes + methods)
    - @Execution(SAME_THREAD) on non-thread-safe tests (DB, SFTP, ServiceLoader)
    - Clean profile split: mvn test (unit, parallel), mvn test -Pintegration (sequential)
    - @Tag("runtime") for health checks that need full tilt stack
    - Merge integration-tests module into airavata-api test sources
    - Fix SharedMariaDBLauncherSessionListener to detect surefire.groups property
    - Remove build cache extension (Java 25 incompatible)
    
    Unit: 182 pass, 0 fail | Integration: 119 pass, 0 fail
    
    * test: re-enable disabled tests that work with Hibernate 6 and single EMF
    
    Enable SharingServiceIntegrationTest (13 tests) and WorkflowRepositoryTest
    (1 test) which now pass with the consolidated persistence setup. Fix test
    logic in addAndRemoveGroupAdmin (user must be group member before admin).
    Update @Disabled reasons on remaining tests to reflect actual root causes
    (Dozer mapping, FK constraints, test isolation).
    
    * test: re-enable 14 disabled tests, update reasons on remaining 19
    
    - Enable SharingServiceIntegrationTest (13 tests) — single EMF resolved caching issue
    - Enable WorkflowRepositoryTest (1 test) — works with Hibernate 6
    - Fix addAndRemoveGroupAdmin test — user must be added to group before admin
    - Remaining 19 disabled: all Dozer mapping issues (MapStruct migration needed)
    
    Unit: 182 pass, 0 fail, 26 skip | Integration: 119 pass, 0 fail, 19 skip
    
    * perf: eager Dozer init, dynamic SFTP port, remove unnecessary SAME_THREAD
    
    - ObjectMapperSingleton: eager static init (eliminates 2-3s first-test penalty)
    - SFTPDeleteDirTest: use OS-assigned port (no more port conflicts, can run parallel)
    - Fixes race condition in ObjectMapperSingleton (was lazy init without synchronization)
    
    Unit: 52s wall clock, 182 pass | Integration: 2:45, 119 pass
    
    * refactor: replace Dozer with MapStruct for entity-model mapping
    
    5 MapStruct mappers replacing runtime Dozer reflection with compile-time code.
    63 repos updated, 3 AbstractRepository bases cleaned, Dozer dependency removed.
    
    Unit: 179 pass, 0 fail | Integration: 119 pass, 0 fail
    
    * perf: per-test transaction rollback for parallel integration tests
    
    Replace truncate-all-tables cleanup with per-test transaction rollback:
    - EntityManagerFactoryHolder: ThreadLocal test EntityManager support
    - 3 AbstractRepository bases: test mode skips transaction management
    - TestBase: @BeforeEach begins transaction, @AfterEach rolls back
    - 33 test constructors updated (removed Database enum)
    - Integration profile: classes run in parallel (ForkJoinPool)
    
    Integration tests: 2:23 (was 2:45) — 22s saved from parallelism
    Unit: 179 pass | Integration: 119 pass | 0 failures
    
    * test: re-enable 5 disabled tests after MapStruct migration, fix mapper gaps
    
    Re-enabled tests:
    - ComputeResourceRepositoryTest: listComputeResourcesTest, updateComputeResourceTest,
      addComputeResourceTest, addUnicoreDataMovementTest
    - ExperimentStatusRepositoryTest: ExperimentStatusRepositoryTest
    
    Mapper fixes:
    - BatchQueue: maxRuntime <-> maxRunTime field name mismatch
    - UnicoreDataMovement: unicoreEndpointUrl <-> unicoreEndPointURL mismatch
    - ApplicationDeployment: defaultWallTime <-> defaultWalltime mismatch
    - UserResourceProfile: gatewayId <-> gatewayID mismatch
    - GatewayResourceProfile: gatewayId <-> gatewayID mismatch
    
    JPA fixes:
    - Add insertable=false to @JoinColumn on GroupComputeResourcePrefEntity,
      BatchQueueResourcePolicyEntity, ComputeResourcePolicyEntity to prevent
      duplicate column mapping with @Id fields
    
    Updated @Disabled reasons on 14 remaining tests to reflect actual root causes.
    
    * perf: cascading FK deletes, fully parallel integration tests
    
    Add @OneToMany(cascade=ALL, orphanRemoval=true) on ResourceJobManagerEntity
    for JobManagerCommandEntity and ParallelismCommandEntity children, enabling
    cascading deletes. Re-enable deleteResourceJobManagerTest.
    
    Switch integration test parallelism from same_thread to concurrent for methods,
    increase dynamic factor to 2, add forkCount=1C. Guard deadlock-prone tests
    (ApplicationInterfaceRepositoryTest, SharingServiceIntegrationTest,
    DatabaseTestCases) with @Execution(SAME_THREAD).
---
 Tiltfile                                           |  20 +-
 .../airavata-agent => airavata-agent}/.gitignore   |   0
 .../airavata-agent => airavata-agent}/Dockerfile   |   0
 .../airavata-agent => airavata-agent}/Makefile     |   0
 .../airavata-agent => airavata-agent}/README.md    |   0
 .../agent-communication.proto                      |   0
 .../airavata-agent => airavata-agent}/agent.go     |   0
 .../airavata-agent => airavata-agent}/agent.sh     |   0
 .../application/README.md                          |   0
 .../application/alphafold2.sh                      |   0
 .../application/gaussian16.sh                      |   0
 .../application/gromacs.sh                         |   0
 .../application/namd.sh                            |   0
 .../application/pmemd_cuda.sh                      |   0
 .../application/pmemd_mpi.sh                       |   0
 .../application/psi4.sh                            |   0
 .../airavata-agent => airavata-agent}/go.mod       |   0
 .../airavata-agent => airavata-agent}/kernel.py    |   0
 .../pkg/jupyter.go                                 |   0
 .../pkg/python.go                                  |   0
 .../airavata-agent => airavata-agent}/pkg/shell.go |   0
 .../pkg/tunnel.go                                  |   0
 .../airavata-agent => airavata-agent}/pkg/types.go |   0
 .../protos/agent-communication.pb.go               |   0
 .../protos/agent-communication_grpc.pb.go          |   0
 .../agent-service/.gitignore                       |   0
 .../agent-service/pom.xml                          |   4 +-
 .../connection/service/config/AgentProperties.java |  94 +++
 .../service/config/AgentServiceConfig.java         |  21 +-
 .../service/config/ClusterApplicationConfig.java   |   0
 .../service/controllers/AgentController.java       |   0
 .../service/controllers/ExperimentController.java  |   0
 .../service/controllers/PlanController.java        |   2 +-
 .../service/db/entity/AgentDeploymentInfo.java     |   0
 .../service/db/entity/AgentExecution.java          |   0
 .../service/db/entity/AgentExecutionStatus.java    |   0
 .../agent/connection/service/db/entity/Plan.java   |   0
 .../service/db/repo/AgentDeploymentInfoRepo.java   |   0
 .../service/db/repo/AgentExecutionRepo.java        |   0
 .../service/db/repo/AgentExecutionStatusRepo.java  |   0
 .../agent/connection/service/db/repo/PlanRepo.java |   0
 .../service/handlers/AgentConnectionHandler.java   |   8 +-
 .../service/handlers/AgentManagementHandler.java   |  24 +-
 .../connection/service/handlers/FuseFSHandler.java |   0
 .../connection/service/handlers/PlanHandler.java   |   0
 .../models/AgentAsyncCommandExecutionRequest.java  |   0
 .../models/AgentAsyncCommandExecutionResponse.java |   0
 .../models/AgentAsyncCommandListRequest.java       |   0
 .../models/AgentAsyncCommandListResponse.java      |   0
 .../models/AgentAsyncCommandTerminateRequest.java  |   0
 .../models/AgentAsyncCommandTerminateResponse.java |   0
 .../service/models/AgentCommandExecutionAck.java   |   0
 .../models/AgentCommandExecutionRequest.java       |   0
 .../models/AgentCommandExecutionResponse.java      |   0
 .../service/models/AgentEnvSetupAck.java           |   0
 .../service/models/AgentEnvSetupRequest.java       |   0
 .../service/models/AgentEnvSetupResponse.java      |   0
 .../service/models/AgentInfoResponse.java          |   0
 .../service/models/AgentJupyterExecutionAck.java   |   0
 .../models/AgentJupyterExecutionRequest.java       |   0
 .../models/AgentJupyterExecutionResponse.java      |   0
 .../service/models/AgentKernelRestartAck.java      |   0
 .../service/models/AgentKernelRestartRequest.java  |   0
 .../service/models/AgentKernelRestartResponse.java |   0
 .../service/models/AgentLaunchRequest.java         |   0
 .../service/models/AgentLaunchResponse.java        |   0
 .../service/models/AgentPythonExecutionAck.java    |   0
 .../models/AgentPythonExecutionRequest.java        |   0
 .../models/AgentPythonExecutionResponse.java       |   0
 .../service/models/AgentTerminateResponse.java     |   0
 .../connection/service/models/AgentTunnelAck.java  |   0
 .../service/models/AgentTunnelCreateRequest.java   |   0
 .../service/models/AgentTunnelCreateResponse.java  |   0
 .../models/AgentTunnelTerminateRequest.java        |   0
 .../models/AgentTunnelTerminateResponse.java       |   0
 .../connection/service/models/AsyncCommand.java    |   0
 .../connection/service/models/DirectoryInfo.java   |   0
 .../service/models/ExperimentStorageResponse.java  |   0
 .../agent/connection/service/models/FileInfo.java  |   0
 .../service/services/AiravataFileService.java      |   4 +-
 .../service/services/AiravataService.java          |  34 +-
 .../src/main}/proto/agent-communication.proto      |   0
 .../src/main}/proto/airavata-fuse.proto            |   0
 .../resources/distribution/bin/agent-service.sh    |   0
 .../src/main/resources/distribution/bin/setenv.sh  |   0
 .../src/main/resources/distribution/conf/.gitkeep  |   0
 .../agent-service/src/main/resources/log4j2.xml    |   0
 {modules => airavata-api}/file-server/pom.xml      |   0
 .../file/server/FileServerConfiguration.java       |  20 +-
 .../file/server/config/FileServerConfig.java       |  18 +-
 .../file/server/controller/FileController.java     |   0
 .../file/server/model/AiravataDirectory.java       |   0
 .../airavata/file/server/model/AiravataFile.java   |   0
 .../file/server/model/FileUploadResponse.java      |   0
 .../file/server/service/AirvataFileService.java    |  13 +-
 .../file/server/service/ProcessDataManager.java    |  14 +-
 .../resources/distribution/bin/file-service.sh     |   0
 .../src/main/resources/distribution/bin/setenv.sh  |   0
 .../src/main/resources/distribution/conf/.gitkeep  |   0
 .../file-server/src/main/resources/log4j2.xml      |   0
 airavata-api/pom.xml                               |  35 +-
 .../research-service/README.md                     |   0
 .../research-service/pom.xml                       |   2 +-
 .../src/main/compose/dbinit/01-init-db.sql         |   0
 .../src/main/compose/docker-compose.yaml           |   0
 .../airavata/research/service/AiravataService.java |  51 ++
 .../service/config/DevDataInitializer.java         |   0
 .../service/config/ResearchProperties.java         |  82 +++
 .../service/config/ResearchServiceConfig.java      |  23 +-
 .../controller/GlobalExceptionController.java      |   0
 .../service/controller/ProjectController.java      |   0
 .../service/controller/ResearchHubController.java  |   0
 .../service/controller/ResourceController.java     |   0
 .../service/controller/SessionController.java      |   2 +-
 .../research/service/dto/CreateProjectRequest.java |   0
 .../service/dto/CreateResourceRequest.java         |   0
 .../service/dto/ModifyResourceRequest.java         |   0
 .../research/service/dto/RedirectResponse.java     |   0
 .../research/service/dto/ResourceResponse.java     |   0
 .../research/service/enums/PrivacyEnum.java        |   0
 .../research/service/enums/ResourceTypeEnum.java   |   0
 .../research/service/enums/SessionStatusEnum.java  |   0
 .../airavata/research/service/enums/StateEnum.java |   0
 .../research/service/enums/StatusEnum.java         |   0
 .../research/service/exception/ErrorResponse.java  |   0
 .../service/exception/GlobalExceptionHandler.java  |   0
 .../research/service/handlers/ProjectHandler.java  |   2 +-
 .../service/handlers/ResearchHubHandler.java       |   7 +-
 .../research/service/handlers/ResourceHandler.java |   2 +-
 .../research/service/handlers/SessionHandler.java  |   2 +-
 .../service/model/entity/DatasetResource.java      |   0
 .../service/model/entity/ModelResource.java        |   0
 .../service/model/entity/NotebookResource.java     |   0
 .../research/service/model/entity/Project.java     |   0
 .../service/model/entity/RepositoryResource.java   |   0
 .../research/service/model/entity/Resource.java    |   0
 .../service/model/entity/ResourceStar.java         |   0
 .../research/service/model/entity/Session.java     |   0
 .../research/service/model/entity/Tag.java         |   0
 .../service/model/repo/ProjectRepository.java      |   0
 .../service/model/repo/ResourceRepository.java     |   0
 .../service/model/repo/ResourceStarRepository.java |   0
 .../service/model/repo/SessionRepository.java      |   0
 .../research/service/model/repo/TagRepository.java |   0
 .../src/main/proto/research-service.proto          |   0
 .../resources/distribution/bin/research-service.sh |   0
 .../src/main/resources/distribution/bin/setenv.sh  |   0
 .../src/main/resources/distribution/conf/.gitkeep  |   0
 .../research-service/src/main/resources/log4j2.xml |   0
 .../common/config/AiravataServerProperties.java    |  30 +-
 .../common/config/ConditionalOnServer.java         |  21 +-
 .../airavata/common/config/OnServerCondition.java  |  23 +-
 .../db/EntityManagerFactoryHolder.java}            |  40 +-
 .../db/EntityManagerFactoryRegistrar.java}         |  35 +-
 .../org/apache/airavata/common/db/JPAUtils.java    | 102 ----
 .../airavata/common/security/UserContext.java      |  45 +-
 .../airavata/compute/mapper/ComputeMapper.java     | 253 ++++++++
 .../compute/model/AppEnvironmentEntity.java        |   5 +-
 .../compute/model/AppModuleMappingEntity.java      |   4 +-
 .../compute/model/ApplicationInputEntity.java      |   5 +-
 .../compute/model/ApplicationInterfaceEntity.java  |   2 +-
 .../compute/model/ApplicationOutputEntity.java     |   5 +-
 .../airavata/compute/model/BatchQueueEntity.java   |   2 +-
 .../model/BatchQueueResourcePolicyEntity.java      |   4 +-
 .../compute/model/ComputeResourceEntity.java       |   5 +-
 .../model/ComputeResourceFileSystemEntity.java     |   2 +-
 .../compute/model/ComputeResourcePolicyEntity.java |   6 +-
 .../model/ComputeResourceReservationEntity.java    |   2 +-
 .../model/GroupComputeResourcePrefEntity.java      |   2 +-
 .../model/GroupSSHAccountProvisionerConfig.java    |   8 +-
 .../compute/model/JobManagerCommandEntity.java     |   2 +-
 .../model/JobSubmissionInterfaceEntity.java        |   2 +-
 .../compute/model/LibraryApendPathEntity.java      |   5 +-
 .../compute/model/LibraryPrependPathEntity.java    |   5 +-
 .../compute/model/LocalSubmissionEntity.java       |   2 +-
 .../compute/model/ModuleLoadCmdEntity.java         |   5 +-
 .../compute/model/ParallelismCommandEntity.java    |   2 +-
 .../compute/model/ParserConnectorEntity.java       |   6 +-
 .../compute/model/ParserConnectorInputEntity.java  |   6 +-
 .../airavata/compute/model/ParserInputEntity.java  |   2 +-
 .../airavata/compute/model/ParserOutputEntity.java |   2 +-
 .../compute/model/ParsingTemplateInputEntity.java  |   4 +-
 .../compute/model/PostjobCommandEntity.java        |   5 +-
 .../compute/model/PrejobCommandEntity.java         |   5 +-
 .../compute/model/ResourceJobManagerEntity.java    |  24 +
 .../model/SSHAccountProvisionerConfiguration.java  |   4 +-
 .../model/UserComputeResourcePreferenceEntity.java |   5 +-
 .../repository/AppCatAbstractRepository.java       |  36 --
 .../ApplicationDeploymentRepository.java           |  19 +-
 .../repository/ApplicationInputRepository.java     |  14 +-
 .../repository/ApplicationInterfaceRepository.java |  27 +-
 .../repository/ApplicationModuleRepository.java    |  14 +-
 .../repository/ApplicationOutputRepository.java    |  14 +-
 .../repository/BatchQueuePolicyRepository.java     |  14 +-
 .../compute/repository/BatchQueueRepository.java   |  14 +-
 .../ComputeResourcePolicyRepository.java           |  14 +-
 .../repository/ComputeResourcePrefRepository.java  |  14 +-
 .../repository/ComputeResourceRepository.java      | 135 +++--
 .../repository/GatewayGroupsRepository.java        |  14 +-
 .../repository/GroupResourceProfileRepository.java |  14 +-
 .../repository/GrpComputePrefRepository.java       |  14 +-
 .../repository/GwyResourceProfileRepository.java   |  23 +-
 .../JobSubmissionInterfaceRepository.java          |  20 +-
 .../compute/repository/ParserInputRepository.java  |  14 +-
 .../compute/repository/ParserOutputRepository.java |  14 +-
 .../compute/repository/ParserRepository.java       |  21 +-
 .../repository/ParsingTemplateRepository.java      |  15 +-
 .../repository/ResourceJobManagerRepository.java   |  14 +-
 .../UserComputeResourcePreferenceRepository.java   |  14 +-
 .../repository/UserResourceProfileRepository.java  |  19 +-
 .../apache/airavata/compute/task/JobFactory.java   |   6 +-
 .../compute/task/aws/AWSProcessContextManager.java |  17 +-
 .../apache/airavata/compute/util/AgentUtils.java   |  30 +-
 .../service/provisioning/SSHAccountManager.java    | 108 +---
 .../util/CredentialStoreClientFactory.java         |  44 --
 .../execution/handler/RegistryServerHandler.java   |   7 +
 .../handler/RegistryServiceDBEventHandler.java     |  35 +-
 .../airavata/execution/mapper/ExecutionMapper.java | 296 ++++++++++
 .../ComputationalResourceSchedulingEntity.java     |   2 +-
 .../execution/model/ExperimentErrorEntity.java     |   2 +-
 .../execution/model/ExperimentInputEntity.java     |   2 +-
 .../execution/model/ExperimentOutputEntity.java    |   2 +-
 .../execution/model/ExperimentStatusEntity.java    |   2 +-
 .../apache/airavata/execution/model/JobEntity.java |   2 +-
 .../airavata/execution/model/JobStatusEntity.java  |   4 +-
 .../airavata/execution/model/ProcessEntity.java    |   2 +-
 .../execution/model/ProcessErrorEntity.java        |   2 +-
 .../execution/model/ProcessInputEntity.java        |   2 +-
 .../execution/model/ProcessOutputEntity.java       |   2 +-
 .../execution/model/ProcessStatusEntity.java       |   2 +-
 .../execution/model/ProcessWorkflowEntity.java     |   2 +-
 .../execution/model/ProjectUserEntity.java         |   2 +-
 .../airavata/execution/model/TaskEntity.java       |   2 +-
 .../airavata/execution/model/TaskErrorEntity.java  |   2 +-
 .../airavata/execution/model/TaskStatusEntity.java |   2 +-
 .../airavata/execution/model/UserEntity.java       |   2 +-
 .../workflow/AiravataWorkflowErrorEntity.java      |   2 +-
 .../workflow/AiravataWorkflowStatusEntity.java     |   2 +-
 .../model/workflow/ApplicationErrorEntity.java     |   2 +-
 .../model/workflow/ApplicationStatusEntity.java    |   2 +-
 .../model/workflow/HandlerErrorEntity.java         |   7 +-
 .../model/workflow/HandlerInputEntity.java         |   7 +-
 .../model/workflow/HandlerOutputEntity.java        |   7 +-
 .../model/workflow/HandlerStatusEntity.java        |   7 +-
 .../model/workflow/WorkflowApplicationEntity.java  |   2 +-
 .../model/workflow/WorkflowConnectionEntity.java   |   4 +-
 .../model/workflow/WorkflowDataBlockEntity.java    |   2 +-
 .../model/workflow/WorkflowHandlerEntity.java      |   2 +-
 .../model/workflow/WorkflowInputEntity.java        |   2 +-
 .../model/workflow/WorkflowOutputEntity.java       |   2 +-
 .../monitor/AiravataCustomMailParser.java          |   2 +-
 .../execution/monitor/ClusterStatusMonitorJob.java |  11 +-
 .../execution/monitor/ComputeResourceMonitor.java  |  49 +-
 .../execution/monitor/EmailBasedMonitor.java       |  61 +-
 .../airavata/execution/monitor/EmailParser.java    |   2 +-
 .../execution/monitor/HTCondorEmailParser.java     |   2 +-
 .../airavata/execution/monitor/LSFEmailParser.java |   2 +-
 .../airavata/execution/monitor/MonitoringJob.java  |  15 +-
 .../airavata/execution/monitor/PBSEmailParser.java |   2 +-
 .../execution/monitor/RealtimeJobStatusParser.java |   4 +-
 .../execution/monitor/RealtimeMonitor.java         |  47 +-
 .../execution/monitor/SLURMEmailParser.java        |   2 +-
 .../airavata/execution/monitor/UGEEmailParser.java |   2 +-
 .../execution/orchestrator/AiravataTask.java       |  38 +-
 .../orchestrator/BatchQueueValidator.java          |  25 +-
 .../GroupResourceProfileValidator.java             |  25 +-
 .../orchestrator/OrchestratorServerUtils.java      |  50 +-
 .../execution/orchestrator/OrchestratorUtils.java  | 106 +---
 .../orchestrator/ParserWorkflowManager.java        |  43 +-
 .../orchestrator/PostWorkflowManager.java          |  33 +-
 .../execution/orchestrator/PreWorkflowManager.java |  20 +-
 .../orchestrator/SimpleOrchestratorImpl.java       | 303 ++++------
 .../execution/orchestrator/TaskContext.java        |  43 +-
 .../execution/orchestrator/WorkflowManager.java    |  45 +-
 .../repository/ExpCatAbstractRepository.java       |  36 --
 .../repository/ExperimentErrorRepository.java      |  19 +-
 .../repository/ExperimentInputRepository.java      |  19 +-
 .../repository/ExperimentOutputRepository.java     |  19 +-
 .../execution/repository/ExperimentRepository.java |  20 +-
 .../repository/ExperimentStatusRepository.java     |  21 +-
 .../repository/ExperimentSummaryRepository.java    |  14 +-
 .../execution/repository/GatewayRepository.java    |  19 +-
 .../GatewayUsageReportingCommandRepository.java    |  19 +-
 .../execution/repository/JobRepository.java        |  20 +-
 .../execution/repository/JobStatusRepository.java  |  19 +-
 .../repository/NotificationRepository.java         |  19 +-
 .../repository/ProcessErrorRepository.java         |  19 +-
 .../repository/ProcessInputRepository.java         |  19 +-
 .../repository/ProcessOutputRepository.java        |  19 +-
 .../execution/repository/ProcessRepository.java    |  39 +-
 .../repository/ProcessStatusRepository.java        |  21 +-
 .../repository/ProcessWorkflowRepository.java      |  20 +-
 .../execution/repository/ProjectRepository.java    |  20 +-
 .../repository/QueueStatusRepository.java          |  19 +-
 .../execution/repository/TaskErrorRepository.java  |  19 +-
 .../execution/repository/TaskRepository.java       |  31 +-
 .../execution/repository/TaskStatusRepository.java |  19 +-
 .../execution/repository/UserRepository.java       |  14 +-
 .../repository/WorkflowCatAbstractRepository.java  |  36 --
 .../execution/repository/WorkflowRepository.java   |  18 +-
 .../ComputeResourceSelectionPolicyImpl.java        |  16 +-
 .../execution/scheduler/DataAnalyzerImpl.java      |  21 +-
 .../DefaultComputeResourceSelectionPolicy.java     |   8 +-
 .../scheduler/ExponentialBackOffReScheduler.java   |  28 +-
 .../scheduler/MultipleComputeResourcePolicy.java   |   8 +-
 .../execution/scheduler/ProcessScannerImpl.java    |  18 +-
 .../execution/scheduler/ProcessSchedulerImpl.java  |  11 +-
 .../apache/airavata/execution/scheduler/Utils.java | 126 ++--
 .../airavata/execution/task/DataParsingTask.java   |  12 +-
 .../execution/util/AbstractRepository.java         | 146 ++++-
 .../execution/util/AppCatalogDBInitConfig.java     |   2 +-
 .../execution/util/AppCatalogJDBCConfig.java       |  65 --
 .../execution/util/AppCatalogJPAUtils.java         |  49 --
 .../execution/util/CsvStringConverter.java         |  53 --
 .../airavata/execution/util/CustomBeanFactory.java | 113 ----
 .../execution/util/ExpCatalogDBInitConfig.java     |   2 +-
 .../execution/util/ExpCatalogJDBCConfig.java       |  65 --
 .../execution/util/ExpCatalogJPAUtils.java         |  46 --
 .../execution/util/ObjectMapperSingleton.java      |  39 --
 .../airavata/execution/util/QueryConstants.java    |   2 +-
 .../execution/util/RepCatalogJPAUtils.java         |  49 --
 .../execution/util/ReplicaCatalogDBInitConfig.java |   2 +-
 .../execution/util/ReplicaCatalogJDBCConfig.java   |  65 --
 .../execution/util/StorageDateConverter.java       |  51 --
 .../util/WorkflowCatalogDBInitConfig.java          |   2 +-
 .../execution/util/WorkflowCatalogJDBCConfig.java  |  65 --
 .../execution/util/WorkflowCatalogJPAUtils.java    |  47 --
 .../commons/repositories/AbstractRepository.java   |  86 ++-
 .../commons/tenant/entities/GatewayEntity.java     |   2 +-
 .../user/entities/NSFDemographicsEntity.java       |   2 +-
 .../commons/user/entities/UserProfileEntity.java   |   2 +-
 .../security/profile/commons/utils/JPAUtils.java   |  63 --
 .../commons/utils/ObjectMapperSingleton.java       |  37 --
 .../commons/utils/ProfileServiceJDBCConfig.java    |  50 --
 .../profile/commons/utils/QueryConstants.java      |   6 +-
 .../security/profile/mapper/ProfileMapper.java     |  54 ++
 .../core/repositories/TenantProfileRepository.java |  11 +
 .../core/repositories/UserProfileRepository.java   |  24 +-
 .../core/utils/UserProfileCatalogDBInitConfig.java |   2 +-
 .../core/utils/UserProfileCatalogJDBCConfig.java   |  51 --
 .../security/service/GatewayGroupsInitializer.java |  76 +--
 .../security/service/KeyCloakSecurityManager.java  |  54 +-
 .../handler/SharingServiceDBEventHandler.java      |  13 +-
 .../SharingServiceDBEventMessagingFactory.java     |   4 +-
 .../airavata/sharing/mapper/SharingMapper.java     |  85 +++
 .../airavata/sharing/model/GroupAdminEntity.java   |   4 +-
 .../apache/airavata/sharing/model/UserEntity.java  |   2 +-
 .../airavata/sharing/model/UserGroupEntity.java    |   2 +-
 .../sharing/repository/AbstractRepository.java     |  67 ++-
 .../sharing/repository/DomainRepository.java       |  11 +
 .../sharing/repository/EntityRepository.java       |  33 +-
 .../sharing/repository/EntityTypeRepository.java   |  11 +
 .../sharing/repository/GroupAdminRepository.java   |  11 +
 .../repository/GroupMembershipRepository.java      |  14 +-
 .../repository/PermissionTypeRepository.java       |  11 +
 .../sharing/repository/SharingRepository.java      |  11 +
 .../sharing/repository/UserGroupRepository.java    |  11 +
 .../sharing/repository/UserRepository.java         |  15 +-
 .../sharing/util/AiravataDataMigrator.java         |  77 +--
 .../sharing/util/ObjectMapperSingleton.java        |  37 --
 .../sharing/util/SharingRegistryDBInitConfig.java  |   2 +-
 .../sharing/util/SharingRegistryJDBCConfig.java    |  66 ---
 .../util/SharingRegistryServiceClientFactory.java  |  47 --
 .../airavata/storage/mapper/StorageMapper.java     |  83 +++
 .../storage/model/DataMovementInterfaceEntity.java |   2 +-
 .../airavata/storage/model/DataProductEntity.java  |   2 +-
 .../storage/model/DataReplicaLocationEntity.java   |   4 +-
 .../storage/model/GridftpEndpointEntity.java       |   2 +-
 .../storage/model/StorageInterfaceEntity.java      |   2 +-
 .../storage/model/UserStoragePreferenceEntity.java |   5 +-
 .../storage/repository/DataMovementRepository.java |  20 +-
 .../storage/repository/DataProductRepository.java  |  48 +-
 .../repository/DataReplicaLocationRepository.java  |  40 +-
 .../repository/RepCatAbstractRepository.java       |  36 --
 .../storage/repository/StoragePrefRepository.java  |  15 +-
 .../repository/StorageResourceRepository.java      |  21 +-
 .../UserStoragePreferenceRepository.java           |  15 +-
 airavata-api/src/main/resources/dozer_mapping.xml  |  68 ---
 .../airavata/common/utils/DatabaseTestCases.java   |  30 +-
 .../ApplicationDeploymentRepositoryTest.java       |  22 +-
 .../ApplicationInterfaceRepositoryTest.java        |   5 +-
 .../repository/ComputeResourceRepositoryTest.java  |   8 +-
 .../repository/GatewayGroupsRepositoryTest.java    |   2 +-
 .../repository/GatewayProfileRepositoryTest.java   |   4 +-
 .../GroupResourceProfileRepositoryTest.java        |  12 +-
 .../JobSubmissionInterfaceRepositoryTest.java      |   2 +-
 .../repository/StorageResourceRepositoryTest.java  |   2 +-
 .../UserResourceProfileRepositoryTest.java         |   4 +-
 .../airavata/compute/util/SFTPDeleteDirTest.java   |   5 +-
 .../SSHAccountProvisionerFactoryTest.java          |   3 +
 .../repository/ExperimentErrorRepositoryTest.java  |   2 +-
 .../repository/ExperimentInputRepositoryTest.java  |   2 +-
 .../repository/ExperimentOutputRepositoryTest.java |   2 +-
 .../repository/ExperimentRepositoryTest.java       |   2 +-
 .../repository/ExperimentStatusRepositoryTest.java |   4 +-
 .../ExperimentSummaryRepositoryTest.java           |   4 +-
 .../repository/GatewayRepositoryTest.java          |   2 +-
 .../execution/repository/JobRepositoryTest.java    |   2 +-
 .../repository/JobStatusRepositoryTest.java        |   2 +-
 .../repository/NotificationRepositoryTest.java     |   2 +-
 .../repository/ProcessErrorRepositoryTest.java     |   2 +-
 .../repository/ProcessInputRepositoryTest.java     |   2 +-
 .../repository/ProcessOutputRepositoryTest.java    |   2 +-
 .../repository/ProcessRepositoryTest.java          |   2 +-
 .../repository/ProcessStatusRepositoryTest.java    |   2 +-
 .../repository/ProjectRepositoryTest.java          |   2 +-
 .../repository/QueueStatusRepositoryTest.java      |   2 +-
 .../repository/TaskErrorRepositoryTest.java        |   2 +-
 .../execution/repository/TaskRepositoryTest.java   |   2 +-
 .../repository/TaskStatusRepositoryTest.java       |   2 +-
 .../execution/repository/UserRepositoryTest.java   |   2 +-
 .../repository/WorkflowRepositoryTest.java         |   5 +-
 .../execution/util/CustomBeanFactoryTest.java      |  67 ---
 .../execution/util/ObjectMapperSingletonTest.java  |  69 ---
 .../execution/util/common/SharedMariaDB.java       |  43 +-
 .../SharedMariaDBLauncherSessionListener.java      |  14 +-
 .../airavata/execution/util/common/TestBase.java   |  64 +-
 .../replicacatalog/DataProductRepositoryTest.java  |   2 +-
 .../DataReplicaLocationRepositoryTest.java         |  15 +-
 .../integration/AbstractIntegrationTest.java       |  10 +-
 .../integration/BackgroundServiceHealthTest.java   |   2 +-
 .../airavata/integration/DatabaseHealthTest.java   |   2 +-
 .../ExperimentRepositoryIntegrationTest.java       |  27 +-
 .../airavata/integration/KafkaHealthTest.java      |   2 +-
 .../airavata/integration/KeycloakHealthTest.java   |   2 +-
 .../airavata/integration/PrometheusHealthTest.java |   2 +-
 .../airavata/integration/RabbitMQHealthTest.java   |   2 +-
 .../integration/ServiceHealthEndpointTest.java     |   2 +-
 .../integration/SharingServiceIntegrationTest.java |   5 +-
 .../integration/ThriftServiceHealthTest.java       |   2 +-
 .../service/KeyCloakSecurityManagerTest.java       |  28 +-
 .../util/AuthenticatorConfigurationReaderTest.java |   3 +
 .../src/test/resources/META-INF/persistence.xml    | 176 ++++++
 .../airavata-fuse => airavata-fuse}/.gitignore     |   0
 .../airavata-fuse => airavata-fuse}/Makefile       |   0
 .../airavata-fuse => airavata-fuse}/README.md      |   0
 .../src/grpcfs/adapters.go                         |   0
 .../src/grpcfs/fs.go                               |   0
 .../src/grpcfs/go.mod                              |   0
 .../src/grpcfs/go.sum                              |   0
 .../src/grpcfs/grpc.go                             |   0
 .../src/grpcfs/inode.go                            |   0
 .../src/grpcfs/pb/grpcfs.pb.go                     |   0
 .../src/grpcfs/pb/grpcfs_grpc.pb.go                |   0
 .../src/grpcfs_client/go.mod                       |   0
 .../src/grpcfs_client/go.sum                       |   0
 .../src/grpcfs_client/main.go                      |   0
 .../src/grpcfs_server/go.mod                       |   0
 .../src/grpcfs_server/go.sum                       |   0
 .../src/grpcfs_server/main.go                      |   0
 .../src/proto/grpcfs.proto                         |   0
 .../Dockerfile                                     |   0
 .../custom_templates/login.html                    |   0
 .../docker-compose.yaml                            |   0
 .../jupyterhub_config.py                           |   0
 .../user-container/Dockerfile                      |   0
 .../user-container/Makefile                        |   0
 .../user-container/init.sh                         |   0
 .../grpc}/pom.xml                                  |   6 +-
 .../server/grpc}/AiravataGrpcServerConfig.java     |  10 +-
 .../server/grpc}/config/GrpcAuthInterceptor.java   |  11 +-
 airavata-server/pom.xml                            |   6 +-
 .../rest}/pom.xml                                  |   6 +-
 .../server/rest}/AiravataRestServerConfig.java     |   2 +-
 .../server/rest}/config/OpenApiConfig.java         |   2 +-
 .../server/rest}/config/SecurityConfig.java        |   2 +-
 .../airavata/server/rest}/config/WebMvcConfig.java |   2 +-
 .../rest}/controller/KafkaProxyController.java     |   2 +-
 .../apache/airavata/server/AiravataServerMain.java |  51 +-
 airavata-server/src/main/resources/application.yml |   3 +
 .../file-server => airavata-server/thrift}/pom.xml |  56 +-
 .../server/thrift}/AiravataThriftServerConfig.java |  21 +-
 .../thrift}/config/BackgroundServicesConfig.java   |   5 +-
 .../thrift}/config/ThriftProcessorConfig.java      |  46 +-
 .../thrift}/config/ThriftServerLifecycle.java      |  14 +-
 .../thrift}/handler/AiravataServerHandler.java     |   5 +-
 .../handler}/GroupManagerServiceHandler.java       |  75 +--
 .../thrift/handler}/IamAdminServicesHandler.java   |  35 +-
 .../thrift/handler}/OrchestratorServerHandler.java |  96 ++-
 .../handler}/TenantProfileServiceHandler.java      |  44 +-
 .../server/thrift}/handler/ThriftAdapter.java      |   2 +-
 .../thrift/handler}/UserProfileServiceHandler.java |  21 +-
 .../server/thrift}/mapper/WorkspaceMapper.java     |   2 +-
 .../airavata/server/thrift}/util/Constants.java    |   2 +-
 .../main/thrift/airavata-apis/airavata_api.thrift  |   0
 .../thrift/airavata-apis/airavata_commons.thrift   |   0
 .../thrift/airavata-apis/airavata_errors.thrift    |   0
 .../thrift/airavata-apis/db_event_model.thrift     |   0
 .../thrift/airavata-apis/messaging_events.thrift   |   0
 .../thrift/airavata-apis/security_model.thrift     |   0
 .../main/thrift/airavata-apis/workflow_api.thrift  |   0
 .../src/main/thrift/base-api/base_api.thrift       |   0
 .../data-models/account_provisioning_model.thrift  |   0
 .../application_deployment_model.thrift            |   0
 .../data-models/application_interface_model.thrift |   0
 .../data-models/application_io_models.thrift       |   0
 .../data-models/compute_resource_model.thrift      |   0
 .../data-models/credential_store_models.thrift     |   0
 .../thrift/data-models/data_movement_models.thrift |   0
 .../thrift/data-models/experiment_model.thrift     |   0
 .../thrift/data-models/gateway_groups_model.thrift |   0
 .../gateway_resource_profile_model.thrift          |   0
 .../thrift/data-models/group_manager_model.thrift  |   0
 .../group_resource_profile_model.thrift            |   0
 .../src/main/thrift/data-models/job_model.thrift   |   0
 .../thrift/data-models/parallelism_model.thrift    |   0
 .../main/thrift/data-models/parser_model.thrift    |   0
 .../main/thrift/data-models/process_model.thrift   |   0
 .../data-models/replica_catalog_models.thrift      |   0
 .../thrift/data-models/scheduling_model.thrift     |   0
 .../main/thrift/data-models/sharing_models.thrift  |   0
 .../main/thrift/data-models/status_models.thrift   |   0
 .../data-models/storage_resource_model.thrift      |   0
 .../src/main/thrift/data-models/task_model.thrift  |   0
 .../thrift/data-models/tenant_profile_model.thrift |   0
 .../thrift/data-models/user_profile_model.thrift   |   0
 .../data-models/user_resource_profile_model.thrift |   0
 .../thrift/data-models/workflow_data_model.thrift  |   0
 .../main/thrift/data-models/workflow_model.thrift  |   0
 .../main/thrift/data-models/workspace_model.thrift |   0
 .../src/main/thrift/generate-thrift-stubs.sh       |   0
 .../service-cpis/credential-store-cpi.thrift       |   0
 .../service-cpis/credential_store_errors.thrift    |   0
 .../thrift/service-cpis/orchestrator-cpi.thrift    |   0
 .../thrift/service-cpis/profile-service-cpi.thrift |   0
 .../group-manager/group-manager-cpi.thrift         |   0
 .../group-manager/group_manager_cpi_errors.thrift  |   0
 .../iam-admin-services-cpi.thrift                  |   0
 .../iam_admin_services_cpi_errors.thrift           |   0
 .../profile-tenant/profile-tenant-cpi.thrift       |   0
 .../profile_tenant_cpi_errors.thrift               |   0
 .../profile-user/profile-user-cpi.thrift           |   0
 .../profile-user/profile_user_cpi_errors.thrift    |   0
 .../main/thrift/service-cpis/registry-api.thrift   |   0
 .../thrift/service-cpis/registry_api_errors.thrift |   0
 .../main/thrift/service-cpis/sharing_cpi.thrift    |   0
 .../thrift/service-cpis/user-profile-cpi.thrift    |   0
 .../service-cpis/user_profile_cpi_errors.thrift    |   0
 .../thrift}/src/main/thrift/stubs_java.thrift      |   0
 .../thrift}/src/main/thrift/stubs_php.thrift       |   0
 .../thrift}/src/main/thrift/stubs_python.thrift    |   0
 airavata-thrift-server/pom.xml                     |  83 ---
 .../simexr_mod/.gitignore                          |   0
 .../simexr_mod/FINAL_REPORT.md                     |   0
 .../simexr_mod/README.md                           |   0
 .../simexr_mod/api/__init__.py                     |   0
 .../simexr_mod/api/config.py                       |   0
 .../simexr_mod/api/dependencies.py                 |   0
 .../simexr_mod/api/main.py                         |   0
 .../simexr_mod/api/models.py                       |   0
 .../simexr_mod/api/routers/__init__.py             |   0
 .../simexr_mod/api/routers/database.py             |   0
 .../simexr_mod/api/routers/health.py               |   0
 .../simexr_mod/api/routers/reasoning.py            |   0
 .../simexr_mod/api/routers/simulation.py           |   0
 .../simexr_mod/app.py                              |   0
 .../simexr_mod/code/__init__.py                    |   0
 .../simexr_mod/code/extract/llm_extract.py         |   0
 .../simexr_mod/code/helpers/ast_helpers.py         |   0
 .../simexr_mod/code/helpers/locate_helpers.py      |   0
 .../simexr_mod/code/inject/inject_overrides.py     |   0
 .../simexr_mod/code/locate/locate.py               |   0
 .../simexr_mod/code/locate/param_usage_visitor.py  |   0
 .../simexr_mod/code/models/param_ref.py            |   0
 .../simexr_mod/code/refactor/llm_refactor.py       |   0
 .../simexr_mod/code/test/__init__.py               |   0
 .../simexr_mod/code/test/simulation_refiner.py     |   0
 .../simexr_mod/code/utils/github_utils.py          |   0
 .../simexr_mod/code/utils/notebook_utils.py        |   0
 .../simexr_mod/config.yaml.example                 |   0
 .../simexr_mod/core/__init__.py                    |   0
 .../simexr_mod/core/interfaces.py                  |   0
 .../simexr_mod/core/parser.py                      |   0
 .../simexr_mod/core/patterns.py                    |   0
 .../simexr_mod/core/services.py                    |   0
 .../simexr_mod/db/__init__.py                      |   0
 .../simexr_mod/db/base.py                          |   0
 .../simexr_mod/db/config/__init__.py               |   0
 .../simexr_mod/db/config/database.py               |   0
 .../simexr_mod/db/models/__init__.py               |   0
 .../simexr_mod/db/models/base.py                   |   0
 .../simexr_mod/db/models/simulation.py             |   0
 .../simexr_mod/db/repositories/__init__.py         |   0
 .../simexr_mod/db/repositories/base.py             |   0
 .../simexr_mod/db/repositories/reasoning.py        |   0
 .../simexr_mod/db/repositories/simulation.py       |   0
 .../simexr_mod/db/services/__init__.py             |   0
 .../simexr_mod/db/services/reasoning.py            |   0
 .../simexr_mod/db/services/results.py              |   0
 .../simexr_mod/db/services/store.py                |   0
 .../simexr_mod/db/utils/__init__.py                |   0
 .../simexr_mod/db/utils/hash_utils.py              |   0
 .../simexr_mod/db/utils/json_utils.py              |   0
 .../simexr_mod/db/utils/transform_utils.py         |   0
 .../simexr_mod/execute/__init__.py                 |   0
 .../simexr_mod/execute/base.py                     |   0
 .../simexr_mod/execute/loader/__init__.py          |   0
 .../simexr_mod/execute/loader/simulate_loader.py   |   0
 .../simexr_mod/execute/loader/transform_code.py    |   0
 .../simexr_mod/execute/logging/__init__.py         |   0
 .../simexr_mod/execute/logging/run_logger.py       |   0
 .../simexr_mod/execute/model/__init__.py           |   0
 .../simexr_mod/execute/model/smoke_test_result.py  |   0
 .../simexr_mod/execute/persistence/__init__.py     |   0
 .../simexr_mod/execute/persistence/save_script.py  |   0
 .../simexr_mod/execute/run/__init__.py             |   0
 .../simexr_mod/execute/run/batch_runner.py         |   0
 .../simexr_mod/execute/run/simulation_runner.py    |   0
 .../simexr_mod/execute/test/__init__.py            |   0
 .../simexr_mod/execute/test/fix_agent.py           |   0
 .../simexr_mod/execute/test/simulation_refiner.py  |   0
 .../simexr_mod/execute/test/smoke_tester.py        |   0
 .../simexr_mod/execute/utils/__init__.py           |   0
 .../simexr_mod/execute/utils/black_formatter.py    |   0
 .../simexr_mod/execute/utils/error_context.py      |   0
 .../simexr_mod/execute/utils/json_utlils.py        |   0
 .../simexr_mod/execute/utils/model_utils.py        |   0
 .../simexr_mod/execute/utils/python_utils.py       |   0
 .../execute/utils/requirements_manager.py          |   0
 .../simexr_mod/llm/local_llm.py                    |   0
 .../simexr_mod/llm/prompt_templates.py             |   0
 .../simexr_mod/pages/param_annotations.py          |   0
 .../simexr_mod/reasoning/__init__.py               |   0
 .../simexr_mod/reasoning/agent/__init__.py         |   0
 .../simexr_mod/reasoning/agent/loop.py             |   0
 .../simexr_mod/reasoning/base.py                   |   0
 .../simexr_mod/reasoning/config/__init__.py        |   0
 .../simexr_mod/reasoning/config/tools.py           |   0
 .../simexr_mod/reasoning/helpers/__init__.py       |   0
 .../simexr_mod/reasoning/helpers/chat_utils.py     |   0
 .../simexr_mod/reasoning/helpers/prompts.py        |   0
 .../simexr_mod/reasoning/messages/__init__.py      |   0
 .../simexr_mod/reasoning/messages/llm_client.py    |   0
 .../simexr_mod/reasoning/messages/model.py         |   0
 .../simexr_mod/reasoning/messages/openai_client.py |   0
 .../simexr_mod/reasoning/model/__init__.py         |   0
 .../simexr_mod/reasoning/model/reasoning_result.py |   0
 .../simexr_mod/reasoning/tools/__init__.py         |   0
 .../simexr_mod/reasoning/tools/final_answer.py     |   0
 .../simexr_mod/reasoning/tools/python_exec.py      |   0
 .../simexr_mod/reasoning/tools/simulate_exec.py    |   0
 .../simexr_mod/reasoning/utils/__init__.py         |   0
 .../simexr_mod/reasoning/utils/extract_code_map.py |   0
 .../simexr_mod/reasoning/utils/history.py          |   0
 .../simexr_mod/reasoning/utils/json_utils.py       |   0
 .../simexr_mod/reasoning/utils/load_results.py     |   0
 .../simexr_mod/requirements.txt                    |   0
 .../simexr_mod/setup.sh                            |   0
 .../simexr_mod/start_api.py                        |   0
 .../simexr_mod/start_streamlit.py                  |   0
 .../simexr_mod/test_all_apis.py                    |   0
 .../simexr_mod/utils/config.py                     |   0
 .../simexr_mod/utils/logger.py                     |   0
 .../simexr_mod/utils/openai_config.py              |   0
 integration-tests/pom.xml                          |  99 ----
 .../connection/service/config/AgentProperties.java |  35 --
 .../service/config/AgentServiceConfig.java         |  13 -
 .../agent-framework/airavata-fuse/data/foo/bar.txt |   1 -
 .../agent-framework/airavata-fuse/data/hello.txt   |   1 -
 .../file/server/FileServerConfiguration.java       |  63 --
 .../file/server/config/FileServerConfig.java       |   9 -
 modules/registry-jpa-generator/pom.xml             |  41 --
 .../computeresource/BatchQueueGenerator.java       |  91 ---
 .../ComputeResourceDescriptionGenerator.java       |  79 ---
 .../DataMovementInterfaceGenerator.java            |  88 ---
 .../computeresource/FileSystemsGenerator.java      |  87 ---
 .../GridFTPDataMovementGenerator.java              |  79 ---
 .../computeresource/GridFTPEndpointsGenerator.java |  87 ---
 .../JobManagerCommandGenerator.java                |  90 ---
 .../JobSubmissionInterfaceGenerator.java           |  88 ---
 .../LocalDataMovementGenerator.java                |  78 ---
 .../computeresource/LocalSubmissionGenerator.java  |  87 ---
 .../computeresource/ModuleCMDGenerator.java        |  86 ---
 .../ResourceJobManagerGenerator.java               |  86 ---
 .../computeresource/SCPDataMovementGenerator.java  |  81 ---
 .../computeresource/SSHJobSubmissionGenerator.java |  90 ---
 .../main/java/generators/AbstractGenerator.java    | 144 -----
 .../main/java/generators/JPAClassGenerator.java    | 253 --------
 .../java/generators/JPAResourceClassGenerator.java | 655 ---------------------
 .../src/main/java/generators/SQLGenerator.java     |  94 ---
 .../src/main/java/model/JPAClassField.java         |  71 ---
 .../src/main/java/model/JPAClassModel.java         |  53 --
 .../src/main/java/model/JPAPKClassModel.java       |  49 --
 .../src/main/java/model/JPAResourceClassModel.java |  46 --
 .../src/main/java/model/SQLData.java               | 106 ----
 .../src/main/java/test/Test.java                   | 101 ----
 .../airavata/research/service/AiravataService.java |  73 ---
 .../service/config/ResearchProperties.java         |  28 -
 .../service/config/ResearchServiceConfig.java      |  15 -
 pom.xml                                            |  73 ++-
 690 files changed, 3752 insertions(+), 7097 deletions(-)

diff --git a/Tiltfile b/Tiltfile
index ad9700a596..b94e0aa15b 100644
--- a/Tiltfile
+++ b/Tiltfile
@@ -11,12 +11,18 @@ local_resource(
     deps=[
         'airavata-api/src',
         'airavata-api/pom.xml',
-        'airavata-thrift-server/src',
-        'airavata-thrift-server/pom.xml',
-        'airavata-rest-server/src',
-        'airavata-rest-server/pom.xml',
-        'airavata-grpc-server/src',
-        'airavata-grpc-server/pom.xml',
+        'airavata-api/file-server/src',
+        'airavata-api/file-server/pom.xml',
+        'airavata-api/agent-service/src',
+        'airavata-api/agent-service/pom.xml',
+        'airavata-api/research-service/src',
+        'airavata-api/research-service/pom.xml',
+        'airavata-server/thrift/src',
+        'airavata-server/thrift/pom.xml',
+        'airavata-server/rest/src',
+        'airavata-server/rest/pom.xml',
+        'airavata-server/grpc/src',
+        'airavata-server/grpc/pom.xml',
         'airavata-server/src',
         'airavata-server/pom.xml',
     ],
@@ -44,7 +50,7 @@ local_resource(
 # --- Integration Tests (manual trigger) ---
 local_resource(
     'integration-tests',
-    cmd='mvn test -pl integration-tests -Dgroups=integration -am -q',
+    cmd='mvn test -pl airavata-api -Dgroups=runtime -Dsurefire.excludedGroups="" -am -q',
     resource_deps=['airavata-server'],
     auto_init=False,
     trigger_mode=TRIGGER_MODE_MANUAL,
diff --git a/modules/agent-framework/airavata-agent/.gitignore b/airavata-agent/.gitignore
similarity index 100%
rename from modules/agent-framework/airavata-agent/.gitignore
rename to airavata-agent/.gitignore
diff --git a/modules/agent-framework/airavata-agent/Dockerfile b/airavata-agent/Dockerfile
similarity index 100%
rename from modules/agent-framework/airavata-agent/Dockerfile
rename to airavata-agent/Dockerfile
diff --git a/modules/agent-framework/airavata-agent/Makefile b/airavata-agent/Makefile
similarity index 100%
rename from modules/agent-framework/airavata-agent/Makefile
rename to airavata-agent/Makefile
diff --git a/modules/agent-framework/airavata-agent/README.md b/airavata-agent/README.md
similarity index 100%
rename from modules/agent-framework/airavata-agent/README.md
rename to airavata-agent/README.md
diff --git a/modules/agent-framework/airavata-agent/agent-communication.proto b/airavata-agent/agent-communication.proto
similarity index 100%
rename from modules/agent-framework/airavata-agent/agent-communication.proto
rename to airavata-agent/agent-communication.proto
diff --git a/modules/agent-framework/airavata-agent/agent.go b/airavata-agent/agent.go
similarity index 100%
rename from modules/agent-framework/airavata-agent/agent.go
rename to airavata-agent/agent.go
diff --git a/modules/agent-framework/airavata-agent/agent.sh b/airavata-agent/agent.sh
similarity index 100%
rename from modules/agent-framework/airavata-agent/agent.sh
rename to airavata-agent/agent.sh
diff --git a/modules/agent-framework/airavata-agent/application/README.md b/airavata-agent/application/README.md
similarity index 100%
rename from modules/agent-framework/airavata-agent/application/README.md
rename to airavata-agent/application/README.md
diff --git a/modules/agent-framework/airavata-agent/application/alphafold2.sh b/airavata-agent/application/alphafold2.sh
similarity index 100%
rename from modules/agent-framework/airavata-agent/application/alphafold2.sh
rename to airavata-agent/application/alphafold2.sh
diff --git a/modules/agent-framework/airavata-agent/application/gaussian16.sh b/airavata-agent/application/gaussian16.sh
similarity index 100%
rename from modules/agent-framework/airavata-agent/application/gaussian16.sh
rename to airavata-agent/application/gaussian16.sh
diff --git a/modules/agent-framework/airavata-agent/application/gromacs.sh b/airavata-agent/application/gromacs.sh
similarity index 100%
rename from modules/agent-framework/airavata-agent/application/gromacs.sh
rename to airavata-agent/application/gromacs.sh
diff --git a/modules/agent-framework/airavata-agent/application/namd.sh b/airavata-agent/application/namd.sh
similarity index 100%
rename from modules/agent-framework/airavata-agent/application/namd.sh
rename to airavata-agent/application/namd.sh
diff --git a/modules/agent-framework/airavata-agent/application/pmemd_cuda.sh b/airavata-agent/application/pmemd_cuda.sh
similarity index 100%
rename from modules/agent-framework/airavata-agent/application/pmemd_cuda.sh
rename to airavata-agent/application/pmemd_cuda.sh
diff --git a/modules/agent-framework/airavata-agent/application/pmemd_mpi.sh b/airavata-agent/application/pmemd_mpi.sh
similarity index 100%
rename from modules/agent-framework/airavata-agent/application/pmemd_mpi.sh
rename to airavata-agent/application/pmemd_mpi.sh
diff --git a/modules/agent-framework/airavata-agent/application/psi4.sh b/airavata-agent/application/psi4.sh
similarity index 100%
rename from modules/agent-framework/airavata-agent/application/psi4.sh
rename to airavata-agent/application/psi4.sh
diff --git a/modules/agent-framework/airavata-agent/go.mod b/airavata-agent/go.mod
similarity index 100%
rename from modules/agent-framework/airavata-agent/go.mod
rename to airavata-agent/go.mod
diff --git a/modules/agent-framework/airavata-agent/kernel.py b/airavata-agent/kernel.py
similarity index 100%
rename from modules/agent-framework/airavata-agent/kernel.py
rename to airavata-agent/kernel.py
diff --git a/modules/agent-framework/airavata-agent/pkg/jupyter.go b/airavata-agent/pkg/jupyter.go
similarity index 100%
rename from modules/agent-framework/airavata-agent/pkg/jupyter.go
rename to airavata-agent/pkg/jupyter.go
diff --git a/modules/agent-framework/airavata-agent/pkg/python.go b/airavata-agent/pkg/python.go
similarity index 100%
rename from modules/agent-framework/airavata-agent/pkg/python.go
rename to airavata-agent/pkg/python.go
diff --git a/modules/agent-framework/airavata-agent/pkg/shell.go b/airavata-agent/pkg/shell.go
similarity index 100%
rename from modules/agent-framework/airavata-agent/pkg/shell.go
rename to airavata-agent/pkg/shell.go
diff --git a/modules/agent-framework/airavata-agent/pkg/tunnel.go b/airavata-agent/pkg/tunnel.go
similarity index 100%
rename from modules/agent-framework/airavata-agent/pkg/tunnel.go
rename to airavata-agent/pkg/tunnel.go
diff --git a/modules/agent-framework/airavata-agent/pkg/types.go b/airavata-agent/pkg/types.go
similarity index 100%
rename from modules/agent-framework/airavata-agent/pkg/types.go
rename to airavata-agent/pkg/types.go
diff --git a/modules/agent-framework/airavata-agent/protos/agent-communication.pb.go b/airavata-agent/protos/agent-communication.pb.go
similarity index 100%
rename from modules/agent-framework/airavata-agent/protos/agent-communication.pb.go
rename to airavata-agent/protos/agent-communication.pb.go
diff --git a/modules/agent-framework/airavata-agent/protos/agent-communication_grpc.pb.go b/airavata-agent/protos/agent-communication_grpc.pb.go
similarity index 100%
rename from modules/agent-framework/airavata-agent/protos/agent-communication_grpc.pb.go
rename to airavata-agent/protos/agent-communication_grpc.pb.go
diff --git a/modules/agent-framework/agent-service/.gitignore b/airavata-api/agent-service/.gitignore
similarity index 100%
rename from modules/agent-framework/agent-service/.gitignore
rename to airavata-api/agent-service/.gitignore
diff --git a/modules/agent-framework/agent-service/pom.xml b/airavata-api/agent-service/pom.xml
similarity index 98%
rename from modules/agent-framework/agent-service/pom.xml
rename to airavata-api/agent-service/pom.xml
index 2075ebf2b5..f7dc8553bb 100644
--- a/modules/agent-framework/agent-service/pom.xml
+++ b/airavata-api/agent-service/pom.xml
@@ -25,7 +25,7 @@ under the License.
     <groupId>org.apache.airavata</groupId>
     <artifactId>airavata</artifactId>
     <version>0.21-SNAPSHOT</version>
-    <relativePath>../../../pom.xml</relativePath>
+    <relativePath>../../pom.xml</relativePath>
   </parent>
 
   <artifactId>agent-service</artifactId>
@@ -171,7 +171,7 @@ under the License.
         <configuration>
           <protocVersion>4.30.1</protocVersion>
           <sourceDirectories>
-            <sourceDirectory>${project.basedir}/../proto</sourceDirectory>
+            <sourceDirectory>${project.basedir}/src/main/proto</sourceDirectory>
           </sourceDirectories>
           <binaryMavenPlugins>
             <binaryMavenPlugin>
diff --git a/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/config/AgentProperties.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/config/AgentProperties.java
new file mode 100644
index 0000000000..a8f098e2c9
--- /dev/null
+++ b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/config/AgentProperties.java
@@ -0,0 +1,94 @@
+/**
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT 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.agent.connection.service.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "airavata.agent")
+public class AgentProperties {
+    private String storageResourceId;
+    private String storagePath;
+    private Tunnel tunnel = new Tunnel();
+
+    public String getStorageResourceId() {
+        return storageResourceId;
+    }
+
+    public void setStorageResourceId(String s) {
+        this.storageResourceId = s;
+    }
+
+    public String getStoragePath() {
+        return storagePath;
+    }
+
+    public void setStoragePath(String s) {
+        this.storagePath = s;
+    }
+
+    public Tunnel getTunnel() {
+        return tunnel;
+    }
+
+    public void setTunnel(Tunnel t) {
+        this.tunnel = t;
+    }
+
+    public static class Tunnel {
+        private String serverHost;
+        private int serverPort;
+        private String serverToken;
+        private String serverApiUrl;
+
+        public String getServerHost() {
+            return serverHost;
+        }
+
+        public void setServerHost(String s) {
+            this.serverHost = s;
+        }
+
+        public int getServerPort() {
+            return serverPort;
+        }
+
+        public void setServerPort(int p) {
+            this.serverPort = p;
+        }
+
+        public String getServerToken() {
+            return serverToken;
+        }
+
+        public void setServerToken(String s) {
+            this.serverToken = s;
+        }
+
+        public String getServerApiUrl() {
+            return serverApiUrl;
+        }
+
+        public void setServerApiUrl(String s) {
+            this.serverApiUrl = s;
+        }
+    }
+}
diff --git a/airavata-thrift-server/src/main/java/org/apache/airavata/thrift/server/AiravataThriftServerConfig.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/config/AgentServiceConfig.java
similarity index 63%
copy from airavata-thrift-server/src/main/java/org/apache/airavata/thrift/server/AiravataThriftServerConfig.java
copy to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/config/AgentServiceConfig.java
index 81af820223..1af7517dab 100644
--- a/airavata-thrift-server/src/main/java/org/apache/airavata/thrift/server/AiravataThriftServerConfig.java
+++ b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/config/AgentServiceConfig.java
@@ -17,22 +17,15 @@
 * specific language governing permissions and limitations
 * under the License.
 */
-package org.apache.airavata.thrift.server;
+package org.apache.airavata.agent.connection.service.config;
 
-import org.apache.airavata.common.config.ConditionalOnServer;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 
 @Configuration
-@ConditionalOnServer("thrift")
-@ComponentScan(basePackages = {
-    "org.apache.airavata.api.server.handler",
-    "org.apache.airavata.credential.handler",
-    "org.apache.airavata.execution.handler",
-    "org.apache.airavata.sharing.handler",
-    "org.apache.airavata.service.profile.handlers",
-    "org.apache.airavata.orchestrator.server",
-    "org.apache.airavata.thrift.server.config"
-})
-public class AiravataThriftServerConfig {
-}
+@ComponentScan(basePackages = "org.apache.airavata.agent.connection.service")
+@EntityScan(basePackages = "org.apache.airavata.agent.connection.service")
+@EnableJpaRepositories(basePackages = "org.apache.airavata.agent.connection.service")
+public class AgentServiceConfig {}
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/config/ClusterApplicationConfig.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/config/ClusterApplicationConfig.java
similarity index 100%
copy from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/config/ClusterApplicationConfig.java
copy to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/config/ClusterApplicationConfig.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/AgentController.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/AgentController.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/AgentController.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/AgentController.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/ExperimentController.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/PlanController.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/PlanController.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/PlanController.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/PlanController.java
index 6f70dedc18..e73f27b645 100644
--- a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/PlanController.java
+++ b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/controllers/PlanController.java
@@ -22,9 +22,9 @@ package org.apache.airavata.agent.connection.service.controllers;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import java.util.List;
-import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.agent.connection.service.db.entity.Plan;
 import org.apache.airavata.agent.connection.service.handlers.PlanHandler;
+import org.apache.airavata.common.security.UserContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpStatus;
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentDeploymentInfo.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentDeploymentInfo.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentDeploymentInfo.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentDeploymentInfo.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentExecution.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentExecution.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentExecution.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentExecution.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentExecutionStatus.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentExecutionStatus.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentExecutionStatus.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/AgentExecutionStatus.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/Plan.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/Plan.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/Plan.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/entity/Plan.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/AgentDeploymentInfoRepo.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/AgentDeploymentInfoRepo.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/AgentDeploymentInfoRepo.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/AgentDeploymentInfoRepo.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/AgentExecutionRepo.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/AgentExecutionRepo.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/AgentExecutionRepo.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/AgentExecutionRepo.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/AgentExecutionStatusRepo.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/AgentExecutionStatusRepo.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/AgentExecutionStatusRepo.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/AgentExecutionStatusRepo.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/PlanRepo.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/PlanRepo.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/PlanRepo.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/PlanRepo.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java
similarity index 99%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java
index e62279a05d..e173cbc373 100644
--- a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java
+++ b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java
@@ -29,8 +29,8 @@ import java.util.stream.Collectors;
 import net.devh.boot.grpc.server.service.GrpcService;
 import org.apache.airavata.agent.*;
 import org.apache.airavata.agent.AsyncCommand;
-import org.apache.airavata.agent.connection.service.models.*;
 import org.apache.airavata.agent.connection.service.config.AgentProperties;
+import org.apache.airavata.agent.connection.service.models.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -475,8 +475,10 @@ public class AgentConnectionHandler extends AgentCommunicationServiceGrpc.AgentC
                                 .setLocalBindHost(tunnelRequest.getLocalBindHost())
                                 .setTunnelServerHost(agentProperties.getTunnel().getServerHost())
                                 .setTunnelServerPort(agentProperties.getTunnel().getServerPort())
-                                .setTunnelServerApiUrl(agentProperties.getTunnel().getServerApiUrl())
-                                .setTunnelServerToken(agentProperties.getTunnel().getServerToken())
+                                .setTunnelServerApiUrl(
+                                        agentProperties.getTunnel().getServerApiUrl())
+                                .setTunnelServerToken(
+                                        agentProperties.getTunnel().getServerToken())
                                 .build())
                         .build());
             } catch (Exception e) {
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentManagementHandler.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentManagementHandler.java
similarity index 94%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentManagementHandler.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentManagementHandler.java
index 9939d25c30..cb58e23601 100644
--- a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentManagementHandler.java
+++ b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentManagementHandler.java
@@ -24,13 +24,13 @@ import java.util.List;
 import java.util.UUID;
 import java.util.stream.Collectors;
 import org.apache.airavata.agent.connection.service.config.AgentProperties;
-import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.agent.connection.service.config.ClusterApplicationConfig;
 import org.apache.airavata.agent.connection.service.models.AgentLaunchRequest;
 import org.apache.airavata.agent.connection.service.models.AgentLaunchResponse;
 import org.apache.airavata.agent.connection.service.models.AgentTerminateResponse;
 import org.apache.airavata.agent.connection.service.services.AiravataService;
 import org.apache.airavata.api.Airavata;
+import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.EnvironmentSpecificPreferences;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
@@ -61,7 +61,10 @@ public class AgentManagementHandler {
     @Value("${grpc.server.host}")
     private String grpcHost;
 
-    public AgentManagementHandler(AiravataService airavataService, ClusterApplicationConfig clusterApplicationConfig, AgentProperties agentProperties) {
+    public AgentManagementHandler(
+            AiravataService airavataService,
+            ClusterApplicationConfig clusterApplicationConfig,
+            AgentProperties agentProperties) {
         this.airavataService = airavataService;
         this.clusterApplicationConfig = clusterApplicationConfig;
         this.agentProperties = agentProperties;
@@ -69,7 +72,7 @@ public class AgentManagementHandler {
 
     public AgentTerminateResponse terminateExperiment(String experimentId) {
         try {
-            Airavata.Client airavata = airavataService.airavata();
+            Airavata.Iface airavata = airavataService.airavata();
             ExperimentModel experiment = airavata.getExperiment(UserContext.authzToken(), experimentId);
             airavata.terminateExperiment(
                     UserContext.authzToken(), experiment.getExperimentId(), experiment.getGatewayId());
@@ -82,7 +85,7 @@ public class AgentManagementHandler {
 
     public ExperimentModel getExperiment(String experimentId) {
         try {
-            Airavata.Client airavata = airavataService.airavata();
+            Airavata.Iface airavata = airavataService.airavata();
             ExperimentModel experiment = airavata.getExperiment(UserContext.authzToken(), experimentId);
             GroupResourceProfile groupResourceProfile = airavata.getGroupResourceProfile(
                     UserContext.authzToken(),
@@ -206,7 +209,7 @@ public class AgentManagementHandler {
 
     private ExperimentModel generateExperiment(AgentLaunchRequest req, String agentId, String envName)
             throws TException {
-        Airavata.Client airavataClient = airavataService.airavata();
+        Airavata.Iface airavataClient = airavataService.airavata();
 
         String experimentName = req.getExperimentName();
         String projectName = req.getProjectName() != null ? req.getProjectName() : "Default Project";
@@ -244,10 +247,15 @@ public class AgentManagementHandler {
         userConfigurationDataModel.setAiravataAutoSchedule(false);
         userConfigurationDataModel.setOverrideManualScheduledParams(false);
         userConfigurationDataModel.setInputStorageResourceId(
-                StringUtils.isNotBlank(req.getInputStorageId()) ? req.getInputStorageId() : agentProperties.getStorageResourceId());
+                StringUtils.isNotBlank(req.getInputStorageId())
+                        ? req.getInputStorageId()
+                        : agentProperties.getStorageResourceId());
         userConfigurationDataModel.setOutputStorageResourceId(
-                StringUtils.isNotBlank(req.getOutputStorageId()) ? req.getInputStorageId() : agentProperties.getStorageResourceId());
-        String experimentDataDir = Paths.get(agentProperties.getStoragePath(), gatewayId, userName, projectDir, experimentName)
+                StringUtils.isNotBlank(req.getOutputStorageId())
+                        ? req.getInputStorageId()
+                        : agentProperties.getStorageResourceId());
+        String experimentDataDir = Paths.get(
+                        agentProperties.getStoragePath(), gatewayId, userName, projectDir, experimentName)
                 .toString();
         userConfigurationDataModel.setExperimentDataDir(experimentDataDir);
         userConfigurationDataModel.setGroupResourceProfileId(groupCompResourcePref.getGroupResourceProfileId());
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/FuseFSHandler.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/FuseFSHandler.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/FuseFSHandler.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/FuseFSHandler.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/PlanHandler.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/PlanHandler.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/PlanHandler.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/PlanHandler.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandExecutionRequest.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandExecutionRequest.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandExecutionRequest.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandExecutionRequest.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandExecutionResponse.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandExecutionResponse.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandExecutionResponse.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandExecutionResponse.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandListRequest.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandListRequest.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandListRequest.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandListRequest.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandListResponse.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandListResponse.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandListResponse.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandListResponse.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandTerminateRequest.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandTerminateRequest.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandTerminateRequest.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandTerminateRequest.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandTerminateResponse.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandTerminateResponse.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandTerminateResponse.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentAsyncCommandTerminateResponse.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentCommandExecutionAck.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentCommandExecutionAck.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentCommandExecutionAck.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentCommandExecutionAck.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentCommandExecutionRequest.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentCommandExecutionRequest.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentCommandExecutionRequest.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentCommandExecutionRequest.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentCommandExecutionResponse.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentCommandExecutionResponse.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentCommandExecutionResponse.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentCommandExecutionResponse.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentEnvSetupAck.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentEnvSetupAck.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentEnvSetupAck.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentEnvSetupAck.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentEnvSetupRequest.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentEnvSetupRequest.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentEnvSetupRequest.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentEnvSetupRequest.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentEnvSetupResponse.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentEnvSetupResponse.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentEnvSetupResponse.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentEnvSetupResponse.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentInfoResponse.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentInfoResponse.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentInfoResponse.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentInfoResponse.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentJupyterExecutionAck.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentJupyterExecutionAck.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentJupyterExecutionAck.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentJupyterExecutionAck.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentJupyterExecutionRequest.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentJupyterExecutionRequest.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentJupyterExecutionRequest.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentJupyterExecutionRequest.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentJupyterExecutionResponse.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentJupyterExecutionResponse.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentJupyterExecutionResponse.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentJupyterExecutionResponse.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartAck.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartAck.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartAck.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartAck.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartRequest.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartRequest.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartRequest.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartRequest.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartResponse.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartResponse.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartResponse.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentKernelRestartResponse.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentLaunchRequest.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentLaunchRequest.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentLaunchRequest.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentLaunchRequest.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentLaunchResponse.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentLaunchResponse.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentLaunchResponse.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentLaunchResponse.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonExecutionAck.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonExecutionAck.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonExecutionAck.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonExecutionAck.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonExecutionRequest.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonExecutionRequest.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonExecutionRequest.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonExecutionRequest.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonExecutionResponse.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonExecutionResponse.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonExecutionResponse.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentPythonExecutionResponse.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTerminateResponse.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTerminateResponse.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTerminateResponse.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTerminateResponse.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelAck.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelAck.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelAck.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelAck.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelCreateRequest.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelCreateRequest.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelCreateRequest.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelCreateRequest.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelCreateResponse.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelCreateResponse.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelCreateResponse.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelCreateResponse.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelTerminateRequest.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelTerminateRequest.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelTerminateRequest.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelTerminateRequest.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelTerminateResponse.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelTerminateResponse.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelTerminateResponse.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AgentTunnelTerminateResponse.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AsyncCommand.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AsyncCommand.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AsyncCommand.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AsyncCommand.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/DirectoryInfo.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/DirectoryInfo.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/DirectoryInfo.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/DirectoryInfo.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/ExperimentStorageResponse.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/ExperimentStorageResponse.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/ExperimentStorageResponse.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/ExperimentStorageResponse.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/FileInfo.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/FileInfo.java
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/FileInfo.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/FileInfo.java
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataFileService.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataFileService.java
similarity index 99%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataFileService.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataFileService.java
index cf990fc8e8..89992c058c 100644
--- a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataFileService.java
+++ b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataFileService.java
@@ -28,11 +28,11 @@ import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import org.apache.airavata.agent.ServerMessage;
-import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.agent.connection.service.models.DirectoryInfo;
 import org.apache.airavata.agent.connection.service.models.ExperimentStorageResponse;
 import org.apache.airavata.agent.connection.service.models.FileInfo;
 import org.apache.airavata.api.Airavata;
+import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.fuse.DirEntry;
 import org.apache.airavata.fuse.ReadDirReq;
 import org.apache.airavata.fuse.ReadDirRes;
@@ -63,7 +63,7 @@ public class AiravataFileService {
     }
 
     public void handleReadDirRequest(ReadDirReq request, StreamObserver<ServerMessage> responseObserver) {
-        Airavata.Client airavataClient = airavataService.airavata();
+        Airavata.Iface airavataClient = airavataService.airavata();
         String fusePath = request.getName();
 
         ReadDirRes.Builder readDirResBuilder = ReadDirRes.newBuilder();
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataService.java b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataService.java
similarity index 78%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataService.java
rename to airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataService.java
index 5df63cc194..de857af046 100644
--- a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataService.java
+++ b/airavata-api/agent-service/src/main/java/org/apache/airavata/agent/connection/service/services/AiravataService.java
@@ -25,19 +25,16 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.api.Airavata;
-import org.apache.airavata.common.util.AiravataClientFactory;
+import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
-import org.apache.airavata.model.error.AiravataClientException;
 import org.apache.airavata.model.experiment.ExperimentSearchFields;
 import org.apache.airavata.model.experiment.ExperimentSummaryModel;
 import org.apache.airavata.model.workspace.Project;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 @Service
@@ -45,25 +42,17 @@ public class AiravataService {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(AiravataService.class);
 
-    @Value("${airavata.server.url:airavata.host}")
-    private String serverUrl;
-
-    @Value("${airavata.server.port:8930}")
-    private int port;
+    private final Airavata.Iface airavataHandler;
 
-    @Value("${airavata.server.secure:false}")
-    private boolean secure;
+    public AiravataService(Airavata.Iface airavataHandler) {
+        this.airavataHandler = airavataHandler;
+    }
 
-    public Airavata.Client airavata() {
-        try {
-            return AiravataClientFactory.createAiravataClient(serverUrl, port, secure);
-        } catch (AiravataClientException e) {
-            LOGGER.error("Error while creating Airavata client", e);
-            throw new RuntimeException("Error while creating Airavata client", e);
-        }
+    public Airavata.Iface airavata() {
+        return airavataHandler;
     }
 
-    public String getProjectId(Airavata.Client airavataClient, String projectName) throws TException {
+    public String getProjectId(Airavata.Iface airavataClient, String projectName) throws TException {
         int limit = 10;
         int offset = 0;
 
@@ -83,12 +72,11 @@ public class AiravataService {
             offset += limit;
         }
 
-        throw new RuntimeException(
-                "Could not find project: " + projectName + " for the user: " + UserContext.userId());
+        throw new RuntimeException("Could not find project: " + projectName + " for the user: " + UserContext.userId());
     }
 
     public GroupComputeResourcePreference extractGroupComputeResourcePreference(
-            Airavata.Client airavataClient, String group, String remoteCluster) throws TException {
+            Airavata.Iface airavataClient, String group, String remoteCluster) throws TException {
         List<GroupResourceProfile> groupResourceList =
                 airavataClient.getGroupResourceList(UserContext.authzToken(), UserContext.gatewayId());
         String groupProfileName = StringUtils.isNotBlank(group) ? group : "Default";
@@ -102,7 +90,7 @@ public class AiravataService {
                         + groupProfileName + " group resource profile for the user: " + UserContext.userId()));
     }
 
-    public List<String> getUserExperimentIDs(Airavata.Client airavataClient) throws TException {
+    public List<String> getUserExperimentIDs(Airavata.Iface airavataClient) throws TException {
         int limit = 100;
         Map<ExperimentSearchFields, String> filters =
                 Map.of(ExperimentSearchFields.PROJECT_ID, getProjectId(airavataClient, "Default Project"));
diff --git a/modules/agent-framework/proto/agent-communication.proto b/airavata-api/agent-service/src/main/proto/agent-communication.proto
similarity index 100%
rename from modules/agent-framework/proto/agent-communication.proto
rename to airavata-api/agent-service/src/main/proto/agent-communication.proto
diff --git a/modules/agent-framework/proto/airavata-fuse.proto b/airavata-api/agent-service/src/main/proto/airavata-fuse.proto
similarity index 100%
rename from modules/agent-framework/proto/airavata-fuse.proto
rename to airavata-api/agent-service/src/main/proto/airavata-fuse.proto
diff --git a/modules/agent-framework/agent-service/src/main/resources/distribution/bin/agent-service.sh b/airavata-api/agent-service/src/main/resources/distribution/bin/agent-service.sh
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/resources/distribution/bin/agent-service.sh
rename to airavata-api/agent-service/src/main/resources/distribution/bin/agent-service.sh
diff --git a/modules/agent-framework/agent-service/src/main/resources/distribution/bin/setenv.sh b/airavata-api/agent-service/src/main/resources/distribution/bin/setenv.sh
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/resources/distribution/bin/setenv.sh
rename to airavata-api/agent-service/src/main/resources/distribution/bin/setenv.sh
diff --git a/modules/agent-framework/agent-service/src/main/resources/distribution/conf/.gitkeep b/airavata-api/agent-service/src/main/resources/distribution/conf/.gitkeep
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/resources/distribution/conf/.gitkeep
rename to airavata-api/agent-service/src/main/resources/distribution/conf/.gitkeep
diff --git a/modules/agent-framework/agent-service/src/main/resources/log4j2.xml b/airavata-api/agent-service/src/main/resources/log4j2.xml
similarity index 100%
rename from modules/agent-framework/agent-service/src/main/resources/log4j2.xml
rename to airavata-api/agent-service/src/main/resources/log4j2.xml
diff --git a/modules/file-server/pom.xml b/airavata-api/file-server/pom.xml
similarity index 100%
copy from modules/file-server/pom.xml
copy to airavata-api/file-server/pom.xml
diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/config/ClusterApplicationConfig.java b/airavata-api/file-server/src/main/java/org/apache/airavata/file/server/FileServerConfiguration.java
similarity index 68%
rename from modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/config/ClusterApplicationConfig.java
rename to airavata-api/file-server/src/main/java/org/apache/airavata/file/server/FileServerConfiguration.java
index 52e77b2f69..ec35cc888a 100644
--- a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/config/ClusterApplicationConfig.java
+++ b/airavata-api/file-server/src/main/java/org/apache/airavata/file/server/FileServerConfiguration.java
@@ -17,22 +17,20 @@
 * specific language governing permissions and limitations
 * under the License.
 */
-package org.apache.airavata.agent.connection.service.config;
+package org.apache.airavata.file.server;
 
+import org.apache.airavata.execution.orchestrator.AdaptorSupport;
+import org.apache.airavata.execution.orchestrator.AdaptorSupportImpl;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Component;
 
 @Component
-@ConfigurationProperties(prefix = "airavata.cluster")
-public class ClusterApplicationConfig {
+@ConfigurationProperties
+public class FileServerConfiguration {
 
-    private String applicationInterfaceId;
-
-    public String getApplicationInterfaceId() {
-        return applicationInterfaceId;
-    }
-
-    public void setApplicationInterfaceId(String applicationInterfaceId) {
-        this.applicationInterfaceId = applicationInterfaceId;
+    @Bean
+    public AdaptorSupport adaptorSupport() {
+        return AdaptorSupportImpl.getInstance();
     }
 }
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/dto/ModifyResourceRequest.java b/airavata-api/file-server/src/main/java/org/apache/airavata/file/server/config/FileServerConfig.java
similarity index 73%
copy from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/dto/ModifyResourceRequest.java
copy to airavata-api/file-server/src/main/java/org/apache/airavata/file/server/config/FileServerConfig.java
index 81bcf7f293..d94ee7acf2 100644
--- a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/dto/ModifyResourceRequest.java
+++ b/airavata-api/file-server/src/main/java/org/apache/airavata/file/server/config/FileServerConfig.java
@@ -17,17 +17,11 @@
 * specific language governing permissions and limitations
 * under the License.
 */
-package org.apache.airavata.research.service.dto;
+package org.apache.airavata.file.server.config;
 
-public class ModifyResourceRequest extends CreateResourceRequest {
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
 
-    public String id;
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-}
+@Configuration
+@ComponentScan(basePackages = "org.apache.airavata.file.server")
+public class FileServerConfig {}
diff --git a/modules/file-server/src/main/java/org/apache/airavata/file/server/controller/FileController.java b/airavata-api/file-server/src/main/java/org/apache/airavata/file/server/controller/FileController.java
similarity index 100%
rename from modules/file-server/src/main/java/org/apache/airavata/file/server/controller/FileController.java
rename to airavata-api/file-server/src/main/java/org/apache/airavata/file/server/controller/FileController.java
diff --git a/modules/file-server/src/main/java/org/apache/airavata/file/server/model/AiravataDirectory.java b/airavata-api/file-server/src/main/java/org/apache/airavata/file/server/model/AiravataDirectory.java
similarity index 100%
rename from modules/file-server/src/main/java/org/apache/airavata/file/server/model/AiravataDirectory.java
rename to airavata-api/file-server/src/main/java/org/apache/airavata/file/server/model/AiravataDirectory.java
diff --git a/modules/file-server/src/main/java/org/apache/airavata/file/server/model/AiravataFile.java b/airavata-api/file-server/src/main/java/org/apache/airavata/file/server/model/AiravataFile.java
similarity index 100%
rename from modules/file-server/src/main/java/org/apache/airavata/file/server/model/AiravataFile.java
rename to airavata-api/file-server/src/main/java/org/apache/airavata/file/server/model/AiravataFile.java
diff --git a/modules/file-server/src/main/java/org/apache/airavata/file/server/model/FileUploadResponse.java b/airavata-api/file-server/src/main/java/org/apache/airavata/file/server/model/FileUploadResponse.java
similarity index 100%
rename from modules/file-server/src/main/java/org/apache/airavata/file/server/model/FileUploadResponse.java
rename to airavata-api/file-server/src/main/java/org/apache/airavata/file/server/model/FileUploadResponse.java
diff --git a/modules/file-server/src/main/java/org/apache/airavata/file/server/service/AirvataFileService.java b/airavata-api/file-server/src/main/java/org/apache/airavata/file/server/service/AirvataFileService.java
similarity index 95%
rename from modules/file-server/src/main/java/org/apache/airavata/file/server/service/AirvataFileService.java
rename to airavata-api/file-server/src/main/java/org/apache/airavata/file/server/service/AirvataFileService.java
index f136f9cbe5..1d14cb53f1 100644
--- a/modules/file-server/src/main/java/org/apache/airavata/file/server/service/AirvataFileService.java
+++ b/airavata-api/file-server/src/main/java/org/apache/airavata/file/server/service/AirvataFileService.java
@@ -24,7 +24,6 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
 import java.util.List;
-import org.apache.airavata.common.util.ThriftClientPool;
 import org.apache.airavata.compute.util.AgentAdaptor;
 import org.apache.airavata.execution.orchestrator.AdaptorSupport;
 import org.apache.airavata.file.server.model.AiravataDirectory;
@@ -46,7 +45,7 @@ public class AirvataFileService {
     private AdaptorSupport adaptorSupport;
 
     @Autowired
-    ThriftClientPool<RegistryService.Client> registryClientPool;
+    RegistryService.Iface registryClient;
 
     private AgentAdaptor getAgentAdaptor(ProcessDataManager dataManager, String processId) throws Exception {
         AgentAdaptor agentAdaptor;
@@ -60,7 +59,7 @@ public class AirvataFileService {
     }
 
     public FileMetadata getInfo(String processId, String subPath) throws Exception {
-        ProcessDataManager dataManager = new ProcessDataManager(registryClientPool, processId, adaptorSupport);
+        ProcessDataManager dataManager = new ProcessDataManager(registryClient, processId, adaptorSupport);
         AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId);
         String absPath = dataManager.getBaseDir() + subPath;
 
@@ -69,7 +68,7 @@ public class AirvataFileService {
     }
 
     public AiravataDirectory listDir(String processId, String subPath) throws Exception {
-        ProcessDataManager dataManager = new ProcessDataManager(registryClientPool, processId, adaptorSupport);
+        ProcessDataManager dataManager = new ProcessDataManager(registryClient, processId, adaptorSupport);
         AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId);
 
         String absPath = dataManager.getBaseDir() + subPath;
@@ -96,7 +95,7 @@ public class AirvataFileService {
     }
 
     public AiravataFile listFile(String processId, String subPath) throws Exception {
-        ProcessDataManager dataManager = new ProcessDataManager(registryClientPool, processId, adaptorSupport);
+        ProcessDataManager dataManager = new ProcessDataManager(registryClient, processId, adaptorSupport);
         AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId);
 
         String absPath = dataManager.getBaseDir() + subPath;
@@ -113,7 +112,7 @@ public class AirvataFileService {
         metadata.setSize(file.getSize());
         Files.copy(file.getInputStream(), tempPath, StandardCopyOption.REPLACE_EXISTING);
 
-        ProcessDataManager dataManager = new ProcessDataManager(registryClientPool, processId, adaptorSupport);
+        ProcessDataManager dataManager = new ProcessDataManager(registryClient, processId, adaptorSupport);
         AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId);
         String absPath = dataManager.getBaseDir() + subPath;
 
@@ -133,7 +132,7 @@ public class AirvataFileService {
 
     public Path downloadFile(String processId, String subPath) throws Exception {
 
-        ProcessDataManager dataManager = new ProcessDataManager(registryClientPool, processId, adaptorSupport);
+        ProcessDataManager dataManager = new ProcessDataManager(registryClient, processId, adaptorSupport);
         AgentAdaptor agentAdaptor = getAgentAdaptor(dataManager, processId);
         String absPath = dataManager.getBaseDir() + subPath;
 
diff --git a/modules/file-server/src/main/java/org/apache/airavata/file/server/service/ProcessDataManager.java b/airavata-api/file-server/src/main/java/org/apache/airavata/file/server/service/ProcessDataManager.java
similarity index 86%
rename from modules/file-server/src/main/java/org/apache/airavata/file/server/service/ProcessDataManager.java
rename to airavata-api/file-server/src/main/java/org/apache/airavata/file/server/service/ProcessDataManager.java
index 8d057cbb3a..3b55d3598c 100644
--- a/modules/file-server/src/main/java/org/apache/airavata/file/server/service/ProcessDataManager.java
+++ b/airavata-api/file-server/src/main/java/org/apache/airavata/file/server/service/ProcessDataManager.java
@@ -20,7 +20,6 @@
 package org.apache.airavata.file.server.service;
 
 import java.util.UUID;
-import org.apache.airavata.common.util.ThriftClientPool;
 import org.apache.airavata.compute.task.aws.AWSProcessContextManager;
 import org.apache.airavata.compute.util.AgentAdaptor;
 import org.apache.airavata.compute.util.AgentUtils;
@@ -45,28 +44,21 @@ public class ProcessDataManager extends OutputDataStagingTask {
     private ProcessModel process;
     ExperimentModel experiment;
 
-    public ProcessDataManager(
-            ThriftClientPool<RegistryService.Client> registryClientPool,
-            String processId,
-            AdaptorSupport adaptorSupport)
+    public ProcessDataManager(RegistryService.Iface registryClient, String processId, AdaptorSupport adaptorSupport)
             throws Exception {
 
         this.adaptorSupport = adaptorSupport;
-        RegistryService.Client regClient = registryClientPool.getResource();
         try {
-            process = regClient.getProcess(processId);
-            experiment = regClient.getExperiment(process.getExperimentId());
+            process = registryClient.getProcess(processId);
+            experiment = registryClient.getExperiment(process.getExperimentId());
 
             setTaskId(UUID.randomUUID().toString());
             setProcessId(processId);
             setExperimentId(process.getExperimentId());
             setGatewayId(experiment.getGatewayId());
             loadContext();
-
-            registryClientPool.returnResource(regClient);
         } catch (Exception e) {
             logger.error("Failed to initialize the output data mover for process {}", processId, e);
-            registryClientPool.returnBrokenResource(regClient);
             throw e;
         }
         this.processId = processId;
diff --git a/modules/file-server/src/main/resources/distribution/bin/file-service.sh b/airavata-api/file-server/src/main/resources/distribution/bin/file-service.sh
similarity index 100%
rename from modules/file-server/src/main/resources/distribution/bin/file-service.sh
rename to airavata-api/file-server/src/main/resources/distribution/bin/file-service.sh
diff --git a/modules/file-server/src/main/resources/distribution/bin/setenv.sh b/airavata-api/file-server/src/main/resources/distribution/bin/setenv.sh
similarity index 100%
rename from modules/file-server/src/main/resources/distribution/bin/setenv.sh
rename to airavata-api/file-server/src/main/resources/distribution/bin/setenv.sh
diff --git a/modules/file-server/src/main/resources/distribution/conf/.gitkeep b/airavata-api/file-server/src/main/resources/distribution/conf/.gitkeep
similarity index 100%
rename from modules/file-server/src/main/resources/distribution/conf/.gitkeep
rename to airavata-api/file-server/src/main/resources/distribution/conf/.gitkeep
diff --git a/modules/file-server/src/main/resources/log4j2.xml b/airavata-api/file-server/src/main/resources/log4j2.xml
similarity index 100%
rename from modules/file-server/src/main/resources/log4j2.xml
rename to airavata-api/file-server/src/main/resources/log4j2.xml
diff --git a/airavata-api/pom.xml b/airavata-api/pom.xml
index 177e1462e4..babd67e0a3 100644
--- a/airavata-api/pom.xml
+++ b/airavata-api/pom.xml
@@ -101,14 +101,8 @@ under the License.
       <artifactId>commons-cli</artifactId>
     </dependency>
     <dependency>
-      <groupId>com.github.dozermapper</groupId>
-      <artifactId>dozer-core</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>org.slf4j</groupId>
-          <artifactId>slf4j-log4j12</artifactId>
-        </exclusion>
-      </exclusions>
+      <groupId>org.mapstruct</groupId>
+      <artifactId>mapstruct</artifactId>
     </dependency>
     <dependency>
       <groupId>org.hibernate.orm</groupId>
@@ -410,6 +404,21 @@ under the License.
         </executions>
       </plugin>
 
+      <!-- MapStruct annotation processor -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <annotationProcessorPaths>
+            <path>
+              <groupId>org.mapstruct</groupId>
+              <artifactId>mapstruct-processor</artifactId>
+              <version>1.6.3</version>
+            </path>
+          </annotationProcessorPaths>
+        </configuration>
+      </plugin>
+
       <!-- Enforce version convergence -->
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
@@ -450,7 +459,7 @@ under the License.
                   <arg value="java:beans,jakarta_annotations=undated" />
                   <arg value="-out" />
                   <arg value="${project.build.directory}/generated-sources/thrift" />
-                  <arg value="${project.basedir}/../airavata-thrift-server/src/main/thrift/stubs_java.thrift" />
+                  <arg value="${project.basedir}/../airavata-server/thrift/src/main/thrift/stubs_java.thrift" />
                 </exec>
               </target>
             </configuration>
@@ -505,10 +514,6 @@ under the License.
         <artifactId>maven-surefire-plugin</artifactId>
         <inherited>true</inherited>
         <configuration>
-          <failIfNoTests>false</failIfNoTests>
-          <workingDirectory>${project.build.testOutputDirectory}</workingDirectory>
-          <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
-          <!--  -->
           <systemPropertyVariables>
             <credential.module.directory>${basedir}</credential.module.directory>
           </systemPropertyVariables>
@@ -520,9 +525,6 @@ under the License.
             <exclude>**/DAOBaseTestCase.java</exclude>
             <exclude>**/MappingDAOTest.java</exclude>
           </excludes>
-          <!-- Exclude @Tag("integration") tests by default — they require Docker.
-               Run with: mvn test -Dgroups=integration -Dsurefire.excludedGroups="" -->
-          <excludedGroups>${surefire.excludedGroups}</excludedGroups>
         </configuration>
       </plugin>
 
@@ -614,7 +616,6 @@ under the License.
   </build>
 
   <properties>
-    <surefire.excludedGroups>integration</surefire.excludedGroups>
     <docker.api.server.build.directory>${project.build.directory}/api_server_docker_img_build</docker.api.server.build.directory>
     <docker.api.server.image.src.root>src/main/docker</docker.api.server.image.src.root>
     <api.server.dist.name>apache-airavata-api-server-${project.version}</api.server.dist.name>
diff --git a/modules/research-framework/research-service/README.md b/airavata-api/research-service/README.md
similarity index 100%
rename from modules/research-framework/research-service/README.md
rename to airavata-api/research-service/README.md
diff --git a/modules/research-framework/research-service/pom.xml b/airavata-api/research-service/pom.xml
similarity index 99%
rename from modules/research-framework/research-service/pom.xml
rename to airavata-api/research-service/pom.xml
index d6796746f4..6d43f98a7e 100644
--- a/modules/research-framework/research-service/pom.xml
+++ b/airavata-api/research-service/pom.xml
@@ -25,7 +25,7 @@ under the License.
     <groupId>org.apache.airavata</groupId>
     <artifactId>airavata</artifactId>
     <version>0.21-SNAPSHOT</version>
-    <relativePath>../../../pom.xml</relativePath>
+    <relativePath>../../pom.xml</relativePath>
   </parent>
 
   <artifactId>research-service</artifactId>
diff --git a/modules/research-framework/research-service/src/main/compose/dbinit/01-init-db.sql b/airavata-api/research-service/src/main/compose/dbinit/01-init-db.sql
similarity index 100%
rename from modules/research-framework/research-service/src/main/compose/dbinit/01-init-db.sql
rename to airavata-api/research-service/src/main/compose/dbinit/01-init-db.sql
diff --git a/modules/research-framework/research-service/src/main/compose/docker-compose.yaml b/airavata-api/research-service/src/main/compose/docker-compose.yaml
similarity index 100%
rename from modules/research-framework/research-service/src/main/compose/docker-compose.yaml
rename to airavata-api/research-service/src/main/compose/docker-compose.yaml
diff --git a/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java
new file mode 100644
index 0000000000..f9fd706cb6
--- /dev/null
+++ b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/AiravataService.java
@@ -0,0 +1,51 @@
+/**
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+package org.apache.airavata.research.service;
+
+import org.apache.airavata.common.security.UserContext;
+import org.apache.airavata.model.user.UserProfile;
+import org.apache.airavata.security.profile.user.core.repositories.UserProfileRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AiravataService {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AiravataService.class);
+
+    private final UserProfileRepository userProfileRepository = new UserProfileRepository();
+
+    public UserProfile getUserProfile(String userId) {
+        UserProfile profile = userProfileRepository.getUserProfileByIdAndGateWay(userId, UserContext.gatewayId());
+        if (profile == null) {
+            throw new RuntimeException("User profile not found for id: " + userId);
+        }
+        return profile;
+    }
+
+    public UserProfile getUserProfile(String authzToken, String userId, String gatewayId) {
+        UserProfile profile = userProfileRepository.getUserProfileByIdAndGateWay(userId, gatewayId);
+        if (profile == null) {
+            throw new RuntimeException("User profile not found for id: " + userId + " in gateway: " + gatewayId);
+        }
+        return profile;
+    }
+}
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/DevDataInitializer.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/config/DevDataInitializer.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/DevDataInitializer.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/config/DevDataInitializer.java
diff --git a/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/config/ResearchProperties.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/config/ResearchProperties.java
new file mode 100644
index 0000000000..eac77a921f
--- /dev/null
+++ b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/config/ResearchProperties.java
@@ -0,0 +1,82 @@
+/**
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+package org.apache.airavata.research.service.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "airavata.research")
+public class ResearchProperties {
+    private String hubUrl;
+    private String portalUrl;
+    private String devUrl;
+    private String devUser;
+    private String adminApiKey;
+    private int limit = 10;
+
+    public String getHubUrl() {
+        return hubUrl;
+    }
+
+    public void setHubUrl(String hubUrl) {
+        this.hubUrl = hubUrl;
+    }
+
+    public String getPortalUrl() {
+        return portalUrl;
+    }
+
+    public void setPortalUrl(String portalUrl) {
+        this.portalUrl = portalUrl;
+    }
+
+    public String getDevUrl() {
+        return devUrl;
+    }
+
+    public void setDevUrl(String devUrl) {
+        this.devUrl = devUrl;
+    }
+
+    public String getDevUser() {
+        return devUser;
+    }
+
+    public void setDevUser(String devUser) {
+        this.devUser = devUser;
+    }
+
+    public String getAdminApiKey() {
+        return adminApiKey;
+    }
+
+    public void setAdminApiKey(String adminApiKey) {
+        this.adminApiKey = adminApiKey;
+    }
+
+    public int getLimit() {
+        return limit;
+    }
+
+    public void setLimit(int limit) {
+        this.limit = limit;
+    }
+}
diff --git a/airavata-thrift-server/src/main/java/org/apache/airavata/thrift/server/AiravataThriftServerConfig.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/config/ResearchServiceConfig.java
similarity index 63%
copy from airavata-thrift-server/src/main/java/org/apache/airavata/thrift/server/AiravataThriftServerConfig.java
copy to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/config/ResearchServiceConfig.java
index 81af820223..c6f98d877b 100644
--- a/airavata-thrift-server/src/main/java/org/apache/airavata/thrift/server/AiravataThriftServerConfig.java
+++ b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/config/ResearchServiceConfig.java
@@ -17,22 +17,17 @@
 * specific language governing permissions and limitations
 * under the License.
 */
-package org.apache.airavata.thrift.server;
+package org.apache.airavata.research.service.config;
 
-import org.apache.airavata.common.config.ConditionalOnServer;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 
 @Configuration
-@ConditionalOnServer("thrift")
-@ComponentScan(basePackages = {
-    "org.apache.airavata.api.server.handler",
-    "org.apache.airavata.credential.handler",
-    "org.apache.airavata.execution.handler",
-    "org.apache.airavata.sharing.handler",
-    "org.apache.airavata.service.profile.handlers",
-    "org.apache.airavata.orchestrator.server",
-    "org.apache.airavata.thrift.server.config"
-})
-public class AiravataThriftServerConfig {
-}
+@ComponentScan(basePackages = "org.apache.airavata.research.service")
+@EntityScan(basePackages = "org.apache.airavata.research.service")
+@EnableJpaRepositories(basePackages = "org.apache.airavata.research.service")
+@EnableJpaAuditing
+public class ResearchServiceConfig {}
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/GlobalExceptionController.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/controller/GlobalExceptionController.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/GlobalExceptionController.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/controller/GlobalExceptionController.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ProjectController.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/controller/ProjectController.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ProjectController.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/controller/ProjectController.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ResearchHubController.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/controller/ResearchHubController.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ResearchHubController.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/controller/ResearchHubController.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ResourceController.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/controller/ResourceController.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ResourceController.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/controller/ResourceController.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/SessionController.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/controller/SessionController.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/SessionController.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/controller/SessionController.java
index 4396f50c2a..ab3de088af 100644
--- a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/SessionController.java
+++ b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/controller/SessionController.java
@@ -22,9 +22,9 @@ package org.apache.airavata.research.service.controller;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import java.util.List;
+import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.research.service.enums.SessionStatusEnum;
 import org.apache.airavata.research.service.handlers.SessionHandler;
-import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.research.service.model.entity.Session;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/dto/CreateProjectRequest.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/dto/CreateProjectRequest.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/dto/CreateProjectRequest.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/dto/CreateProjectRequest.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/dto/CreateResourceRequest.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/dto/CreateResourceRequest.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/dto/CreateResourceRequest.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/dto/CreateResourceRequest.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/dto/ModifyResourceRequest.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/dto/ModifyResourceRequest.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/dto/ModifyResourceRequest.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/dto/ModifyResourceRequest.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/dto/RedirectResponse.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/dto/RedirectResponse.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/dto/RedirectResponse.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/dto/RedirectResponse.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/dto/ResourceResponse.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/dto/ResourceResponse.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/dto/ResourceResponse.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/dto/ResourceResponse.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/PrivacyEnum.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/enums/PrivacyEnum.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/PrivacyEnum.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/enums/PrivacyEnum.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/ResourceTypeEnum.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/enums/ResourceTypeEnum.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/ResourceTypeEnum.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/enums/ResourceTypeEnum.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/SessionStatusEnum.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/enums/SessionStatusEnum.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/SessionStatusEnum.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/enums/SessionStatusEnum.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/StateEnum.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/enums/StateEnum.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/StateEnum.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/enums/StateEnum.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/StatusEnum.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/enums/StatusEnum.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/StatusEnum.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/enums/StatusEnum.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/exception/ErrorResponse.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/exception/ErrorResponse.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/exception/ErrorResponse.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/exception/ErrorResponse.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/exception/GlobalExceptionHandler.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/exception/GlobalExceptionHandler.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/exception/GlobalExceptionHandler.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/exception/GlobalExceptionHandler.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
index 0106ebce34..384c65223a 100644
--- a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
+++ b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
@@ -25,10 +25,10 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
+import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.research.service.dto.CreateProjectRequest;
 import org.apache.airavata.research.service.enums.ResourceTypeEnum;
 import org.apache.airavata.research.service.enums.StateEnum;
-import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.research.service.model.entity.DatasetResource;
 import org.apache.airavata.research.service.model.entity.Project;
 import org.apache.airavata.research.service.model.entity.RepositoryResource;
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResearchHubHandler.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResearchHubHandler.java
similarity index 97%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResearchHubHandler.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResearchHubHandler.java
index c5a583c81c..d5cb73e485 100644
--- a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResearchHubHandler.java
+++ b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResearchHubHandler.java
@@ -24,15 +24,15 @@ import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
-import org.apache.airavata.research.service.enums.SessionStatusEnum;
 import org.apache.airavata.common.security.UserContext;
+import org.apache.airavata.research.service.config.ResearchProperties;
+import org.apache.airavata.research.service.enums.SessionStatusEnum;
 import org.apache.airavata.research.service.model.entity.DatasetResource;
 import org.apache.airavata.research.service.model.entity.Project;
 import org.apache.airavata.research.service.model.entity.Session;
 import org.apache.airavata.research.service.model.repo.ProjectRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.airavata.research.service.config.ResearchProperties;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpMethod;
@@ -149,7 +149,8 @@ public class ResearchHubHandler {
         // TODO restrict this execution for owner
         Session session = sessionHandler.findSession(sessionId);
 
-        String sessionUrl = String.format(RH_SESSION_URL, researchProperties.getHubUrl(), UserContext.userId(), session.getId());
+        String sessionUrl =
+                String.format(RH_SESSION_URL, researchProperties.getHubUrl(), UserContext.userId(), session.getId());
         LOGGER.debug("Generated the session url: {} for the user: {}", sessionUrl, UserContext.userId());
         return sessionUrl;
     }
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResourceHandler.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResourceHandler.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResourceHandler.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResourceHandler.java
index 02c30e963e..780f933dd3 100644
--- a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResourceHandler.java
+++ b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResourceHandler.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
+import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.model.user.UserProfile;
 import org.apache.airavata.research.service.AiravataService;
 import org.apache.airavata.research.service.dto.CreateResourceRequest;
@@ -34,7 +35,6 @@ import org.apache.airavata.research.service.enums.PrivacyEnum;
 import org.apache.airavata.research.service.enums.ResourceTypeEnum;
 import org.apache.airavata.research.service.enums.StateEnum;
 import org.apache.airavata.research.service.enums.StatusEnum;
-import org.apache.airavata.common.security.UserContext;
 import org.apache.airavata.research.service.model.entity.RepositoryResource;
 import org.apache.airavata.research.service.model.entity.Resource;
 import org.apache.airavata.research.service.model.entity.ResourceStar;
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/SessionHandler.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/handlers/SessionHandler.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/SessionHandler.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/handlers/SessionHandler.java
index 6c1d442a44..59e38de3b4 100644
--- a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/SessionHandler.java
+++ b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/handlers/SessionHandler.java
@@ -22,8 +22,8 @@ package org.apache.airavata.research.service.handlers;
 import jakarta.persistence.EntityNotFoundException;
 import java.util.List;
 import java.util.UUID;
-import org.apache.airavata.research.service.enums.SessionStatusEnum;
 import org.apache.airavata.common.security.UserContext;
+import org.apache.airavata.research.service.enums.SessionStatusEnum;
 import org.apache.airavata.research.service.model.entity.Project;
 import org.apache.airavata.research.service.model.entity.Session;
 import org.apache.airavata.research.service.model.repo.SessionRepository;
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/DatasetResource.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/DatasetResource.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/DatasetResource.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/DatasetResource.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/ModelResource.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/ModelResource.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/ModelResource.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/ModelResource.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/NotebookResource.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/NotebookResource.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/NotebookResource.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/NotebookResource.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Project.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Project.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Project.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Project.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/RepositoryResource.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/RepositoryResource.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/RepositoryResource.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/RepositoryResource.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Resource.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Resource.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Resource.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Resource.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/ResourceStar.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/ResourceStar.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/ResourceStar.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/ResourceStar.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Session.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Session.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Session.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Session.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Tag.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Tag.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Tag.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Tag.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ProjectRepository.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ProjectRepository.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ProjectRepository.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ProjectRepository.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ResourceRepository.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ResourceRepository.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ResourceRepository.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ResourceRepository.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ResourceStarRepository.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ResourceStarRepository.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ResourceStarRepository.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ResourceStarRepository.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/SessionRepository.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/repo/SessionRepository.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/SessionRepository.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/repo/SessionRepository.java
diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/TagRepository.java b/airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/repo/TagRepository.java
similarity index 100%
rename from modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/TagRepository.java
rename to airavata-api/research-service/src/main/java/org/apache/airavata/research/service/model/repo/TagRepository.java
diff --git a/modules/research-framework/research-service/src/main/proto/research-service.proto b/airavata-api/research-service/src/main/proto/research-service.proto
similarity index 100%
rename from modules/research-framework/research-service/src/main/proto/research-service.proto
rename to airavata-api/research-service/src/main/proto/research-service.proto
diff --git a/modules/research-framework/research-service/src/main/resources/distribution/bin/research-service.sh b/airavata-api/research-service/src/main/resources/distribution/bin/research-service.sh
similarity index 100%
rename from modules/research-framework/research-service/src/main/resources/distribution/bin/research-service.sh
rename to airavata-api/research-service/src/main/resources/distribution/bin/research-service.sh
diff --git a/modules/research-framework/research-service/src/main/resources/distribution/bin/setenv.sh b/airavata-api/research-service/src/main/resources/distribution/bin/setenv.sh
similarity index 100%
rename from modules/research-framework/research-service/src/main/resources/distribution/bin/setenv.sh
rename to airavata-api/research-service/src/main/resources/distribution/bin/setenv.sh
diff --git a/modules/research-framework/research-service/src/main/resources/distribution/conf/.gitkeep b/airavata-api/research-service/src/main/resources/distribution/conf/.gitkeep
similarity index 100%
rename from modules/research-framework/research-service/src/main/resources/distribution/conf/.gitkeep
rename to airavata-api/research-service/src/main/resources/distribution/conf/.gitkeep
diff --git a/modules/research-framework/research-service/src/main/resources/log4j2.xml b/airavata-api/research-service/src/main/resources/log4j2.xml
similarity index 100%
rename from modules/research-framework/research-service/src/main/resources/log4j2.xml
rename to airavata-api/research-service/src/main/resources/log4j2.xml
diff --git a/airavata-api/src/main/java/org/apache/airavata/common/config/AiravataServerProperties.java b/airavata-api/src/main/java/org/apache/airavata/common/config/AiravataServerProperties.java
index 46ae58aa49..8011c0d0ac 100644
--- a/airavata-api/src/main/java/org/apache/airavata/common/config/AiravataServerProperties.java
+++ b/airavata-api/src/main/java/org/apache/airavata/common/config/AiravataServerProperties.java
@@ -1,7 +1,26 @@
+/**
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
 package org.apache.airavata.common.config;
 
-import org.springframework.boot.context.properties.ConfigurationProperties;
 import java.util.List;
+import org.springframework.boot.context.properties.ConfigurationProperties;
 
 /**
  * Binds the {@code airavata.servers} list property.
@@ -11,6 +30,11 @@ import java.util.List;
 public class AiravataServerProperties {
     private List<String> servers = List.of("thrift", "rest", "grpc");
 
-    public List<String> getServers() { return servers; }
-    public void setServers(List<String> servers) { this.servers = servers; }
+    public List<String> getServers() {
+        return servers;
+    }
+
+    public void setServers(List<String> servers) {
+        this.servers = servers;
+    }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/common/config/ConditionalOnServer.java b/airavata-api/src/main/java/org/apache/airavata/common/config/ConditionalOnServer.java
index 015d919e40..c7e1c804e2 100644
--- a/airavata-api/src/main/java/org/apache/airavata/common/config/ConditionalOnServer.java
+++ b/airavata-api/src/main/java/org/apache/airavata/common/config/ConditionalOnServer.java
@@ -1,7 +1,26 @@
+/**
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
 package org.apache.airavata.common.config;
 
-import org.springframework.context.annotation.Conditional;
 import java.lang.annotation.*;
+import org.springframework.context.annotation.Conditional;
 
 @Target({ElementType.TYPE, ElementType.METHOD})
 @Retention(RetentionPolicy.RUNTIME)
diff --git a/airavata-api/src/main/java/org/apache/airavata/common/config/OnServerCondition.java b/airavata-api/src/main/java/org/apache/airavata/common/config/OnServerCondition.java
index 6356b9dc53..cac321e5e9 100644
--- a/airavata-api/src/main/java/org/apache/airavata/common/config/OnServerCondition.java
+++ b/airavata-api/src/main/java/org/apache/airavata/common/config/OnServerCondition.java
@@ -1,10 +1,29 @@
+/**
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT 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.config;
 
+import java.util.Arrays;
+import java.util.Map;
 import org.springframework.context.annotation.Condition;
 import org.springframework.context.annotation.ConditionContext;
 import org.springframework.core.type.AnnotatedTypeMetadata;
-import java.util.Arrays;
-import java.util.Map;
 
 public class OnServerCondition implements Condition {
     @Override
diff --git a/airavata-api/src/main/java/org/apache/airavata/sharing/util/JPAUtils.java b/airavata-api/src/main/java/org/apache/airavata/common/db/EntityManagerFactoryHolder.java
similarity index 53%
rename from airavata-api/src/main/java/org/apache/airavata/sharing/util/JPAUtils.java
rename to airavata-api/src/main/java/org/apache/airavata/common/db/EntityManagerFactoryHolder.java
index 4956d2393d..076b954782 100644
--- a/airavata-api/src/main/java/org/apache/airavata/sharing/util/JPAUtils.java
+++ b/airavata-api/src/main/java/org/apache/airavata/common/db/EntityManagerFactoryHolder.java
@@ -17,30 +17,44 @@
 * specific language governing permissions and limitations
 * under the License.
 */
-package org.apache.airavata.sharing.util;
+package org.apache.airavata.common.db;
 
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.EntityManagerFactory;
-import org.apache.airavata.common.db.JDBCConfig;
 
-public class JPAUtils {
-    public static final String PERSISTENCE_UNIT_NAME = "airavata-sharing-registry";
-    private static final JDBCConfig JDBC_CONFIG = new SharingRegistryJDBCConfig();
+/**
+ * Static holder for the single application-wide {@link EntityManagerFactory}.
+ * Set once at startup by {@code EntityManagerFactoryRegistrar} (Spring) or
+ * manually in tests.
+ */
+public class EntityManagerFactoryHolder {
     private static volatile EntityManagerFactory factory;
+    private static final ThreadLocal<EntityManager> testEntityManager = new ThreadLocal<>();
+
+    public static void setFactory(EntityManagerFactory emf) {
+        factory = emf;
+    }
 
-    private static EntityManagerFactory getFactory() {
+    public static EntityManagerFactory getFactory() {
         if (factory == null) {
-            synchronized (JPAUtils.class) {
-                if (factory == null) {
-                    factory = org.apache.airavata.common.db.JPAUtils.getEntityManagerFactory(
-                            PERSISTENCE_UNIT_NAME, JDBC_CONFIG);
-                }
-            }
+            throw new IllegalStateException("EntityManagerFactory not initialized");
         }
         return factory;
     }
 
-    public static EntityManager getEntityManager() {
+    public static EntityManager createEntityManager() {
         return getFactory().createEntityManager();
     }
+
+    public static void setTestEntityManager(EntityManager em) {
+        testEntityManager.set(em);
+    }
+
+    public static EntityManager getTestEntityManager() {
+        return testEntityManager.get();
+    }
+
+    public static void clearTestEntityManager() {
+        testEntityManager.remove();
+    }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserInputRepository.java b/airavata-api/src/main/java/org/apache/airavata/common/db/EntityManagerFactoryRegistrar.java
similarity index 52%
copy from airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserInputRepository.java
copy to airavata-api/src/main/java/org/apache/airavata/common/db/EntityManagerFactoryRegistrar.java
index 5f109049b0..174b5bc674 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/ParserInputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/common/db/EntityManagerFactoryRegistrar.java
@@ -17,28 +17,33 @@
 * specific language governing permissions and limitations
 * under the License.
 */
-package org.apache.airavata.compute.repository;
+package org.apache.airavata.common.db;
 
-import org.apache.airavata.compute.model.ParserInputEntity;
-import org.apache.airavata.execution.util.cpi.AppCatalogException;
-import org.apache.airavata.model.appcatalog.parser.ParserInput;
+import jakarta.annotation.PostConstruct;
+import jakarta.persistence.EntityManagerFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
 
-public class ParserInputRepository extends AppCatAbstractRepository<ParserInput, ParserInputEntity, String> {
+/**
+ * Bridges the Spring-managed {@link EntityManagerFactory} into the static
+ * {@link EntityManagerFactoryHolder} so that non-Spring repository classes
+ * can obtain an {@link jakarta.persistence.EntityManager}.
+ */
+@Component
+public class EntityManagerFactoryRegistrar {
+
+    private static final Logger logger = LoggerFactory.getLogger(EntityManagerFactoryRegistrar.class);
 
-    private static final Logger logger = LoggerFactory.getLogger(ParserInputRepository.class);
+    private final EntityManagerFactory emf;
 
-    public ParserInputRepository() {
-        super(ParserInput.class, ParserInputEntity.class);
+    public EntityManagerFactoryRegistrar(EntityManagerFactory emf) {
+        this.emf = emf;
     }
 
-    public ParserInput getParserInput(String inputId) throws AppCatalogException {
-        try {
-            return super.get(inputId);
-        } catch (Exception e) {
-            logger.error("Failed to fetch parser input with id " + inputId, e);
-            throw new AppCatalogException("Failed to fetch parser input with id " + inputId, e);
-        }
+    @PostConstruct
+    public void register() {
+        EntityManagerFactoryHolder.setFactory(emf);
+        logger.info("Registered Spring-managed EntityManagerFactory in EntityManagerFactoryHolder");
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/common/db/JPAUtils.java b/airavata-api/src/main/java/org/apache/airavata/common/db/JPAUtils.java
deleted file mode 100644
index 351575e3a6..0000000000
--- a/airavata-api/src/main/java/org/apache/airavata/common/db/JPAUtils.java
+++ /dev/null
@@ -1,102 +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.db;
-
-import jakarta.persistence.EntityManagerFactory;
-import jakarta.persistence.Persistence;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * JPAUtils
- */
-public class JPAUtils {
-
-    private static final Logger logger = LoggerFactory.getLogger(JPAUtils.class);
-    private static final Map<String, String> DEFAULT_ENTITY_MANAGER_FACTORY_PROPERTIES;
-
-    static {
-        Map<String, String> properties = new HashMap<String, String>();
-        properties.put("openjpa.ConnectionDriverName", "org.apache.commons.dbcp2.BasicDataSource");
-        properties.put(
-                "openjpa.DynamicEnhancementAgent", System.getProperty("openjpa.DynamicEnhancementAgent", "false"));
-        properties.put(
-                "openjpa.RuntimeUnenhancedClasses",
-                System.getProperty("openjpa.RuntimeUnenhancedClasses", "unsupported"));
-        properties.put("openjpa.RemoteCommitProvider", "sjvm");
-        properties.put("openjpa.Log", "DefaultLevel=INFO, Runtime=INFO, Tool=INFO, SQL=INFO");
-        // use the following to enable logging of all SQL statements
-        // properties.put("openjpa.Log", "DefaultLevel=INFO, Runtime=INFO, Tool=INFO,
-        // SQL=TRACE");
-        properties.put("openjpa.jdbc.SynchronizeMappings", "validate");
-        properties.put("openjpa.jdbc.QuerySQLCache", "false");
-        properties.put("openjpa.DetachState", "all");
-        properties.put(
-                "openjpa.ConnectionFactoryProperties",
-                "PrettyPrint=true, PrettyPrintLineLength=72,"
-                        + " PrintParameters=true, MaxActive=10, MaxIdle=5, MinIdle=2, MaxWait=31536000,  autoReconnect=true");
-        // MariaDB/MySQL dialect configuration to handle boolean to tinyint mapping
-        properties.put("openjpa.jdbc.DBDictionary", "mysql");
-        properties.put(
-                "openjpa.jdbc.MappingDefaults", "ForeignKeyDeleteAction=cascade, JoinForeignKeyDeleteAction=cascade");
-        DEFAULT_ENTITY_MANAGER_FACTORY_PROPERTIES = properties;
-    }
-
-    /**
-     * Create an {@link EntityManagerFactory} with the default settings.
-     *
-     * @param persistenceUnitName
-     * @param jdbcConfig
-     * @return {@link EntityManagerFactory}
-     */
-    public static EntityManagerFactory getEntityManagerFactory(String persistenceUnitName, JDBCConfig jdbcConfig) {
-
-        return getEntityManagerFactory(persistenceUnitName, jdbcConfig, DEFAULT_ENTITY_MANAGER_FACTORY_PROPERTIES);
-    }
-
-    /**
-     * Create an {@link EntityManagerFactory}. The given properties will override
-     * the default properties.
-     *
-     * @param persistenceUnitName
-     * @param jdbcConfig
-     * @param properties
-     * @return {@link EntityManagerFactory}
-     */
-    public static EntityManagerFactory getEntityManagerFactory(
-            String persistenceUnitName, JDBCConfig jdbcConfig, Map<String, String> properties) {
-
-        Map<String, String> finalProperties = new HashMap<>(DEFAULT_ENTITY_MANAGER_FACTORY_PROPERTIES);
-        finalProperties.putAll(createConnectionProperties(jdbcConfig));
-        finalProperties.putAll(properties);
-        return Persistence.createEntityManagerFactory(persistenceUnitName, finalProperties);
-    }
-
-    public static Map<String, String> createConnectionProperties(JDBCConfig jdbcConfig) {
-        String connectionProperties = "DriverClassName=" + jdbcConfig.getDriver() + "," + "Url=" + jdbcConfig.getURL()
-                + "?autoReconnect=true&tinyInt1isBit=false," + "Username=" + jdbcConfig.getUser() + "," + "Password="
-                + jdbcConfig.getPassword() + ",validationQuery=" + jdbcConfig.getValidationQuery();
-        logger.debug("Connection properties={}", connectionProperties);
-        return Collections.singletonMap("openjpa.ConnectionProperties", connectionProperties);
-    }
-}
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 d67ed248dd..73694d56c2 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
@@ -1,11 +1,29 @@
+/**
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT 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.security;
 
+import java.util.Map;
 import org.apache.airavata.common.config.Constants;
 import org.apache.airavata.model.security.AuthzToken;
 import org.apache.airavata.security.profile.commons.user.entities.UserProfileEntity;
 
-import java.util.Map;
-
 public class UserContext {
 
     private static final ThreadLocal<AuthzToken> AUTHZ_TOKEN = new ThreadLocal<>();
@@ -13,10 +31,21 @@ public class UserContext {
 
     private UserContext() {}
 
-    public static AuthzToken authzToken() { return AUTHZ_TOKEN.get(); }
-    public static void setAuthzToken(AuthzToken token) { AUTHZ_TOKEN.set(token); }
-    public static UserProfileEntity user() { return CURRENT_USER.get(); }
-    public static void setUser(UserProfileEntity user) { CURRENT_USER.set(user); }
+    public static AuthzToken authzToken() {
+        return AUTHZ_TOKEN.get();
+    }
+
+    public static void setAuthzToken(AuthzToken token) {
+        AUTHZ_TOKEN.set(token);
+    }
+
+    public static UserProfileEntity user() {
+        return CURRENT_USER.get();
+    }
+
+    public static void setUser(UserProfileEntity user) {
+        CURRENT_USER.set(user);
+    }
 
     public static String userId() {
         var token = authzToken();
@@ -32,7 +61,9 @@ public class UserContext {
         return claims != null ? claims.get(Constants.GATEWAY_ID) : null;
     }
 
-    public static boolean isAuthenticated() { return authzToken() != null; }
+    public static boolean isAuthenticated() {
+        return authzToken() != null;
+    }
 
     public static void clear() {
         AUTHZ_TOKEN.remove();
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
new file mode 100644
index 0000000000..3953b137ac
--- /dev/null
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/mapper/ComputeMapper.java
@@ -0,0 +1,253 @@
+/**
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT 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.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.storage.model.GridftpDataMovementEntity;
+import org.apache.airavata.storage.model.LocalDataMovementEntity;
+import org.apache.airavata.storage.model.ScpDataMovementEntity;
+import org.apache.airavata.storage.model.UnicoreDatamovementEntity;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface ComputeMapper {
+
+    ComputeMapper INSTANCE = Mappers.getMapper(ComputeMapper.class);
+
+    // --- ComputeResourceDescription ---
+    ComputeResourceDescription computeResourceToModel(ComputeResourceEntity entity);
+
+    ComputeResourceEntity computeResourceToEntity(ComputeResourceDescription model);
+
+    // --- ApplicationDeploymentDescription ---
+    @Mapping(source = "defaultWallTime", target = "defaultWalltime")
+    ApplicationDeploymentDescription appDeploymentToModel(ApplicationDeploymentEntity entity);
+
+    @Mapping(source = "defaultWalltime", target = "defaultWallTime")
+    ApplicationDeploymentEntity appDeploymentToEntity(ApplicationDeploymentDescription model);
+
+    // --- ApplicationInterfaceDescription ---
+    ApplicationInterfaceDescription appInterfaceToModel(ApplicationInterfaceEntity entity);
+
+    ApplicationInterfaceEntity appInterfaceToEntity(ApplicationInterfaceDescription model);
+
+    // --- ApplicationModule ---
+    ApplicationModule appModuleToModel(ApplicationModuleEntity entity);
+
+    ApplicationModuleEntity appModuleToEntity(ApplicationModule model);
+
+    // --- ApplicationInput ---
+    InputDataObjectType appInputToModel(ApplicationInputEntity entity);
+
+    ApplicationInputEntity appInputToEntity(InputDataObjectType model);
+
+    // --- ApplicationOutput ---
+    OutputDataObjectType appOutputToModel(ApplicationOutputEntity entity);
+
+    ApplicationOutputEntity appOutputToEntity(OutputDataObjectType model);
+
+    // --- BatchQueue ---
+    @Mapping(source = "maxRuntime", target = "maxRunTime")
+    BatchQueue batchQueueToModel(BatchQueueEntity entity);
+
+    @Mapping(source = "maxRunTime", target = "maxRuntime")
+    BatchQueueEntity batchQueueToEntity(BatchQueue model);
+
+    // --- ResourceJobManager ---
+    @Mapping(target = "jobManagerCommands", ignore = true)
+    @Mapping(target = "parallelismPrefix", ignore = true)
+    ResourceJobManager resourceJobManagerToModel(ResourceJobManagerEntity entity);
+
+    @Mapping(target = "jobManagerCommands", ignore = true)
+    @Mapping(target = "parallelismCommands", ignore = true)
+    ResourceJobManagerEntity resourceJobManagerToEntity(ResourceJobManager model);
+
+    // --- JobSubmissionInterface ---
+    JobSubmissionInterface jobSubmissionInterfaceToModel(JobSubmissionInterfaceEntity entity);
+
+    JobSubmissionInterfaceEntity jobSubmissionInterfaceToEntity(JobSubmissionInterface model);
+
+    // --- GatewayResourceProfile / GatewayProfileEntity ---
+    @Mapping(source = "gatewayId", target = "gatewayID")
+    GatewayResourceProfile gatewayProfileToModel(GatewayProfileEntity entity);
+
+    @Mapping(source = "gatewayID", target = "gatewayId")
+    GatewayProfileEntity gatewayProfileToEntity(GatewayResourceProfile model);
+
+    // --- ComputeResourcePreference ---
+    ComputeResourcePreference computeResourcePrefToModel(ComputeResourcePreferenceEntity entity);
+
+    ComputeResourcePreferenceEntity computeResourcePrefToEntity(ComputeResourcePreference model);
+
+    // --- GroupResourceProfile ---
+    GroupResourceProfile groupResourceProfileToModel(GroupResourceProfileEntity entity);
+
+    GroupResourceProfileEntity groupResourceProfileToEntity(GroupResourceProfile model);
+
+    // --- GroupComputeResourcePreference ---
+    GroupComputeResourcePreference groupComputePrefToModel(GroupComputeResourcePrefEntity entity);
+    // Uses SlurmGroupComputeResourcePrefEntity as the default concrete type
+    SlurmGroupComputeResourcePrefEntity groupComputePrefToEntity(GroupComputeResourcePreference model);
+
+    // --- ComputeResourcePolicy ---
+    ComputeResourcePolicy computeResourcePolicyToModel(ComputeResourcePolicyEntity entity);
+
+    ComputeResourcePolicyEntity computeResourcePolicyToEntity(ComputeResourcePolicy model);
+
+    // --- BatchQueueResourcePolicy ---
+    BatchQueueResourcePolicy batchQueuePolicyToModel(BatchQueueResourcePolicyEntity entity);
+
+    BatchQueueResourcePolicyEntity batchQueuePolicyToEntity(BatchQueueResourcePolicy model);
+
+    // --- UserResourceProfile ---
+    @Mapping(source = "gatewayId", target = "gatewayID")
+    UserResourceProfile userResourceProfileToModel(UserResourceProfileEntity entity);
+
+    @Mapping(source = "gatewayID", target = "gatewayId")
+    UserResourceProfileEntity userResourceProfileToEntity(UserResourceProfile model);
+
+    // --- UserComputeResourcePreference ---
+    UserComputeResourcePreference userComputeResourcePrefToModel(UserComputeResourcePreferenceEntity entity);
+
+    UserComputeResourcePreferenceEntity userComputeResourcePrefToEntity(UserComputeResourcePreference model);
+
+    // --- GatewayGroups ---
+    GatewayGroups gatewayGroupsToModel(GatewayGroupsEntity entity);
+
+    GatewayGroupsEntity gatewayGroupsToEntity(GatewayGroups model);
+
+    // --- Parser ---
+    Parser parserToModel(ParserEntity entity);
+
+    ParserEntity parserToEntity(Parser model);
+
+    // --- ParserInput ---
+    ParserInput parserInputToModel(ParserInputEntity entity);
+
+    ParserInputEntity parserInputToEntity(ParserInput model);
+
+    // --- ParserOutput ---
+    ParserOutput parserOutputToModel(ParserOutputEntity entity);
+
+    ParserOutputEntity parserOutputToEntity(ParserOutput model);
+
+    // --- ParsingTemplate ---
+    ParsingTemplate parsingTemplateToModel(ParsingTemplateEntity entity);
+
+    ParsingTemplateEntity parsingTemplateToEntity(ParsingTemplate model);
+
+    // --- Extra types used directly in ComputeResourceRepository ---
+
+    // SSHJobSubmission
+    SSHJobSubmission sshJobSubmissionToModel(SshJobSubmissionEntity entity);
+
+    SshJobSubmissionEntity sshJobSubmissionToEntity(SSHJobSubmission model);
+
+    // CloudJobSubmission
+    CloudJobSubmission cloudJobSubmissionToModel(CloudJobSubmissionEntity entity);
+
+    CloudJobSubmissionEntity cloudJobSubmissionToEntity(CloudJobSubmission model);
+
+    // LOCALSubmission
+    LOCALSubmission localSubmissionToModel(LocalSubmissionEntity entity);
+
+    LocalSubmissionEntity localSubmissionToEntity(LOCALSubmission model);
+
+    // UnicoreJobSubmission
+    UnicoreJobSubmission unicoreSubmissionToModel(UnicoreSubmissionEntity entity);
+
+    UnicoreSubmissionEntity unicoreSubmissionToEntity(UnicoreJobSubmission model);
+
+    // LOCALDataMovement
+    LOCALDataMovement localDataMovementToModel(LocalDataMovementEntity entity);
+
+    LocalDataMovementEntity localDataMovementToEntity(LOCALDataMovement model);
+
+    // SCPDataMovement
+    SCPDataMovement scpDataMovementToModel(ScpDataMovementEntity entity);
+
+    ScpDataMovementEntity scpDataMovementToEntity(SCPDataMovement model);
+
+    // UnicoreDataMovement
+    @Mapping(source = "unicoreEndpointUrl", target = "unicoreEndPointURL")
+    UnicoreDataMovement unicoreDataMovementToModel(UnicoreDatamovementEntity entity);
+
+    @Mapping(source = "unicoreEndPointURL", target = "unicoreEndpointUrl")
+    UnicoreDatamovementEntity unicoreDataMovementToEntity(UnicoreDataMovement model);
+
+    // GridFTPDataMovement
+    GridFTPDataMovement gridFtpDataMovementToModel(GridftpDataMovementEntity entity);
+
+    GridftpDataMovementEntity gridFtpDataMovementToEntity(GridFTPDataMovement model);
+
+    // --- Custom converters ---
+
+    default Timestamp longToTimestamp(long millis) {
+        return millis == 0 ? null : new Timestamp(millis);
+    }
+
+    default long timestampToLong(Timestamp ts) {
+        return ts == null ? 0 : ts.getTime();
+    }
+
+    /** short to boolean (Thrift boolean fields stored as short in some entities) */
+    default boolean shortToBoolean(short value) {
+        return value != 0;
+    }
+
+    /** boolean to short */
+    default short booleanToShort(boolean value) {
+        return (short) (value ? 1 : 0);
+    }
+}
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/AppEnvironmentEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/AppEnvironmentEntity.java
index 6f8ac4177e..1d62821250 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/AppEnvironmentEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/AppEnvironmentEntity.java
@@ -21,8 +21,6 @@ package org.apache.airavata.compute.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.hibernate.annotations.OnDelete;
-import org.hibernate.annotations.OnDeleteAction;
 
 /**
  * The persistent class for the app_environment database table.
@@ -48,8 +46,7 @@ public class AppEnvironmentEntity implements Serializable {
     private int envPathOrder;
 
     @ManyToOne(targetEntity = ApplicationDeploymentEntity.class)
-    @JoinColumn(name = "DEPLOYMENT_ID", nullable = false, updatable = false)
-    @OnDelete(action = OnDeleteAction.CASCADE)
+    @JoinColumn(name = "DEPLOYMENT_ID", insertable = false, updatable = false)
     private ApplicationDeploymentEntity applicationDeployment;
 
     public AppEnvironmentEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/AppModuleMappingEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/AppModuleMappingEntity.java
index 136954da95..73b0e0a990 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/AppModuleMappingEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/AppModuleMappingEntity.java
@@ -41,11 +41,11 @@ public class AppModuleMappingEntity implements Serializable {
     private String moduleId;
 
     @ManyToOne(targetEntity = ApplicationInterfaceEntity.class)
-    @JoinColumn(name = "INTERFACE_ID")
+    @JoinColumn(name = "INTERFACE_ID", insertable = false, updatable = false)
     private ApplicationInterfaceEntity applicationInterface;
 
     @ManyToOne(targetEntity = ApplicationModuleEntity.class)
-    @JoinColumn(name = "MODULE_ID")
+    @JoinColumn(name = "MODULE_ID", insertable = false, updatable = false)
     private ApplicationModuleEntity applicationModule;
 
     public AppModuleMappingEntity() {}
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 9d8092a4c1..9846723608 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
@@ -22,8 +22,6 @@ package org.apache.airavata.compute.model;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import org.apache.airavata.model.application.io.DataType;
-import org.hibernate.annotations.OnDelete;
-import org.hibernate.annotations.OnDeleteAction;
 
 /**
  * The persistent class for the application_input database table.
@@ -82,8 +80,7 @@ public class ApplicationInputEntity implements Serializable {
     private String overrideFilename;
 
     @ManyToOne(targetEntity = ApplicationInterfaceEntity.class)
-    @JoinColumn(name = "INTERFACE_ID", nullable = false, updatable = false)
-    @OnDelete(action = OnDeleteAction.CASCADE)
+    @JoinColumn(name = "INTERFACE_ID", insertable = false, updatable = false)
     private ApplicationInterfaceEntity applicationInterface;
 
     public ApplicationInputEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationInterfaceEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationInterfaceEntity.java
index 33876f0436..d85b1cb39f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationInterfaceEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ApplicationInterfaceEntity.java
@@ -34,7 +34,7 @@ public class ApplicationInterfaceEntity implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @Id
-    @Column(name = "INTERFACE_ID")
+    @Column(name = "INTERFACE_ID", insertable = false, updatable = false)
     private String applicationInterfaceId;
 
     @Column(name = "APPLICATION_DESCRIPTION")
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 b50ef9e7ae..242ed900dd 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
@@ -22,8 +22,6 @@ package org.apache.airavata.compute.model;
 import jakarta.persistence.*;
 import java.io.Serializable;
 import org.apache.airavata.model.application.io.DataType;
-import org.hibernate.annotations.OnDelete;
-import org.hibernate.annotations.OnDeleteAction;
 
 /**
  * The persistent class for the application_output database table.
@@ -74,8 +72,7 @@ public class ApplicationOutputEntity implements Serializable {
     private String metaData;
 
     @ManyToOne(targetEntity = ApplicationInterfaceEntity.class)
-    @JoinColumn(name = "INTERFACE_ID", nullable = false, updatable = false)
-    @OnDelete(action = OnDeleteAction.CASCADE)
+    @JoinColumn(name = "INTERFACE_ID", insertable = false, updatable = false)
     private ApplicationInterfaceEntity applicationInterface;
 
     public ApplicationOutputEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/BatchQueueEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/BatchQueueEntity.java
index 46f104a08f..f8a0b361f1 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/BatchQueueEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/BatchQueueEntity.java
@@ -58,7 +58,7 @@ public class BatchQueueEntity implements Serializable {
     private String queueDescription;
 
     @ManyToOne(targetEntity = ComputeResourceEntity.class, cascade = CascadeType.MERGE)
-    @JoinColumn(name = "COMPUTE_RESOURCE_ID")
+    @JoinColumn(name = "COMPUTE_RESOURCE_ID", insertable = false, updatable = false)
     private ComputeResourceEntity computeResource;
 
     @Column(name = "CPU_PER_NODE")
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/BatchQueueResourcePolicyEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/BatchQueueResourcePolicyEntity.java
index 64df10b84c..00c0c7194f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/BatchQueueResourcePolicyEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/BatchQueueResourcePolicyEntity.java
@@ -45,7 +45,7 @@ public class BatchQueueResourcePolicyEntity implements Serializable {
     @Column(name = "COMPUTE_RESOURCE_ID")
     private String computeResourceId;
 
-    @Column(name = "GROUP_RESOURCE_PROFILE_ID")
+    @Column(name = "GROUP_RESOURCE_PROFILE_ID", insertable = false, updatable = false)
     private String groupResourceProfileId;
 
     @Column(name = "QUEUE_NAME")
@@ -61,7 +61,7 @@ public class BatchQueueResourcePolicyEntity implements Serializable {
     private Integer maxAllowedWalltime;
 
     @ManyToOne(targetEntity = GroupResourceProfileEntity.class)
-    @JoinColumn(name = "GROUP_RESOURCE_PROFILE_ID", nullable = false, updatable = false)
+    @JoinColumn(name = "GROUP_RESOURCE_PROFILE_ID", nullable = false, insertable = false, updatable = false)
     @OnDelete(action = OnDeleteAction.CASCADE)
     private GroupResourceProfileEntity groupResourceProfile;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceEntity.java
index e592674cba..89ee21e8d4 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceEntity.java
@@ -34,7 +34,7 @@ public class ComputeResourceEntity implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @Id
-    @Column(name = "RESOURCE_ID")
+    @Column(name = "RESOURCE_ID", insertable = false, updatable = false)
     private String computeResourceId;
 
     @Column(name = "CREATION_TIME")
@@ -89,6 +89,7 @@ public class ComputeResourceEntity implements Serializable {
     @OneToMany(
             targetEntity = BatchQueueEntity.class,
             cascade = CascadeType.ALL,
+            orphanRemoval = true,
             mappedBy = "computeResource",
             fetch = FetchType.EAGER)
     private List<BatchQueueEntity> batchQueues;
@@ -96,6 +97,7 @@ public class ComputeResourceEntity implements Serializable {
     @OneToMany(
             targetEntity = JobSubmissionInterfaceEntity.class,
             cascade = CascadeType.ALL,
+            orphanRemoval = true,
             mappedBy = "computeResource",
             fetch = FetchType.EAGER)
     private List<JobSubmissionInterfaceEntity> jobSubmissionInterfaces;
@@ -103,6 +105,7 @@ public class ComputeResourceEntity implements Serializable {
     @OneToMany(
             targetEntity = DataMovementInterfaceEntity.class,
             cascade = CascadeType.ALL,
+            orphanRemoval = true,
             mappedBy = "computeResource",
             fetch = FetchType.EAGER)
     private List<DataMovementInterfaceEntity> dataMovementInterfaces;
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 9c5d917cea..f0ea4028e7 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
@@ -43,7 +43,7 @@ public class ComputeResourceFileSystemEntity implements Serializable {
     private FileSystems fileSystem;
 
     @ManyToOne(cascade = CascadeType.MERGE)
-    @JoinColumn(name = "COMPUTE_RESOURCE_ID")
+    @JoinColumn(name = "COMPUTE_RESOURCE_ID", insertable = false, updatable = false)
     private ComputeResourceEntity computeResource;
 
     @Column(name = "PATH")
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourcePolicyEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourcePolicyEntity.java
index c43e400734..cc1d8a040f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourcePolicyEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourcePolicyEntity.java
@@ -43,13 +43,13 @@ public class ComputeResourcePolicyEntity implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @Id
-    @Column(name = "RESOURCE_POLICY_ID")
+    @Column(name = "RESOURCE_POLICY_ID", insertable = false, updatable = false)
     private String resourcePolicyId;
 
     @Column(name = "COMPUTE_RESOURCE_ID")
     private String computeResourceId;
 
-    @Column(name = "GROUP_RESOURCE_PROFILE_ID")
+    @Column(name = "GROUP_RESOURCE_PROFILE_ID", insertable = false, updatable = false)
     private String groupResourceProfileId;
 
     // TODO: Store COMPUTE_RESOURCE_ID and QUEUE_NAME in table so it can FK to BATCH_QUEUE
@@ -61,7 +61,7 @@ public class ComputeResourcePolicyEntity implements Serializable {
     private List<String> allowedBatchQueues;
 
     @ManyToOne(targetEntity = GroupResourceProfileEntity.class)
-    @JoinColumn(name = "GROUP_RESOURCE_PROFILE_ID", nullable = false, updatable = false)
+    @JoinColumn(name = "GROUP_RESOURCE_PROFILE_ID", nullable = false, insertable = false, updatable = false)
     @OnDelete(action = OnDeleteAction.CASCADE)
     private GroupResourceProfileEntity groupResourceProfile;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceReservationEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceReservationEntity.java
index 865f383f44..c4170b897d 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceReservationEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ComputeResourceReservationEntity.java
@@ -45,7 +45,7 @@ public class ComputeResourceReservationEntity implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @Id
-    @Column(name = "RESERVATION_ID")
+    @Column(name = "RESERVATION_ID", insertable = false, updatable = false)
     private String reservationId;
 
     @Column(name = "RESERVATION_NAME", nullable = false)
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 76277cbf8d..9164de5671 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
@@ -80,7 +80,7 @@ public abstract class GroupComputeResourcePrefEntity implements Serializable {
     private String resourceSpecificCredentialStoreToken;
 
     @ManyToOne(targetEntity = GroupResourceProfileEntity.class, cascade = CascadeType.PERSIST)
-    @JoinColumn(name = "GROUP_RESOURCE_PROFILE_ID", nullable = false, updatable = false)
+    @JoinColumn(name = "GROUP_RESOURCE_PROFILE_ID", nullable = false, insertable = false, updatable = false)
     @OnDelete(action = OnDeleteAction.CASCADE)
     private GroupResourceProfileEntity groupResourceProfile;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/GroupSSHAccountProvisionerConfig.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/GroupSSHAccountProvisionerConfig.java
index 0678f3f9b0..9be0922817 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/GroupSSHAccountProvisionerConfig.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/GroupSSHAccountProvisionerConfig.java
@@ -28,8 +28,6 @@ import jakarta.persistence.JoinColumns;
 import jakarta.persistence.ManyToOne;
 import jakarta.persistence.Table;
 import java.io.Serializable;
-import org.hibernate.annotations.OnDelete;
-import org.hibernate.annotations.OnDeleteAction;
 
 /**
  * The persistent class for the grp_ssh_acc_prov_config database table.
@@ -58,13 +56,13 @@ public class GroupSSHAccountProvisionerConfig implements Serializable {
 
     @ManyToOne(targetEntity = GroupComputeResourcePrefEntity.class)
     @JoinColumns({
-        @JoinColumn(name = "RESOURCE_ID", referencedColumnName = "RESOURCE_ID", nullable = false),
+        @JoinColumn(name = "RESOURCE_ID", referencedColumnName = "RESOURCE_ID", insertable = false, updatable = false),
         @JoinColumn(
                 name = "GROUP_RESOURCE_PROFILE_ID",
                 referencedColumnName = "GROUP_RESOURCE_PROFILE_ID",
-                nullable = false)
+                insertable = false,
+                updatable = false)
     })
-    @OnDelete(action = OnDeleteAction.CASCADE)
     private GroupComputeResourcePrefEntity groupComputeResourcePref;
 
     public GroupSSHAccountProvisionerConfig() {}
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 3160fcbcb1..2e3c7da5f4 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
@@ -45,7 +45,7 @@ public class JobManagerCommandEntity implements Serializable {
     private String command;
 
     @ManyToOne(cascade = CascadeType.MERGE)
-    @JoinColumn(name = "RESOURCE_JOB_MANAGER_ID")
+    @JoinColumn(name = "RESOURCE_JOB_MANAGER_ID", insertable = false, updatable = false)
     private ResourceJobManagerEntity resourceJobManager;
 
     public JobManagerCommandEntity() {}
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 32d2304bbc..f98b03dca4 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
@@ -55,7 +55,7 @@ public class JobSubmissionInterfaceEntity implements Serializable {
     private Timestamp updateTime;
 
     @ManyToOne(targetEntity = ComputeResourceEntity.class)
-    @JoinColumn(name = "COMPUTE_RESOURCE_ID", nullable = false, updatable = false)
+    @JoinColumn(name = "COMPUTE_RESOURCE_ID", insertable = false, updatable = false)
     private ComputeResourceEntity computeResource;
 
     public JobSubmissionInterfaceEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/LibraryApendPathEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/LibraryApendPathEntity.java
index 02c787ec25..9c5a431340 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/LibraryApendPathEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/LibraryApendPathEntity.java
@@ -21,8 +21,6 @@ package org.apache.airavata.compute.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.hibernate.annotations.OnDelete;
-import org.hibernate.annotations.OnDeleteAction;
 
 /**
  * The persistent class for the library_apend_path database table.
@@ -45,8 +43,7 @@ public class LibraryApendPathEntity implements Serializable {
     private String name;
 
     @ManyToOne(targetEntity = ApplicationDeploymentEntity.class, cascade = CascadeType.MERGE)
-    @JoinColumn(name = "DEPLOYMENT_ID")
-    @OnDelete(action = OnDeleteAction.CASCADE)
+    @JoinColumn(name = "DEPLOYMENT_ID", insertable = false, updatable = false)
     private ApplicationDeploymentEntity applicationDeployment;
 
     public LibraryApendPathEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/LibraryPrependPathEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/LibraryPrependPathEntity.java
index 986d411a6e..d5f71724ee 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/LibraryPrependPathEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/LibraryPrependPathEntity.java
@@ -21,8 +21,6 @@ package org.apache.airavata.compute.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.hibernate.annotations.OnDelete;
-import org.hibernate.annotations.OnDeleteAction;
 
 /**
  * The persistent class for the library_apend_path database table.
@@ -46,8 +44,7 @@ public class LibraryPrependPathEntity implements Serializable {
     private String name;
 
     @ManyToOne(targetEntity = ApplicationDeploymentEntity.class, cascade = CascadeType.MERGE)
-    @JoinColumn(name = "DEPLOYMENT_ID")
-    @OnDelete(action = OnDeleteAction.CASCADE)
+    @JoinColumn(name = "DEPLOYMENT_ID", insertable = false, updatable = false)
     private ApplicationDeploymentEntity applicationDeployment;
 
     public LibraryPrependPathEntity() {}
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 2f2214bb13..9a8ecad805 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
@@ -42,7 +42,7 @@ public class LocalSubmissionEntity implements Serializable {
     @Column(name = "UPDATE_TIME")
     private Timestamp updateTime;
 
-    @Column(name = "RESOURCE_JOB_MANAGER_ID")
+    @Column(name = "RESOURCE_JOB_MANAGER_ID", insertable = false, updatable = false)
     private String resourceJobManagerId;
 
     @Column(name = "SECURITY_PROTOCOL")
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ModuleLoadCmdEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ModuleLoadCmdEntity.java
index 79cfd0ed6a..b5139538b3 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ModuleLoadCmdEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ModuleLoadCmdEntity.java
@@ -21,8 +21,6 @@ package org.apache.airavata.compute.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.hibernate.annotations.OnDelete;
-import org.hibernate.annotations.OnDeleteAction;
 
 /**
  * The persistent class for the module_load_cmd database table.
@@ -45,8 +43,7 @@ public class ModuleLoadCmdEntity implements Serializable {
     private int commandOrder;
 
     @ManyToOne(targetEntity = ApplicationDeploymentEntity.class, cascade = CascadeType.MERGE)
-    @JoinColumn(name = "APP_DEPLOYMENT_ID")
-    @OnDelete(action = OnDeleteAction.CASCADE)
+    @JoinColumn(name = "APP_DEPLOYMENT_ID", insertable = false, updatable = false)
     private ApplicationDeploymentEntity applicationDeployment;
 
     public ModuleLoadCmdEntity() {}
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 bb7f2bfe07..056c51a0c9 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
@@ -45,7 +45,7 @@ public class ParallelismCommandEntity implements Serializable {
     private String command;
 
     @ManyToOne(cascade = CascadeType.MERGE)
-    @JoinColumn(name = "RESOURCE_JOB_MANAGER_ID")
+    @JoinColumn(name = "RESOURCE_JOB_MANAGER_ID", insertable = false, updatable = false)
     private ResourceJobManagerEntity resourceJobManager;
 
     public ParallelismCommandEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserConnectorEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserConnectorEntity.java
index cac5d335aa..52cfe463eb 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserConnectorEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserConnectorEntity.java
@@ -32,13 +32,13 @@ public class ParserConnectorEntity implements Serializable {
     @Column(name = "PARSER_CONNECTOR_ID")
     private String id;
 
-    @Column(name = "PARENT_PARSER_ID")
+    @Column(name = "PARENT_PARSER_ID", insertable = false, updatable = false)
     private String parentParserId;
 
-    @Column(name = "CHILD_PARSER_ID")
+    @Column(name = "CHILD_PARSER_ID", insertable = false, updatable = false)
     private String childParserId;
 
-    @Column(name = "PARSING_TEMPLATE_ID")
+    @Column(name = "PARSING_TEMPLATE_ID", insertable = false, updatable = false)
     private String parsingTemplateId;
 
     @OneToMany(
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserConnectorInputEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserConnectorInputEntity.java
index 9e2ec88c49..85a28a8e14 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserConnectorInputEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserConnectorInputEntity.java
@@ -31,16 +31,16 @@ public class ParserConnectorInputEntity implements Serializable {
     @Column(name = "PARSER_CONNECTOR_INPUT_ID")
     private String id;
 
-    @Column(name = "PARSER_INPUT_ID")
+    @Column(name = "PARSER_INPUT_ID", insertable = false, updatable = false)
     private String inputId;
 
-    @Column(name = "PARSER_OUTPUT_ID")
+    @Column(name = "PARSER_OUTPUT_ID", insertable = false, updatable = false)
     private String parentOutputId;
 
     @Column(name = "VALUE")
     private String value;
 
-    @Column(name = "PARSER_CONNECTOR_ID")
+    @Column(name = "PARSER_CONNECTOR_ID", insertable = false, updatable = false)
     private String parserConnectorId;
 
     @ManyToOne(targetEntity = ParserInputEntity.class, cascade = CascadeType.MERGE)
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserInputEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserInputEntity.java
index a4c0b4932a..767003601e 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserInputEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserInputEntity.java
@@ -37,7 +37,7 @@ public class ParserInputEntity implements Serializable {
     @Column(name = "PARSER_INPUT_REQUIRED")
     private boolean requiredInput;
 
-    @Column(name = "PARSER_ID")
+    @Column(name = "PARSER_ID", insertable = false, updatable = false)
     private String parserId;
 
     @ManyToOne(targetEntity = ParserEntity.class, cascade = CascadeType.MERGE)
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserOutputEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserOutputEntity.java
index 0acc48f64c..d122ff89ed 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserOutputEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ParserOutputEntity.java
@@ -37,7 +37,7 @@ public class ParserOutputEntity implements Serializable {
     @Column(name = "PARSER_OUTPUT_REQUIRED")
     private boolean requiredOutput;
 
-    @Column(name = "PARSER_ID")
+    @Column(name = "PARSER_ID", insertable = false, updatable = false)
     private String parserId;
 
     @ManyToOne(targetEntity = ParserEntity.class, cascade = CascadeType.MERGE)
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/ParsingTemplateInputEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/ParsingTemplateInputEntity.java
index 371d10090f..522927d168 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/ParsingTemplateInputEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/ParsingTemplateInputEntity.java
@@ -31,7 +31,7 @@ public class ParsingTemplateInputEntity implements Serializable {
     @Column(name = "PARSING_TEMPLATE_INPUT_ID")
     private String id;
 
-    @Column(name = "TARGET_PARSER_INPUT_ID")
+    @Column(name = "TARGET_PARSER_INPUT_ID", insertable = false, updatable = false)
     private String targetInputId;
 
     @Column(name = "APPLICATION_OUTPUT_NAME")
@@ -40,7 +40,7 @@ public class ParsingTemplateInputEntity implements Serializable {
     @Column(name = "VALUE")
     private String value;
 
-    @Column(name = "PARSING_TEMPLATE_ID")
+    @Column(name = "PARSING_TEMPLATE_ID", insertable = false, updatable = false)
     private String parsingTemplateId;
 
     @ManyToOne(targetEntity = ParserInputEntity.class, cascade = CascadeType.MERGE)
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/PostjobCommandEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/PostjobCommandEntity.java
index 3c59bf2469..dbe45e8725 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/PostjobCommandEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/PostjobCommandEntity.java
@@ -21,8 +21,6 @@ package org.apache.airavata.compute.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.hibernate.annotations.OnDelete;
-import org.hibernate.annotations.OnDeleteAction;
 
 /**
  * The persistent class for the postjob_command database table.
@@ -45,8 +43,7 @@ public class PostjobCommandEntity implements Serializable {
     private int commandOrder;
 
     @ManyToOne(targetEntity = ApplicationDeploymentEntity.class, cascade = CascadeType.MERGE)
-    @JoinColumn(name = "APPDEPLOYMENT_ID")
-    @OnDelete(action = OnDeleteAction.CASCADE)
+    @JoinColumn(name = "APPDEPLOYMENT_ID", insertable = false, updatable = false)
     private ApplicationDeploymentEntity applicationDeployment;
 
     public PostjobCommandEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/PrejobCommandEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/PrejobCommandEntity.java
index 3cd8a7c7e1..be67ce7df9 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/PrejobCommandEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/PrejobCommandEntity.java
@@ -21,8 +21,6 @@ package org.apache.airavata.compute.model;
 
 import jakarta.persistence.*;
 import java.io.Serializable;
-import org.hibernate.annotations.OnDelete;
-import org.hibernate.annotations.OnDeleteAction;
 
 /**
  * The persistent class for the prejob_command database table.
@@ -45,8 +43,7 @@ public class PrejobCommandEntity implements Serializable {
     private int commandOrder;
 
     @ManyToOne(targetEntity = ApplicationDeploymentEntity.class, cascade = CascadeType.MERGE)
-    @JoinColumn(name = "APPDEPLOYMENT_ID")
-    @OnDelete(action = OnDeleteAction.CASCADE)
+    @JoinColumn(name = "APPDEPLOYMENT_ID", insertable = false, updatable = false)
     private ApplicationDeploymentEntity applicationDeployment;
 
     public PrejobCommandEntity() {}
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 78ef623a7d..ef5a085b95 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
@@ -22,6 +22,8 @@ package org.apache.airavata.compute.model;
 import jakarta.persistence.*;
 import java.io.Serializable;
 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;
 
@@ -53,6 +55,12 @@ public class ResourceJobManagerEntity implements Serializable {
     @Column(name = "UPDATE_TIME")
     private Timestamp updateTime;
 
+    @OneToMany(mappedBy = "resourceJobManager", cascade = CascadeType.ALL, orphanRemoval = true)
+    private List<JobManagerCommandEntity> jobManagerCommands = new ArrayList<>();
+
+    @OneToMany(mappedBy = "resourceJobManager", cascade = CascadeType.ALL, orphanRemoval = true)
+    private List<ParallelismCommandEntity> parallelismCommands = new ArrayList<>();
+
     public ResourceJobManagerEntity() {}
 
     public String getResourceJobManagerId() {
@@ -102,4 +110,20 @@ public class ResourceJobManagerEntity implements Serializable {
     public void setUpdateTime(Timestamp updateTime) {
         this.updateTime = updateTime;
     }
+
+    public List<JobManagerCommandEntity> getJobManagerCommands() {
+        return jobManagerCommands;
+    }
+
+    public void setJobManagerCommands(List<JobManagerCommandEntity> jobManagerCommands) {
+        this.jobManagerCommands = jobManagerCommands;
+    }
+
+    public List<ParallelismCommandEntity> getParallelismCommands() {
+        return parallelismCommands;
+    }
+
+    public void setParallelismCommands(List<ParallelismCommandEntity> parallelismCommands) {
+        this.parallelismCommands = parallelismCommands;
+    }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/SSHAccountProvisionerConfiguration.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/SSHAccountProvisionerConfiguration.java
index a5569451e9..82b09e320a 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/SSHAccountProvisionerConfiguration.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/SSHAccountProvisionerConfiguration.java
@@ -46,8 +46,8 @@ public class SSHAccountProvisionerConfiguration {
 
     @ManyToOne(targetEntity = ComputeResourcePreferenceEntity.class, cascade = CascadeType.MERGE)
     @JoinColumns({
-        @JoinColumn(name = "GATEWAY_ID", referencedColumnName = "GATEWAY_ID", nullable = false),
-        @JoinColumn(name = "RESOURCE_ID", referencedColumnName = "RESOURCE_ID", nullable = false)
+        @JoinColumn(name = "GATEWAY_ID", referencedColumnName = "GATEWAY_ID", insertable = false, updatable = false),
+        @JoinColumn(name = "RESOURCE_ID", referencedColumnName = "RESOURCE_ID", insertable = false, updatable = false)
     })
     private ComputeResourcePreferenceEntity computeResourcePreference;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/model/UserComputeResourcePreferenceEntity.java b/airavata-api/src/main/java/org/apache/airavata/compute/model/UserComputeResourcePreferenceEntity.java
index dec424facc..9197edea81 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/model/UserComputeResourcePreferenceEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/model/UserComputeResourcePreferenceEntity.java
@@ -74,7 +74,10 @@ public class UserComputeResourcePreferenceEntity {
     private boolean validated;
 
     @ManyToOne(targetEntity = UserResourceProfileEntity.class, cascade = CascadeType.MERGE)
-    @JoinColumns({@JoinColumn(name = "USER_ID"), @JoinColumn(name = "GATEWAY_ID")})
+    @JoinColumns({
+        @JoinColumn(name = "USER_ID", insertable = false, updatable = false),
+        @JoinColumn(name = "GATEWAY_ID", insertable = false, updatable = false)
+    })
     private UserResourceProfileEntity userResourceProfile;
 
     public UserComputeResourcePreferenceEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/repository/AppCatAbstractRepository.java b/airavata-api/src/main/java/org/apache/airavata/compute/repository/AppCatAbstractRepository.java
deleted file mode 100644
index 4a90231a1c..0000000000
--- a/airavata-api/src/main/java/org/apache/airavata/compute/repository/AppCatAbstractRepository.java
+++ /dev/null
@@ -1,36 +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.compute.repository;
-
-import jakarta.persistence.EntityManager;
-import org.apache.airavata.execution.util.AbstractRepository;
-import org.apache.airavata.execution.util.AppCatalogJPAUtils;
-
-public class AppCatAbstractRepository<T, E, Id> extends AbstractRepository<T, E, Id> {
-
-    public AppCatAbstractRepository(Class<T> thriftGenericClass, Class<E> dbEntityGenericClass) {
-        super(thriftGenericClass, dbEntityGenericClass);
-    }
-
-    @Override
-    protected EntityManager getEntityManager() {
-        return AppCatalogJPAUtils.getEntityManager();
-    }
-}
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 32095be88c..90cca5f43e 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
@@ -19,12 +19,12 @@
 */
 package org.apache.airavata.compute.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.sql.Timestamp;
 import java.util.*;
+import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.ApplicationDeploymentEntity;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.AppCatalogException;
 import org.apache.airavata.execution.util.cpi.ApplicationDeployment;
@@ -35,7 +35,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ApplicationDeploymentRepository
-        extends AppCatAbstractRepository<ApplicationDeploymentDescription, ApplicationDeploymentEntity, String>
+        extends AbstractRepository<ApplicationDeploymentDescription, ApplicationDeploymentEntity, String>
         implements ApplicationDeployment {
     private static final Logger logger = LoggerFactory.getLogger(ApplicationDeploymentRepository.class);
 
@@ -43,6 +43,16 @@ public class ApplicationDeploymentRepository
         super(ApplicationDeploymentDescription.class, ApplicationDeploymentEntity.class);
     }
 
+    @Override
+    protected ApplicationDeploymentDescription toModel(ApplicationDeploymentEntity entity) {
+        return ComputeMapper.INSTANCE.appDeploymentToModel(entity);
+    }
+
+    @Override
+    protected ApplicationDeploymentEntity toEntity(ApplicationDeploymentDescription model) {
+        return ComputeMapper.INSTANCE.appDeploymentToEntity(model);
+    }
+
     protected String saveApplicationDeploymentDescriptorData(
             ApplicationDeploymentDescription applicationDeploymentDescription, String gatewayId)
             throws AppCatalogException {
@@ -66,9 +76,8 @@ public class ApplicationDeploymentRepository
         }
 
         String applicationDeploymentId = applicationDeploymentDescription.getAppDeploymentId();
-        Mapper mapper = ObjectMapperSingleton.getInstance();
         ApplicationDeploymentEntity applicationDeploymentEntity =
-                mapper.map(applicationDeploymentDescription, ApplicationDeploymentEntity.class);
+                ComputeMapper.INSTANCE.appDeploymentToEntity(applicationDeploymentDescription);
 
         if (gatewayId != null) {
             logger.debug("Setting the gateway ID of the Application Deployment");
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 7562cbdaaf..faa3b2d8ef 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
@@ -19,14 +19,26 @@
 */
 package org.apache.airavata.compute.repository;
 
+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;
 
 public class ApplicationInputRepository
-        extends AppCatAbstractRepository<InputDataObjectType, ApplicationInputEntity, ApplicationInputPK> {
+        extends AbstractRepository<InputDataObjectType, ApplicationInputEntity, ApplicationInputPK> {
 
     public ApplicationInputRepository() {
         super(InputDataObjectType.class, ApplicationInputEntity.class);
     }
+
+    @Override
+    protected InputDataObjectType toModel(ApplicationInputEntity entity) {
+        return ComputeMapper.INSTANCE.appInputToModel(entity);
+    }
+
+    @Override
+    protected ApplicationInputEntity toEntity(InputDataObjectType model) {
+        return ComputeMapper.INSTANCE.appInputToEntity(model);
+    }
 }
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 e0a567cb95..ae9e39777f 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
@@ -19,15 +19,15 @@
 */
 package org.apache.airavata.compute.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.sql.Timestamp;
 import java.util.*;
 import org.apache.airavata.common.util.AiravataUtils;
+import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.AppModuleMappingEntity;
 import org.apache.airavata.compute.model.ApplicationInterfaceEntity;
 import org.apache.airavata.compute.model.ApplicationModuleEntity;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.AppCatalogException;
 import org.apache.airavata.execution.util.cpi.ApplicationInterface;
@@ -40,7 +40,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ApplicationInterfaceRepository
-        extends AppCatAbstractRepository<ApplicationInterfaceDescription, ApplicationInterfaceEntity, String>
+        extends AbstractRepository<ApplicationInterfaceDescription, ApplicationInterfaceEntity, String>
         implements ApplicationInterface {
     private static final Logger logger = LoggerFactory.getLogger(ApplicationInterfaceRepository.class);
 
@@ -48,6 +48,16 @@ public class ApplicationInterfaceRepository
         super(ApplicationInterfaceDescription.class, ApplicationInterfaceEntity.class);
     }
 
+    @Override
+    protected ApplicationInterfaceDescription toModel(ApplicationInterfaceEntity entity) {
+        return ComputeMapper.INSTANCE.appInterfaceToModel(entity);
+    }
+
+    @Override
+    protected ApplicationInterfaceEntity toEntity(ApplicationInterfaceDescription model) {
+        return ComputeMapper.INSTANCE.appInterfaceToEntity(model);
+    }
+
     protected String saveApplicationInterfaceDescriptorData(
             ApplicationInterfaceDescription applicationInterfaceDescription, String gatewayId)
             throws AppCatalogException {
@@ -71,9 +81,8 @@ public class ApplicationInterfaceRepository
         }
 
         String applicationInterfaceId = applicationInterfaceDescription.getApplicationInterfaceId();
-        Mapper mapper = ObjectMapperSingleton.getInstance();
         ApplicationInterfaceEntity applicationInterfaceEntity =
-                mapper.map(applicationInterfaceDescription, ApplicationInterfaceEntity.class);
+                ComputeMapper.INSTANCE.appInterfaceToEntity(applicationInterfaceDescription);
 
         if (gatewayId != null) {
             logger.debug("Setting the gateway ID of the Application Interface");
@@ -120,8 +129,7 @@ public class ApplicationInterfaceRepository
         }
 
         String applicationModuleId = applicationModule.getAppModuleId();
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        ApplicationModuleEntity applicationModuleEntity = mapper.map(applicationModule, ApplicationModuleEntity.class);
+        ApplicationModuleEntity applicationModuleEntity = ComputeMapper.INSTANCE.appModuleToEntity(applicationModule);
 
         if (gatewayId != null) {
             logger.debug("Setting the gateway ID of the Application Module");
@@ -152,12 +160,11 @@ public class ApplicationInterfaceRepository
 
     @Override
     public void addApplicationModuleMapping(String moduleId, String interfaceId) throws AppCatalogException {
-        Mapper mapper = ObjectMapperSingleton.getInstance();
         ApplicationModule applicationModule = getApplicationModule(moduleId);
         ApplicationInterfaceDescription applicationInterfaceDescription = getApplicationInterface(interfaceId);
-        ApplicationModuleEntity applicationModuleEntity = mapper.map(applicationModule, ApplicationModuleEntity.class);
+        ApplicationModuleEntity applicationModuleEntity = ComputeMapper.INSTANCE.appModuleToEntity(applicationModule);
         ApplicationInterfaceEntity applicationInterfaceEntity =
-                mapper.map(applicationInterfaceDescription, ApplicationInterfaceEntity.class);
+                ComputeMapper.INSTANCE.appInterfaceToEntity(applicationInterfaceDescription);
         AppModuleMappingEntity appModuleMappingEntity = new AppModuleMappingEntity();
         appModuleMappingEntity.setModuleId(moduleId);
         appModuleMappingEntity.setInterfaceId(interfaceId);
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 0728319391..3c027a8898 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
@@ -19,13 +19,25 @@
 */
 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;
 
 public class ApplicationModuleRepository
-        extends AppCatAbstractRepository<ApplicationModule, ApplicationModuleEntity, String> {
+        extends AbstractRepository<ApplicationModule, ApplicationModuleEntity, String> {
 
     public ApplicationModuleRepository() {
         super(ApplicationModule.class, ApplicationModuleEntity.class);
     }
+
+    @Override
+    protected ApplicationModule toModel(ApplicationModuleEntity entity) {
+        return ComputeMapper.INSTANCE.appModuleToModel(entity);
+    }
+
+    @Override
+    protected ApplicationModuleEntity toEntity(ApplicationModule model) {
+        return ComputeMapper.INSTANCE.appModuleToEntity(model);
+    }
 }
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 df7aaf3cf4..160e9d6295 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
@@ -19,14 +19,26 @@
 */
 package org.apache.airavata.compute.repository;
 
+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;
 
 public class ApplicationOutputRepository
-        extends AppCatAbstractRepository<OutputDataObjectType, ApplicationOutputEntity, ApplicationOutputPK> {
+        extends AbstractRepository<OutputDataObjectType, ApplicationOutputEntity, ApplicationOutputPK> {
 
     public ApplicationOutputRepository() {
         super(OutputDataObjectType.class, ApplicationOutputEntity.class);
     }
+
+    @Override
+    protected OutputDataObjectType toModel(ApplicationOutputEntity entity) {
+        return ComputeMapper.INSTANCE.appOutputToModel(entity);
+    }
+
+    @Override
+    protected ApplicationOutputEntity toEntity(OutputDataObjectType model) {
+        return ComputeMapper.INSTANCE.appOutputToEntity(model);
+    }
 }
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 3afc55e52b..dfd80d726f 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
@@ -19,16 +19,28 @@
 */
 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;
 
 /**
  * Created by skariyat on 2/10/18.
  */
 public class BatchQueuePolicyRepository
-        extends AppCatAbstractRepository<BatchQueueResourcePolicy, BatchQueueResourcePolicyEntity, String> {
+        extends AbstractRepository<BatchQueueResourcePolicy, BatchQueueResourcePolicyEntity, String> {
 
     public BatchQueuePolicyRepository() {
         super(BatchQueueResourcePolicy.class, BatchQueueResourcePolicyEntity.class);
     }
+
+    @Override
+    protected BatchQueueResourcePolicy toModel(BatchQueueResourcePolicyEntity entity) {
+        return ComputeMapper.INSTANCE.batchQueuePolicyToModel(entity);
+    }
+
+    @Override
+    protected BatchQueueResourcePolicyEntity toEntity(BatchQueueResourcePolicy model) {
+        return ComputeMapper.INSTANCE.batchQueuePolicyToEntity(model);
+    }
 }
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 db0fcbce55..655bf45f4f 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
@@ -19,13 +19,25 @@
 */
 package org.apache.airavata.compute.repository;
 
+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;
 
-public class BatchQueueRepository extends AppCatAbstractRepository<BatchQueue, BatchQueueEntity, BatchQueuePK> {
+public class BatchQueueRepository extends AbstractRepository<BatchQueue, BatchQueueEntity, BatchQueuePK> {
 
     public BatchQueueRepository() {
         super(BatchQueue.class, BatchQueueEntity.class);
     }
+
+    @Override
+    protected BatchQueue toModel(BatchQueueEntity entity) {
+        return ComputeMapper.INSTANCE.batchQueueToModel(entity);
+    }
+
+    @Override
+    protected BatchQueueEntity toEntity(BatchQueue model) {
+        return ComputeMapper.INSTANCE.batchQueueToEntity(model);
+    }
 }
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 aea09855f6..ee6fbfe32d 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
@@ -19,16 +19,28 @@
 */
 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;
 
 /**
  * Created by skariyat on 2/10/18.
  */
 public class ComputeResourcePolicyRepository
-        extends AppCatAbstractRepository<ComputeResourcePolicy, ComputeResourcePolicyEntity, String> {
+        extends AbstractRepository<ComputeResourcePolicy, ComputeResourcePolicyEntity, String> {
 
     public ComputeResourcePolicyRepository() {
         super(ComputeResourcePolicy.class, ComputeResourcePolicyEntity.class);
     }
+
+    @Override
+    protected ComputeResourcePolicy toModel(ComputeResourcePolicyEntity entity) {
+        return ComputeMapper.INSTANCE.computeResourcePolicyToModel(entity);
+    }
+
+    @Override
+    protected ComputeResourcePolicyEntity toEntity(ComputeResourcePolicy model) {
+        return ComputeMapper.INSTANCE.computeResourcePolicyToEntity(model);
+    }
 }
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 6f7b0c0079..f0b203dde7 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
@@ -21,19 +21,31 @@ package org.apache.airavata.compute.repository;
 
 import java.util.HashMap;
 import java.util.Map;
+import org.apache.airavata.compute.mapper.ComputeMapper;
 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;
 
 public class ComputeResourcePrefRepository
-        extends AppCatAbstractRepository<
+        extends AbstractRepository<
                 ComputeResourcePreference, ComputeResourcePreferenceEntity, ComputeResourcePreferencePK> {
 
     public ComputeResourcePrefRepository() {
         super(ComputeResourcePreference.class, ComputeResourcePreferenceEntity.class);
     }
 
+    @Override
+    protected ComputeResourcePreference toModel(ComputeResourcePreferenceEntity entity) {
+        return ComputeMapper.INSTANCE.computeResourcePrefToModel(entity);
+    }
+
+    @Override
+    protected ComputeResourcePreferenceEntity toEntity(ComputeResourcePreference model) {
+        return ComputeMapper.INSTANCE.computeResourcePrefToEntity(model);
+    }
+
     public Map<String, String> getsshAccountProvisionerConfig(String gatewayId, String hostId) {
         ComputeResourcePreferencePK computeResourcePreferencePK = new ComputeResourcePreferencePK();
         computeResourcePreferencePK.setGatewayId(gatewayId);
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 4abec829f5..83538e10c1 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
@@ -19,25 +19,23 @@
 */
 package org.apache.airavata.compute.repository;
 
-import com.github.dozermapper.core.Mapper;
 import jakarta.persistence.Query;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 import org.apache.airavata.common.util.AiravataUtils;
-import org.apache.airavata.compute.model.BatchQueuePK;
+import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.CloudJobSubmissionEntity;
 import org.apache.airavata.compute.model.ComputeResourceEntity;
 import org.apache.airavata.compute.model.ComputeResourceFileSystemEntity;
-import org.apache.airavata.compute.model.JobSubmissionInterfacePK;
 import org.apache.airavata.compute.model.LocalSubmissionEntity;
 import org.apache.airavata.compute.model.ResourceJobManagerEntity;
 import org.apache.airavata.compute.model.SshJobSubmissionEntity;
 import org.apache.airavata.compute.model.UnicoreSubmissionEntity;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.AppCatalogUtils;
 import org.apache.airavata.execution.util.DBConstants;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.AppCatalogException;
 import org.apache.airavata.execution.util.cpi.ComputeResource;
@@ -59,7 +57,6 @@ 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.storage.model.DataMovementInterfacePK;
 import org.apache.airavata.storage.model.GridftpDataMovementEntity;
 import org.apache.airavata.storage.model.GridftpEndpointEntity;
 import org.apache.airavata.storage.model.LocalDataMovementEntity;
@@ -70,7 +67,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ComputeResourceRepository
-        extends AppCatAbstractRepository<ComputeResourceDescription, ComputeResourceEntity, String>
+        extends AbstractRepository<ComputeResourceDescription, ComputeResourceEntity, String>
         implements ComputeResource {
 
     private static final Logger logger = LoggerFactory.getLogger(ComputeResourceRepository.class);
@@ -79,6 +76,16 @@ public class ComputeResourceRepository
         super(ComputeResourceDescription.class, ComputeResourceEntity.class);
     }
 
+    @Override
+    protected ComputeResourceDescription toModel(ComputeResourceEntity entity) {
+        return ComputeMapper.INSTANCE.computeResourceToModel(entity);
+    }
+
+    @Override
+    protected ComputeResourceEntity toEntity(ComputeResourceDescription model) {
+        return ComputeMapper.INSTANCE.computeResourceToEntity(model);
+    }
+
     @Override
     public String addComputeResource(ComputeResourceDescription description) throws AppCatalogException {
         if (description.getComputeResourceId().equals("")
@@ -99,8 +106,7 @@ public class ComputeResourceRepository
     protected ComputeResourceEntity saveComputeResource(ComputeResourceDescription description)
             throws AppCatalogException {
         String computeResourceId = description.getComputeResourceId();
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        ComputeResourceEntity computeResourceEntity = mapper.map(description, ComputeResourceEntity.class);
+        ComputeResourceEntity computeResourceEntity = ComputeMapper.INSTANCE.computeResourceToEntity(description);
         if (computeResourceEntity.getBatchQueues() != null) {
             computeResourceEntity
                     .getBatchQueues()
@@ -246,8 +252,8 @@ public class ComputeResourceRepository
         String submissionId = AppCatalogUtils.getID("SSH");
         sshJobSubmission.setJobSubmissionInterfaceId(submissionId);
         String resourceJobManagerId = addResourceJobManager(sshJobSubmission.getResourceJobManager());
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        SshJobSubmissionEntity sshJobSubmissionEntity = mapper.map(sshJobSubmission, SshJobSubmissionEntity.class);
+        SshJobSubmissionEntity sshJobSubmissionEntity =
+                ComputeMapper.INSTANCE.sshJobSubmissionToEntity(sshJobSubmission);
         sshJobSubmissionEntity.getResourceJobManager().setResourceJobManagerId(resourceJobManagerId);
         if (sshJobSubmission.getResourceJobManager().getParallelismPrefix() != null) {
             (new ResourceJobManagerRepository())
@@ -270,8 +276,8 @@ public class ComputeResourceRepository
     }
 
     public void updateSSHJobSubmission(SSHJobSubmission sshJobSubmission) throws AppCatalogException {
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        SshJobSubmissionEntity sshJobSubmissionEntity = mapper.map(sshJobSubmission, SshJobSubmissionEntity.class);
+        SshJobSubmissionEntity sshJobSubmissionEntity =
+                ComputeMapper.INSTANCE.sshJobSubmissionToEntity(sshJobSubmission);
         sshJobSubmissionEntity.setUpdateTime(AiravataUtils.getCurrentTimestamp());
         execute(entityManager -> entityManager.merge(sshJobSubmissionEntity));
     }
@@ -279,17 +285,15 @@ public class ComputeResourceRepository
     @Override
     public String addCloudJobSubmission(CloudJobSubmission cloudJobSubmission) throws AppCatalogException {
         cloudJobSubmission.setJobSubmissionInterfaceId(AppCatalogUtils.getID("Cloud"));
-        Mapper mapper = ObjectMapperSingleton.getInstance();
         CloudJobSubmissionEntity cloudJobSubmissionEntity =
-                mapper.map(cloudJobSubmission, CloudJobSubmissionEntity.class);
+                ComputeMapper.INSTANCE.cloudJobSubmissionToEntity(cloudJobSubmission);
         execute(entityManager -> entityManager.merge(cloudJobSubmissionEntity));
         return cloudJobSubmissionEntity.getJobSubmissionInterfaceId();
     }
 
     public void updateCloudJobSubmission(CloudJobSubmission cloudJobSubmission) throws AppCatalogException {
-        Mapper mapper = ObjectMapperSingleton.getInstance();
         CloudJobSubmissionEntity cloudJobSubmissionEntity =
-                mapper.map(cloudJobSubmission, CloudJobSubmissionEntity.class);
+                ComputeMapper.INSTANCE.cloudJobSubmissionToEntity(cloudJobSubmission);
         execute(entityManager -> entityManager.merge(cloudJobSubmissionEntity));
     }
 
@@ -298,9 +302,8 @@ public class ComputeResourceRepository
         ResourceJobManagerRepository resourceJobManagerRepository = new ResourceJobManagerRepository();
         resourceJobManager.setResourceJobManagerId(AppCatalogUtils.getID("RJM"));
         resourceJobManagerRepository.create(resourceJobManager);
-        Mapper mapper = ObjectMapperSingleton.getInstance();
         ResourceJobManagerEntity resourceJobManagerEntity =
-                mapper.map(resourceJobManager, ResourceJobManagerEntity.class);
+                ComputeMapper.INSTANCE.resourceJobManagerToEntity(resourceJobManager);
         Map<JobManagerCommand, String> jobManagerCommands = resourceJobManager.getJobManagerCommands();
         if (jobManagerCommands != null && jobManagerCommands.size() != 0) {
             resourceJobManagerRepository.createJobManagerCommand(jobManagerCommands, resourceJobManagerEntity);
@@ -319,9 +322,8 @@ public class ComputeResourceRepository
         ResourceJobManagerRepository resourceJobManagerRepository = new ResourceJobManagerRepository();
         updatedResourceJobManager.setResourceJobManagerId(resourceJobManagerId);
         ResourceJobManager resourceJobManager = resourceJobManagerRepository.create(updatedResourceJobManager);
-        Mapper mapper = ObjectMapperSingleton.getInstance();
         ResourceJobManagerEntity resourceJobManagerEntity =
-                mapper.map(resourceJobManager, ResourceJobManagerEntity.class);
+                ComputeMapper.INSTANCE.resourceJobManagerToEntity(resourceJobManager);
         Map<JobManagerCommand, String> jobManagerCommands = updatedResourceJobManager.getJobManagerCommands();
         if (jobManagerCommands != null && jobManagerCommands.size() != 0) {
             resourceJobManagerRepository.createJobManagerCommand(jobManagerCommands, resourceJobManagerEntity);
@@ -361,8 +363,7 @@ public class ComputeResourceRepository
     public String addLocalJobSubmission(LOCALSubmission localSubmission) throws AppCatalogException {
         localSubmission.setJobSubmissionInterfaceId(AppCatalogUtils.getID("LOCAL"));
         String resourceJobManagerId = addResourceJobManager(localSubmission.getResourceJobManager());
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        LocalSubmissionEntity localSubmissionEntity = mapper.map(localSubmission, LocalSubmissionEntity.class);
+        LocalSubmissionEntity localSubmissionEntity = ComputeMapper.INSTANCE.localSubmissionToEntity(localSubmission);
         localSubmissionEntity.setResourceJobManagerId(resourceJobManagerId);
         localSubmissionEntity.getResourceJobManager().setResourceJobManagerId(resourceJobManagerId);
         if (localSubmission.getResourceJobManager().getParallelismPrefix() != null) {
@@ -384,9 +385,7 @@ public class ComputeResourceRepository
     }
 
     public void updateLocalJobSubmission(LOCALSubmission localSubmission) throws AppCatalogException {
-
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        LocalSubmissionEntity localSubmissionEntity = mapper.map(localSubmission, LocalSubmissionEntity.class);
+        LocalSubmissionEntity localSubmissionEntity = ComputeMapper.INSTANCE.localSubmissionToEntity(localSubmission);
         localSubmissionEntity.setUpdateTime(AiravataUtils.getCurrentTimestamp());
         execute(entityManager -> entityManager.merge(localSubmissionEntity));
     }
@@ -399,9 +398,8 @@ public class ComputeResourceRepository
     @Override
     public String addUNICOREJobSubmission(UnicoreJobSubmission unicoreJobSubmission) throws AppCatalogException {
         unicoreJobSubmission.setJobSubmissionInterfaceId(AppCatalogUtils.getID("UNICORE"));
-        Mapper mapper = ObjectMapperSingleton.getInstance();
         UnicoreSubmissionEntity unicoreSubmissionEntity =
-                mapper.map(unicoreJobSubmission, UnicoreSubmissionEntity.class);
+                ComputeMapper.INSTANCE.unicoreSubmissionToEntity(unicoreJobSubmission);
         if (unicoreJobSubmission.getSecurityProtocol() != null) {
             unicoreSubmissionEntity.setSecurityProtocol(unicoreJobSubmission.getSecurityProtocol());
         }
@@ -412,30 +410,28 @@ public class ComputeResourceRepository
     @Override
     public String addLocalDataMovement(LOCALDataMovement localDataMovement) throws AppCatalogException {
         localDataMovement.setDataMovementInterfaceId(AppCatalogUtils.getID("LOCAL"));
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        LocalDataMovementEntity localDataMovementEntity = mapper.map(localDataMovement, LocalDataMovementEntity.class);
+        LocalDataMovementEntity localDataMovementEntity =
+                ComputeMapper.INSTANCE.localDataMovementToEntity(localDataMovement);
         execute(entityManager -> entityManager.merge(localDataMovementEntity));
         return localDataMovementEntity.getDataMovementInterfaceId();
     }
 
     public void updateLocalDataMovement(LOCALDataMovement localDataMovement) throws AppCatalogException {
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        LocalDataMovementEntity localDataMovementEntity = mapper.map(localDataMovement, LocalDataMovementEntity.class);
+        LocalDataMovementEntity localDataMovementEntity =
+                ComputeMapper.INSTANCE.localDataMovementToEntity(localDataMovement);
         execute(entityManager -> entityManager.merge(localDataMovementEntity));
     }
 
     @Override
     public String addScpDataMovement(SCPDataMovement scpDataMovement) throws AppCatalogException {
         scpDataMovement.setDataMovementInterfaceId(AppCatalogUtils.getID("SCP"));
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        ScpDataMovementEntity scpDataMovementEntity = mapper.map(scpDataMovement, ScpDataMovementEntity.class);
+        ScpDataMovementEntity scpDataMovementEntity = ComputeMapper.INSTANCE.scpDataMovementToEntity(scpDataMovement);
         execute(entityManager -> entityManager.merge(scpDataMovementEntity));
         return scpDataMovementEntity.getDataMovementInterfaceId();
     }
 
     public void updateScpDataMovement(SCPDataMovement scpDataMovement) throws AppCatalogException {
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        ScpDataMovementEntity scpDataMovementEntity = mapper.map(scpDataMovement, ScpDataMovementEntity.class);
+        ScpDataMovementEntity scpDataMovementEntity = ComputeMapper.INSTANCE.scpDataMovementToEntity(scpDataMovement);
         scpDataMovementEntity.setUpdateTime(AiravataUtils.getCurrentTimestamp());
         execute(entityManager -> entityManager.merge(scpDataMovementEntity));
     }
@@ -443,9 +439,8 @@ public class ComputeResourceRepository
     @Override
     public String addUnicoreDataMovement(UnicoreDataMovement unicoreDataMovement) throws AppCatalogException {
         unicoreDataMovement.setDataMovementInterfaceId(AppCatalogUtils.getID("UNICORE"));
-        Mapper mapper = ObjectMapperSingleton.getInstance();
         UnicoreDatamovementEntity unicoreDatamovementEntity =
-                mapper.map(unicoreDataMovement, UnicoreDatamovementEntity.class);
+                ComputeMapper.INSTANCE.unicoreDataMovementToEntity(unicoreDataMovement);
         execute(entityManager -> entityManager.merge(unicoreDatamovementEntity));
         return unicoreDatamovementEntity.getDataMovementInterfaceId();
     }
@@ -459,9 +454,8 @@ public class ComputeResourceRepository
     @Override
     public String addGridFTPDataMovement(GridFTPDataMovement gridFTPDataMovement) throws AppCatalogException {
         gridFTPDataMovement.setDataMovementInterfaceId(AppCatalogUtils.getID("GRIDFTP"));
-        Mapper mapper = ObjectMapperSingleton.getInstance();
         GridftpDataMovementEntity gridftpDataMovementEntity =
-                mapper.map(gridFTPDataMovement, GridftpDataMovementEntity.class);
+                ComputeMapper.INSTANCE.gridFtpDataMovementToEntity(gridFTPDataMovement);
         execute(entityManager -> entityManager.merge(gridftpDataMovementEntity));
         List<String> gridFTPEndPoint = gridFTPDataMovement.getGridFTPEndPoints();
         if (gridFTPEndPoint != null && !gridFTPEndPoint.isEmpty()) {
@@ -481,8 +475,7 @@ public class ComputeResourceRepository
         SshJobSubmissionEntity entity =
                 execute(entityManager -> entityManager.find(SshJobSubmissionEntity.class, submissionId));
         if (entity == null) return null;
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        SSHJobSubmission sshJobSubmission = mapper.map(entity, SSHJobSubmission.class);
+        SSHJobSubmission sshJobSubmission = ComputeMapper.INSTANCE.sshJobSubmissionToModel(entity);
         sshJobSubmission
                 .getResourceJobManager()
                 .setParallelismPrefix((new ResourceJobManagerRepository()
@@ -501,8 +494,7 @@ public class ComputeResourceRepository
         UnicoreSubmissionEntity entity =
                 execute(entityManager -> entityManager.find(UnicoreSubmissionEntity.class, submissionId));
         if (entity == null) return null;
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        return mapper.map(entity, UnicoreJobSubmission.class);
+        return ComputeMapper.INSTANCE.unicoreSubmissionToModel(entity);
     }
 
     @Override
@@ -510,8 +502,7 @@ public class ComputeResourceRepository
         UnicoreDatamovementEntity entity =
                 execute(entityManager -> entityManager.find(UnicoreDatamovementEntity.class, dataMovementId));
         if (entity == null) return null;
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        return mapper.map(entity, UnicoreDataMovement.class);
+        return ComputeMapper.INSTANCE.unicoreDataMovementToModel(entity);
     }
 
     @Override
@@ -519,8 +510,7 @@ public class ComputeResourceRepository
         CloudJobSubmissionEntity entity =
                 execute(entityManager -> entityManager.find(CloudJobSubmissionEntity.class, submissionId));
         if (entity == null) return null;
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        return mapper.map(entity, CloudJobSubmission.class);
+        return ComputeMapper.INSTANCE.cloudJobSubmissionToModel(entity);
     }
 
     @Override
@@ -528,8 +518,7 @@ public class ComputeResourceRepository
         ScpDataMovementEntity entity =
                 execute(entityManager -> entityManager.find(ScpDataMovementEntity.class, dataMoveId));
         if (entity == null) return null;
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        return mapper.map(entity, SCPDataMovement.class);
+        return ComputeMapper.INSTANCE.scpDataMovementToModel(entity);
     }
 
     @Override
@@ -552,12 +541,10 @@ public class ComputeResourceRepository
 
         List<GridftpEndpointEntity> endpointEntities = resultSet;
 
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-
         List<String> endpoints = endpointEntities.stream()
                 .map(GridftpEndpointEntity::getEndpoint)
                 .collect(Collectors.toList());
-        GridFTPDataMovement dataMovement = mapper.map(entity, GridFTPDataMovement.class);
+        GridFTPDataMovement dataMovement = ComputeMapper.INSTANCE.gridFtpDataMovementToModel(entity);
         dataMovement.setGridFTPEndPoints(endpoints);
 
         return dataMovement;
@@ -566,27 +553,41 @@ public class ComputeResourceRepository
     @Override
     public void removeJobSubmissionInterface(String computeResourceId, String jobSubmissionInterfaceId)
             throws AppCatalogException {
-        JobSubmissionInterfacePK jobSubmissionInterfacePK = new JobSubmissionInterfacePK();
-        jobSubmissionInterfacePK.setComputeResourceId(computeResourceId);
-        jobSubmissionInterfacePK.setJobSubmissionInterfaceId(jobSubmissionInterfaceId);
-        (new JobSubmissionInterfaceRepository()).delete(jobSubmissionInterfacePK);
+        execute(entityManager -> {
+            ComputeResourceEntity parent = entityManager.find(ComputeResourceEntity.class, computeResourceId);
+            if (parent != null && parent.getJobSubmissionInterfaces() != null) {
+                parent.getJobSubmissionInterfaces()
+                        .removeIf(e -> jobSubmissionInterfaceId.equals(e.getJobSubmissionInterfaceId()));
+                entityManager.merge(parent);
+            }
+            return null;
+        });
     }
 
     @Override
     public void removeDataMovementInterface(String computeResourceId, String dataMovementInterfaceId)
             throws AppCatalogException {
-        DataMovementInterfacePK dataMovementInterfacePK = new DataMovementInterfacePK();
-        dataMovementInterfacePK.setDataMovementInterfaceId(dataMovementInterfaceId);
-        dataMovementInterfacePK.setComputeResourceId(computeResourceId);
-        (new DataMovementRepository()).delete(dataMovementInterfacePK);
+        execute(entityManager -> {
+            ComputeResourceEntity parent = entityManager.find(ComputeResourceEntity.class, computeResourceId);
+            if (parent != null && parent.getDataMovementInterfaces() != null) {
+                parent.getDataMovementInterfaces()
+                        .removeIf(e -> dataMovementInterfaceId.equals(e.getDataMovementInterfaceId()));
+                entityManager.merge(parent);
+            }
+            return null;
+        });
     }
 
     @Override
     public void removeBatchQueue(String computeResourceId, String queueName) throws AppCatalogException {
-        BatchQueuePK batchQueuePK = new BatchQueuePK();
-        batchQueuePK.setQueueName(queueName);
-        batchQueuePK.setComputeResourceId(computeResourceId);
-        (new BatchQueueRepository()).delete(batchQueuePK);
+        execute(entityManager -> {
+            ComputeResourceEntity parent = entityManager.find(ComputeResourceEntity.class, computeResourceId);
+            if (parent != null && parent.getBatchQueues() != null) {
+                parent.getBatchQueues().removeIf(e -> queueName.equals(e.getQueueName()));
+                entityManager.merge(parent);
+            }
+            return null;
+        });
     }
 
     @Override
@@ -594,8 +595,7 @@ public class ComputeResourceRepository
         LocalSubmissionEntity entity =
                 execute(entityManager -> entityManager.find(LocalSubmissionEntity.class, submissionId));
         if (entity == null) return null;
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        LOCALSubmission localSubmission = mapper.map(entity, LOCALSubmission.class);
+        LOCALSubmission localSubmission = ComputeMapper.INSTANCE.localSubmissionToModel(entity);
         localSubmission
                 .getResourceJobManager()
                 .setParallelismPrefix((new ResourceJobManagerRepository()
@@ -614,7 +614,6 @@ public class ComputeResourceRepository
         LocalDataMovementEntity entity =
                 execute(entityManager -> entityManager.find(LocalDataMovementEntity.class, datamovementId));
         if (entity == null) return null;
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        return mapper.map(entity, LOCALDataMovement.class);
+        return ComputeMapper.INSTANCE.localDataMovementToModel(entity);
     }
 }
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 43044a17b5..d7e2a3c0db 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
@@ -19,11 +19,23 @@
 */
 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;
 
-public class GatewayGroupsRepository extends AppCatAbstractRepository<GatewayGroups, GatewayGroupsEntity, String> {
+public class GatewayGroupsRepository extends AbstractRepository<GatewayGroups, GatewayGroupsEntity, String> {
     public GatewayGroupsRepository() {
         super(GatewayGroups.class, GatewayGroupsEntity.class);
     }
+
+    @Override
+    protected GatewayGroups toModel(GatewayGroupsEntity entity) {
+        return ComputeMapper.INSTANCE.gatewayGroupsToModel(entity);
+    }
+
+    @Override
+    protected GatewayGroupsEntity toEntity(GatewayGroups model) {
+        return ComputeMapper.INSTANCE.gatewayGroupsToEntity(model);
+    }
 }
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 3db81dfe48..c463f720eb 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
@@ -26,12 +26,14 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import org.apache.airavata.common.util.AiravataUtils;
+import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.AWSGroupComputeResourcePrefEntity;
 import org.apache.airavata.compute.model.ComputeResourceReservationEntity;
 import org.apache.airavata.compute.model.GroupComputeResourcePrefEntity;
 import org.apache.airavata.compute.model.GroupComputeResourcePrefPK;
 import org.apache.airavata.compute.model.GroupResourceProfileEntity;
 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;
@@ -47,12 +49,22 @@ import org.apache.airavata.model.commons.airavata_commonsConstants;
  * Created by skariyat on 2/8/18.
  */
 public class GroupResourceProfileRepository
-        extends AppCatAbstractRepository<GroupResourceProfile, GroupResourceProfileEntity, String> {
+        extends AbstractRepository<GroupResourceProfile, GroupResourceProfileEntity, String> {
 
     public GroupResourceProfileRepository() {
         super(GroupResourceProfile.class, GroupResourceProfileEntity.class);
     }
 
+    @Override
+    protected GroupResourceProfile toModel(GroupResourceProfileEntity entity) {
+        return ComputeMapper.INSTANCE.groupResourceProfileToModel(entity);
+    }
+
+    @Override
+    protected GroupResourceProfileEntity toEntity(GroupResourceProfile model) {
+        return ComputeMapper.INSTANCE.groupResourceProfileToEntity(model);
+    }
+
     public String addGroupResourceProfile(GroupResourceProfile groupResourceProfile) {
 
         final String groupResourceProfileId = UUID.randomUUID().toString();
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 22dee83d40..d8d711d566 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
@@ -19,10 +19,12 @@
 */
 package org.apache.airavata.compute.repository;
 
+import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.AWSGroupComputeResourcePrefEntity;
 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;
@@ -33,13 +35,23 @@ import org.apache.airavata.model.appcatalog.groupresourceprofile.SlurmComputeRes
  * Created by skariyat on 2/10/18.
  */
 public class GrpComputePrefRepository
-        extends AppCatAbstractRepository<
+        extends AbstractRepository<
                 GroupComputeResourcePreference, GroupComputeResourcePrefEntity, GroupComputeResourcePrefPK> {
 
     public GrpComputePrefRepository() {
         super(GroupComputeResourcePreference.class, GroupComputeResourcePrefEntity.class);
     }
 
+    @Override
+    protected GroupComputeResourcePreference toModel(GroupComputeResourcePrefEntity entity) {
+        return ComputeMapper.INSTANCE.groupComputePrefToModel(entity);
+    }
+
+    @Override
+    protected GroupComputeResourcePrefEntity toEntity(GroupComputeResourcePreference model) {
+        return ComputeMapper.INSTANCE.groupComputePrefToEntity(model);
+    }
+
     @Override
     public GroupComputeResourcePreference get(GroupComputeResourcePrefPK groupComputeResourcePrefPK) {
         GroupComputeResourcePreference pref = super.get(groupComputeResourcePrefPK);
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 4b5b8c49ac..5f99d1c57f 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
@@ -19,15 +19,15 @@
 */
 package org.apache.airavata.compute.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.airavata.common.util.AiravataUtils;
+import org.apache.airavata.compute.mapper.ComputeMapper;
 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.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.AppCatalogException;
 import org.apache.airavata.execution.util.cpi.GwyResourceProfile;
@@ -40,8 +40,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class GwyResourceProfileRepository
-        extends AppCatAbstractRepository<GatewayResourceProfile, GatewayProfileEntity, String>
-        implements GwyResourceProfile {
+        extends AbstractRepository<GatewayResourceProfile, GatewayProfileEntity, String> implements GwyResourceProfile {
 
     private static final Logger logger = LoggerFactory.getLogger(GwyResourceProfileRepository.class);
 
@@ -49,6 +48,16 @@ public class GwyResourceProfileRepository
         super(GatewayResourceProfile.class, GatewayProfileEntity.class);
     }
 
+    @Override
+    protected GatewayResourceProfile toModel(GatewayProfileEntity entity) {
+        return ComputeMapper.INSTANCE.gatewayProfileToModel(entity);
+    }
+
+    @Override
+    protected GatewayProfileEntity toEntity(GatewayResourceProfile model) {
+        return ComputeMapper.INSTANCE.gatewayProfileToEntity(model);
+    }
+
     @Override
     public String addGatewayResourceProfile(GatewayResourceProfile gatewayResourceProfile) {
 
@@ -63,8 +72,8 @@ public class GwyResourceProfileRepository
 
     public String updateGatewayResourceProfile(GatewayResourceProfile gatewayResourceProfile) {
         String gatewayId = gatewayResourceProfile.getGatewayID();
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        GatewayProfileEntity gatewayProfileEntity = mapper.map(gatewayResourceProfile, GatewayProfileEntity.class);
+        GatewayProfileEntity gatewayProfileEntity =
+                ComputeMapper.INSTANCE.gatewayProfileToEntity(gatewayResourceProfile);
         // Explicitly set gatewayId since Dozer mapping does not handle gatewayID -> gatewayId conversion
         gatewayProfileEntity.setGatewayId(gatewayId);
         if (get(gatewayId) != null) {
@@ -88,7 +97,7 @@ public class GwyResourceProfileRepository
                 if (preference.getSshAccountProvisionerConfig() != null
                         && !preference.getSshAccountProvisionerConfig().isEmpty()) {
                     ComputeResourcePreferenceEntity computeResourcePreferenceEntity =
-                            mapper.map(preference, ComputeResourcePreferenceEntity.class);
+                            ComputeMapper.INSTANCE.computeResourcePrefToEntity(preference);
                     computeResourcePreferenceEntity.setGatewayId(gatewayId);
                     List<SSHAccountProvisionerConfiguration> configurations = new ArrayList<>();
                     for (String sshAccountProvisionerConfigName :
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 4ebc3ca670..c48781587c 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
@@ -19,24 +19,32 @@
 */
 package org.apache.airavata.compute.repository;
 
-import com.github.dozermapper.core.Mapper;
+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.ObjectMapperSingleton;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
 
 public class JobSubmissionInterfaceRepository
-        extends AppCatAbstractRepository<
-                JobSubmissionInterface, JobSubmissionInterfaceEntity, JobSubmissionInterfacePK> {
+        extends AbstractRepository<JobSubmissionInterface, JobSubmissionInterfaceEntity, JobSubmissionInterfacePK> {
 
     public JobSubmissionInterfaceRepository() {
         super(JobSubmissionInterface.class, JobSubmissionInterfaceEntity.class);
     }
 
+    @Override
+    protected JobSubmissionInterface toModel(JobSubmissionInterfaceEntity entity) {
+        return ComputeMapper.INSTANCE.jobSubmissionInterfaceToModel(entity);
+    }
+
+    @Override
+    protected JobSubmissionInterfaceEntity toEntity(JobSubmissionInterface model) {
+        return ComputeMapper.INSTANCE.jobSubmissionInterfaceToEntity(model);
+    }
+
     public String addJobSubmission(String computeResourceId, JobSubmissionInterface jobSubmissionInterface) {
-        Mapper mapper = ObjectMapperSingleton.getInstance();
         JobSubmissionInterfaceEntity jobSubmissionInterfaceEntity =
-                mapper.map(jobSubmissionInterface, JobSubmissionInterfaceEntity.class);
+                ComputeMapper.INSTANCE.jobSubmissionInterfaceToEntity(jobSubmissionInterface);
         jobSubmissionInterfaceEntity.setComputeResourceId(computeResourceId);
         execute(entityManager -> entityManager.merge(jobSubmissionInterfaceEntity));
 
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 5f109049b0..54592446e8 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
@@ -19,13 +19,15 @@
 */
 package org.apache.airavata.compute.repository;
 
+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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ParserInputRepository extends AppCatAbstractRepository<ParserInput, ParserInputEntity, String> {
+public class ParserInputRepository extends AbstractRepository<ParserInput, ParserInputEntity, String> {
 
     private static final Logger logger = LoggerFactory.getLogger(ParserInputRepository.class);
 
@@ -33,6 +35,16 @@ public class ParserInputRepository extends AppCatAbstractRepository<ParserInput,
         super(ParserInput.class, ParserInputEntity.class);
     }
 
+    @Override
+    protected ParserInput toModel(ParserInputEntity entity) {
+        return ComputeMapper.INSTANCE.parserInputToModel(entity);
+    }
+
+    @Override
+    protected ParserInputEntity toEntity(ParserInput model) {
+        return ComputeMapper.INSTANCE.parserInputToEntity(model);
+    }
+
     public ParserInput getParserInput(String inputId) throws AppCatalogException {
         try {
             return super.get(inputId);
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 3875dd91dd..808a3b027c 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
@@ -19,13 +19,15 @@
 */
 package org.apache.airavata.compute.repository;
 
+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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ParserOutputRepository extends AppCatAbstractRepository<ParserOutput, ParserOutputEntity, String> {
+public class ParserOutputRepository extends AbstractRepository<ParserOutput, ParserOutputEntity, String> {
 
     private static final Logger logger = LoggerFactory.getLogger(ParserInputRepository.class);
 
@@ -33,6 +35,16 @@ public class ParserOutputRepository extends AppCatAbstractRepository<ParserOutpu
         super(ParserOutput.class, ParserOutputEntity.class);
     }
 
+    @Override
+    protected ParserOutput toModel(ParserOutputEntity entity) {
+        return ComputeMapper.INSTANCE.parserOutputToModel(entity);
+    }
+
+    @Override
+    protected ParserOutputEntity toEntity(ParserOutput model) {
+        return ComputeMapper.INSTANCE.parserOutputToEntity(model);
+    }
+
     public ParserOutput getParserOutput(String outputId) throws AppCatalogException {
         try {
             return super.get(outputId);
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 57e1042934..5dd9f92238 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
@@ -19,20 +19,20 @@
 */
 package org.apache.airavata.compute.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.ParserEntity;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ParserRepository extends AppCatAbstractRepository<Parser, ParserEntity, String> {
+public class ParserRepository extends AbstractRepository<Parser, ParserEntity, String> {
 
     private static final Logger logger = LoggerFactory.getLogger(ParserRepository.class);
 
@@ -40,11 +40,20 @@ public class ParserRepository extends AppCatAbstractRepository<Parser, ParserEnt
         super(Parser.class, ParserEntity.class);
     }
 
+    @Override
+    protected Parser toModel(ParserEntity entity) {
+        return ComputeMapper.INSTANCE.parserToModel(entity);
+    }
+
+    @Override
+    protected ParserEntity toEntity(Parser model) {
+        return ComputeMapper.INSTANCE.parserToEntity(model);
+    }
+
     public Parser saveParser(Parser parser) throws AppCatalogException {
 
         try {
-            Mapper mapper = ObjectMapperSingleton.getInstance();
-            ParserEntity parserEntity = mapper.map(parser, ParserEntity.class);
+            ParserEntity parserEntity = ComputeMapper.INSTANCE.parserToEntity(parser);
 
             if (parser.getInputFiles() != null) {
                 parserEntity.getInputFiles().forEach(input -> {
@@ -61,7 +70,7 @@ public class ParserRepository extends AppCatAbstractRepository<Parser, ParserEnt
             }
 
             ParserEntity savedParserEntity = execute(entityManager -> entityManager.merge(parserEntity));
-            return mapper.map(savedParserEntity, Parser.class);
+            return ComputeMapper.INSTANCE.parserToModel(savedParserEntity);
         } catch (Exception e) {
             logger.error("Failed to save parser with id " + parser.getId(), e);
             throw new AppCatalogException("Failed to save parser with id " + parser.getId(), e);
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 f960b1fad3..af3a99a5cc 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
@@ -22,18 +22,29 @@ package org.apache.airavata.compute.repository;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.airavata.compute.mapper.ComputeMapper;
 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;
 
-public class ParsingTemplateRepository
-        extends AppCatAbstractRepository<ParsingTemplate, ParsingTemplateEntity, String> {
+public class ParsingTemplateRepository extends AbstractRepository<ParsingTemplate, ParsingTemplateEntity, String> {
 
     public ParsingTemplateRepository() {
         super(ParsingTemplate.class, ParsingTemplateEntity.class);
     }
 
+    @Override
+    protected ParsingTemplate toModel(ParsingTemplateEntity entity) {
+        return ComputeMapper.INSTANCE.parsingTemplateToModel(entity);
+    }
+
+    @Override
+    protected ParsingTemplateEntity toEntity(ParsingTemplate model) {
+        return ComputeMapper.INSTANCE.parsingTemplateToEntity(model);
+    }
+
     public List<ParsingTemplate> getParsingTemplatesForApplication(String applicationInterfaceId) {
         Map<String, Object> queryParameters = new HashMap<>();
         queryParameters.put(DBConstants.ParsingTemplate.APPLICATION_INTERFACE_ID, applicationInterfaceId);
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 13e37eef9b..475f5d8a8c 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
@@ -23,7 +23,9 @@ import jakarta.persistence.Query;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.airavata.compute.mapper.ComputeMapper;
 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;
@@ -31,12 +33,22 @@ import org.apache.airavata.model.appcatalog.computeresource.ResourceJobManager;
 import org.apache.airavata.model.parallelism.ApplicationParallelismType;
 
 public class ResourceJobManagerRepository
-        extends AppCatAbstractRepository<ResourceJobManager, ResourceJobManagerEntity, String> {
+        extends AbstractRepository<ResourceJobManager, ResourceJobManagerEntity, String> {
 
     public ResourceJobManagerRepository() {
         super(ResourceJobManager.class, ResourceJobManagerEntity.class);
     }
 
+    @Override
+    protected ResourceJobManager toModel(ResourceJobManagerEntity entity) {
+        return ComputeMapper.INSTANCE.resourceJobManagerToModel(entity);
+    }
+
+    @Override
+    protected ResourceJobManagerEntity toEntity(ResourceJobManager model) {
+        return ComputeMapper.INSTANCE.resourceJobManagerToEntity(model);
+    }
+
     public void createJobManagerCommand(
             Map<JobManagerCommand, String> jobManagerCommands, ResourceJobManagerEntity resourceJobManagerEntity) {
         for (JobManagerCommand commandType : jobManagerCommands.keySet()) {
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 88798053a4..35db26245c 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
@@ -19,15 +19,27 @@
 */
 package org.apache.airavata.compute.repository;
 
+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;
 
 public class UserComputeResourcePreferenceRepository
-        extends AppCatAbstractRepository<
+        extends AbstractRepository<
                 UserComputeResourcePreference, UserComputeResourcePreferenceEntity, UserComputeResourcePreferencePK> {
 
     public UserComputeResourcePreferenceRepository() {
         super(UserComputeResourcePreference.class, UserComputeResourcePreferenceEntity.class);
     }
+
+    @Override
+    protected UserComputeResourcePreference toModel(UserComputeResourcePreferenceEntity entity) {
+        return ComputeMapper.INSTANCE.userComputeResourcePrefToModel(entity);
+    }
+
+    @Override
+    protected UserComputeResourcePreferenceEntity toEntity(UserComputeResourcePreference model) {
+        return ComputeMapper.INSTANCE.userComputeResourcePrefToEntity(model);
+    }
 }
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 01660450a9..e8596fbe1e 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
@@ -19,14 +19,14 @@
 */
 package org.apache.airavata.compute.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.sql.Timestamp;
 import java.util.*;
+import org.apache.airavata.compute.mapper.ComputeMapper;
 import org.apache.airavata.compute.model.UserComputeResourcePreferencePK;
 import org.apache.airavata.compute.model.UserResourceProfileEntity;
 import org.apache.airavata.compute.model.UserResourceProfilePK;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.AppCatalogException;
 import org.apache.airavata.execution.util.cpi.UsrResourceProfile;
@@ -39,7 +39,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class UserResourceProfileRepository
-        extends AppCatAbstractRepository<UserResourceProfile, UserResourceProfileEntity, UserResourceProfilePK>
+        extends AbstractRepository<UserResourceProfile, UserResourceProfileEntity, UserResourceProfilePK>
         implements UsrResourceProfile {
     private static final Logger logger = LoggerFactory.getLogger(UserResourceProfileRepository.class);
 
@@ -47,6 +47,16 @@ public class UserResourceProfileRepository
         super(UserResourceProfile.class, UserResourceProfileEntity.class);
     }
 
+    @Override
+    protected UserResourceProfile toModel(UserResourceProfileEntity entity) {
+        return ComputeMapper.INSTANCE.userResourceProfileToModel(entity);
+    }
+
+    @Override
+    protected UserResourceProfileEntity toEntity(UserResourceProfile model) {
+        return ComputeMapper.INSTANCE.userResourceProfileToEntity(model);
+    }
+
     protected String saveUserResourceProfileData(UserResourceProfile userResourceProfile) throws AppCatalogException {
         UserResourceProfileEntity userResourceProfileEntity = saveUserResourceProfile(userResourceProfile);
         return userResourceProfileEntity.getUserId();
@@ -56,9 +66,8 @@ public class UserResourceProfileRepository
             throws AppCatalogException {
         String userId = userResourceProfile.getUserId();
         String gatewayId = userResourceProfile.getGatewayID();
-        Mapper mapper = ObjectMapperSingleton.getInstance();
         UserResourceProfileEntity userResourceProfileEntity =
-                mapper.map(userResourceProfile, UserResourceProfileEntity.class);
+                ComputeMapper.INSTANCE.userResourceProfileToEntity(userResourceProfile);
 
         if (userResourceProfileEntity.getUserComputeResourcePreferences() != null) {
             logger.debug(
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 ab58b536d2..1280de0456 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
@@ -43,7 +43,7 @@ public class JobFactory {
     }
 
     public static ResourceJobManager getResourceJobManager(
-            RegistryService.Client registryClient,
+            RegistryService.Iface registryClient,
             JobSubmissionProtocol submissionProtocol,
             JobSubmissionInterface jobSubmissionInterface)
             throws Exception {
@@ -83,7 +83,7 @@ public class JobFactory {
                 + jobSubmissionInterface.getJobSubmissionInterfaceId());
     }
 
-    public static LOCALSubmission getLocalJobSubmission(RegistryService.Client registryClient, String submissionId)
+    public static LOCALSubmission getLocalJobSubmission(RegistryService.Iface registryClient, String submissionId)
             throws AppCatalogException {
         try {
             return registryClient.getLocalJobSubmission(submissionId);
@@ -93,7 +93,7 @@ public class JobFactory {
         }
     }
 
-    public static SSHJobSubmission getSSHJobSubmission(RegistryService.Client registryClient, String submissionId)
+    public static SSHJobSubmission getSSHJobSubmission(RegistryService.Iface registryClient, String submissionId)
             throws AppCatalogException {
         try {
             return registryClient.getSSHJobSubmission(submissionId);
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 f75786ddef..d8c1f7764d 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
@@ -24,7 +24,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
-import org.apache.airavata.compute.util.AgentException;
 import org.apache.airavata.compute.util.AgentUtils;
 import org.apache.airavata.execution.orchestrator.TaskContext;
 import org.apache.airavata.model.process.ProcessModel;
@@ -48,21 +47,15 @@ public class AWSProcessContextManager {
     private static final String AWS_PUBLIC_IP = "AWS_PUBLIC_IP";
     private static final String AWS_JOB_ID = "AWS_JOB_ID";
 
-    private final RegistryService.Client registryClient;
+    private final RegistryService.Iface registryClient;
     private final TaskContext taskContext;
     private final String processId;
 
     public AWSProcessContextManager(TaskContext taskContext) {
-        try {
-            this.registryClient = AgentUtils.getRegistryServiceClient();
-            this.taskContext = taskContext;
-            this.processId = taskContext.getProcessId();
-            LOGGER.info("Initialized AWSProcessContextManager for process {}", processId);
-
-        } catch (AgentException e) {
-            LOGGER.error("Failed to initialize AWSProcessContextManager", e);
-            throw new RuntimeException("Failed to initialize AWSProcessContextManager", e);
-        }
+        this.registryClient = AgentUtils.getRegistryServiceClient();
+        this.taskContext = taskContext;
+        this.processId = taskContext.getProcessId();
+        LOGGER.info("Initialized AWSProcessContextManager for process {}", processId);
     }
 
     public String getInstanceId() throws IOException {
diff --git a/airavata-api/src/main/java/org/apache/airavata/compute/util/AgentUtils.java b/airavata-api/src/main/java/org/apache/airavata/compute/util/AgentUtils.java
index 5674786d00..b0b73256fa 100644
--- a/airavata-api/src/main/java/org/apache/airavata/compute/util/AgentUtils.java
+++ b/airavata-api/src/main/java/org/apache/airavata/compute/util/AgentUtils.java
@@ -19,36 +19,22 @@
 */
 package org.apache.airavata.compute.util;
 
-import org.apache.airavata.common.config.ServerSettings;
-import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.credential.handler.CredentialStoreServerHandler;
 import org.apache.airavata.credential.store.cpi.CredentialStoreService;
-import org.apache.airavata.credential.store.exception.CredentialStoreException;
-import org.apache.airavata.credential.util.CredentialStoreClientFactory;
-import org.apache.airavata.execution.util.RegistryServiceClientFactory;
+import org.apache.airavata.execution.scheduler.Utils;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.airavata.registry.api.exception.RegistryServiceException;
 
 public class AgentUtils {
 
-    // TODO this is inefficient. Try to use a connection pool
-    public static RegistryService.Client getRegistryServiceClient() throws AgentException {
-        try {
-            final int serverPort = Integer.parseInt(ServerSettings.getRegistryServerPort());
-            final String serverHost = ServerSettings.getRegistryServerHost();
-
-            return RegistryServiceClientFactory.createRegistryClient(serverHost, serverPort);
-        } catch (RegistryServiceException | ApplicationSettingsException e) {
-            throw new AgentException("Unable to create registry client...", e);
-        }
+    public static RegistryService.Iface getRegistryServiceClient() {
+        return Utils.getRegistryHandler();
     }
 
-    public static CredentialStoreService.Client getCredentialClient() throws AgentException {
+    public static CredentialStoreService.Iface getCredentialClient() throws AgentException {
         try {
-            final int serverPort = Integer.parseInt(ServerSettings.getCredentialStoreServerPort());
-            final String serverHost = ServerSettings.getCredentialStoreServerHost();
-            return CredentialStoreClientFactory.createAiravataCSClient(serverHost, serverPort);
-        } catch (CredentialStoreException | ApplicationSettingsException e) {
-            throw new AgentException("Unable to create credential client...", e);
+            return new CredentialStoreServerHandler();
+        } catch (Exception e) {
+            throw new AgentException("Unable to create CredentialStoreServerHandler...", e);
         }
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/credential/service/provisioning/SSHAccountManager.java b/airavata-api/src/main/java/org/apache/airavata/credential/service/provisioning/SSHAccountManager.java
index 0d5a2652f9..310ad23e03 100644
--- a/airavata-api/src/main/java/org/apache/airavata/credential/service/provisioning/SSHAccountManager.java
+++ b/airavata-api/src/main/java/org/apache/airavata/credential/service/provisioning/SSHAccountManager.java
@@ -24,12 +24,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;
-import org.apache.airavata.common.config.ServerSettings;
-import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.credential.handler.CredentialStoreServerHandler;
 import org.apache.airavata.credential.store.cpi.CredentialStoreService;
-import org.apache.airavata.credential.store.exception.CredentialStoreException;
-import org.apache.airavata.credential.util.CredentialStoreClientFactory;
-import org.apache.airavata.execution.util.RegistryServiceClientFactory;
+import org.apache.airavata.execution.handler.RegistryServerHandler;
 import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
 import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
 import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
@@ -39,7 +36,6 @@ import org.apache.airavata.model.appcatalog.userresourceprofile.UserComputeResou
 import org.apache.airavata.model.credential.store.PasswordCredential;
 import org.apache.airavata.model.credential.store.SSHCredential;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -73,7 +69,7 @@ public class SSHAccountManager {
     private static SSHAccountProvisioner getSshAccountProvisioner(String gatewayId, String computeResourceId)
             throws InvalidSetupException {
         // get compute resource preferences for the gateway and hostname
-        RegistryService.Client registryServiceClient = getRegistryServiceClient();
+        RegistryService.Iface registryServiceClient = getRegistryServiceClient();
         ComputeResourcePreference computeResourcePreference = null;
         try {
             computeResourcePreference =
@@ -83,13 +79,6 @@ public class SSHAccountManager {
                     "Failed to get ComputeResourcePreference for [" + gatewayId + "] and [" + computeResourceId + "]: "
                             + e.getMessage(),
                     e);
-        } finally {
-            if (registryServiceClient.getInputProtocol().getTransport().isOpen()) {
-                registryServiceClient.getInputProtocol().getTransport().close();
-            }
-            if (registryServiceClient.getOutputProtocol().getTransport().isOpen()) {
-                registryServiceClient.getOutputProtocol().getTransport().close();
-            }
         }
 
         // get the account provisioner and config values for the preferences
@@ -122,7 +111,7 @@ public class SSHAccountManager {
             throws InvalidSetupException, InvalidUsernameException {
 
         // get compute resource preferences for the gateway and hostname
-        RegistryService.Client registryServiceClient = getRegistryServiceClient();
+        RegistryService.Iface registryServiceClient = getRegistryServiceClient();
         ComputeResourcePreference computeResourcePreference = null;
         ComputeResourceDescription computeResourceDescription = null;
         SSHJobSubmission sshJobSubmission = null;
@@ -144,13 +133,6 @@ public class SSHAccountManager {
                     "Failed to retrieve compute resource information for [" + gatewayId + "] and " + "["
                             + computeResourceId + "]: " + e.getMessage(),
                     e);
-        } finally {
-            if (registryServiceClient.getInputProtocol().getTransport().isOpen()) {
-                registryServiceClient.getInputProtocol().getTransport().close();
-            }
-            if (registryServiceClient.getOutputProtocol().getTransport().isOpen()) {
-                registryServiceClient.getOutputProtocol().getTransport().close();
-            }
         }
 
         if (sshJobSubmission == null) {
@@ -258,52 +240,28 @@ public class SSHAccountManager {
     private static Map<ConfigParam, String> resolveProvisionerConfig(
             String gatewayId, String provisionerName, Map<ConfigParam, String> provisionerConfig)
             throws InvalidSetupException {
-        CredentialStoreService.Client credentialStoreServiceClient = null;
-        try {
-            credentialStoreServiceClient = getCredentialStoreClient();
-            // Resolve any CRED_STORE_PASSWORD_TOKEN config parameters to passwords
-            Map<ConfigParam, String> resolvedConfig = new HashMap<>();
-            for (Map.Entry<ConfigParam, String> configEntry : provisionerConfig.entrySet()) {
-                if (configEntry.getKey().getType() == ConfigParam.ConfigParamType.CRED_STORE_PASSWORD_TOKEN) {
-                    try {
-                        PasswordCredential password =
-                                credentialStoreServiceClient.getPasswordCredential(configEntry.getValue(), gatewayId);
-                        if (password == null) {
-                            throw new InvalidSetupException("Password credential doesn't exist for config param ["
-                                    + configEntry.getKey().getName() + "] for token [" + configEntry.getValue()
-                                    + "] for provisioner [" + provisionerName + "].");
-                        }
-                        resolvedConfig.put(configEntry.getKey(), password.getPassword());
-                    } catch (TException e) {
-                        throw new RuntimeException("Failed to get password needed to configure " + provisionerName, e);
+        CredentialStoreService.Iface credentialStoreHandler = getCredentialStoreHandler();
+        // Resolve any CRED_STORE_PASSWORD_TOKEN config parameters to passwords
+        Map<ConfigParam, String> resolvedConfig = new HashMap<>();
+        for (Map.Entry<ConfigParam, String> configEntry : provisionerConfig.entrySet()) {
+            if (configEntry.getKey().getType() == ConfigParam.ConfigParamType.CRED_STORE_PASSWORD_TOKEN) {
+                try {
+                    PasswordCredential password =
+                            credentialStoreHandler.getPasswordCredential(configEntry.getValue(), gatewayId);
+                    if (password == null) {
+                        throw new InvalidSetupException("Password credential doesn't exist for config param ["
+                                + configEntry.getKey().getName() + "] for token [" + configEntry.getValue()
+                                + "] for provisioner [" + provisionerName + "].");
                     }
-                } else {
-                    resolvedConfig.put(configEntry.getKey(), configEntry.getValue());
-                }
-            }
-            return resolvedConfig;
-        } finally {
-            if (credentialStoreServiceClient != null) {
-                if (credentialStoreServiceClient
-                        .getInputProtocol()
-                        .getTransport()
-                        .isOpen()) {
-                    credentialStoreServiceClient
-                            .getInputProtocol()
-                            .getTransport()
-                            .close();
-                }
-                if (credentialStoreServiceClient
-                        .getOutputProtocol()
-                        .getTransport()
-                        .isOpen()) {
-                    credentialStoreServiceClient
-                            .getOutputProtocol()
-                            .getTransport()
-                            .close();
+                    resolvedConfig.put(configEntry.getKey(), password.getPassword());
+                } catch (TException e) {
+                    throw new RuntimeException("Failed to get password needed to configure " + provisionerName, e);
                 }
+            } else {
+                resolvedConfig.put(configEntry.getKey(), configEntry.getValue());
             }
         }
+        return resolvedConfig;
     }
 
     private static Map<ConfigParam, String> convertConfigParams(
@@ -324,25 +282,15 @@ public class SSHAccountManager {
         return result;
     }
 
-    private static RegistryService.Client getRegistryServiceClient() {
-
-        try {
-            String registryServerHost = ServerSettings.getRegistryServerHost();
-            int registryServerPort = Integer.valueOf(ServerSettings.getRegistryServerPort());
-            return RegistryServiceClientFactory.createRegistryClient(registryServerHost, registryServerPort);
-        } catch (ApplicationSettingsException | RegistryServiceException e) {
-            throw new RuntimeException("Failed to create registry service client", e);
-        }
+    private static RegistryService.Iface getRegistryServiceClient() {
+        return new RegistryServerHandler();
     }
 
-    private static CredentialStoreService.Client getCredentialStoreClient() {
-
+    private static CredentialStoreService.Iface getCredentialStoreHandler() {
         try {
-            String credServerHost = ServerSettings.getCredentialStoreServerHost();
-            int credServerPort = Integer.valueOf(ServerSettings.getCredentialStoreServerPort());
-            return CredentialStoreClientFactory.createAiravataCSClient(credServerHost, credServerPort);
-        } catch (CredentialStoreException | ApplicationSettingsException e) {
-            throw new RuntimeException("Failed to create credential store service client", e);
+            return new CredentialStoreServerHandler();
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to create CredentialStoreServerHandler", e);
         }
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/credential/util/CredentialStoreClientFactory.java b/airavata-api/src/main/java/org/apache/airavata/credential/util/CredentialStoreClientFactory.java
deleted file mode 100644
index c19bdc5f23..0000000000
--- a/airavata-api/src/main/java/org/apache/airavata/credential/util/CredentialStoreClientFactory.java
+++ /dev/null
@@ -1,44 +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.credential.util;
-
-import org.apache.airavata.credential.store.cpi.CredentialStoreService;
-import org.apache.airavata.credential.store.exception.CredentialStoreException;
-import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.protocol.TProtocol;
-import org.apache.thrift.transport.TSocket;
-import org.apache.thrift.transport.TTransport;
-import org.apache.thrift.transport.TTransportException;
-
-public class CredentialStoreClientFactory {
-
-    public static CredentialStoreService.Client createAiravataCSClient(String serverHost, int serverPort)
-            throws CredentialStoreException {
-        try {
-            TTransport transport = new TSocket(serverHost, serverPort);
-            transport.open();
-            TProtocol protocol = new TBinaryProtocol(transport);
-            return new CredentialStoreService.Client(protocol);
-        } catch (TTransportException e) {
-            throw new CredentialStoreException(
-                    "Unable to connect to the credential store server at " + serverHost + ":" + serverPort);
-        }
-    }
-}
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 3a54bbadfb..8d4b5f100a 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
@@ -19,6 +19,7 @@
 */
 package org.apache.airavata.execution.handler;
 
+import jakarta.annotation.PostConstruct;
 import java.util.*;
 import org.apache.airavata.common.config.ServerSettings;
 import org.apache.airavata.common.util.AiravataUtils;
@@ -84,6 +85,12 @@ import org.springframework.stereotype.Component;
 public class RegistryServerHandler implements RegistryService.Iface {
     private static final Logger logger = LoggerFactory.getLogger(RegistryServerHandler.class);
 
+    @PostConstruct
+    public void registerAsGlobalHandler() {
+        org.apache.airavata.execution.scheduler.Utils.setRegistryHandler(this);
+        logger.info("RegistryServerHandler registered as global registry handler");
+    }
+
     private ApplicationDeploymentRepository applicationDeploymentRepository = new ApplicationDeploymentRepository();
     private ApplicationInterfaceRepository applicationInterfaceRepository = new ApplicationInterfaceRepository();
     private StorageResourceRepository storageResourceRepository = new StorageResourceRepository();
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 f9d84442c2..217bc9da07 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
@@ -19,12 +19,9 @@
 */
 package org.apache.airavata.execution.handler;
 
-import java.time.Duration;
 import java.util.List;
-import org.apache.airavata.common.config.ServerSettings;
 import org.apache.airavata.common.exception.AiravataException;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.common.util.ThriftClientPool;
 import org.apache.airavata.common.util.ThriftUtils;
 import org.apache.airavata.messaging.service.MessageContext;
 import org.apache.airavata.messaging.service.MessageHandler;
@@ -39,8 +36,6 @@ 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.registry.api.RegistryService;
-import org.apache.airavata.registry.api.exception.RegistryServiceException;
-import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,28 +46,11 @@ import org.slf4j.LoggerFactory;
 public class RegistryServiceDBEventHandler implements MessageHandler {
 
     private static final Logger logger = LoggerFactory.getLogger(RegistryServiceDBEventHandler.class);
-    private final ThriftClientPool<RegistryService.Client> registryClientPool;
+    private final RegistryService.Iface registryHandler;
     private DBEventPublisherUtils dbEventPublisherUtils = new DBEventPublisherUtils(DBEventService.REGISTRY);
 
-    public RegistryServiceDBEventHandler() throws ApplicationSettingsException, RegistryServiceException {
-
-        GenericObjectPoolConfig<RegistryService.Client> poolConfig = new GenericObjectPoolConfig<>();
-        poolConfig.setMaxTotal(5);
-        poolConfig.setMinIdle(1);
-        poolConfig.setBlockWhenExhausted(true);
-        poolConfig.setTestOnBorrow(true);
-        poolConfig.setTestWhileIdle(true);
-        // must set timeBetweenEvictionRunsMillis since eviction doesn't run unless that is positive
-        poolConfig.setTimeBetweenEvictionRuns(Duration.ofMinutes(5));
-        poolConfig.setNumTestsPerEvictionRun(10);
-        poolConfig.setMaxWait(Duration.ofSeconds(3));
-
-        registryClientPool = new ThriftClientPool<>(
-                tProtocol -> new RegistryService.Client(tProtocol),
-                poolConfig,
-                ServerSettings.getRegistryServerHost(),
-                Integer.parseInt(ServerSettings.getRegistryServerPort()),
-                "RegistryService");
+    public RegistryServiceDBEventHandler() {
+        this.registryHandler = org.apache.airavata.execution.scheduler.Utils.getRegistryHandler();
     }
 
     @Override
@@ -92,7 +70,7 @@ public class RegistryServiceDBEventHandler implements MessageHandler {
                     dbEventMessage.getMessageContext().getPublisher().getPublisherContext();
             logger.info("RegistryService, Replicated Entity: " + publisherContext.getEntityType());
 
-            RegistryService.Client registryClient = registryClientPool.getResource();
+            RegistryService.Iface registryClient = registryHandler;
             // this try-block is mainly for catching DuplicateEntryException
             try {
                 // check type of entity-type
@@ -190,13 +168,12 @@ public class RegistryServiceDBEventHandler implements MessageHandler {
                         logger.error("Handler not defined for Entity: " + publisherContext.getEntityType());
                     }
                 }
-                registryClientPool.returnResource(registryClient);
+
             } catch (DuplicateEntryException ex) {
                 // log this exception and proceed (do nothing)
                 // this exception is thrown mostly when messages are re-consumed, hence ignore
                 logger.warn("DuplicateEntryException while consuming db-event message, ex: " + ex.getMessage(), ex);
             } catch (Exception ex) {
-                registryClientPool.returnBrokenResource(registryClient);
                 throw ex;
             }
             // send ack for received message
@@ -215,7 +192,7 @@ public class RegistryServiceDBEventHandler implements MessageHandler {
         }
     }
 
-    private Project createDefaultProject(RegistryService.Client registryClient, UserProfile userProfile)
+    private Project createDefaultProject(RegistryService.Iface registryClient, UserProfile userProfile)
             throws TException {
         // Just retrieve the first project to see if the user has any projects
         List<Project> projects =
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
new file mode 100644
index 0000000000..961a054849
--- /dev/null
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/mapper/ExecutionMapper.java
@@ -0,0 +1,296 @@
+/**
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT 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.execution.mapper;
+
+import java.sql.Timestamp;
+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.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface ExecutionMapper {
+
+    ExecutionMapper INSTANCE = Mappers.getMapper(ExecutionMapper.class);
+
+    // --- Experiment ---
+    @Mapping(target = "emailAddresses", source = "emailAddresses")
+    ExperimentModel experimentToModel(ExperimentEntity entity);
+
+    @Mapping(target = "emailAddresses", source = "emailAddresses")
+    ExperimentEntity experimentToEntity(ExperimentModel model);
+
+    // --- ExperimentSummary ---
+    ExperimentSummaryModel experimentSummaryToModel(ExperimentSummaryEntity entity);
+
+    ExperimentSummaryEntity experimentSummaryToEntity(ExperimentSummaryModel model);
+
+    // --- Process ---
+    @Mapping(target = "emailAddresses", source = "emailAddresses")
+    ProcessModel processToModel(ProcessEntity entity);
+
+    @Mapping(target = "emailAddresses", source = "emailAddresses")
+    ProcessEntity processToEntity(ProcessModel model);
+
+    // --- Task ---
+    TaskModel taskToModel(TaskEntity entity);
+
+    TaskEntity taskToEntity(TaskModel model);
+
+    // --- Job ---
+    JobModel jobToModel(JobEntity entity);
+
+    JobEntity jobToEntity(JobModel model);
+
+    // --- ExperimentStatus ---
+    ExperimentStatus experimentStatusToModel(ExperimentStatusEntity entity);
+
+    ExperimentStatusEntity experimentStatusToEntity(ExperimentStatus model);
+
+    // --- ProcessStatus ---
+    ProcessStatus processStatusToModel(ProcessStatusEntity entity);
+
+    ProcessStatusEntity processStatusToEntity(ProcessStatus model);
+
+    // --- TaskStatus ---
+    TaskStatus taskStatusToModel(TaskStatusEntity entity);
+
+    TaskStatusEntity taskStatusToEntity(TaskStatus model);
+
+    // --- JobStatus ---
+    JobStatus jobStatusToModel(JobStatusEntity entity);
+
+    JobStatusEntity jobStatusToEntity(JobStatus model);
+
+    // --- ExperimentError ---
+    ErrorModel experimentErrorToModel(ExperimentErrorEntity entity);
+
+    ExperimentErrorEntity experimentErrorToEntity(ErrorModel model);
+
+    // --- ProcessError ---
+    ErrorModel processErrorToModel(ProcessErrorEntity entity);
+
+    ProcessErrorEntity processErrorToEntity(ErrorModel model);
+
+    // --- TaskError ---
+    ErrorModel taskErrorToModel(TaskErrorEntity entity);
+
+    TaskErrorEntity taskErrorToEntity(ErrorModel model);
+
+    // --- ExperimentInput ---
+    InputDataObjectType experimentInputToModel(ExperimentInputEntity entity);
+
+    ExperimentInputEntity experimentInputToEntity(InputDataObjectType model);
+
+    // --- ProcessInput ---
+    InputDataObjectType processInputToModel(ProcessInputEntity entity);
+
+    ProcessInputEntity processInputToEntity(InputDataObjectType model);
+
+    // --- ExperimentOutput ---
+    OutputDataObjectType experimentOutputToModel(ExperimentOutputEntity entity);
+
+    ExperimentOutputEntity experimentOutputToEntity(OutputDataObjectType model);
+
+    // --- ProcessOutput ---
+    OutputDataObjectType processOutputToModel(ProcessOutputEntity entity);
+
+    ProcessOutputEntity processOutputToEntity(OutputDataObjectType model);
+
+    // --- ProcessWorkflow ---
+    ProcessWorkflow processWorkflowToModel(ProcessWorkflowEntity entity);
+
+    ProcessWorkflowEntity processWorkflowToEntity(ProcessWorkflow model);
+
+    // --- Project ---
+    Project projectToModel(ProjectEntity entity);
+
+    ProjectEntity projectToEntity(Project model);
+
+    // --- QueueStatus ---
+    QueueStatusModel queueStatusToModel(QueueStatusEntity entity);
+
+    QueueStatusEntity queueStatusToEntity(QueueStatusModel model);
+
+    // --- AiravataWorkflow ---
+    AiravataWorkflow workflowToModel(AiravataWorkflowEntity entity);
+
+    AiravataWorkflowEntity workflowToEntity(AiravataWorkflow model);
+
+    // --- Gateway ---
+    Gateway gatewayToModel(GatewayEntity entity);
+
+    GatewayEntity gatewayToEntity(Gateway model);
+
+    // --- Notification ---
+    Notification notificationToModel(NotificationEntity entity);
+
+    NotificationEntity notificationToEntity(Notification model);
+
+    // --- UserProfile (execution.UserEntity) ---
+    UserProfile userToModel(UserEntity entity);
+
+    UserEntity userToEntity(UserProfile model);
+
+    // --- GatewayUsageReportingCommand ---
+    GatewayUsageReportingCommand gatewayUsageReportingCommandToModel(GatewayUsageReportingCommandEntity entity);
+
+    GatewayUsageReportingCommandEntity gatewayUsageReportingCommandToEntity(GatewayUsageReportingCommand model);
+
+    // --- Custom converter replacements ---
+
+    /**
+     * Custom mapping: UserConfigurationDataEntity -> UserConfigurationDataModel.
+     * The entity flattens scheduling fields; the model nests them under computationalResourceScheduling.
+     * This replaces the Dozer mapping: {@code <field><a>this</a><b>computationalResourceScheduling</b></field>}
+     */
+    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;
+    }
+
+    /**
+     * Custom mapping: UserConfigurationDataModel -> UserConfigurationDataEntity.
+     */
+    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.setUserDN(model.getUserDN());
+        entity.setGenerateCert(model.isGenerateCert());
+        entity.setExperimentDataDir(model.getExperimentDataDir());
+        entity.setGroupResourceProfileId(model.getGroupResourceProfileId());
+        entity.setUseUserCRPref(model.isUseUserCRPref());
+        entity.setInputStorageResourceId(model.getInputStorageResourceId());
+        entity.setOutputStorageResourceId(model.getOutputStorageResourceId());
+
+        // Extract scheduling fields from nested object
+        ComputationalResourceSchedulingModel scheduling = model.getComputationalResourceScheduling();
+        if (scheduling != null) {
+            entity.setResourceHostId(scheduling.getResourceHostId());
+            entity.setTotalCPUCount(scheduling.getTotalCPUCount());
+            entity.setNodeCount(scheduling.getNodeCount());
+            entity.setNumberOfThreads(scheduling.getNumberOfThreads());
+            entity.setQueueName(scheduling.getQueueName());
+            entity.setWallTimeLimit(scheduling.getWallTimeLimit());
+            entity.setTotalPhysicalMemory(scheduling.getTotalPhysicalMemory());
+            entity.setStaticWorkingDir(scheduling.getStaticWorkingDir());
+            entity.setOverrideLoginUserName(scheduling.getOverrideLoginUserName());
+            entity.setOverrideScratchLocation(scheduling.getOverrideScratchLocation());
+            entity.setOverrideAllocationProjectNumber(scheduling.getOverrideAllocationProjectNumber());
+        }
+
+        return entity;
+    }
+
+    /** boolean to int (Thrift boolean fields stored as int in some entities) */
+    default int booleanToInt(boolean value) {
+        return value ? 1 : 0;
+    }
+
+    /** int to boolean */
+    default boolean intToBoolean(int value) {
+        return value != 0;
+    }
+
+    /** CSV String to List<String> (replaces CsvStringConverter) */
+    default List<String> csvToList(String csv) {
+        if (csv == null || csv.isEmpty()) {
+            return null;
+        }
+        return Arrays.asList(csv.split(","));
+    }
+
+    /** List<String> to CSV String (replaces CsvStringConverter) */
+    default String listToCsv(List<String> list) {
+        if (list == null || list.isEmpty()) {
+            return null;
+        }
+        return String.join(",", list);
+    }
+
+    /** Long millis to Timestamp (replaces StorageDateConverter) */
+    default Timestamp longToTimestamp(long millis) {
+        return millis == 0 ? null : new Timestamp(millis);
+    }
+
+    /** Timestamp to long millis (replaces StorageDateConverter) */
+    default long timestampToLong(Timestamp ts) {
+        return ts == null ? 0 : ts.getTime();
+    }
+}
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/ComputationalResourceSchedulingEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/ComputationalResourceSchedulingEntity.java
index 8ff876e67c..764feafea0 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/ComputationalResourceSchedulingEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/ComputationalResourceSchedulingEntity.java
@@ -74,7 +74,7 @@ public class ComputationalResourceSchedulingEntity implements Serializable {
     private String overrideAllocationProjectNumber;
 
     @ManyToOne(targetEntity = UserConfigurationDataEntity.class, cascade = CascadeType.ALL)
-    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
+    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID", insertable = false, updatable = false)
     private UserConfigurationDataEntity userConfigurationData;
 
     public ComputationalResourceSchedulingEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentErrorEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentErrorEntity.java
index 49a52689f9..399da9f387 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentErrorEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/ExperimentErrorEntity.java
@@ -59,7 +59,7 @@ public class ExperimentErrorEntity implements Serializable {
     private String rootCauseErrorIdList;
 
     @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
+    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID", insertable = false, updatable = false)
     private ExperimentEntity experiment;
 
     public ExperimentErrorEntity() {}
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 8ee4a3fa70..ce2eed1fc1 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
@@ -83,7 +83,7 @@ public class ExperimentInputEntity implements Serializable {
     private String overrideFilename;
 
     @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
+    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID", insertable = false, updatable = false)
     private ExperimentEntity experiment;
 
     public ExperimentInputEntity() {}
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 bfe84fcff3..e1c12e6fc7 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
@@ -76,7 +76,7 @@ public class ExperimentOutputEntity implements Serializable {
     private String metaData;
 
     @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
+    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID", insertable = false, updatable = false)
     private ExperimentEntity experiment;
 
     public ExperimentOutputEntity() {}
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 0cae6ab464..f61d238c92 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
@@ -53,7 +53,7 @@ public class ExperimentStatusEntity implements Serializable {
     private String reason;
 
     @ManyToOne(targetEntity = ExperimentEntity.class, fetch = FetchType.LAZY)
-    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID", nullable = false, updatable = false)
+    @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID", insertable = false, updatable = false)
     private ExperimentEntity experiment;
 
     public ExperimentStatusEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/JobEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/JobEntity.java
index 7668d06b5d..3fa50c7036 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/JobEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/JobEntity.java
@@ -80,7 +80,7 @@ public class JobEntity implements Serializable {
     private List<JobStatusEntity> jobStatuses;
 
     @ManyToOne(targetEntity = TaskEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID", nullable = false, updatable = false)
+    @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID", insertable = false, updatable = false)
     private TaskEntity task;
 
     public JobEntity() {}
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 2f65782c7b..6ca741b037 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
@@ -58,8 +58,8 @@ public class JobStatusEntity implements Serializable {
 
     @ManyToOne(targetEntity = JobEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     @JoinColumns({
-        @JoinColumn(name = "JOB_ID", referencedColumnName = "JOB_ID"),
-        @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID")
+        @JoinColumn(name = "JOB_ID", referencedColumnName = "JOB_ID", insertable = false, updatable = false),
+        @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID", insertable = false, updatable = false)
     })
     private JobEntity job;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessEntity.java
index c2951c06fa..ad4ee1e5a9 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessEntity.java
@@ -37,7 +37,7 @@ public class ProcessEntity implements Serializable {
     @Column(name = "PROCESS_ID")
     private String processId;
 
-    @Column(name = "EXPERIMENT_ID")
+    @Column(name = "EXPERIMENT_ID", insertable = false, updatable = false)
     private String experimentId;
 
     @Column(name = "CREATION_TIME")
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessErrorEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessErrorEntity.java
index eec79f6a7c..7749514865 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessErrorEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessErrorEntity.java
@@ -59,7 +59,7 @@ public class ProcessErrorEntity implements Serializable {
     private String rootCauseErrorIdList;
 
     @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
+    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID", insertable = false, updatable = false)
     private ProcessEntity process;
 
     public ProcessErrorEntity() {}
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 0b686fbdb1..a7ef78fd82 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
@@ -83,7 +83,7 @@ public class ProcessInputEntity implements Serializable {
     private String overrideFilename;
 
     @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
+    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID", insertable = false, updatable = false)
     private ProcessEntity process;
 
     public ProcessInputEntity() {}
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 f81d3d76f1..802f043180 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
@@ -76,7 +76,7 @@ public class ProcessOutputEntity implements Serializable {
     private String metaData;
 
     @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
+    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID", insertable = false, updatable = false)
     private ProcessEntity process;
 
     public ProcessOutputEntity() {}
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 aaf7e074f9..34e37948cc 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
@@ -53,7 +53,7 @@ public class ProcessStatusEntity implements Serializable {
     private String reason;
 
     @ManyToOne(targetEntity = ProcessEntity.class, fetch = FetchType.LAZY)
-    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID", nullable = false, updatable = false)
+    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID", insertable = false, updatable = false)
     private ProcessEntity process;
 
     public ProcessStatusEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessWorkflowEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessWorkflowEntity.java
index 01e4c5d70b..be8c13a32f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessWorkflowEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/ProcessWorkflowEntity.java
@@ -42,7 +42,7 @@ public class ProcessWorkflowEntity {
     private String type;
 
     @ManyToOne(targetEntity = ProcessEntity.class, fetch = FetchType.LAZY)
-    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID", nullable = false, updatable = false)
+    @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID", insertable = false, updatable = false)
     private ProcessEntity process;
 
     public String getProcessId() {
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/ProjectUserEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/ProjectUserEntity.java
index 3128ee65c1..23c23945a3 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/ProjectUserEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/ProjectUserEntity.java
@@ -42,7 +42,7 @@ public class ProjectUserEntity implements Serializable {
     public ProjectUserEntity() {}
 
     @ManyToOne(targetEntity = UserEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "USER_NAME", referencedColumnName = "USER_NAME")
+    @JoinColumn(name = "USER_NAME", referencedColumnName = "USER_NAME", insertable = false, updatable = false)
     private UserEntity user;
 
     public String getProjectID() {
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 c557c2a235..506f63b25e 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
@@ -41,7 +41,7 @@ public class TaskEntity implements Serializable {
     @Enumerated(EnumType.STRING)
     private TaskTypes taskType;
 
-    @Column(name = "PARENT_PROCESS_ID")
+    @Column(name = "PARENT_PROCESS_ID", insertable = false, updatable = false)
     private String parentProcessId;
 
     @Column(name = "CREATION_TIME")
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/TaskErrorEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/TaskErrorEntity.java
index 2eed78c7a2..a34c7e74f4 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/TaskErrorEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/TaskErrorEntity.java
@@ -59,7 +59,7 @@ public class TaskErrorEntity implements Serializable {
     private String rootCauseErrorIdList;
 
     @ManyToOne(targetEntity = TaskEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID")
+    @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID", insertable = false, updatable = false)
     private TaskEntity task;
 
     public TaskErrorEntity() {}
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 14852a6e42..87b60008d0 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
@@ -53,7 +53,7 @@ public class TaskStatusEntity implements Serializable {
     private String reason;
 
     @ManyToOne(targetEntity = TaskEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID")
+    @JoinColumn(name = "TASK_ID", referencedColumnName = "TASK_ID", insertable = false, updatable = false)
     private TaskEntity task;
 
     public TaskStatusEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/UserEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/UserEntity.java
index c3d06cd67c..a4817c78ff 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/UserEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/UserEntity.java
@@ -70,7 +70,7 @@ public class UserEntity {
     }
 
     @ManyToOne(targetEntity = GatewayEntity.class)
-    @JoinColumn(name = "GATEWAY_ID")
+    @JoinColumn(name = "GATEWAY_ID", insertable = false, updatable = false)
     public GatewayEntity getGateway() {
         return gateway;
     }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/AiravataWorkflowErrorEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/AiravataWorkflowErrorEntity.java
index ede141ee8e..da01c68bbb 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/AiravataWorkflowErrorEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/AiravataWorkflowErrorEntity.java
@@ -56,7 +56,7 @@ public class AiravataWorkflowErrorEntity implements Serializable {
     private String rootCauseErrorIdList;
 
     @ManyToOne(targetEntity = AiravataWorkflowEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "ID")
+    @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "ID", insertable = false, updatable = false)
     private AiravataWorkflowEntity workflow;
 
     public AiravataWorkflowErrorEntity() {}
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 0e7424dba2..6449d08504 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
@@ -49,7 +49,7 @@ public class AiravataWorkflowStatusEntity implements Serializable {
     private Timestamp updatedAt;
 
     @ManyToOne(targetEntity = AiravataWorkflowEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "ID")
+    @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "ID", insertable = false, updatable = false)
     private AiravataWorkflowEntity workflow;
 
     public AiravataWorkflowStatusEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/ApplicationErrorEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/ApplicationErrorEntity.java
index 9bacf3d8fd..7e9b45d7fe 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/ApplicationErrorEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/ApplicationErrorEntity.java
@@ -56,7 +56,7 @@ public class ApplicationErrorEntity implements Serializable {
     private String rootCauseErrorIdList;
 
     @ManyToOne(targetEntity = WorkflowApplicationEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "APPLICATION_ID", referencedColumnName = "ID")
+    @JoinColumn(name = "APPLICATION_ID", referencedColumnName = "ID", insertable = false, updatable = false)
     private WorkflowApplicationEntity application;
 
     public ApplicationErrorEntity() {}
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 78283386ed..59cc928153 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
@@ -49,7 +49,7 @@ public class ApplicationStatusEntity implements Serializable {
     private Timestamp updatedAt;
 
     @ManyToOne(targetEntity = WorkflowApplicationEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "APPLICATION_ID", referencedColumnName = "ID")
+    @JoinColumn(name = "APPLICATION_ID", referencedColumnName = "ID", insertable = false, updatable = false)
     private WorkflowApplicationEntity application;
 
     public ApplicationStatusEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerErrorEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerErrorEntity.java
index 07f0132149..df8b45021f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerErrorEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerErrorEntity.java
@@ -37,6 +37,9 @@ public class HandlerErrorEntity implements Serializable {
     @Column(name = "HANDLER_ID")
     private String handlerId;
 
+    @Column(name = "WORKFLOW_ID")
+    private String workflowId;
+
     @Column(name = "CREATION_TIME")
     private Timestamp creationTime;
 
@@ -57,8 +60,8 @@ public class HandlerErrorEntity implements Serializable {
 
     @ManyToOne(targetEntity = WorkflowHandlerEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     @JoinColumns({
-        @JoinColumn(name = "HANDLER_ID", referencedColumnName = "ID", nullable = false, updatable = false),
-        @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "WORKFLOW_ID", nullable = false, updatable = false)
+        @JoinColumn(name = "HANDLER_ID", referencedColumnName = "ID", insertable = false, updatable = false),
+        @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "WORKFLOW_ID", insertable = false, updatable = false)
     })
     private WorkflowHandlerEntity handler;
 
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 0e37e44e39..6f39165f5d 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
@@ -37,6 +37,9 @@ public class HandlerInputEntity implements Serializable {
     @Column(name = "NAME")
     private String name;
 
+    @Column(name = "WORKFLOW_ID")
+    private String workflowId;
+
     @Lob
     @Column(name = "VALUE")
     private String value;
@@ -77,8 +80,8 @@ public class HandlerInputEntity implements Serializable {
 
     @ManyToOne(targetEntity = WorkflowHandlerEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     @JoinColumns({
-        @JoinColumn(name = "HANDLER_ID", referencedColumnName = "ID", nullable = false, updatable = false),
-        @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "WORKFLOW_ID", nullable = false, updatable = false)
+        @JoinColumn(name = "HANDLER_ID", referencedColumnName = "ID", insertable = false, updatable = false),
+        @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "WORKFLOW_ID", insertable = false, updatable = false)
     })
     private WorkflowHandlerEntity handler;
 
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 c24315c4e4..c14133d1a0 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
@@ -37,6 +37,9 @@ public class HandlerOutputEntity implements Serializable {
     @Column(name = "NAME")
     private String name;
 
+    @Column(name = "WORKFLOW_ID")
+    private String workflowId;
+
     @Lob
     @Column(name = "VALUE")
     private String value;
@@ -71,8 +74,8 @@ public class HandlerOutputEntity implements Serializable {
 
     @ManyToOne(targetEntity = WorkflowHandlerEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     @JoinColumns({
-        @JoinColumn(name = "HANDLER_ID", referencedColumnName = "ID", nullable = false, updatable = false),
-        @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "WORKFLOW_ID", nullable = false, updatable = false)
+        @JoinColumn(name = "HANDLER_ID", referencedColumnName = "ID", insertable = false, updatable = false),
+        @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "WORKFLOW_ID", insertable = false, updatable = false)
     })
     private WorkflowHandlerEntity handler;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerStatusEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerStatusEntity.java
index 65363acc46..fe863c2858 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerStatusEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/HandlerStatusEntity.java
@@ -37,6 +37,9 @@ public class HandlerStatusEntity implements Serializable {
     @Column(name = "HANDLER_ID")
     private String handlerId;
 
+    @Column(name = "WORKFLOW_ID")
+    private String workflowId;
+
     @Column(name = "STATE")
     private String state;
 
@@ -48,8 +51,8 @@ public class HandlerStatusEntity implements Serializable {
 
     @ManyToOne(targetEntity = WorkflowHandlerEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     @JoinColumns({
-        @JoinColumn(name = "HANDLER_ID", referencedColumnName = "ID", nullable = false, updatable = false),
-        @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "WORKFLOW_ID", nullable = false, updatable = false)
+        @JoinColumn(name = "HANDLER_ID", referencedColumnName = "ID", insertable = false, updatable = false),
+        @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "WORKFLOW_ID", insertable = false, updatable = false)
     })
     private WorkflowHandlerEntity handler;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowApplicationEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowApplicationEntity.java
index 371e8edad5..7acb4250e2 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowApplicationEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowApplicationEntity.java
@@ -69,7 +69,7 @@ public class WorkflowApplicationEntity implements Serializable {
     private Timestamp updatedAt;
 
     @ManyToOne(targetEntity = AiravataWorkflowEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "ID")
+    @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "ID", insertable = false, updatable = false)
     private AiravataWorkflowEntity workflow;
 
     @OneToMany(
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 1712e92062..466af601b3 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
@@ -68,11 +68,11 @@ public class WorkflowConnectionEntity implements Serializable {
     private Timestamp updatedAt;
 
     @ManyToOne(targetEntity = AiravataWorkflowEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "ID")
+    @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "ID", insertable = false, updatable = false)
     private AiravataWorkflowEntity workflow;
 
     @ManyToOne(targetEntity = WorkflowDataBlockEntity.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
-    @JoinColumn(name = "DATA_BLOCK_ID", referencedColumnName = "ID")
+    @JoinColumn(name = "DATA_BLOCK_ID", referencedColumnName = "ID", insertable = false, updatable = false)
     private WorkflowDataBlockEntity dataBlock;
 
     public WorkflowConnectionEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowDataBlockEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowDataBlockEntity.java
index b1d34b9656..c66d9a94ff 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowDataBlockEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowDataBlockEntity.java
@@ -33,7 +33,7 @@ public class WorkflowDataBlockEntity implements Serializable {
     @Column(name = "ID")
     private String id;
 
-    @Column(name = "WORKFLOW_ID")
+    @Column(name = "WORKFLOW_ID", insertable = false, updatable = false)
     private String workflowId;
 
     @Column(name = "VALUE")
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 20e57ce3fb..6b25430d2b 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
@@ -50,7 +50,7 @@ public class WorkflowHandlerEntity implements Serializable {
     private Timestamp updatedAt;
 
     @ManyToOne(targetEntity = AiravataWorkflowEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
-    @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "ID")
+    @JoinColumn(name = "WORKFLOW_ID", referencedColumnName = "ID", insertable = false, updatable = false)
     private AiravataWorkflowEntity workflow;
 
     @OneToMany(
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowInputEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowInputEntity.java
index 60d5bc9b76..4c7f87b119 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowInputEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowInputEntity.java
@@ -70,7 +70,7 @@ public class WorkflowInputEntity implements Serializable {
     private String userFriendlyDescription;
 
     @ManyToOne(targetEntity = WorkflowEntity.class, cascade = CascadeType.MERGE)
-    @JoinColumn(name = "TEMPLATE_ID")
+    @JoinColumn(name = "TEMPLATE_ID", insertable = false, updatable = false)
     private WorkflowEntity workflow;
 
     public WorkflowInputEntity() {}
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowOutputEntity.java b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowOutputEntity.java
index 0c81aaa10b..827390e81e 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowOutputEntity.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/model/workflow/WorkflowOutputEntity.java
@@ -68,7 +68,7 @@ public class WorkflowOutputEntity implements Serializable {
     private String searchQuery;
 
     @ManyToOne(targetEntity = WorkflowEntity.class, cascade = CascadeType.MERGE)
-    @JoinColumn(name = "TEMPLATE_ID")
+    @JoinColumn(name = "TEMPLATE_ID", insertable = false, updatable = false)
     private WorkflowEntity workflow;
 
     public WorkflowOutputEntity() {}
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 8a2adceb97..47352e279f 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
@@ -40,7 +40,7 @@ public class AiravataCustomMailParser implements EmailParser {
     private static final Pattern pattern = Pattern.compile(REGEX);
 
     @Override
-    public JobStatusResult parseEmail(Message message, RegistryService.Client registryClient)
+    public JobStatusResult parseEmail(Message message, RegistryService.Iface registryClient)
             throws MessagingException, AiravataException {
         JobStatusResult jobStatusResult = new JobStatusResult();
         parseSubject(message.getSubject(), jobStatusResult);
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 3eaa9631b8..8e66368f3c 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
@@ -55,7 +55,7 @@ public class ClusterStatusMonitorJob implements Job {
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
         try {
             String superTenantGatewayId = ServerSettings.getSuperTenantGatewayId();
-            RegistryService.Client registryClient = getRegistryClient();
+            RegistryService.Iface registryClient = getRegistryClient();
             List<ComputeResourceProfile> computeResourceProfiles = new ArrayList<>();
             List<ComputeResourcePreference> computeResourcePreferences = null;
             try {
@@ -225,13 +225,8 @@ public class ClusterStatusMonitorJob implements Job {
         }
     }
 
-    private static RegistryService.Client getRegistryClient() throws TTransportException, ApplicationSettingsException {
-        TTransport transport = new TSocket(
-                ServerSettings.getRegistryServerHost(), Integer.parseInt(ServerSettings.getRegistryServerPort()));
-        transport.open();
-        TProtocol protocol = new TBinaryProtocol(transport);
-        RegistryService.Client registryClient = new RegistryService.Client(protocol);
-        return registryClient;
+    private static RegistryService.Iface getRegistryClient() {
+        return org.apache.airavata.execution.scheduler.Utils.getRegistryHandler();
     }
 
     private static CredentialStoreService.Client getCredentialStoreClient()
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 4ad5f1096b..5f218701a2 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
@@ -19,7 +19,6 @@
 */
 package org.apache.airavata.execution.monitor;
 
-import org.apache.airavata.common.util.ThriftClientPool;
 import org.apache.airavata.execution.scheduler.Utils;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupResourceProfile;
@@ -29,10 +28,10 @@ import org.apache.airavata.registry.api.RegistryService;
 
 public abstract class ComputeResourceMonitor {
 
-    protected ThriftClientPool<RegistryService.Client> registryClientPool;
+    protected RegistryService.Iface registryHandler;
 
     public ComputeResourceMonitor() {
-        this.registryClientPool = Utils.getRegistryServiceClientPool();
+        this.registryHandler = Utils.getRegistryHandler();
     }
 
     private boolean isValid(String str) {
@@ -40,28 +39,18 @@ public abstract class ComputeResourceMonitor {
     }
 
     public UserResourceProfile getUserResourceProfile(String username, String gatewayId) throws Exception {
-        RegistryService.Client client = this.registryClientPool.getResource();
-        try {
-            if (client.isUserResourceProfileExists(username, gatewayId)) {
-                return client.getUserResourceProfile(username, gatewayId);
-            }
-            return null;
-        } finally {
-            this.registryClientPool.returnResource(client);
+        if (registryHandler.isUserResourceProfileExists(username, gatewayId)) {
+            return registryHandler.getUserResourceProfile(username, gatewayId);
         }
+        return null;
     }
 
     private UserComputeResourcePreference getUserComputeResourcePreference(
             String gatewayId, String username, String computeResourceId) throws Exception {
-        RegistryService.Client client = this.registryClientPool.getResource();
-        try {
-            if (client.isUserComputeResourcePreferenceExists(username, gatewayId, computeResourceId)) {
-                return client.getUserComputeResourcePreference(username, gatewayId, computeResourceId);
-            }
-            return null;
-        } finally {
-            this.registryClientPool.returnResource(client);
+        if (registryHandler.isUserComputeResourcePreferenceExists(username, gatewayId, computeResourceId)) {
+            return registryHandler.getUserComputeResourcePreference(username, gatewayId, computeResourceId);
         }
+        return null;
     }
 
     public String getComputeResourceCredentialToken(
@@ -94,27 +83,17 @@ public abstract class ComputeResourceMonitor {
 
     public GroupComputeResourcePreference getGroupComputeResourcePreference(
             String computeResourcId, String groupResourceProfileId) throws Exception {
-        RegistryService.Client client = this.registryClientPool.getResource();
-        try {
-            if (client.isGroupComputeResourcePreferenceExists(computeResourcId, groupResourceProfileId)) {
-                return client.getGroupComputeResourcePreference(computeResourcId, groupResourceProfileId);
-            }
-            return null;
-        } finally {
-            this.registryClientPool.returnResource(client);
+        if (registryHandler.isGroupComputeResourcePreferenceExists(computeResourcId, groupResourceProfileId)) {
+            return registryHandler.getGroupComputeResourcePreference(computeResourcId, groupResourceProfileId);
         }
+        return null;
     }
 
     public GroupResourceProfile getGroupResourceProfile(String groupResourceProfileId) throws Exception {
-        RegistryService.Client client = this.registryClientPool.getResource();
-        try {
-            if (client.isGroupResourceProfileExists(groupResourceProfileId)) {
-                return client.getGroupResourceProfile(groupResourceProfileId);
-            }
-            return null;
-        } finally {
-            this.registryClientPool.returnResource(client);
+        if (registryHandler.isGroupResourceProfileExists(groupResourceProfileId)) {
+            return registryHandler.getGroupResourceProfile(groupResourceProfileId);
         }
+        return null;
     }
 
     public String getComputeResourceLoginUserName(
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 02a8cbf869..ea2428e015 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
@@ -34,13 +34,10 @@ import java.util.*;
 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.exception.ApplicationSettingsException;
 import org.apache.airavata.common.server.IServer;
-import org.apache.airavata.common.util.ThriftClientPool;
 import org.apache.airavata.model.appcatalog.computeresource.ResourceJobManagerType;
 import org.apache.airavata.model.job.JobModel;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.yaml.snakeyaml.Yaml;
@@ -50,7 +47,7 @@ public class EmailBasedMonitor implements AbstractMonitor, IServer {
     private static final Logger log = LoggerFactory.getLogger(EmailBasedMonitor.class);
 
     private IServer.ServerStatus status = IServer.ServerStatus.STOPPED;
-    private final ThriftClientPool<RegistryService.Client> registryClientPool;
+    private final RegistryService.Iface registryHandler;
     private final MessageProducer messageProducer;
 
     private static final String IMAPS = "imaps";
@@ -68,31 +65,12 @@ public class EmailBasedMonitor implements AbstractMonitor, IServer {
     private String publisherId;
 
     public EmailBasedMonitor() throws Exception {
-        this.registryClientPool = createRegistryClientPool();
+        this.registryHandler = org.apache.airavata.execution.scheduler.Utils.getRegistryHandler();
         this.messageProducer = new MessageProducer();
         init();
         populateAddressAndParserMap(resourceConfigs);
     }
 
-    private static ThriftClientPool<RegistryService.Client> createRegistryClientPool()
-            throws ApplicationSettingsException {
-        GenericObjectPoolConfig<RegistryService.Client> poolConfig = new GenericObjectPoolConfig<>();
-        poolConfig.setMaxTotal(100);
-        poolConfig.setMinIdle(5);
-        poolConfig.setBlockWhenExhausted(true);
-        poolConfig.setTestOnBorrow(true);
-        poolConfig.setTestWhileIdle(true);
-        poolConfig.setTimeBetweenEvictionRuns(Duration.ofMinutes(5));
-        poolConfig.setNumTestsPerEvictionRun(10);
-        poolConfig.setMaxWait(Duration.ofSeconds(3));
-        return new ThriftClientPool<>(
-                RegistryService.Client::new,
-                poolConfig,
-                ServerSettings.getRegistryServerHost(),
-                Integer.parseInt(ServerSettings.getRegistryServerPort()),
-                "RegistryService");
-    }
-
     @Override
     public void submitJobStatus(JobStatusResult jobStatusResult) throws MonitoringException {
         try {
@@ -110,9 +88,9 @@ public class EmailBasedMonitor implements AbstractMonitor, IServer {
     }
 
     private boolean validateJobStatus(JobStatusResult jobStatusResult) {
-        RegistryService.Client registryClient = registryClientPool.getResource();
+
         try {
-            List<JobModel> jobs = registryClient.getJobs("jobId", jobStatusResult.getJobId());
+            List<JobModel> jobs = registryHandler.getJobs("jobId", jobStatusResult.getJobId());
             if (!jobs.isEmpty()) {
                 jobs = jobs.stream()
                         .filter(jm -> jm.getJobName().equals(jobStatusResult.getJobName()))
@@ -124,13 +102,13 @@ public class EmailBasedMonitor implements AbstractMonitor, IServer {
                         jobStatusResult.getJobId(),
                         jobStatusResult.getJobName(),
                         jobs.size());
-                registryClientPool.returnResource(registryClient);
+
                 return false;
             }
             JobModel jobModel = jobs.get(0);
             String processId = jobModel.getProcessId();
-            String experimentId = registryClient.getProcess(processId).getExperimentId();
-            registryClientPool.returnResource(registryClient);
+            String experimentId = registryHandler.getProcess(processId).getExperimentId();
+
             if (experimentId != null && processId != null) {
                 log.info(
                         "Job {} owned by process {} of experiment {}",
@@ -143,7 +121,7 @@ public class EmailBasedMonitor implements AbstractMonitor, IServer {
             return false;
         } catch (Exception e) {
             log.error("Error validating job status {}", jobStatusResult.getJobId(), e);
-            registryClientPool.returnBrokenResource(registryClient);
+
             return false;
         }
     }
@@ -232,22 +210,13 @@ public class EmailBasedMonitor implements AbstractMonitor, IServer {
             throw new AiravataException("[EJM]: Un-handle resource job manager type: " + jobMonitorType.toString()
                     + " for email monitoring -->  " + addressStr);
         }
-        RegistryService.Client regClient = registryClientPool.getResource();
-
-        try {
-            JobStatusResult jobStatusResult = emailParser.parseEmail(message, regClient);
-            jobStatusResult.setPublisherName(publisherId);
-            var jobId = jobStatusResult.getJobId();
-            var jobName = jobStatusResult.getJobName();
-            var jobStatus = jobStatusResult.getState().getValue();
-            log.info("Parsed Job Status: From=[{}], Id={}, Name={}, State={}", publisherId, jobId, jobName, jobStatus);
-            return jobStatusResult;
-        } catch (Exception e) {
-            registryClientPool.returnBrokenResource(regClient);
-            throw e;
-        } finally {
-            registryClientPool.returnResource(regClient);
-        }
+        JobStatusResult jobStatusResult = emailParser.parseEmail(message, registryHandler);
+        jobStatusResult.setPublisherName(publisherId);
+        var jobId = jobStatusResult.getJobId();
+        var jobName = jobStatusResult.getJobName();
+        var jobStatus = jobStatusResult.getState().getValue();
+        log.info("Parsed Job Status: From=[{}], Id={}, Name={}, State={}", publisherId, jobId, jobName, jobStatus);
+        return jobStatusResult;
     }
 
     private ResourceJobManagerType getJobMonitorType(String addressStr) throws AiravataException {
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/EmailParser.java b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/EmailParser.java
index a09c2b51a8..1da1edb233 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/monitor/EmailParser.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/monitor/EmailParser.java
@@ -30,6 +30,6 @@ public interface EmailParser {
     static final String JOBNAME = "jobName";
     static final String EXIT_STATUS = "exitStatus";
 
-    JobStatusResult parseEmail(Message message, RegistryService.Client registryClient)
+    JobStatusResult parseEmail(Message message, RegistryService.Iface registryClient)
             throws MessagingException, AiravataException;
 }
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 5c2fcea929..c5c830a171 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
@@ -55,7 +55,7 @@ public class HTCondorEmailParser implements EmailParser {
      * Returns : JobStatusResult
      * Purpose : Responsible for parsing the email to access an HTCondor job status
      */
-    public JobStatusResult parseEmail(Message message, RegistryService.Client registryClient)
+    public JobStatusResult parseEmail(Message message, RegistryService.Iface registryClient)
             throws MessagingException, AiravataException {
         // Job Status Results
         JobStatusResult jobStatusResult = new 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 e0466b4562..ba76acc627 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
@@ -39,7 +39,7 @@ public class LSFEmailParser implements EmailParser {
     public static final String FAILED = "Exited";
 
     @Override
-    public JobStatusResult parseEmail(Message message, RegistryService.Client registryClient)
+    public JobStatusResult parseEmail(Message message, RegistryService.Iface registryClient)
             throws MessagingException, AiravataException {
         JobStatusResult jobStatusResult = new JobStatusResult();
 
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 c263b35bdc..d1dd8bbdbb 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
@@ -48,11 +48,10 @@ public class MonitoringJob extends ComputeResourceMonitor implements Job {
 
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
-        RegistryService.Client client = null;
         try {
             LOGGER.debug("Executing ComputeResources Monitoring Job....... ");
 
-            client = this.registryClientPool.getResource();
+            RegistryService.Iface client = this.registryHandler;
 
             JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
             String metaSchedulerGateway = jobDataMap.getString(Constants.METASCHEDULER_GATEWAY);
@@ -70,19 +69,11 @@ public class MonitoringJob extends ComputeResourceMonitor implements Job {
         } catch (Exception ex) {
             String msg = "Error occurred while executing job" + ex.getMessage();
             LOGGER.error(msg, ex);
-            if (client != null) {
-                registryClientPool.returnBrokenResource(client);
-            }
-            client = null;
-        } finally {
-            if (client != null) {
-                registryClientPool.returnResource(client);
-            }
         }
     }
 
     private void executeComputeResourceMonitoring(
-            RegistryService.Client client,
+            RegistryService.Iface client,
             String metaSchedulerGateway,
             String username,
             String metaSchedulerGRP,
@@ -115,7 +106,7 @@ public class MonitoringJob extends ComputeResourceMonitor implements Job {
     }
 
     private void updateComputeResource(
-            RegistryService.Client client,
+            RegistryService.Iface client,
             AdaptorSupport adaptorSupport,
             String gatewayId,
             String username,
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 bc092e397a..6a26bda111 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
@@ -42,7 +42,7 @@ public class PBSEmailParser implements EmailParser {
     private static final String REGEX_EXIT_STATUS = "Exit_status=(?<" + EXIT_STATUS + ">[\\d]+)";
 
     @Override
-    public JobStatusResult parseEmail(Message message, RegistryService.Client registryClient)
+    public JobStatusResult parseEmail(Message message, RegistryService.Iface registryClient)
             throws MessagingException, AiravataException {
         JobStatusResult jobStatusResult = new JobStatusResult();
         //        log.info("Parsing -> " + message.getSubject());
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 6e81925f1d..b3d86f53a7 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
@@ -34,7 +34,7 @@ public class RealtimeJobStatusParser {
 
     private static final Logger logger = LoggerFactory.getLogger(RealtimeJobStatusParser.class);
 
-    private String getJobIdIdByJobNameWithRetry(String jobName, String taskId, RegistryService.Client registryClient)
+    private String getJobIdIdByJobNameWithRetry(String jobName, String taskId, RegistryService.Iface registryClient)
             throws Exception {
         for (int i = 0; i < 3; i++) {
 
@@ -58,7 +58,7 @@ public class RealtimeJobStatusParser {
         return null;
     }
 
-    public JobStatusResult parse(String rawMessage, String publisherId, RegistryService.Client registryClient) {
+    public JobStatusResult parse(String rawMessage, String publisherId, RegistryService.Iface registryClient) {
 
         try {
             Map asMap = new Gson().fromJson(rawMessage, Map.class);
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 d83b12db92..523fb5925e 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,10 +26,8 @@ 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.common.util.ThriftClientPool;
 import org.apache.airavata.model.job.JobModel;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import org.apache.kafka.clients.consumer.Consumer;
 import org.apache.kafka.clients.consumer.ConsumerConfig;
 import org.apache.kafka.clients.consumer.ConsumerRecords;
@@ -45,7 +43,7 @@ public class RealtimeMonitor implements AbstractMonitor, IServer {
     private final RealtimeJobStatusParser parser;
     private final String publisherId;
     private final String brokerTopic;
-    private final ThriftClientPool<RegistryService.Client> registryClientPool;
+    private final RegistryService.Iface registryHandler;
     private final MessageProducer messageProducer;
     private IServer.ServerStatus status = IServer.ServerStatus.STOPPED;
 
@@ -53,29 +51,10 @@ public class RealtimeMonitor implements AbstractMonitor, IServer {
         parser = new RealtimeJobStatusParser();
         publisherId = ServerSettings.getSetting("job.monitor.realtime.publisher.id");
         brokerTopic = ServerSettings.getSetting("realtime.monitor.broker.topic");
-        registryClientPool = createRegistryClientPool();
+        registryHandler = org.apache.airavata.execution.scheduler.Utils.getRegistryHandler();
         messageProducer = new MessageProducer();
     }
 
-    private static ThriftClientPool<RegistryService.Client> createRegistryClientPool()
-            throws ApplicationSettingsException {
-        GenericObjectPoolConfig<RegistryService.Client> poolConfig = new GenericObjectPoolConfig<>();
-        poolConfig.setMaxTotal(100);
-        poolConfig.setMinIdle(5);
-        poolConfig.setBlockWhenExhausted(true);
-        poolConfig.setTestOnBorrow(true);
-        poolConfig.setTestWhileIdle(true);
-        poolConfig.setTimeBetweenEvictionRuns(Duration.ofMinutes(5));
-        poolConfig.setNumTestsPerEvictionRun(10);
-        poolConfig.setMaxWait(Duration.ofSeconds(3));
-        return new ThriftClientPool<>(
-                RegistryService.Client::new,
-                poolConfig,
-                ServerSettings.getRegistryServerHost(),
-                Integer.parseInt(ServerSettings.getRegistryServerPort()),
-                "RegistryService");
-    }
-
     @Override
     public void submitJobStatus(JobStatusResult jobStatusResult) throws MonitoringException {
         try {
@@ -93,9 +72,9 @@ public class RealtimeMonitor implements AbstractMonitor, IServer {
     }
 
     private boolean validateJobStatus(JobStatusResult jobStatusResult) {
-        RegistryService.Client registryClient = registryClientPool.getResource();
+
         try {
-            List<JobModel> jobs = registryClient.getJobs("jobId", jobStatusResult.getJobId());
+            List<JobModel> jobs = registryHandler.getJobs("jobId", jobStatusResult.getJobId());
             if (!jobs.isEmpty()) {
                 jobs = jobs.stream()
                         .filter(jm -> jm.getJobName().equals(jobStatusResult.getJobName()))
@@ -107,13 +86,13 @@ public class RealtimeMonitor implements AbstractMonitor, IServer {
                         jobStatusResult.getJobId(),
                         jobStatusResult.getJobName(),
                         jobs.size());
-                registryClientPool.returnResource(registryClient);
+
                 return false;
             }
             JobModel jobModel = jobs.get(0);
             String processId = jobModel.getProcessId();
-            String experimentId = registryClient.getProcess(processId).getExperimentId();
-            registryClientPool.returnResource(registryClient);
+            String experimentId = registryHandler.getProcess(processId).getExperimentId();
+
             if (experimentId != null && processId != null) {
                 return true;
             }
@@ -121,7 +100,7 @@ public class RealtimeMonitor implements AbstractMonitor, IServer {
             return false;
         } catch (Exception e) {
             logger.error("Error validating job status {}", jobStatusResult.getJobId(), e);
-            registryClientPool.returnBrokenResource(registryClient);
+
             return false;
         }
     }
@@ -144,22 +123,22 @@ public class RealtimeMonitor implements AbstractMonitor, IServer {
 
         while (!Thread.currentThread().isInterrupted()) {
             final ConsumerRecords<String, String> consumerRecords = consumer.poll(Duration.ofSeconds(1));
-            RegistryService.Client registryClient = registryClientPool.getResource();
+
             consumerRecords.forEach(record -> {
                 try {
-                    process(record.key(), record.value(), registryClient);
+                    process(record.key(), record.value());
                 } catch (Exception e) {
                     logger.error("Error while processing message {}", record.value(), e);
                 }
             });
-            registryClientPool.returnResource(registryClient);
+
             consumer.commitAsync();
         }
     }
 
-    private void process(String key, String value, RegistryService.Client registryClient) throws MonitoringException {
+    private void process(String key, String value) throws MonitoringException {
         logger.info("received post from {} on {}: {}->{}", publisherId, brokerTopic, key, value);
-        JobStatusResult statusResult = parser.parse(value, publisherId, registryClient);
+        JobStatusResult statusResult = parser.parse(value, publisherId, registryHandler);
         if (statusResult != null) {
             logger.info("Submitting message to job monitor queue");
             submitJobStatus(statusResult);
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 fcdf8773d5..5cac465376 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
@@ -44,7 +44,7 @@ public class SLURMEmailParser implements EmailParser {
     private static final Pattern pattern = Pattern.compile(REGEX);
 
     @Override
-    public JobStatusResult parseEmail(Message message, RegistryService.Client registryClient)
+    public JobStatusResult parseEmail(Message message, RegistryService.Iface registryClient)
             throws MessagingException, AiravataException {
         JobStatusResult jobStatusResult = new JobStatusResult();
         parseSubject(message.getSubject(), jobStatusResult);
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 bb0801cb4b..3cab3ac6da 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
@@ -43,7 +43,7 @@ public class UGEEmailParser implements EmailParser {
     public static final String ABORTED = "Aborted";
 
     @Override
-    public JobStatusResult parseEmail(Message message, RegistryService.Client registryClient)
+    public JobStatusResult parseEmail(Message message, RegistryService.Iface registryClient)
             throws MessagingException, AiravataException {
         JobStatusResult jobStatusResult = new JobStatusResult();
 
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 6b63835e35..49e246fe31 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
@@ -28,9 +28,8 @@ import java.util.List;
 import java.util.UUID;
 import org.apache.airavata.common.config.ServerSettings;
 import org.apache.airavata.common.exception.AiravataException;
-import org.apache.airavata.common.exception.ApplicationSettingsException;
 import org.apache.airavata.common.util.AiravataUtils;
-import org.apache.airavata.execution.util.RegistryServiceClientFactory;
+import org.apache.airavata.execution.scheduler.Utils;
 import org.apache.airavata.messaging.service.MessageContext;
 import org.apache.airavata.messaging.service.MessagingFactory;
 import org.apache.airavata.messaging.service.Publisher;
@@ -45,10 +44,7 @@ import org.apache.airavata.model.messaging.event.*;
 import org.apache.airavata.model.process.ProcessModel;
 import org.apache.airavata.model.status.*;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.airavata.registry.api.exception.RegistryServiceException;
-import org.apache.airavata.security.profile.client.ProfileServiceClientFactory;
-import org.apache.airavata.service.profile.user.cpi.UserProfileService;
-import org.apache.airavata.service.profile.user.cpi.exception.UserProfileServiceException;
+import org.apache.airavata.security.profile.user.core.repositories.UserProfileRepository;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.helix.HelixManager;
@@ -524,7 +520,7 @@ public abstract class AiravataTask extends AbstractTask {
             TaskContext.TaskContextBuilder taskContextBuilder = new TaskContext.TaskContextBuilder(
                             getProcessId(), getGatewayId(), getTaskId())
                     .setRegistryClient(getRegistryServiceClient())
-                    .setProfileClient(getUserProfileClient())
+                    .setUserProfileRepository(getUserProfileRepository())
                     .setExperimentModel(getExperimentModel())
                     .setProcessModel(getProcessModel());
 
@@ -646,31 +642,11 @@ public abstract class AiravataTask extends AbstractTask {
         this.autoSchedule = autoSchedule;
     }
 
-    // TODO this is inefficient. Try to use a connection pool
-    public static RegistryService.Client getRegistryServiceClient() {
-        final String serverHost;
-        final int serverPort;
-        try {
-            serverPort = Integer.parseInt(ServerSettings.getRegistryServerPort());
-            serverHost = ServerSettings.getRegistryServerHost();
-        } catch (ApplicationSettingsException e) {
-            throw new RuntimeException("Unable to get registry server host or port...", e);
-        }
-        try {
-            logger.info("Connecting to registry server on {}:{}", serverHost, serverPort);
-            return RegistryServiceClientFactory.createRegistryClient(serverHost, serverPort);
-        } catch (RegistryServiceException e) {
-            throw new RuntimeException("Unable to create registry client...", e);
-        }
+    public static RegistryService.Iface getRegistryServiceClient() {
+        return Utils.getRegistryHandler();
     }
 
-    public static UserProfileService.Client getUserProfileClient() {
-        try {
-            final int serverPort = Integer.parseInt(ServerSettings.getProfileServiceServerPort());
-            final String serverHost = ServerSettings.getProfileServiceServerHost();
-            return ProfileServiceClientFactory.createUserProfileServiceClient(serverHost, serverPort);
-        } catch (UserProfileServiceException | ApplicationSettingsException e) {
-            throw new RuntimeException("Unable to create profile service client...", e);
-        }
+    public static UserProfileRepository getUserProfileRepository() {
+        return new UserProfileRepository();
     }
 }
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 1534b33fee..5ffd47ceac 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
@@ -21,9 +21,7 @@ package org.apache.airavata.execution.orchestrator;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.airavata.common.config.ServerSettings;
-import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.execution.util.RegistryServiceClientFactory;
+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;
@@ -32,7 +30,6 @@ import org.apache.airavata.model.experiment.*;
 import org.apache.airavata.model.process.ProcessModel;
 import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,10 +37,10 @@ import org.slf4j.LoggerFactory;
 public class BatchQueueValidator implements JobMetadataValidator {
     private static final Logger logger = LoggerFactory.getLogger(BatchQueueValidator.class);
 
-    private RegistryService.Client registryClient;
+    private final RegistryService.Iface registryHandler;
 
-    public BatchQueueValidator() throws TException, ApplicationSettingsException {
-        this.registryClient = getRegistryServiceClient();
+    public BatchQueueValidator() {
+        this.registryHandler = Utils.getRegistryHandler();
     }
 
     public ValidationResults validate(ExperimentModel experiment, ProcessModel processModel) {
@@ -78,12 +75,12 @@ public class BatchQueueValidator implements JobMetadataValidator {
         } else {
             ComputeResourceDescription computeResource;
             if (processModel == null) {
-                computeResource = registryClient.getComputeResource(experiment
+                computeResource = registryHandler.getComputeResource(experiment
                         .getUserConfigurationData()
                         .getComputationalResourceScheduling()
                         .getResourceHostId());
             } else {
-                computeResource = registryClient.getComputeResource(
+                computeResource = registryHandler.getComputeResource(
                         processModel.getProcessResourceSchedule().getResourceHostId());
             }
 
@@ -224,14 +221,4 @@ public class BatchQueueValidator implements JobMetadataValidator {
         }
         return validatorResultList;
     }
-
-    private RegistryService.Client getRegistryServiceClient() throws ApplicationSettingsException {
-        final int serverPort = Integer.parseInt(ServerSettings.getRegistryServerPort());
-        final String serverHost = ServerSettings.getRegistryServerHost();
-        try {
-            return RegistryServiceClientFactory.createRegistryClient(serverHost, serverPort);
-        } catch (RegistryServiceException e) {
-            throw new RuntimeException("Unable to create registry client...", e);
-        }
-    }
 }
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 3bd43e258d..69e3b3658d 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
@@ -21,9 +21,7 @@ package org.apache.airavata.execution.orchestrator;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.airavata.common.config.ServerSettings;
-import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.execution.util.RegistryServiceClientFactory;
+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;
@@ -33,7 +31,6 @@ 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.registry.api.RegistryService;
-import org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,10 +39,10 @@ public class GroupResourceProfileValidator implements JobMetadataValidator {
 
     private static final Logger logger = LoggerFactory.getLogger(GroupResourceProfileValidator.class);
 
-    private RegistryService.Client registryClient;
+    private final RegistryService.Iface registryHandler;
 
-    public GroupResourceProfileValidator() throws TException, ApplicationSettingsException {
-        this.registryClient = getRegistryServiceClient();
+    public GroupResourceProfileValidator() {
+        this.registryHandler = Utils.getRegistryHandler();
     }
 
     @Override
@@ -83,9 +80,9 @@ public class GroupResourceProfileValidator implements JobMetadataValidator {
         }
 
         List<BatchQueueResourcePolicy> batchQueueResourcePolicies =
-                registryClient.getGroupBatchQueueResourcePolicyList(groupResourceProfileId);
+                registryHandler.getGroupBatchQueueResourcePolicyList(groupResourceProfileId);
         List<ComputeResourcePolicy> computeResourcePolicies =
-                registryClient.getGroupComputeResourcePolicyList(groupResourceProfileId);
+                registryHandler.getGroupComputeResourcePolicyList(groupResourceProfileId);
         ComputeResourcePolicy groupComputeResourcePolicy = computeResourcePolicies.stream()
                 .filter(computeResourcePolicy -> computeResourceId.equals(computeResourcePolicy.getComputeResourceId()))
                 .findFirst()
@@ -203,14 +200,4 @@ public class GroupResourceProfileValidator implements JobMetadataValidator {
         batchQueuevalidatorResultList.add(cpuCountResult);
         return batchQueuevalidatorResultList;
     }
-
-    private RegistryService.Client getRegistryServiceClient() throws TException, ApplicationSettingsException {
-        final int serverPort = Integer.parseInt(ServerSettings.getRegistryServerPort());
-        final String serverHost = ServerSettings.getRegistryServerHost();
-        try {
-            return RegistryServiceClientFactory.createRegistryClient(serverHost, serverPort);
-        } catch (RegistryServiceException e) {
-            throw new RuntimeException("Unable to create registry client...", 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 7464f5220b..5a19f7d36c 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
@@ -19,12 +19,9 @@
 */
 package org.apache.airavata.execution.orchestrator;
 
-import org.apache.airavata.common.config.ServerSettings;
 import org.apache.airavata.common.exception.AiravataException;
-import org.apache.airavata.common.exception.ApplicationSettingsException;
 import org.apache.airavata.common.util.AiravataUtils;
-import org.apache.airavata.common.util.ThriftUtils;
-import org.apache.airavata.execution.util.RegistryServiceClientFactory;
+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;
@@ -32,7 +29,6 @@ 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.registry.api.RegistryService;
-import org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,10 +38,9 @@ public class OrchestratorServerUtils {
 
     public static void updateAndPublishExperimentStatus(
             String experimentId, ExperimentStatus status, Publisher publisher, String gatewayId) throws TException {
-        RegistryService.Client registryClient = null;
         try {
-            registryClient = getRegistryServiceClient();
-            registryClient.updateExperimentStatus(status, experimentId);
+            RegistryService.Iface registryHandler = Utils.getRegistryHandler();
+            registryHandler.updateExperimentStatus(status, experimentId);
             ExperimentStatusChangeEvent event =
                     new ExperimentStatusChangeEvent(status.getState(), experimentId, gatewayId);
             String messageId = AiravataUtils.getId("EXPERIMENT");
@@ -55,45 +50,14 @@ public class OrchestratorServerUtils {
         } catch (AiravataException e) {
             log.error(
                     "expId : " + experimentId + " Error while publishing experiment status to " + status.toString(), e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
-    public static ExperimentStatus getExperimentStatus(String experimentId)
-            throws TException, ApplicationSettingsException {
-        RegistryService.Client registryClient = null;
-        try {
-            registryClient = getRegistryServiceClient();
-            return registryClient.getExperimentStatus(experimentId);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
-        }
-    }
-
-    public static ProcessModel getProcess(String processId) throws TException, ApplicationSettingsException {
-        RegistryService.Client registryClient = null;
-        try {
-            registryClient = getRegistryServiceClient();
-            return registryClient.getProcess(processId);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
-        }
+    public static ExperimentStatus getExperimentStatus(String experimentId) throws TException {
+        return Utils.getRegistryHandler().getExperimentStatus(experimentId);
     }
 
-    private static RegistryService.Client getRegistryServiceClient() throws ApplicationSettingsException {
-        final int serverPort = Integer.parseInt(ServerSettings.getRegistryServerPort());
-        final String serverHost = ServerSettings.getRegistryServerHost();
-        try {
-            return RegistryServiceClientFactory.createRegistryClient(serverHost, serverPort);
-        } catch (RegistryServiceException e) {
-            throw new RuntimeException("Unable to create registry client...", e);
-        }
+    public static ProcessModel getProcess(String processId) throws TException {
+        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 9d684dc8d9..44e7f58698 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
@@ -28,10 +28,9 @@ import org.apache.airavata.common.config.ServerSettings;
 import org.apache.airavata.common.db.DBUtil;
 import org.apache.airavata.common.exception.AiravataException;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.common.util.ThriftUtils;
 import org.apache.airavata.credential.repository.CredentialReader;
 import org.apache.airavata.credential.repository.CredentialReaderImpl;
-import org.apache.airavata.execution.util.RegistryServiceClientFactory;
+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;
@@ -50,7 +49,6 @@ 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.registry.api.RegistryService;
-import org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -82,29 +80,17 @@ public class OrchestratorUtils {
 
     public static GroupComputeResourcePreference getGroupComputeResourcePreference(ProcessModel model)
             throws TException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
-        try {
-            return registryClient.getGroupComputeResourcePreference(
-                    model.getComputeResourceId(), model.getGroupResourceProfileId());
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
-        }
+        return getRegistryHandler()
+                .getGroupComputeResourcePreference(model.getComputeResourceId(), model.getGroupResourceProfileId());
     }
 
     public static String getApplicationInterfaceName(ProcessModel model) throws TException, OrchestratorException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
         try {
             ApplicationInterfaceDescription appInterface =
-                    registryClient.getApplicationInterface(model.getApplicationInterfaceId());
+                    getRegistryHandler().getApplicationInterface(model.getApplicationInterfaceId());
             return appInterface.getApplicationName();
         } catch (Exception e) {
             throw new OrchestratorException("Error while retrieving application interface", e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
@@ -115,29 +101,24 @@ public class OrchestratorUtils {
 
     public static StoragePreference getStoragePreference(ProcessModel processModel, String gatewayId)
             throws OrchestratorException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
         try {
             String resourceHostId = processModel.getComputeResourceId();
-            return registryClient.getGatewayStoragePreference(gatewayId, resourceHostId);
+            return getRegistryHandler().getGatewayStoragePreference(gatewayId, resourceHostId);
         } catch (Exception e) {
             logger.error("Error occurred while retrieving StoragePreference", e);
             throw new OrchestratorException("Error occurred while retrieving StoragePreference", e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
     public static String getLoginUserName(ProcessModel processModel, String gatewayId)
             throws AiravataException, TException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
         try {
+            RegistryService.Iface registryHandler = getRegistryHandler();
             GroupComputeResourcePreference computeResourcePreference = getGroupComputeResourcePreference(processModel);
             ComputationalResourceSchedulingModel processResourceSchedule = processModel.getProcessResourceSchedule();
             if (processModel.isUseUserCRPref()) {
                 UserComputeResourcePreference userComputeResourcePreference =
-                        registryClient.getUserComputeResourcePreference(
+                        registryHandler.getUserComputeResourcePreference(
                                 processModel.getUserName(), gatewayId, processModel.getComputeResourceId());
                 if (isValid(userComputeResourcePreference.getLoginUserName())) {
                     return userComputeResourcePreference.getLoginUserName();
@@ -169,24 +150,20 @@ public class OrchestratorUtils {
             logger.error("Error occurred while initializing app catalog to fetch login username", e);
             throw new ApplicationSettingsException(
                     "Error occurred while initializing app catalog to fetch login username", e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
     public static String getScratchLocation(ProcessModel processModel, String gatewayId)
             throws AiravataException, TException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
         try {
+            RegistryService.Iface registryHandler = getRegistryHandler();
             GroupComputeResourcePreference computeResourcePreference = getGroupComputeResourcePreference(processModel);
             ComputationalResourceSchedulingModel processResourceSchedule = processModel.getProcessResourceSchedule();
             String scratchLocation = computeResourcePreference.getScratchLocation();
 
             if (processModel.isUseUserCRPref()) {
                 UserComputeResourcePreference userComputeResourcePreference =
-                        registryClient.getUserComputeResourcePreference(
+                        registryHandler.getUserComputeResourcePreference(
                                 processModel.getUserName(), gatewayId, processModel.getComputeResourceId());
                 if (isValid(userComputeResourcePreference.getScratchLocation())) {
                     return userComputeResourcePreference.getScratchLocation();
@@ -218,19 +195,15 @@ public class OrchestratorUtils {
         } catch (AiravataException e) {
             logger.error("Error occurred while initializing app catalog to fetch scratch location", e);
             throw new AiravataException("Error occurred while initializing app catalog to fetch scratch location", e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
     public static JobSubmissionInterface getPreferredJobSubmissionInterface(ProcessModel processModel, String gatewayId)
             throws OrchestratorException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
         try {
             String resourceHostId = processModel.getComputeResourceId();
-            ComputeResourceDescription resourceDescription = registryClient.getComputeResource(resourceHostId);
+            ComputeResourceDescription resourceDescription =
+                    getRegistryHandler().getComputeResource(resourceHostId);
             List<JobSubmissionInterface> jobSubmissionInterfaces = resourceDescription.getJobSubmissionInterfaces();
             if (jobSubmissionInterfaces != null && !jobSubmissionInterfaces.isEmpty()) {
                 Collections.sort(
@@ -242,19 +215,15 @@ public class OrchestratorUtils {
             return jobSubmissionInterfaces.get(0);
         } catch (Exception e) {
             throw new OrchestratorException("Error occurred while retrieving data from app catalog", e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
     public static DataMovementInterface getPreferredDataMovementInterface(ProcessModel processModel, String gatewayId)
             throws OrchestratorException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
         try {
             String resourceHostId = processModel.getComputeResourceId();
-            ComputeResourceDescription resourceDescription = registryClient.getComputeResource(resourceHostId);
+            ComputeResourceDescription resourceDescription =
+                    getRegistryHandler().getComputeResource(resourceHostId);
             List<DataMovementInterface> dataMovementInterfaces = resourceDescription.getDataMovementInterfaces();
             if (dataMovementInterfaces != null && !dataMovementInterfaces.isEmpty()) {
                 Collections.sort(
@@ -266,10 +235,6 @@ public class OrchestratorUtils {
             return dataMovementInterfaces.get(0);
         } catch (Exception e) {
             throw new OrchestratorException("Error occurred while retrieving data from app catalog", e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
@@ -328,77 +293,52 @@ public class OrchestratorUtils {
     }
 
     public static LOCALSubmission getLocalJobSubmission(String submissionId) throws OrchestratorException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
         try {
-            return registryClient.getLocalJobSubmission(submissionId);
+            return getRegistryHandler().getLocalJobSubmission(submissionId);
         } catch (Exception e) {
             String errorMsg = "Error while retrieving local job submission with submission id : " + submissionId;
             logger.error(errorMsg, e);
             throw new OrchestratorException(errorMsg, e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
     public static UnicoreJobSubmission getUnicoreJobSubmission(String submissionId) throws OrchestratorException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
         try {
-            return registryClient.getUnicoreJobSubmission(submissionId);
+            return getRegistryHandler().getUnicoreJobSubmission(submissionId);
         } catch (Exception e) {
             String errorMsg = "Error while retrieving UNICORE job submission with submission id : " + submissionId;
             logger.error(errorMsg, e);
             throw new OrchestratorException(errorMsg, e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
     public static SSHJobSubmission getSSHJobSubmission(String submissionId) throws OrchestratorException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
         try {
-            return registryClient.getSSHJobSubmission(submissionId);
+            return getRegistryHandler().getSSHJobSubmission(submissionId);
         } catch (Exception e) {
             String errorMsg = "Error while retrieving SSH job submission with submission id : " + submissionId;
             logger.error(errorMsg, e);
             throw new OrchestratorException(errorMsg, e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
     public static CloudJobSubmission getCloudJobSubmission(String submissionId) throws OrchestratorException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
         try {
-            return registryClient.getCloudJobSubmission(submissionId);
+            return getRegistryHandler().getCloudJobSubmission(submissionId);
         } catch (Exception e) {
             String errorMsg = "Error while retrieving SSH job submission with submission id : " + submissionId;
             logger.error(errorMsg, e);
             throw new OrchestratorException(errorMsg, e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
     public static SCPDataMovement getSCPDataMovement(String dataMoveId) throws OrchestratorException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
         try {
-            return registryClient.getSCPDataMovement(dataMoveId);
+            return getRegistryHandler().getSCPDataMovement(dataMoveId);
         } catch (Exception e) {
             String errorMsg = "Error while retrieving SCP Data movement with submission id : " + dataMoveId;
             logger.error(errorMsg, e);
             throw new OrchestratorException(errorMsg, e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
@@ -406,14 +346,8 @@ public class OrchestratorUtils {
         return (str != null && !str.trim().isEmpty());
     }
 
-    private static RegistryService.Client getRegistryServiceClient() {
-        try {
-            final int serverPort = Integer.parseInt(ServerSettings.getRegistryServerPort());
-            final String serverHost = ServerSettings.getRegistryServerHost();
-            return RegistryServiceClientFactory.createRegistryClient(serverHost, serverPort);
-        } catch (RegistryServiceException | ApplicationSettingsException e) {
-            throw new RuntimeException("Unable to create registry client...", e);
-        }
+    private static RegistryService.Iface getRegistryHandler() {
+        return Utils.getRegistryHandler();
     }
 
     public static CredentialReader getCredentialReader()
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 54d160866f..749881239f 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
@@ -114,15 +114,14 @@ public class ParserWorkflowManager implements IServer {
 
     private boolean process(ProcessCompletionMessage completionMessage) {
 
-        RegistryService.Client registryClient =
-                wfManager.getRegistryClientPool().getResource();
+        RegistryService.Iface registryHandler = wfManager.getRegistryHandler();
 
         try {
             ProcessModel processModel;
             ApplicationInterfaceDescription appDescription;
             try {
-                processModel = registryClient.getProcess(completionMessage.getProcessId());
-                appDescription = registryClient.getApplicationInterface(processModel.getApplicationInterfaceId());
+                processModel = registryHandler.getProcess(completionMessage.getProcessId());
+                appDescription = registryHandler.getApplicationInterface(processModel.getApplicationInterfaceId());
 
             } catch (Exception e) {
                 logger.error(
@@ -137,7 +136,7 @@ public class ParserWorkflowManager implements IServer {
 
             // All the templates should be run
             // FIXME is it ApplicationInterfaceId or ApplicationName
-            List<ParsingTemplate> parsingTemplates = registryClient.getParsingTemplatesForExperiment(
+            List<ParsingTemplate> parsingTemplates = registryHandler.getParsingTemplatesForExperiment(
                     completionMessage.getExperimentId(), completionMessage.getGatewayId());
 
             logger.info("Found " + parsingTemplates.size() + " parsing template for experiment "
@@ -171,7 +170,7 @@ public class ParserWorkflowManager implements IServer {
             for (ParsingTemplate template : parsingTemplates) {
 
                 logger.info("Launching parsing template " + template.getId());
-                ParserInput parserInput = registryClient.getParserInput(
+                ParserInput parserInput = registryHandler.getParserInput(
                         template.getInitialInputs().get(0).getTargetInputId(), template.getGatewayId());
                 String parentParserId = parserInput.getParserId();
 
@@ -201,10 +200,10 @@ public class ParserWorkflowManager implements IServer {
                     throw new Exception("Could not find a parent parser for template " + template.getId());
                 }
 
-                Parser parentParser = registryClient.getParser(parentParserId, completionMessage.getGatewayId());
+                Parser parentParser = registryHandler.getParser(parentParserId, completionMessage.getGatewayId());
 
                 DataParsingTask parentParserTask =
-                        createParentTask(parentParser, completionMessage, template.getInitialInputs(), registryClient);
+                        createParentTask(parentParser, completionMessage, template.getInitialInputs(), registryHandler);
 
                 List<AbstractTask> allTasks = new ArrayList<>();
                 allTasks.add(parentParserTask);
@@ -216,7 +215,7 @@ public class ParserWorkflowManager implements IServer {
                             parentParserTask,
                             parentToChildParsers.get(template.getId()),
                             completionMessage,
-                            registryClient);
+                            registryHandler);
                 }
                 String workflow = wfManager
                         .getWorkflowOperator()
@@ -232,13 +231,10 @@ public class ParserWorkflowManager implements IServer {
                 parserwfCounter.inc();
             }
 
-            wfManager.getRegistryClientPool().returnResource(registryClient);
-
             return true;
 
         } catch (Exception e) {
             logger.error("Failed to create the DataParsing task DAG", e);
-            wfManager.getRegistryClientPool().returnBrokenResource(registryClient);
             return false;
         }
     }
@@ -247,7 +243,7 @@ public class ParserWorkflowManager implements IServer {
             Parser parserInfo,
             ProcessCompletionMessage completionMessage,
             List<ParsingTemplateInput> templateInputs,
-            RegistryService.Client registryClient)
+            RegistryService.Iface registryHandler)
             throws Exception {
         DataParsingTask parsingTask = new DataParsingTask();
         parsingTask.setTaskId(wfManager.normalizeTaskId(completionMessage.getExperimentId() + "-" + parserInfo.getId()
@@ -257,7 +253,7 @@ public class ParserWorkflowManager implements IServer {
         parsingTask.setLocalDataDir("/tmp");
         try {
             parsingTask.setGroupResourceProfileId(
-                    registryClient.getProcess(completionMessage.getProcessId()).getGroupResourceProfileId());
+                    registryHandler.getProcess(completionMessage.getProcessId()).getGroupResourceProfileId());
         } catch (TException e) {
             logger.error("Failed while fetching process model for process id  " + completionMessage.getProcessId());
             throw new Exception(
@@ -285,7 +281,7 @@ public class ParserWorkflowManager implements IServer {
             if (templateInput.getApplicationOutputName() != null) {
                 String applicationOutputName = templateInput.getApplicationOutputName();
                 try {
-                    ExperimentModel experiment = registryClient.getExperiment(completionMessage.getExperimentId());
+                    ExperimentModel experiment = registryHandler.getExperiment(completionMessage.getExperimentId());
                     Optional<OutputDataObjectType> expOutputData;
                     if (applicationOutputName.contains("*")) {
                         expOutputData = experiment.getExperimentOutputs().stream()
@@ -359,8 +355,7 @@ public class ParserWorkflowManager implements IServer {
     }
 
     private String processExpression(String expression, ProcessCompletionMessage completionMessage) throws Exception {
-        RegistryService.Client registryClient =
-                wfManager.getRegistryClientPool().getResource();
+        RegistryService.Iface registryHandler = wfManager.getRegistryHandler();
 
         try {
             if (expression != null) {
@@ -373,20 +368,18 @@ public class ParserWorkflowManager implements IServer {
                         case "{{gateway}}":
                             return completionMessage.getGatewayId();
                         case "{{user}}":
-                            return registryClient
+                            return registryHandler
                                     .getProcess(completionMessage.getProcessId())
                                     .getUserName();
                         case "{{project}}":
-                            return registryClient
+                            return registryHandler
                                     .getExperiment(completionMessage.getExperimentId())
                                     .getProjectId();
                     }
                 }
             }
-            wfManager.getRegistryClientPool().returnResource(registryClient);
             return expression;
         } catch (Exception e) {
-            wfManager.getRegistryClientPool().returnBrokenResource(registryClient);
             throw new Exception("Failed to resolve expression " + expression, e);
         }
     }
@@ -397,13 +390,13 @@ public class ParserWorkflowManager implements IServer {
             DataParsingTask parentTask,
             Map<String, Set<ParserConnector>> parentToChild,
             ProcessCompletionMessage completionMessage,
-            RegistryService.Client registryClient)
+            RegistryService.Iface registryHandler)
             throws Exception {
         if (parentToChild.containsKey(parentParserInfo.getId())) {
 
             for (ParserConnector connector : parentToChild.get(parentParserInfo.getId())) {
                 Parser childParserInfo =
-                        registryClient.getParser(connector.getChildParserId(), completionMessage.getGatewayId());
+                        registryHandler.getParser(connector.getChildParserId(), completionMessage.getGatewayId());
                 DataParsingTask parsingTask = new DataParsingTask();
                 parsingTask.setTaskId(wfManager.normalizeTaskId(completionMessage.getExperimentId() + "-"
                         + childParserInfo.getId() + "-" + UUID.randomUUID().toString()));
@@ -411,7 +404,7 @@ public class ParserWorkflowManager implements IServer {
                 parsingTask.setParserId(childParserInfo.getId());
                 parsingTask.setLocalDataDir("/tmp");
                 try {
-                    parsingTask.setGroupResourceProfileId(registryClient
+                    parsingTask.setGroupResourceProfileId(registryHandler
                             .getProcess(completionMessage.getProcessId())
                             .getGroupResourceProfileId());
                 } catch (TException e) {
@@ -462,7 +455,7 @@ public class ParserWorkflowManager implements IServer {
                 allTasks.add(parsingTask);
 
                 createParserDagRecursively(
-                        allTasks, childParserInfo, parsingTask, parentToChild, completionMessage, registryClient);
+                        allTasks, childParserInfo, parsingTask, parentToChild, completionMessage, registryHandler);
             }
         }
     }
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 aa208bcdd2..8fbdd24c95 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
@@ -108,8 +108,7 @@ public class PostWorkflowManager implements IServer {
             return false;
         }
 
-        RegistryService.Client registryClient =
-                wfManager.getRegistryClientPool().getResource();
+        RegistryService.Iface registryHandler = wfManager.getRegistryHandler();
 
         var jobId = jobStatusResult.getJobId();
         var jobName = jobStatusResult.getJobName();
@@ -118,7 +117,7 @@ public class PostWorkflowManager implements IServer {
         logger.info("processing JobStatusUpdate<{}> from {}: {}", jobId, publisherId, jobStatusResult);
 
         try {
-            List<JobModel> jobs = registryClient.getJobs("jobId", jobId);
+            List<JobModel> jobs = registryHandler.getJobs("jobId", jobId);
             logger.info("Found {} jobs in registry with id={}", jobs.size(), jobId);
             if (!jobs.isEmpty()) {
                 jobs = jobs.stream()
@@ -128,16 +127,14 @@ public class PostWorkflowManager implements IServer {
             }
             if (jobs.size() != 1) {
                 logger.error("Found {} job(s) in registry with id={} and name={}", jobs.size(), jobId, jobName);
-                wfManager.getRegistryClientPool().returnResource(registryClient);
                 return false;
             }
             JobModel jobModel = jobs.get(0);
-            ProcessModel processModel = registryClient.getProcess(jobModel.getProcessId());
-            ExperimentModel experimentModel = registryClient.getExperiment(processModel.getExperimentId());
-            ProcessStatus processStatus = registryClient.getProcessStatus(processModel.getProcessId());
+            ProcessModel processModel = registryHandler.getProcess(jobModel.getProcessId());
+            ExperimentModel experimentModel = registryHandler.getExperiment(processModel.getExperimentId());
+            ProcessStatus processStatus = registryHandler.getProcessStatus(processModel.getProcessId());
 
             var processState = processStatus.getState();
-            wfManager.getRegistryClientPool().returnResource(registryClient);
 
             if (experimentModel != null) {
                 jobModel.getJobStatuses()
@@ -205,7 +202,6 @@ public class PostWorkflowManager implements IServer {
                     jobStatusResult.getJobId(),
                     jobStatusResult.getState().name(),
                     e);
-            wfManager.getRegistryClientPool().returnBrokenResource(registryClient);
             return false;
         }
     }
@@ -213,20 +209,19 @@ public class PostWorkflowManager implements IServer {
     private void executePostWorkflow(String processId, String gateway, boolean forceRun) throws Exception {
 
         postwfCounter.inc();
-        RegistryService.Client registryClient =
-                wfManager.getRegistryClientPool().getResource();
+        RegistryService.Iface registryHandler = wfManager.getRegistryHandler();
 
         ProcessModel processModel;
         ExperimentModel experimentModel;
         HelixTaskFactory taskFactory;
         try {
-            processModel = registryClient.getProcess(processId);
+            processModel = registryHandler.getProcess(processId);
             var experimentId = processModel.getExperimentId();
             var crId = processModel.getComputeResourceId();
             var grpId = processModel.getGroupResourceProfileId();
 
-            experimentModel = registryClient.getExperiment(experimentId);
-            ResourceType resourceType = registryClient
+            experimentModel = registryHandler.getExperiment(experimentId);
+            ResourceType resourceType = registryHandler
                     .getGroupComputeResourcePreference(crId, grpId)
                     .getResourceType();
 
@@ -236,8 +231,6 @@ public class PostWorkflowManager implements IServer {
         } catch (Exception e) {
             logger.error("Failed to fetch experiment/process from registry for pid={}", processId, e);
             throw new Exception("Failed to fetch experiment/process from registry for pid=" + processId, e);
-        } finally {
-            wfManager.getRegistryClientPool().returnResource(registryClient);
         }
 
         String taskDag = processModel.getTaskDag();
@@ -414,16 +407,10 @@ public class PostWorkflowManager implements IServer {
                 jobStatus.setTimeOfStateChange(jobStatus.getTimeOfStateChange());
             }
 
-            RegistryService.Client registryClient =
-                    wfManager.getRegistryClientPool().getResource();
-
             try {
-                registryClient.addJobStatus(jobStatus, taskId, jobId);
-                wfManager.getRegistryClientPool().returnResource(registryClient);
-
+                wfManager.getRegistryHandler().addJobStatus(jobStatus, taskId, jobId);
             } catch (Exception e) {
                 logger.error("Failed to add job status " + jobId, e);
-                wfManager.getRegistryClientPool().returnBrokenResource(registryClient);
             }
 
             JobIdentifier identifier = new JobIdentifier(jobId, taskId, processId, experimentId, gateway);
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 73a31e9ffb..5dccbc63fd 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
@@ -120,17 +120,15 @@ public class PreWorkflowManager implements IServer {
     private String createAndLaunchPreWorkflow(String processId, boolean forceRun) throws Exception {
 
         prewfCounter.inc();
-        RegistryService.Client registryClient =
-                wfManager.getRegistryClientPool().getResource();
+        RegistryService.Iface registryHandler = wfManager.getRegistryHandler();
 
         ProcessModel processModel;
         ExperimentModel experimentModel;
         HelixTaskFactory taskFactory;
         try {
-            processModel = registryClient.getProcess(processId);
-            experimentModel = registryClient.getExperiment(processModel.getExperimentId());
-            wfManager.getRegistryClientPool().returnResource(registryClient);
-            ResourceType resourceType = registryClient
+            processModel = registryHandler.getProcess(processId);
+            experimentModel = registryHandler.getExperiment(processModel.getExperimentId());
+            ResourceType resourceType = registryHandler
                     .getGroupComputeResourcePreference(
                             processModel.getComputeResourceId(), processModel.getGroupResourceProfileId())
                     .getResourceType();
@@ -140,7 +138,6 @@ public class PreWorkflowManager implements IServer {
         } catch (Exception e) {
             logger.error(
                     "Failed to fetch experiment or process from registry associated with process id " + processId, e);
-            wfManager.getRegistryClientPool().returnBrokenResource(registryClient);
             throw new Exception(
                     "Failed to fetch experiment or process from registry associated with process id " + processId, e);
         }
@@ -234,21 +231,18 @@ public class PreWorkflowManager implements IServer {
 
     private String createAndLaunchCancelWorkflow(String processId, String gateway) throws Exception {
 
-        RegistryService.Client registryClient =
-                wfManager.getRegistryClientPool().getResource();
+        RegistryService.Iface registryHandler = wfManager.getRegistryHandler();
 
         ProcessModel processModel;
         GroupComputeResourcePreference gcrPref;
 
         try {
-            processModel = registryClient.getProcess(processId);
-            wfManager.getRegistryClientPool().returnResource(registryClient);
-            gcrPref = registryClient.getGroupComputeResourcePreference(
+            processModel = registryHandler.getProcess(processId);
+            gcrPref = registryHandler.getGroupComputeResourcePreference(
                     processModel.getComputeResourceId(), processModel.getGroupResourceProfileId());
 
         } catch (Exception e) {
             logger.error("Failed to fetch process from registry associated with process id " + processId, e);
-            wfManager.getRegistryClientPool().returnBrokenResource(registryClient);
             throw new Exception("Failed to fetch process from registry associated with process id " + processId, e);
         }
 
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 f7e5d14b25..e95849351c 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
@@ -30,13 +30,10 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.ExecutorService;
-import org.apache.airavata.common.config.ServerSettings;
 import org.apache.airavata.common.exception.AiravataException;
-import org.apache.airavata.common.exception.ApplicationSettingsException;
 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.execution.util.RegistryServiceClientFactory;
 import org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
 import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
 import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
@@ -66,7 +63,6 @@ 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.registry.api.RegistryService;
-import org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -138,18 +134,9 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                             ErrorModel details = new ErrorModel();
                             details.setActualErrorMessage(errorMsg);
                             details.setCreationTime(Calendar.getInstance().getTimeInMillis());
-                            final RegistryService.Client registryClient = getRegistryServiceClient();
-                            try {
-                                registryClient.addErrors(
-                                        OrchestratorConstants.EXPERIMENT_ERROR, details, experiment.getExperimentId());
-                            } finally {
-                                if (registryClient != null) {
-                                    ThriftUtils.close(registryClient);
-                                }
-                            }
-                        } catch (RegistryServiceException e) {
-                            logger.error("Error while saving error details to registry", e);
-                            throw new RuntimeException("Error while saving error details to registry", e);
+                            final RegistryService.Iface registryClient = getRegistryHandler();
+                            registryClient.addErrors(
+                                    OrchestratorConstants.EXPERIMENT_ERROR, details, experiment.getExperimentId());
                         } catch (TException e) {
                             throw new RuntimeException("Error while saving error details to registry", e);
                         }
@@ -214,18 +201,9 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                             ErrorModel details = new ErrorModel();
                             details.setActualErrorMessage(errorMsg);
                             details.setCreationTime(Calendar.getInstance().getTimeInMillis());
-                            final RegistryService.Client registryClient = getRegistryServiceClient();
-                            try {
-                                registryClient.addErrors(
-                                        OrchestratorConstants.PROCESS_ERROR, details, processModel.getProcessId());
-                            } finally {
-                                if (registryClient != null) {
-                                    ThriftUtils.close(registryClient);
-                                }
-                            }
-                        } catch (RegistryServiceException e) {
-                            logger.error("Error while saving error details to registry", e);
-                            throw new RuntimeException("Error while saving error details to registry", e);
+                            final RegistryService.Iface registryClient = getRegistryHandler();
+                            registryClient.addErrors(
+                                    OrchestratorConstants.PROCESS_ERROR, details, processModel.getProcessId());
                         } catch (TException e) {
                             throw new RuntimeException("Error while saving error details to registry", e);
                         }
@@ -251,7 +229,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
 
     public void cancelExperiment(ExperimentModel experiment, String tokenId) throws OrchestratorException {
         logger.info("Terminating experiment " + experiment.getExperimentId());
-        RegistryService.Client registryServiceClient = getRegistryServiceClient();
+        RegistryService.Iface registryServiceClient = getRegistryHandler();
 
         try {
             List<String> processIds = registryServiceClient.getProcessIds(experiment.getExperimentId());
@@ -289,7 +267,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
     public void initialize() throws OrchestratorException {}
 
     public List<ProcessModel> createProcesses(String experimentId, String gatewayId) throws OrchestratorException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
+        final RegistryService.Iface registryClient = getRegistryHandler();
         try {
             ExperimentModel experimentModel = registryClient.getExperiment(experimentId);
             List<ProcessModel> processModels = registryClient.getProcessList(experimentId);
@@ -303,15 +281,11 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
             return processModels;
         } catch (Exception e) {
             throw new OrchestratorException("Error during creating process", e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
     public String createAndSaveTasks(String gatewayId, ProcessModel processModel) throws OrchestratorException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
+        final RegistryService.Iface registryClient = getRegistryHandler();
         try {
             GroupComputeResourcePreference preference =
                     OrchestratorUtils.getGroupComputeResourcePreference(processModel);
@@ -349,16 +323,12 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
             return getTaskDag(taskIdList);
         } catch (Exception e) {
             throw new OrchestratorException("Error during creating process", e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
     public String createAndSaveIntermediateOutputFetchingTasks(
             String gatewayId, ProcessModel processModel, ProcessModel parentProcess) throws OrchestratorException {
-        final RegistryService.Client registryClient = getRegistryServiceClient();
+        final RegistryService.Iface registryClient = getRegistryHandler();
         try {
             GroupComputeResourcePreference preference =
                     OrchestratorUtils.getGroupComputeResourcePreference(processModel);
@@ -370,10 +340,6 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
             return getTaskDag(taskIdList);
         } catch (Exception e) {
             throw new OrchestratorException("Error during creating process", e);
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
     }
 
@@ -390,7 +356,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
     }
 
     private List<String> createAndSaveEnvSetupTask(
-            RegistryService.Client registryClient,
+            RegistryService.Iface registryClient,
             String gatewayId,
             ProcessModel processModel,
             ResourceType resourceType)
@@ -448,7 +414,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                                     processInput.getName());
                             break;
                         }
-                        final RegistryService.Client registryClient = getRegistryServiceClient();
+                        final RegistryService.Iface registryClient = getRegistryHandler();
                         try {
                             TaskModel inputDataStagingTask = getInputDataStagingTask(
                                     registryClient, processModel, processInput, gatewayId, resourceType);
@@ -457,10 +423,6 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
                             dataStagingTaskIds.add(inputDataStagingTask.getTaskId());
                         } catch (Exception e) {
                             throw new AiravataException("Error while serializing data staging sub task model", e);
-                        } finally {
-                            if (registryClient != null) {
-                                ThriftUtils.close(registryClient);
-                            }
                         }
                         break;
                     default:
@@ -476,70 +438,64 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
             ProcessModel processModel, String gatewayId, ResourceType resourceType)
             throws AiravataException, TException, OrchestratorException {
 
-        final RegistryService.Client registryClient = getRegistryServiceClient();
+        final RegistryService.Iface registryClient = getRegistryHandler();
         List<String> dataStagingTaskIds = new ArrayList<>();
-        try {
-            List<OutputDataObjectType> processOutputs = processModel.getProcessOutputs();
-            String appName = OrchestratorUtils.getApplicationInterfaceName(processModel);
-            if (processOutputs != null) {
-                for (OutputDataObjectType processOutput : processOutputs) {
-                    DataType type = processOutput.getType();
-                    switch (type) {
-                        case STDOUT:
-                            if (null == processOutput.getValue()
-                                    || processOutput.getValue().trim().isEmpty()) {
-                                processOutput.setValue(appName + ".stdout");
-                            }
-                            createOutputDataSatagingTasks(
-                                    registryClient,
-                                    processModel,
-                                    gatewayId,
-                                    dataStagingTaskIds,
-                                    processOutput,
-                                    resourceType);
-                            break;
-                        case STDERR:
-                            if (null == processOutput.getValue()
-                                    || processOutput.getValue().trim().isEmpty()) {
-                                processOutput.setValue(appName + ".stderr");
-                            }
-                            createOutputDataSatagingTasks(
-                                    registryClient,
-                                    processModel,
-                                    gatewayId,
-                                    dataStagingTaskIds,
-                                    processOutput,
-                                    resourceType);
-                            break;
-                        case URI:
-                        case URI_COLLECTION:
-                            createOutputDataSatagingTasks(
-                                    registryClient,
-                                    processModel,
-                                    gatewayId,
-                                    dataStagingTaskIds,
-                                    processOutput,
-                                    resourceType);
-                            break;
-                        default:
-                            // nothing to do
-                            break;
-                    }
+        List<OutputDataObjectType> processOutputs = processModel.getProcessOutputs();
+        String appName = OrchestratorUtils.getApplicationInterfaceName(processModel);
+        if (processOutputs != null) {
+            for (OutputDataObjectType processOutput : processOutputs) {
+                DataType type = processOutput.getType();
+                switch (type) {
+                    case STDOUT:
+                        if (null == processOutput.getValue()
+                                || processOutput.getValue().trim().isEmpty()) {
+                            processOutput.setValue(appName + ".stdout");
+                        }
+                        createOutputDataSatagingTasks(
+                                registryClient,
+                                processModel,
+                                gatewayId,
+                                dataStagingTaskIds,
+                                processOutput,
+                                resourceType);
+                        break;
+                    case STDERR:
+                        if (null == processOutput.getValue()
+                                || processOutput.getValue().trim().isEmpty()) {
+                            processOutput.setValue(appName + ".stderr");
+                        }
+                        createOutputDataSatagingTasks(
+                                registryClient,
+                                processModel,
+                                gatewayId,
+                                dataStagingTaskIds,
+                                processOutput,
+                                resourceType);
+                        break;
+                    case URI:
+                    case URI_COLLECTION:
+                        createOutputDataSatagingTasks(
+                                registryClient,
+                                processModel,
+                                gatewayId,
+                                dataStagingTaskIds,
+                                processOutput,
+                                resourceType);
+                        break;
+                    default:
+                        // nothing to do
+                        break;
                 }
             }
+        }
 
-            try {
-                if (isArchive(registryClient, processModel)) {
-                    createArchiveDataStatgingTask(
-                            registryClient, processModel, gatewayId, dataStagingTaskIds, resourceType);
-                }
-            } catch (Exception e) {
-                throw new AiravataException("Error! Application interface retrieval failed", e);
-            }
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
+        try {
+            if (isArchive(registryClient, processModel)) {
+                createArchiveDataStatgingTask(
+                        registryClient, processModel, gatewayId, dataStagingTaskIds, resourceType);
             }
+        } catch (Exception e) {
+            throw new AiravataException("Error! Application interface retrieval failed", e);
         }
         return dataStagingTaskIds;
     }
@@ -548,77 +504,70 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
             ProcessModel processModel, String gatewayId, ProcessModel parentProcess, ResourceType resourceType)
             throws AiravataException, TException, OrchestratorException {
 
-        final RegistryService.Client registryClient = getRegistryServiceClient();
+        final RegistryService.Iface registryClient = getRegistryHandler();
         List<String> dataStagingTaskIds = new ArrayList<>();
-        try {
-            List<OutputDataObjectType> processOutputs = processModel.getProcessOutputs();
-            String appName = OrchestratorUtils.getApplicationInterfaceName(processModel);
-            if (processOutputs != null) {
-                for (OutputDataObjectType processOutput : processOutputs) {
-                    DataType type = processOutput.getType();
-                    switch (type) {
-                        case STDOUT:
-                            if (null == processOutput.getValue()
-                                    || processOutput.getValue().trim().isEmpty()) {
-                                processOutput.setValue(appName + ".stdout");
-                            }
-                            createIntermediateOutputDataStagingTasks(
-                                    registryClient,
-                                    processModel,
-                                    gatewayId,
-                                    parentProcess,
-                                    dataStagingTaskIds,
-                                    processOutput,
-                                    resourceType);
-                            break;
-                        case STDERR:
-                            if (null == processOutput.getValue()
-                                    || processOutput.getValue().trim().isEmpty()) {
-                                processOutput.setValue(appName + ".stderr");
-                            }
-                            createIntermediateOutputDataStagingTasks(
-                                    registryClient,
-                                    processModel,
-                                    gatewayId,
-                                    parentProcess,
-                                    dataStagingTaskIds,
-                                    processOutput,
-                                    resourceType);
-                            break;
-                        case URI:
-                        case URI_COLLECTION:
-                            createIntermediateOutputDataStagingTasks(
-                                    registryClient,
-                                    processModel,
-                                    gatewayId,
-                                    parentProcess,
-                                    dataStagingTaskIds,
-                                    processOutput,
-                                    resourceType);
-                            break;
-                        default:
-                            // nothing to do
-                            break;
-                    }
+        List<OutputDataObjectType> processOutputs = processModel.getProcessOutputs();
+        String appName = OrchestratorUtils.getApplicationInterfaceName(processModel);
+        if (processOutputs != null) {
+            for (OutputDataObjectType processOutput : processOutputs) {
+                DataType type = processOutput.getType();
+                switch (type) {
+                    case STDOUT:
+                        if (null == processOutput.getValue()
+                                || processOutput.getValue().trim().isEmpty()) {
+                            processOutput.setValue(appName + ".stdout");
+                        }
+                        createIntermediateOutputDataStagingTasks(
+                                registryClient,
+                                processModel,
+                                gatewayId,
+                                parentProcess,
+                                dataStagingTaskIds,
+                                processOutput,
+                                resourceType);
+                        break;
+                    case STDERR:
+                        if (null == processOutput.getValue()
+                                || processOutput.getValue().trim().isEmpty()) {
+                            processOutput.setValue(appName + ".stderr");
+                        }
+                        createIntermediateOutputDataStagingTasks(
+                                registryClient,
+                                processModel,
+                                gatewayId,
+                                parentProcess,
+                                dataStagingTaskIds,
+                                processOutput,
+                                resourceType);
+                        break;
+                    case URI:
+                    case URI_COLLECTION:
+                        createIntermediateOutputDataStagingTasks(
+                                registryClient,
+                                processModel,
+                                gatewayId,
+                                parentProcess,
+                                dataStagingTaskIds,
+                                processOutput,
+                                resourceType);
+                        break;
+                    default:
+                        // nothing to do
+                        break;
                 }
             }
-
-        } finally {
-            if (registryClient != null) {
-                ThriftUtils.close(registryClient);
-            }
         }
         return dataStagingTaskIds;
     }
 
-    private boolean isArchive(RegistryService.Client registryClient, ProcessModel processModel) throws TException {
+    private boolean isArchive(RegistryService.Iface registryClient, ProcessModel processModel) throws TException {
         ApplicationInterfaceDescription appInterface =
                 registryClient.getApplicationInterface(processModel.getApplicationInterfaceId());
         return appInterface.isArchiveWorkingDirectory();
     }
 
     private void createArchiveDataStatgingTask(
-            RegistryService.Client registryClient,
+            RegistryService.Iface registryClient,
             ProcessModel processModel,
             String gatewayId,
             List<String> dataStagingTaskIds,
@@ -636,7 +585,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
     }
 
     private void createOutputDataSatagingTasks(
-            RegistryService.Client registryClient,
+            RegistryService.Iface registryClient,
             ProcessModel processModel,
             String gatewayId,
             List<String> dataStagingTaskIds,
@@ -655,7 +604,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
     }
 
     private void createIntermediateOutputDataStagingTasks(
-            RegistryService.Client registryClient,
+            RegistryService.Iface registryClient,
             ProcessModel processModel,
             String gatewayId,
             ProcessModel parentProcess,
@@ -676,7 +625,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
     }
 
     private List<String> createAndSaveSubmissionTasks(
-            RegistryService.Client registryClient,
+            RegistryService.Iface registryClient,
             JobSubmissionInterface jobSubmissionInterface,
             ProcessModel processModel,
             int wallTime)
@@ -766,7 +715,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
     }
 
     private TaskModel getInputDataStagingTask(
-            RegistryService.Client registryClient,
+            RegistryService.Iface registryClient,
             ProcessModel processModel,
             InputDataObjectType processInput,
             String gatewayId,
@@ -826,7 +775,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
     }
 
     private TaskModel getOutputDataStagingTask(
-            RegistryService.Client registryClient,
+            RegistryService.Iface registryClient,
             ProcessModel processModel,
             OutputDataObjectType processOutput,
             String gatewayId,
@@ -900,13 +849,7 @@ public class SimpleOrchestratorImpl extends AbstractOrchestrator {
         }
     }
 
-    private RegistryService.Client getRegistryServiceClient() {
-        try {
-            final int serverPort = Integer.parseInt(ServerSettings.getRegistryServerPort());
-            final String serverHost = ServerSettings.getRegistryServerHost();
-            return RegistryServiceClientFactory.createRegistryClient(serverHost, serverPort);
-        } catch (RegistryServiceException | ApplicationSettingsException e) {
-            throw new RuntimeException("Unable to create registry client...", e);
-        }
+    private RegistryService.Iface getRegistryHandler() {
+        return org.apache.airavata.execution.scheduler.Utils.getRegistryHandler();
     }
 }
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 7d081c08f3..99dc6ca615 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
@@ -61,7 +61,6 @@ 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.security.AuthzToken;
 import org.apache.airavata.model.status.ProcessState;
 import org.apache.airavata.model.status.ProcessStatus;
 import org.apache.airavata.model.status.TaskState;
@@ -69,9 +68,7 @@ import org.apache.airavata.model.status.TaskStatus;
 import org.apache.airavata.model.task.TaskModel;
 import org.apache.airavata.model.user.UserProfile;
 import org.apache.airavata.registry.api.RegistryService;
-import org.apache.airavata.security.service.AiravataSecurityManager;
-import org.apache.airavata.security.service.SecurityManagerFactory;
-import org.apache.airavata.service.profile.user.cpi.UserProfileService;
+import org.apache.airavata.security.profile.user.core.repositories.UserProfileRepository;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -85,8 +82,8 @@ public class TaskContext {
     private static final Logger logger = LoggerFactory.getLogger(TaskContext.class);
 
     private Publisher statusPublisher;
-    private RegistryService.Client registryClient;
-    private UserProfileService.Client profileClient;
+    private RegistryService.Iface registryClient;
+    private UserProfileRepository userProfileRepository;
 
     private String processId;
     private String gatewayId;
@@ -829,30 +826,32 @@ public class TaskContext {
         }
     }
 
-    public void setRegistryClient(RegistryService.Client registryClient) {
+    public void setRegistryClient(RegistryService.Iface registryClient) {
         this.registryClient = registryClient;
     }
 
-    public RegistryService.Client getRegistryClient() {
+    public RegistryService.Iface getRegistryClient() {
         return registryClient;
     }
 
-    public UserProfileService.Client getProfileClient() {
-        return profileClient;
+    public UserProfileRepository getUserProfileRepository() {
+        return userProfileRepository;
     }
 
-    public void setProfileClient(UserProfileService.Client profileClient) {
-        this.profileClient = profileClient;
+    public void setUserProfileRepository(UserProfileRepository userProfileRepository) {
+        this.userProfileRepository = userProfileRepository;
     }
 
     public UserProfile getUserProfile() throws TaskOnFailException {
 
         if (this.userProfile == null) {
             try {
-                AiravataSecurityManager securityManager = SecurityManagerFactory.getSecurityManager();
-                AuthzToken authzToken = securityManager.getUserManagementServiceAccountAuthzToken(getGatewayId());
-                this.userProfile = getProfileClient()
-                        .getUserProfileById(authzToken, getProcessModel().getUserName(), getGatewayId());
+                this.userProfile = getUserProfileRepository()
+                        .getUserProfileByIdAndGateWay(getProcessModel().getUserName(), getGatewayId());
+                if (this.userProfile == null) {
+                    throw new Exception("User profile not found for user "
+                            + getProcessModel().getUserName() + " in gateway " + getGatewayId());
+                }
             } catch (Exception e) {
                 logger.error("Failed to fetch the user profile for user id {}", processModel.getUserName(), e);
                 throw new TaskOnFailException(
@@ -1005,8 +1004,8 @@ public class TaskContext {
         private final String processId;
         private final String gatewayId;
         private final String taskId;
-        private RegistryService.Client registryClient;
-        private UserProfileService.Client profileClient;
+        private RegistryService.Iface registryClient;
+        private UserProfileRepository userProfileRepository;
         private ProcessModel processModel;
         private ExperimentModel experimentModel;
 
@@ -1030,13 +1029,13 @@ public class TaskContext {
             return this;
         }
 
-        public TaskContextBuilder setRegistryClient(RegistryService.Client registryClient) {
+        public TaskContextBuilder setRegistryClient(RegistryService.Iface registryClient) {
             this.registryClient = registryClient;
             return this;
         }
 
-        public TaskContextBuilder setProfileClient(UserProfileService.Client profileClient) {
-            this.profileClient = profileClient;
+        public TaskContextBuilder setUserProfileRepository(UserProfileRepository userProfileRepository) {
+            this.userProfileRepository = userProfileRepository;
             return this;
         }
 
@@ -1053,7 +1052,7 @@ public class TaskContext {
             ctx.setRegistryClient(registryClient);
             ctx.setProcessModel(processModel);
             ctx.setExperimentModel(experimentModel);
-            ctx.setProfileClient(profileClient);
+            ctx.setUserProfileRepository(userProfileRepository);
             return ctx;
         }
 
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 3135c4e8f8..76488a228b 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
@@ -19,7 +19,6 @@
 */
 package org.apache.airavata.execution.orchestrator;
 
-import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.List;
@@ -27,7 +26,6 @@ import org.apache.airavata.common.config.ServerSettings;
 import org.apache.airavata.common.exception.AiravataException;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
 import org.apache.airavata.common.util.AiravataUtils;
-import org.apache.airavata.common.util.ThriftClientPool;
 import org.apache.airavata.messaging.service.MessageContext;
 import org.apache.airavata.messaging.service.MessagingFactory;
 import org.apache.airavata.messaging.service.Publisher;
@@ -39,7 +37,6 @@ 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.registry.api.RegistryService;
-import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import org.apache.helix.manager.zk.ZKHelixAdmin;
 import org.apache.helix.zookeeper.api.client.RealmAwareZkClient.RealmMode;
 import org.slf4j.Logger;
@@ -51,7 +48,7 @@ public class WorkflowManager {
 
     private Publisher statusPublisher;
     private List<WorkflowOperator> workflowOperators = new ArrayList<>();
-    private ThriftClientPool<RegistryService.Client> registryClientPool;
+    private RegistryService.Iface registryHandler;
     private String workflowManagerName;
     private ZKHelixAdmin zkHelixAdmin;
     private boolean loadBalanceClusters;
@@ -64,7 +61,7 @@ public class WorkflowManager {
     }
 
     public void initComponents() throws Exception {
-        initRegistryClientPool();
+        initRegistryHandler();
         initHelixAdmin();
         initWorkflowOperators();
         initStatusPublisher();
@@ -101,25 +98,8 @@ public class WorkflowManager {
                 .build();
     }
 
-    private void initRegistryClientPool() throws ApplicationSettingsException {
-
-        GenericObjectPoolConfig<RegistryService.Client> poolConfig = new GenericObjectPoolConfig<>();
-        poolConfig.setMaxTotal(100);
-        poolConfig.setMinIdle(5);
-        poolConfig.setBlockWhenExhausted(true);
-        poolConfig.setTestOnBorrow(true);
-        poolConfig.setTestWhileIdle(true);
-        // must set timeBetweenEvictionRunsMillis since eviction doesn't run unless that is positive
-        poolConfig.setTimeBetweenEvictionRuns(Duration.ofMinutes(5));
-        poolConfig.setNumTestsPerEvictionRun(10);
-        poolConfig.setMaxWait(Duration.ofSeconds(3));
-
-        this.registryClientPool = new ThriftClientPool<>(
-                RegistryService.Client::new,
-                poolConfig,
-                ServerSettings.getRegistryServerHost(),
-                Integer.parseInt(ServerSettings.getRegistryServerPort()),
-                "RegistryService");
+    private void initRegistryHandler() {
+        this.registryHandler = org.apache.airavata.execution.scheduler.Utils.getRegistryHandler();
     }
 
     public Publisher getStatusPublisher() {
@@ -134,8 +114,8 @@ public class WorkflowManager {
         return workflowOperators.get(currentOperator);
     }
 
-    public ThriftClientPool<RegistryService.Client> getRegistryClientPool() {
-        return registryClientPool;
+    public RegistryService.Iface getRegistryHandler() {
+        return registryHandler;
     }
 
     public void publishProcessStatus(String processId, String experimentId, String gatewayId, ProcessState state)
@@ -145,15 +125,10 @@ public class WorkflowManager {
         status.setState(state);
         status.setTimeOfStateChange(Calendar.getInstance().getTimeInMillis());
 
-        RegistryService.Client registryClient = getRegistryClientPool().getResource();
-
         try {
-            registryClient.updateProcessStatus(status, processId);
-            getRegistryClientPool().returnResource(registryClient);
-
+            registryHandler.updateProcessStatus(status, processId);
         } catch (Exception e) {
             logger.error("Failed to update process status " + processId, e);
-            getRegistryClientPool().returnBrokenResource(registryClient);
         }
 
         ProcessIdentifier identifier = new ProcessIdentifier(processId, experimentId, gatewayId);
@@ -172,22 +147,18 @@ public class WorkflowManager {
     }
 
     public void registerWorkflowForProcess(String processId, String workflowName, String workflowType) {
-        RegistryService.Client registryClient = getRegistryClientPool().getResource();
         try {
             ProcessWorkflow processWorkflow = new ProcessWorkflow();
             processWorkflow.setProcessId(processId);
             processWorkflow.setWorkflowId(workflowName);
             processWorkflow.setType(workflowType);
             processWorkflow.setCreationTime(System.currentTimeMillis());
-            registryClient.addProcessWorkflow(processWorkflow);
-            getRegistryClientPool().returnResource(registryClient);
-
+            registryHandler.addProcessWorkflow(processWorkflow);
         } catch (Exception e) {
             logger.error(
                     "Failed to save workflow " + workflowName + " of process " + processId
                             + ". This will affect cancellation tasks",
                     e);
-            getRegistryClientPool().returnBrokenResource(registryClient);
         }
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExpCatAbstractRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExpCatAbstractRepository.java
deleted file mode 100644
index b1643d97f3..0000000000
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ExpCatAbstractRepository.java
+++ /dev/null
@@ -1,36 +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.execution.repository;
-
-import jakarta.persistence.EntityManager;
-import org.apache.airavata.execution.util.AbstractRepository;
-import org.apache.airavata.execution.util.ExpCatalogJPAUtils;
-
-public class ExpCatAbstractRepository<T, E, Id> extends AbstractRepository<T, E, Id> {
-
-    public ExpCatAbstractRepository(Class<T> thriftGenericClass, Class<E> dbEntityGenericClass) {
-        super(thriftGenericClass, dbEntityGenericClass);
-    }
-
-    @Override
-    protected EntityManager getEntityManager() {
-        return ExpCatalogJPAUtils.getEntityManager();
-    }
-}
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 3b1dd894b2..285e1da414 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
@@ -19,12 +19,12 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.util.List;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.ExperimentErrorEntity;
 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.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.commons.ErrorModel;
 import org.apache.airavata.model.experiment.ExperimentModel;
@@ -32,16 +32,25 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ExperimentErrorRepository
-        extends ExpCatAbstractRepository<ErrorModel, ExperimentErrorEntity, ExperimentErrorPK> {
+        extends AbstractRepository<ErrorModel, ExperimentErrorEntity, ExperimentErrorPK> {
     private static final Logger logger = LoggerFactory.getLogger(ExperimentErrorRepository.class);
 
     public ExperimentErrorRepository() {
         super(ErrorModel.class, ExperimentErrorEntity.class);
     }
 
+    @Override
+    protected ErrorModel toModel(ExperimentErrorEntity entity) {
+        return ExecutionMapper.INSTANCE.experimentErrorToModel(entity);
+    }
+
+    @Override
+    protected ExperimentErrorEntity toEntity(ErrorModel model) {
+        return ExecutionMapper.INSTANCE.experimentErrorToEntity(model);
+    }
+
     protected String saveExperimentError(ErrorModel error, String experimentId) throws RegistryException {
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        ExperimentErrorEntity experimentErrorEntity = mapper.map(error, ExperimentErrorEntity.class);
+        ExperimentErrorEntity experimentErrorEntity = ExecutionMapper.INSTANCE.experimentErrorToEntity(error);
 
         if (experimentErrorEntity.getExperimentId() == null) {
             logger.debug("Setting the ExperimentErrorEntity's ExperimentId");
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 3c46792c25..d5d213030f 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
@@ -19,11 +19,11 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.util.List;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.ExperimentInputEntity;
 import org.apache.airavata.execution.model.ExperimentInputPK;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
+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;
@@ -31,19 +31,28 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ExperimentInputRepository
-        extends ExpCatAbstractRepository<InputDataObjectType, ExperimentInputEntity, ExperimentInputPK> {
+        extends AbstractRepository<InputDataObjectType, ExperimentInputEntity, ExperimentInputPK> {
     private static final Logger logger = LoggerFactory.getLogger(ExperimentInputRepository.class);
 
     public ExperimentInputRepository() {
         super(InputDataObjectType.class, ExperimentInputEntity.class);
     }
 
+    @Override
+    protected InputDataObjectType toModel(ExperimentInputEntity entity) {
+        return ExecutionMapper.INSTANCE.experimentInputToModel(entity);
+    }
+
+    @Override
+    protected ExperimentInputEntity toEntity(InputDataObjectType model) {
+        return ExecutionMapper.INSTANCE.experimentInputToEntity(model);
+    }
+
     protected void saveExperimentInput(List<InputDataObjectType> experimentInputs, String experimentId)
             throws RegistryException {
 
         for (InputDataObjectType input : experimentInputs) {
-            Mapper mapper = ObjectMapperSingleton.getInstance();
-            ExperimentInputEntity experimentInputEntity = mapper.map(input, ExperimentInputEntity.class);
+            ExperimentInputEntity experimentInputEntity = ExecutionMapper.INSTANCE.experimentInputToEntity(input);
 
             if (experimentInputEntity.getExperimentId() == null) {
                 logger.debug("Setting the ExperimentInputEntity's ExperimentId");
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 fde0a6904c..5c9f6b7568 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
@@ -19,11 +19,11 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.util.List;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.ExperimentOutputEntity;
 import org.apache.airavata.execution.model.ExperimentOutputPK;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
+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;
@@ -31,19 +31,28 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ExperimentOutputRepository
-        extends ExpCatAbstractRepository<OutputDataObjectType, ExperimentOutputEntity, ExperimentOutputPK> {
+        extends AbstractRepository<OutputDataObjectType, ExperimentOutputEntity, ExperimentOutputPK> {
     private static final Logger logger = LoggerFactory.getLogger(ExperimentOutputRepository.class);
 
     public ExperimentOutputRepository() {
         super(OutputDataObjectType.class, ExperimentOutputEntity.class);
     }
 
+    @Override
+    protected OutputDataObjectType toModel(ExperimentOutputEntity entity) {
+        return ExecutionMapper.INSTANCE.experimentOutputToModel(entity);
+    }
+
+    @Override
+    protected ExperimentOutputEntity toEntity(OutputDataObjectType model) {
+        return ExecutionMapper.INSTANCE.experimentOutputToEntity(model);
+    }
+
     protected void saveExperimentOutput(List<OutputDataObjectType> experimentOutputs, String experimentId)
             throws RegistryException {
 
         for (OutputDataObjectType output : experimentOutputs) {
-            Mapper mapper = ObjectMapperSingleton.getInstance();
-            ExperimentOutputEntity experimentOutputEntity = mapper.map(output, ExperimentOutputEntity.class);
+            ExperimentOutputEntity experimentOutputEntity = ExecutionMapper.INSTANCE.experimentOutputToEntity(output);
 
             if (experimentOutputEntity.getExperimentId() == null) {
                 logger.debug("Setting the ExperimentOutputEntity's ExperimentId");
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 ce9b78c3d8..c3468c4c7c 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
@@ -19,15 +19,15 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.airavata.common.util.AiravataUtils;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.ComputationalResourceSchedulingEntity;
 import org.apache.airavata.execution.model.ExperimentEntity;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.execution.util.cpi.ResultOrderType;
@@ -38,13 +38,23 @@ import org.apache.airavata.model.status.ExperimentStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ExperimentRepository extends ExpCatAbstractRepository<ExperimentModel, ExperimentEntity, String> {
+public class ExperimentRepository extends AbstractRepository<ExperimentModel, ExperimentEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(ExperimentRepository.class);
 
     public ExperimentRepository() {
         super(ExperimentModel.class, ExperimentEntity.class);
     }
 
+    @Override
+    protected ExperimentModel toModel(ExperimentEntity entity) {
+        return ExecutionMapper.INSTANCE.experimentToModel(entity);
+    }
+
+    @Override
+    protected ExperimentEntity toEntity(ExperimentModel model) {
+        return ExecutionMapper.INSTANCE.experimentToEntity(model);
+    }
+
     protected String saveExperimentModelData(ExperimentModel experimentModel) throws RegistryException {
         ExperimentEntity experimentEntity = saveExperiment(experimentModel);
         return experimentEntity.getExperimentId();
@@ -71,9 +81,7 @@ public class ExperimentRepository extends ExpCatAbstractRepository<ExperimentMod
             logger.debug("Populating creation time if it doesn't already exist");
             experimentModel.setCreationTime(System.currentTimeMillis());
         }
-
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        ExperimentEntity experimentEntity = mapper.map(experimentModel, ExperimentEntity.class);
+        ExperimentEntity experimentEntity = ExecutionMapper.INSTANCE.experimentToEntity(experimentModel);
 
         if (experimentEntity.getUserConfigurationData() != null) {
             logger.debug("Populating the Primary Key of UserConfigurationData object for the Experiment");
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 887e039c5d..9566969d35 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
@@ -19,14 +19,14 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.sql.Timestamp;
 import java.util.List;
 import org.apache.airavata.common.util.AiravataUtils;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.ExperimentStatusEntity;
 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.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.experiment.ExperimentModel;
 import org.apache.airavata.model.status.ExperimentState;
@@ -35,13 +35,23 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ExperimentStatusRepository
-        extends ExpCatAbstractRepository<ExperimentStatus, ExperimentStatusEntity, ExperimentStatusPK> {
+        extends AbstractRepository<ExperimentStatus, ExperimentStatusEntity, ExperimentStatusPK> {
     private static final Logger logger = LoggerFactory.getLogger(ExperimentStatusRepository.class);
 
     public ExperimentStatusRepository() {
         super(ExperimentStatus.class, ExperimentStatusEntity.class);
     }
 
+    @Override
+    protected ExperimentStatus toModel(ExperimentStatusEntity entity) {
+        return ExecutionMapper.INSTANCE.experimentStatusToModel(entity);
+    }
+
+    @Override
+    protected ExperimentStatusEntity toEntity(ExperimentStatus model) {
+        return ExecutionMapper.INSTANCE.experimentStatusToEntity(model);
+    }
+
     protected String saveExperimentStatus(ExperimentStatus experimentStatus, String experimentId)
             throws RegistryException {
 
@@ -55,9 +65,8 @@ public class ExperimentStatusRepository
                 experimentStatus.setStatusId(currentExperimentStatus.getStatusId());
             }
         }
-
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        ExperimentStatusEntity experimentStatusEntity = mapper.map(experimentStatus, ExperimentStatusEntity.class);
+        ExperimentStatusEntity experimentStatusEntity =
+                ExecutionMapper.INSTANCE.experimentStatusToEntity(experimentStatus);
 
         if (experimentStatusEntity.getExperimentId() == null) {
             logger.debug("Setting the ExperimentStatusEntity's ExperimentId");
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 e7d0914a7b..659d572516 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
@@ -27,8 +27,10 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.ExperimentSummaryEntity;
 import org.apache.airavata.execution.model.JobEntity;
+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;
@@ -39,7 +41,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ExperimentSummaryRepository
-        extends ExpCatAbstractRepository<ExperimentSummaryModel, ExperimentSummaryEntity, String> {
+        extends AbstractRepository<ExperimentSummaryModel, ExperimentSummaryEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(ExperimentSummaryRepository.class);
     private static final int ACCESSIBLE_EXPERIMENT_IDS_BATCH_SIZE = 10000;
 
@@ -47,6 +49,16 @@ public class ExperimentSummaryRepository
         super(ExperimentSummaryModel.class, ExperimentSummaryEntity.class);
     }
 
+    @Override
+    protected ExperimentSummaryModel toModel(ExperimentSummaryEntity entity) {
+        return ExecutionMapper.INSTANCE.experimentSummaryToModel(entity);
+    }
+
+    @Override
+    protected ExperimentSummaryEntity toEntity(ExperimentSummaryModel model) {
+        return ExecutionMapper.INSTANCE.experimentSummaryToEntity(model);
+    }
+
     public List<ExperimentSummaryModel> searchAllAccessibleExperiments(
             List<String> accessibleExperimentIds,
             Map<String, String> filters,
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 0975465307..cd923fe828 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
@@ -19,29 +19,39 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.sql.Timestamp;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.airavata.common.config.ServerSettings;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.GatewayEntity;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.workspace.Gateway;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class GatewayRepository extends ExpCatAbstractRepository<Gateway, GatewayEntity, String> {
+public class GatewayRepository extends AbstractRepository<Gateway, GatewayEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(GatewayRepository.class);
 
     public GatewayRepository() {
         super(Gateway.class, GatewayEntity.class);
     }
 
+    @Override
+    protected Gateway toModel(GatewayEntity entity) {
+        return ExecutionMapper.INSTANCE.gatewayToModel(entity);
+    }
+
+    @Override
+    protected GatewayEntity toEntity(Gateway model) {
+        return ExecutionMapper.INSTANCE.gatewayToEntity(model);
+    }
+
     protected String saveGatewayData(Gateway gateway) throws RegistryException {
         GatewayEntity gatewayEntity = saveGateway(gateway);
         return gatewayEntity.getGatewayId();
@@ -49,8 +59,7 @@ public class GatewayRepository extends ExpCatAbstractRepository<Gateway, Gateway
 
     protected GatewayEntity saveGateway(Gateway gateway) throws RegistryException {
         String gatewayId = gateway.getGatewayId();
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        GatewayEntity gatewayEntity = mapper.map(gateway, GatewayEntity.class);
+        GatewayEntity gatewayEntity = ExecutionMapper.INSTANCE.gatewayToEntity(gateway);
 
         if (!isGatewayExist(gatewayId)) {
             logger.debug("Checking if the Gateway already exists");
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 ab89808d6e..038ac439e7 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
@@ -19,17 +19,17 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.GatewayUsageReportingCommandEntity;
 import org.apache.airavata.execution.model.GatewayUsageReportingPK;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.workspace.GatewayUsageReportingCommand;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class GatewayUsageReportingCommandRepository
-        extends ExpCatAbstractRepository<
+        extends AbstractRepository<
                 GatewayUsageReportingCommand, GatewayUsageReportingCommandEntity, GatewayUsageReportingPK> {
 
     private static final Logger logger = LoggerFactory.getLogger(GatewayRepository.class);
@@ -38,11 +38,20 @@ public class GatewayUsageReportingCommandRepository
         super(GatewayUsageReportingCommand.class, GatewayUsageReportingCommandEntity.class);
     }
 
+    @Override
+    protected GatewayUsageReportingCommand toModel(GatewayUsageReportingCommandEntity entity) {
+        return ExecutionMapper.INSTANCE.gatewayUsageReportingCommandToModel(entity);
+    }
+
+    @Override
+    protected GatewayUsageReportingCommandEntity toEntity(GatewayUsageReportingCommand model) {
+        return ExecutionMapper.INSTANCE.gatewayUsageReportingCommandToEntity(model);
+    }
+
     public void addGatewayUsageReportingCommand(GatewayUsageReportingCommand command) throws RegistryException {
         String gatewayId = command.getGatewayId();
-        Mapper mapper = ObjectMapperSingleton.getInstance();
         GatewayUsageReportingCommandEntity reportingEntity =
-                mapper.map(command, GatewayUsageReportingCommandEntity.class);
+                ExecutionMapper.INSTANCE.gatewayUsageReportingCommandToEntity(command);
         execute(entityManager -> entityManager.merge(reportingEntity));
         logger.info("Added gateway usage reporting command for gateway {} to the database", command.getGatewayId());
     }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/JobRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/JobRepository.java
index ca35bb7e33..eed2fe6b94 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/JobRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/JobRepository.java
@@ -19,17 +19,17 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.airavata.common.util.AiravataUtils;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.JobEntity;
 import org.apache.airavata.execution.model.JobPK;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.ExpCatalogUtils;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.commons.airavata_commonsConstants;
@@ -37,13 +37,23 @@ import org.apache.airavata.model.job.JobModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class JobRepository extends ExpCatAbstractRepository<JobModel, JobEntity, JobPK> {
+public class JobRepository extends AbstractRepository<JobModel, JobEntity, JobPK> {
     private static final Logger logger = LoggerFactory.getLogger(JobRepository.class);
 
     public JobRepository() {
         super(JobModel.class, JobEntity.class);
     }
 
+    @Override
+    protected JobModel toModel(JobEntity entity) {
+        return ExecutionMapper.INSTANCE.jobToModel(entity);
+    }
+
+    @Override
+    protected JobEntity toEntity(JobModel model) {
+        return ExecutionMapper.INSTANCE.jobToEntity(model);
+    }
+
     protected String saveJobModelData(JobModel jobModel, JobPK jobPK) throws RegistryException {
         JobEntity jobEntity = saveJob(jobModel, jobPK);
         return jobEntity.getJobId();
@@ -68,9 +78,7 @@ public class JobRepository extends ExpCatAbstractRepository<JobModel, JobEntity,
             logger.debug("Setting creation time to current time if does not exist");
             jobModel.setCreationTime(System.currentTimeMillis());
         }
-
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        JobEntity jobEntity = mapper.map(jobModel, JobEntity.class);
+        JobEntity jobEntity = ExecutionMapper.INSTANCE.jobToEntity(jobModel);
 
         populateParentIds(jobEntity);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/JobStatusRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/JobStatusRepository.java
index 663faf5a54..bad01ff01b 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/JobStatusRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/JobStatusRepository.java
@@ -19,14 +19,14 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.sql.Timestamp;
 import java.util.List;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.JobPK;
 import org.apache.airavata.execution.model.JobStatusEntity;
 import org.apache.airavata.execution.model.JobStatusPK;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.ExpCatalogUtils;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.job.JobModel;
@@ -35,16 +35,25 @@ import org.apache.airavata.model.status.JobStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class JobStatusRepository extends ExpCatAbstractRepository<JobStatus, JobStatusEntity, JobStatusPK> {
+public class JobStatusRepository extends AbstractRepository<JobStatus, JobStatusEntity, JobStatusPK> {
     private static final Logger logger = LoggerFactory.getLogger(JobStatusRepository.class);
 
     public JobStatusRepository() {
         super(JobStatus.class, JobStatusEntity.class);
     }
 
+    @Override
+    protected JobStatus toModel(JobStatusEntity entity) {
+        return ExecutionMapper.INSTANCE.jobStatusToModel(entity);
+    }
+
+    @Override
+    protected JobStatusEntity toEntity(JobStatus model) {
+        return ExecutionMapper.INSTANCE.jobStatusToEntity(model);
+    }
+
     protected String saveJobStatus(JobStatus jobStatus, JobPK jobPK) throws RegistryException {
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        JobStatusEntity jobStatusEntity = mapper.map(jobStatus, JobStatusEntity.class);
+        JobStatusEntity jobStatusEntity = ExecutionMapper.INSTANCE.jobStatusToEntity(jobStatus);
 
         if (jobStatusEntity.getJobId() == null) {
             logger.debug("Setting the JobStatusEntity's JobId");
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/NotificationRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/NotificationRepository.java
index c289eb6fc8..f0c89a3a73 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/NotificationRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/NotificationRepository.java
@@ -19,36 +19,45 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.sql.Timestamp;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.NotificationEntity;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.workspace.Notification;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class NotificationRepository extends ExpCatAbstractRepository<Notification, NotificationEntity, String> {
+public class NotificationRepository extends AbstractRepository<Notification, NotificationEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(NotificationRepository.class);
 
     public NotificationRepository() {
         super(Notification.class, NotificationEntity.class);
     }
 
+    @Override
+    protected Notification toModel(NotificationEntity entity) {
+        return ExecutionMapper.INSTANCE.notificationToModel(entity);
+    }
+
+    @Override
+    protected NotificationEntity toEntity(Notification model) {
+        return ExecutionMapper.INSTANCE.notificationToEntity(model);
+    }
+
     protected String saveNotificationData(Notification notification) throws RegistryException {
         NotificationEntity notificationEntity = saveNotification(notification);
         return notificationEntity.getNotificationId();
     }
 
     protected NotificationEntity saveNotification(Notification notification) throws RegistryException {
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        NotificationEntity notificationEntity = mapper.map(notification, NotificationEntity.class);
+        NotificationEntity notificationEntity = ExecutionMapper.INSTANCE.notificationToEntity(notification);
 
         if (notificationEntity.getCreationTime() != null) {
             logger.debug("Setting the Notification's creation time");
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessErrorRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessErrorRepository.java
index f07676c86d..8e29731b72 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessErrorRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessErrorRepository.java
@@ -19,28 +19,37 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.util.*;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.ProcessErrorEntity;
 import org.apache.airavata.execution.model.ProcessErrorPK;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.ExpCatalogUtils;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.commons.ErrorModel;
 import org.apache.airavata.model.process.ProcessModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ProcessErrorRepository extends ExpCatAbstractRepository<ErrorModel, ProcessErrorEntity, ProcessErrorPK> {
+public class ProcessErrorRepository extends AbstractRepository<ErrorModel, ProcessErrorEntity, ProcessErrorPK> {
     private static final Logger logger = LoggerFactory.getLogger(ProcessErrorRepository.class);
 
     public ProcessErrorRepository() {
         super(ErrorModel.class, ProcessErrorEntity.class);
     }
 
+    @Override
+    protected ErrorModel toModel(ProcessErrorEntity entity) {
+        return ExecutionMapper.INSTANCE.processErrorToModel(entity);
+    }
+
+    @Override
+    protected ProcessErrorEntity toEntity(ErrorModel model) {
+        return ExecutionMapper.INSTANCE.processErrorToEntity(model);
+    }
+
     protected String saveProcessError(ErrorModel error, String processId) throws RegistryException {
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        ProcessErrorEntity processErrorEntity = mapper.map(error, ProcessErrorEntity.class);
+        ProcessErrorEntity processErrorEntity = ExecutionMapper.INSTANCE.processErrorToEntity(error);
 
         if (processErrorEntity.getProcessId() == null) {
             logger.debug("Setting the ProcessErrorEntity's ProcessId");
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessInputRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessInputRepository.java
index fdb2ee7e07..0f95d8cdfc 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessInputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessInputRepository.java
@@ -19,11 +19,11 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.util.*;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.ProcessInputEntity;
 import org.apache.airavata.execution.model.ProcessInputPK;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
+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.process.ProcessModel;
@@ -31,19 +31,28 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ProcessInputRepository
-        extends ExpCatAbstractRepository<InputDataObjectType, ProcessInputEntity, ProcessInputPK> {
+        extends AbstractRepository<InputDataObjectType, ProcessInputEntity, ProcessInputPK> {
     private static final Logger logger = LoggerFactory.getLogger(ProcessInputRepository.class);
 
     public ProcessInputRepository() {
         super(InputDataObjectType.class, ProcessInputEntity.class);
     }
 
+    @Override
+    protected InputDataObjectType toModel(ProcessInputEntity entity) {
+        return ExecutionMapper.INSTANCE.processInputToModel(entity);
+    }
+
+    @Override
+    protected ProcessInputEntity toEntity(InputDataObjectType model) {
+        return ExecutionMapper.INSTANCE.processInputToEntity(model);
+    }
+
     protected void saveProcessInput(List<InputDataObjectType> processInputs, String processId)
             throws RegistryException {
 
         for (InputDataObjectType input : processInputs) {
-            Mapper mapper = ObjectMapperSingleton.getInstance();
-            ProcessInputEntity processInputEntity = mapper.map(input, ProcessInputEntity.class);
+            ProcessInputEntity processInputEntity = ExecutionMapper.INSTANCE.processInputToEntity(input);
 
             if (processInputEntity.getProcessId() == null) {
                 logger.debug("Setting the ProcessInputEntity's ProcessId");
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessOutputRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessOutputRepository.java
index 243fba43ec..152b6f636f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessOutputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessOutputRepository.java
@@ -19,11 +19,11 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.util.*;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.ProcessOutputEntity;
 import org.apache.airavata.execution.model.ProcessOutputPK;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
+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.process.ProcessModel;
@@ -31,19 +31,28 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ProcessOutputRepository
-        extends ExpCatAbstractRepository<OutputDataObjectType, ProcessOutputEntity, ProcessOutputPK> {
+        extends AbstractRepository<OutputDataObjectType, ProcessOutputEntity, ProcessOutputPK> {
     private static final Logger logger = LoggerFactory.getLogger(ProcessOutputRepository.class);
 
     public ProcessOutputRepository() {
         super(OutputDataObjectType.class, ProcessOutputEntity.class);
     }
 
+    @Override
+    protected OutputDataObjectType toModel(ProcessOutputEntity entity) {
+        return ExecutionMapper.INSTANCE.processOutputToModel(entity);
+    }
+
+    @Override
+    protected ProcessOutputEntity toEntity(OutputDataObjectType model) {
+        return ExecutionMapper.INSTANCE.processOutputToEntity(model);
+    }
+
     protected void saveProcessOutput(List<OutputDataObjectType> processOutputs, String processId)
             throws RegistryException {
 
         for (OutputDataObjectType output : processOutputs) {
-            Mapper mapper = ObjectMapperSingleton.getInstance();
-            ProcessOutputEntity processOutputEntity = mapper.map(output, ProcessOutputEntity.class);
+            ProcessOutputEntity processOutputEntity = ExecutionMapper.INSTANCE.processOutputToEntity(output);
 
             if (processOutputEntity.getProcessId() == null) {
                 logger.debug("Setting the ProcessOutputEntity's ProcesstId");
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessRepository.java
index 94d632d5a7..82b844c629 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessRepository.java
@@ -19,17 +19,18 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.airavata.common.util.AiravataUtils;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
+import org.apache.airavata.execution.model.ExperimentEntity;
 import org.apache.airavata.execution.model.ProcessEntity;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.ExpCatalogUtils;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.commons.airavata_commonsConstants;
@@ -40,7 +41,7 @@ import org.apache.airavata.model.status.ProcessStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ProcessRepository extends ExpCatAbstractRepository<ProcessModel, ProcessEntity, String> {
+public class ProcessRepository extends AbstractRepository<ProcessModel, ProcessEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(ProcessRepository.class);
 
     private final TaskRepository taskRepository = new TaskRepository();
@@ -49,6 +50,16 @@ public class ProcessRepository extends ExpCatAbstractRepository<ProcessModel, Pr
         super(ProcessModel.class, ProcessEntity.class);
     }
 
+    @Override
+    protected ProcessModel toModel(ProcessEntity entity) {
+        return ExecutionMapper.INSTANCE.processToModel(entity);
+    }
+
+    @Override
+    protected ProcessEntity toEntity(ProcessModel model) {
+        return ExecutionMapper.INSTANCE.processToEntity(model);
+    }
+
     protected String saveProcessModelData(ProcessModel processModel) throws RegistryException {
         ProcessEntity processEntity = saveProcess(processModel);
         return processEntity.getProcessId();
@@ -77,13 +88,27 @@ public class ProcessRepository extends ExpCatAbstractRepository<ProcessModel, Pr
             processModel.setCreationTime(System.currentTimeMillis());
         }
         processModel.setLastUpdateTime(System.currentTimeMillis());
-
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        ProcessEntity processEntity = mapper.map(processModel, ProcessEntity.class);
+        ProcessEntity processEntity = ExecutionMapper.INSTANCE.processToEntity(processModel);
 
         populateParentIds(processEntity);
 
-        return execute(entityManager -> entityManager.merge(processEntity));
+        return execute(entityManager -> {
+            // Hibernate 6 requires @ManyToOne references to be set (not just the FK column)
+            if (processEntity.getExperiment() == null && processEntity.getExperimentId() != null) {
+                ExperimentEntity experimentRef =
+                        entityManager.getReference(ExperimentEntity.class, processEntity.getExperimentId());
+                processEntity.setExperiment(experimentRef);
+            }
+            // Set process back-reference on child tasks
+            if (processEntity.getTasks() != null) {
+                processEntity.getTasks().forEach(taskEntity -> {
+                    if (taskEntity.getProcess() == null) {
+                        taskEntity.setProcess(processEntity);
+                    }
+                });
+            }
+            return entityManager.merge(processEntity);
+        });
     }
 
     protected void populateParentIds(ProcessEntity processEntity) {
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessStatusRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessStatusRepository.java
index 87a36239eb..92c2141b3c 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessStatusRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessStatusRepository.java
@@ -19,16 +19,16 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.sql.Timestamp;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.ProcessStatusEntity;
 import org.apache.airavata.execution.model.ProcessStatusPK;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.ExpCatalogUtils;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.process.ProcessModel;
@@ -37,14 +37,23 @@ import org.apache.airavata.model.status.ProcessStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ProcessStatusRepository
-        extends ExpCatAbstractRepository<ProcessStatus, ProcessStatusEntity, ProcessStatusPK> {
+public class ProcessStatusRepository extends AbstractRepository<ProcessStatus, ProcessStatusEntity, ProcessStatusPK> {
     private static final Logger logger = LoggerFactory.getLogger(ProcessStatusRepository.class);
 
     public ProcessStatusRepository() {
         super(ProcessStatus.class, ProcessStatusEntity.class);
     }
 
+    @Override
+    protected ProcessStatus toModel(ProcessStatusEntity entity) {
+        return ExecutionMapper.INSTANCE.processStatusToModel(entity);
+    }
+
+    @Override
+    protected ProcessStatusEntity toEntity(ProcessStatus model) {
+        return ExecutionMapper.INSTANCE.processStatusToEntity(model);
+    }
+
     protected String saveProcessStatus(ProcessStatus processStatus, String processId) throws RegistryException {
         if (processStatus.getStatusId() == null) {
 
@@ -56,9 +65,7 @@ public class ProcessStatusRepository
                 processStatus.setStatusId(currentProcessStatus.getStatusId());
             }
         }
-
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        ProcessStatusEntity processStatusEntity = mapper.map(processStatus, ProcessStatusEntity.class);
+        ProcessStatusEntity processStatusEntity = ExecutionMapper.INSTANCE.processStatusToEntity(processStatus);
 
         if (processStatusEntity.getProcessId() == null) {
             logger.debug("Setting the ProcessStatusEntity's ProcessId");
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessWorkflowRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessWorkflowRepository.java
index 076459c4c6..b2859903e7 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessWorkflowRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProcessWorkflowRepository.java
@@ -19,12 +19,12 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.util.Collections;
 import java.util.List;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.ProcessWorkflowEntity;
 import org.apache.airavata.execution.model.ProcessWorkflowPK;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.process.ProcessModel;
 import org.apache.airavata.model.process.ProcessWorkflow;
@@ -32,7 +32,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ProcessWorkflowRepository
-        extends ExpCatAbstractRepository<ProcessWorkflow, ProcessWorkflowEntity, ProcessWorkflowPK> {
+        extends AbstractRepository<ProcessWorkflow, ProcessWorkflowEntity, ProcessWorkflowPK> {
 
     private static final Logger logger = LoggerFactory.getLogger(ProcessInputRepository.class);
 
@@ -40,12 +40,22 @@ public class ProcessWorkflowRepository
         super(ProcessWorkflow.class, ProcessWorkflowEntity.class);
     }
 
+    @Override
+    protected ProcessWorkflow toModel(ProcessWorkflowEntity entity) {
+        return ExecutionMapper.INSTANCE.processWorkflowToModel(entity);
+    }
+
+    @Override
+    protected ProcessWorkflowEntity toEntity(ProcessWorkflow model) {
+        return ExecutionMapper.INSTANCE.processWorkflowToEntity(model);
+    }
+
     protected void saveProcessWorkflow(List<ProcessWorkflow> processWorkflows, String processId)
             throws RegistryException {
 
         for (ProcessWorkflow processWorkflow : processWorkflows) {
-            Mapper mapper = ObjectMapperSingleton.getInstance();
-            ProcessWorkflowEntity processWorkflowEntity = mapper.map(processWorkflow, ProcessWorkflowEntity.class);
+            ProcessWorkflowEntity processWorkflowEntity =
+                    ExecutionMapper.INSTANCE.processWorkflowToEntity(processWorkflow);
 
             if (processWorkflowEntity.getProcessId() == null) {
                 logger.debug("Setting the ProcessWorkflowEntity's ProcessId");
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProjectRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProjectRepository.java
index b42e062f46..7bb0f372a0 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProjectRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/ProjectRepository.java
@@ -19,13 +19,13 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.sql.Timestamp;
 import java.util.*;
 import org.apache.airavata.common.util.AiravataUtils;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.ProjectEntity;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.Constants;
 import org.apache.airavata.execution.util.cpi.RegistryException;
@@ -35,13 +35,23 @@ import org.apache.airavata.model.workspace.Project;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ProjectRepository extends ExpCatAbstractRepository<Project, ProjectEntity, String> {
+public class ProjectRepository extends AbstractRepository<Project, ProjectEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(ProjectRepository.class);
 
     public ProjectRepository() {
         super(Project.class, ProjectEntity.class);
     }
 
+    @Override
+    protected Project toModel(ProjectEntity entity) {
+        return ExecutionMapper.INSTANCE.projectToModel(entity);
+    }
+
+    @Override
+    protected ProjectEntity toEntity(Project model) {
+        return ExecutionMapper.INSTANCE.projectToEntity(model);
+    }
+
     protected String saveProjectData(Project project, String gatewayId) throws RegistryException {
         ProjectEntity projectEntity = saveProject(project, gatewayId);
         return projectEntity.getProjectID();
@@ -52,9 +62,7 @@ public class ProjectRepository extends ExpCatAbstractRepository<Project, Project
             logger.debug("Setting the Project's ProjectId");
             project.setProjectID(AiravataUtils.getId(project.getName()));
         }
-
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        ProjectEntity projectEntity = mapper.map(project, ProjectEntity.class);
+        ProjectEntity projectEntity = ExecutionMapper.INSTANCE.projectToEntity(project);
 
         if (project.getGatewayId() == null) {
             logger.debug("Setting the Project's GatewayId");
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/QueueStatusRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/QueueStatusRepository.java
index d67014f326..b5466249a8 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/QueueStatusRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/QueueStatusRepository.java
@@ -19,32 +19,41 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.QueueStatusEntity;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.status.QueueStatusModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class QueueStatusRepository extends ExpCatAbstractRepository<QueueStatusModel, QueueStatusEntity, String> {
+public class QueueStatusRepository extends AbstractRepository<QueueStatusModel, QueueStatusEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(QueueStatusRepository.class);
 
     public QueueStatusRepository() {
         super(QueueStatusModel.class, QueueStatusEntity.class);
     }
 
+    @Override
+    protected QueueStatusModel toModel(QueueStatusEntity entity) {
+        return ExecutionMapper.INSTANCE.queueStatusToModel(entity);
+    }
+
+    @Override
+    protected QueueStatusEntity toEntity(QueueStatusModel model) {
+        return ExecutionMapper.INSTANCE.queueStatusToEntity(model);
+    }
+
     public boolean createQueueStatuses(List<QueueStatusModel> queueStatusModels) throws RegistryException {
 
         for (QueueStatusModel queueStatusModel : queueStatusModels) {
-            Mapper mapper = ObjectMapperSingleton.getInstance();
-            QueueStatusEntity queueStatusEntity = mapper.map(queueStatusModel, QueueStatusEntity.class);
+            QueueStatusEntity queueStatusEntity = ExecutionMapper.INSTANCE.queueStatusToEntity(queueStatusModel);
             execute(entityManager -> entityManager.merge(queueStatusEntity));
         }
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/TaskErrorRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/TaskErrorRepository.java
index 417d9ee8cf..c204659eb6 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/TaskErrorRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/TaskErrorRepository.java
@@ -19,28 +19,37 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.util.List;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.TaskErrorEntity;
 import org.apache.airavata.execution.model.TaskErrorPK;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.ExpCatalogUtils;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.commons.ErrorModel;
 import org.apache.airavata.model.task.TaskModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TaskErrorRepository extends ExpCatAbstractRepository<ErrorModel, TaskErrorEntity, TaskErrorPK> {
+public class TaskErrorRepository extends AbstractRepository<ErrorModel, TaskErrorEntity, TaskErrorPK> {
     private static final Logger logger = LoggerFactory.getLogger(TaskErrorRepository.class);
 
     public TaskErrorRepository() {
         super(ErrorModel.class, TaskErrorEntity.class);
     }
 
+    @Override
+    protected ErrorModel toModel(TaskErrorEntity entity) {
+        return ExecutionMapper.INSTANCE.taskErrorToModel(entity);
+    }
+
+    @Override
+    protected TaskErrorEntity toEntity(ErrorModel model) {
+        return ExecutionMapper.INSTANCE.taskErrorToEntity(model);
+    }
+
     protected String saveTaskError(ErrorModel error, String taskId) throws RegistryException {
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        TaskErrorEntity taskErrorEntity = mapper.map(error, TaskErrorEntity.class);
+        TaskErrorEntity taskErrorEntity = ExecutionMapper.INSTANCE.taskErrorToEntity(error);
 
         if (taskErrorEntity.getTaskId() == null) {
             logger.debug("Setting the TaskErrorEntity's TaskId");
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/TaskRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/TaskRepository.java
index 52b9c50a9a..ba0e40c1ff 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/TaskRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/TaskRepository.java
@@ -19,16 +19,17 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.airavata.common.util.AiravataUtils;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
+import org.apache.airavata.execution.model.ProcessEntity;
 import org.apache.airavata.execution.model.TaskEntity;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.DBConstants;
 import org.apache.airavata.execution.util.ExpCatalogUtils;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.QueryConstants;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.commons.airavata_commonsConstants;
@@ -36,7 +37,7 @@ import org.apache.airavata.model.task.TaskModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TaskRepository extends ExpCatAbstractRepository<TaskModel, TaskEntity, String> {
+public class TaskRepository extends AbstractRepository<TaskModel, TaskEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(TaskRepository.class);
 
     private final JobRepository jobRepository = new JobRepository();
@@ -45,6 +46,16 @@ public class TaskRepository extends ExpCatAbstractRepository<TaskModel, TaskEnti
         super(TaskModel.class, TaskEntity.class);
     }
 
+    @Override
+    protected TaskModel toModel(TaskEntity entity) {
+        return ExecutionMapper.INSTANCE.taskToModel(entity);
+    }
+
+    @Override
+    protected TaskEntity toEntity(TaskModel model) {
+        return ExecutionMapper.INSTANCE.taskToEntity(model);
+    }
+
     protected String saveTaskModelData(TaskModel taskModel) throws RegistryException {
         TaskEntity taskEntity = saveTask(taskModel);
         return taskEntity.getTaskId();
@@ -73,13 +84,19 @@ public class TaskRepository extends ExpCatAbstractRepository<TaskModel, TaskEnti
         }
 
         taskModel.setLastUpdateTime(System.currentTimeMillis());
-
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        TaskEntity taskEntity = mapper.map(taskModel, TaskEntity.class);
+        TaskEntity taskEntity = ExecutionMapper.INSTANCE.taskToEntity(taskModel);
 
         populateParentIds(taskEntity);
 
-        return execute(entityManager -> entityManager.merge(taskEntity));
+        return execute(entityManager -> {
+            // Hibernate 6 requires @ManyToOne references to be set (not just the FK column)
+            if (taskEntity.getProcess() == null && taskEntity.getParentProcessId() != null) {
+                ProcessEntity processRef =
+                        entityManager.getReference(ProcessEntity.class, taskEntity.getParentProcessId());
+                taskEntity.setProcess(processRef);
+            }
+            return entityManager.merge(taskEntity);
+        });
     }
 
     protected void populateParentIds(TaskEntity taskEntity) {
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/TaskStatusRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/TaskStatusRepository.java
index 3d3112b1f9..e95f463c46 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/TaskStatusRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/TaskStatusRepository.java
@@ -19,13 +19,13 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.sql.Timestamp;
 import java.util.List;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.TaskStatusEntity;
 import org.apache.airavata.execution.model.TaskStatusPK;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.ExpCatalogUtils;
-import org.apache.airavata.execution.util.ObjectMapperSingleton;
 import org.apache.airavata.execution.util.cpi.RegistryException;
 import org.apache.airavata.model.status.TaskState;
 import org.apache.airavata.model.status.TaskStatus;
@@ -33,16 +33,25 @@ import org.apache.airavata.model.task.TaskModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TaskStatusRepository extends ExpCatAbstractRepository<TaskStatus, TaskStatusEntity, TaskStatusPK> {
+public class TaskStatusRepository extends AbstractRepository<TaskStatus, TaskStatusEntity, TaskStatusPK> {
     private static final Logger logger = LoggerFactory.getLogger(TaskStatusRepository.class);
 
     public TaskStatusRepository() {
         super(TaskStatus.class, TaskStatusEntity.class);
     }
 
+    @Override
+    protected TaskStatus toModel(TaskStatusEntity entity) {
+        return ExecutionMapper.INSTANCE.taskStatusToModel(entity);
+    }
+
+    @Override
+    protected TaskStatusEntity toEntity(TaskStatus model) {
+        return ExecutionMapper.INSTANCE.taskStatusToEntity(model);
+    }
+
     protected String saveTaskStatus(TaskStatus taskStatus, String taskId) throws RegistryException {
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        TaskStatusEntity taskStatusEntity = mapper.map(taskStatus, TaskStatusEntity.class);
+        TaskStatusEntity taskStatusEntity = ExecutionMapper.INSTANCE.taskStatusToEntity(taskStatus);
 
         if (taskStatusEntity.getTaskId() == null) {
             logger.debug("Setting the TaskStatusEntity's TaskId");
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/UserRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/UserRepository.java
index 87474632a2..43debe68b2 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/UserRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/UserRepository.java
@@ -22,18 +22,30 @@ package org.apache.airavata.execution.repository;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.UserEntity;
 import org.apache.airavata.execution.model.UserPK;
+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.user.UserProfile;
 
-public class UserRepository extends ExpCatAbstractRepository<UserProfile, UserEntity, UserPK> {
+public class UserRepository extends AbstractRepository<UserProfile, UserEntity, UserPK> {
     public UserRepository() {
         super(UserProfile.class, UserEntity.class);
     }
 
+    @Override
+    protected UserProfile toModel(UserEntity entity) {
+        return ExecutionMapper.INSTANCE.userToModel(entity);
+    }
+
+    @Override
+    protected UserEntity toEntity(UserProfile model) {
+        return ExecutionMapper.INSTANCE.userToEntity(model);
+    }
+
     public UserProfile addUser(UserProfile user) throws RegistryException {
         try {
             return create(user);
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/WorkflowCatAbstractRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/WorkflowCatAbstractRepository.java
deleted file mode 100644
index 4b71661d5d..0000000000
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/WorkflowCatAbstractRepository.java
+++ /dev/null
@@ -1,36 +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.execution.repository;
-
-import jakarta.persistence.EntityManager;
-import org.apache.airavata.execution.util.AbstractRepository;
-import org.apache.airavata.execution.util.WorkflowCatalogJPAUtils;
-
-public class WorkflowCatAbstractRepository<T, E, Id> extends AbstractRepository<T, E, Id> {
-
-    public WorkflowCatAbstractRepository(Class<T> thriftGenericClass, Class<E> dbEntityGenericClass) {
-        super(thriftGenericClass, dbEntityGenericClass);
-    }
-
-    @Override
-    protected EntityManager getEntityManager() {
-        return WorkflowCatalogJPAUtils.getEntityManager();
-    }
-}
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/repository/WorkflowRepository.java b/airavata-api/src/main/java/org/apache/airavata/execution/repository/WorkflowRepository.java
index da9626807d..6d547f8a1d 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/repository/WorkflowRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/repository/WorkflowRepository.java
@@ -19,13 +19,14 @@
 */
 package org.apache.airavata.execution.repository;
 
-import com.github.dozermapper.core.Mapper;
 import java.sql.Timestamp;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.airavata.execution.mapper.ExecutionMapper;
 import org.apache.airavata.execution.model.workflow.AiravataWorkflowEntity;
 import org.apache.airavata.execution.util.*;
+import org.apache.airavata.execution.util.AbstractRepository;
 import org.apache.airavata.execution.util.cpi.WorkflowCatalog;
 import org.apache.airavata.execution.util.cpi.WorkflowCatalogException;
 import org.apache.airavata.model.commons.airavata_commonsConstants;
@@ -33,7 +34,7 @@ import org.apache.airavata.model.workflow.AiravataWorkflow;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class WorkflowRepository extends WorkflowCatAbstractRepository<AiravataWorkflow, AiravataWorkflowEntity, String>
+public class WorkflowRepository extends AbstractRepository<AiravataWorkflow, AiravataWorkflowEntity, String>
         implements WorkflowCatalog {
     private static final Logger logger = LoggerFactory.getLogger(WorkflowRepository.class);
 
@@ -41,6 +42,16 @@ public class WorkflowRepository extends WorkflowCatAbstractRepository<AiravataWo
         super(AiravataWorkflow.class, AiravataWorkflowEntity.class);
     }
 
+    @Override
+    protected AiravataWorkflow toModel(AiravataWorkflowEntity entity) {
+        return ExecutionMapper.INSTANCE.workflowToModel(entity);
+    }
+
+    @Override
+    protected AiravataWorkflowEntity toEntity(AiravataWorkflow model) {
+        return ExecutionMapper.INSTANCE.workflowToEntity(model);
+    }
+
     protected String saveWorkflowModelData(AiravataWorkflow workflowModel, String experimentId)
             throws WorkflowCatalogException {
         AiravataWorkflowEntity workflowEntity = saveWorkflow(workflowModel, experimentId);
@@ -73,8 +84,7 @@ public class WorkflowRepository extends WorkflowCatAbstractRepository<AiravataWo
         }
 
         String workflowId = workflowModel.getId();
-        Mapper mapper = ObjectMapperSingleton.getInstance();
-        AiravataWorkflowEntity workflowEntity = mapper.map(workflowModel, AiravataWorkflowEntity.class);
+        AiravataWorkflowEntity workflowEntity = ExecutionMapper.INSTANCE.workflowToEntity(workflowModel);
 
         if (workflowEntity.getStatuses() != null) {
             logger.debug(
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/ComputeResourceSelectionPolicyImpl.java b/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/ComputeResourceSelectionPolicyImpl.java
index bfc6fe8e5b..fa1038fd2c 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/ComputeResourceSelectionPolicyImpl.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/ComputeResourceSelectionPolicyImpl.java
@@ -19,28 +19,22 @@
 */
 package org.apache.airavata.execution.scheduler;
 
-import org.apache.airavata.common.util.ThriftClientPool;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.GroupComputeResourcePreference;
 import org.apache.airavata.registry.api.RegistryService;
 
 public abstract class ComputeResourceSelectionPolicyImpl implements ComputeResourceSelectionPolicy {
 
-    protected ThriftClientPool<RegistryService.Client> registryClientPool;
+    protected RegistryService.Iface registryHandler;
 
     public ComputeResourceSelectionPolicyImpl() {
-        this.registryClientPool = Utils.getRegistryServiceClientPool();
+        this.registryHandler = Utils.getRegistryHandler();
     }
 
     public GroupComputeResourcePreference getGroupComputeResourcePreference(
             String computeResourcId, String groupResourceProfileId) throws Exception {
-        RegistryService.Client client = this.registryClientPool.getResource();
-        try {
-            if (client.isGroupComputeResourcePreferenceExists(computeResourcId, groupResourceProfileId)) {
-                return client.getGroupComputeResourcePreference(computeResourcId, groupResourceProfileId);
-            }
-            return null;
-        } finally {
-            this.registryClientPool.returnResource(client);
+        if (registryHandler.isGroupComputeResourcePreferenceExists(computeResourcId, groupResourceProfileId)) {
+            return registryHandler.getGroupComputeResourcePreference(computeResourcId, groupResourceProfileId);
         }
+        return null;
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/DataAnalyzerImpl.java b/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/DataAnalyzerImpl.java
index 99e44ee1e5..5436190916 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/DataAnalyzerImpl.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/DataAnalyzerImpl.java
@@ -21,7 +21,6 @@ package org.apache.airavata.execution.scheduler;
 
 import java.util.Map;
 import org.apache.airavata.common.config.ServerSettings;
-import org.apache.airavata.common.util.ThriftClientPool;
 import org.apache.airavata.model.status.JobState;
 import org.apache.airavata.model.status.JobStatus;
 import org.apache.airavata.registry.api.RegistryService;
@@ -34,15 +33,13 @@ public class DataAnalyzerImpl implements DataAnalyzer {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(DataAnalyzerImpl.class);
 
-    protected static ThriftClientPool<RegistryService.Client> registryClientPool = Utils.getRegistryServiceClientPool();
+    protected static RegistryService.Iface registryHandler = Utils.getRegistryHandler();
 
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
-        RegistryService.Client client = null;
 
         try {
             LOGGER.debug("Executing Data Analyzer ....... ");
-            client = this.registryClientPool.getResource();
 
             // TODO: handle multiple gateways
             String gateway = ServerSettings.getDataAnalyzingEnabledGateways();
@@ -52,11 +49,11 @@ public class DataAnalyzerImpl implements DataAnalyzer {
             jobStatus.setJobState(state);
             double time = ServerSettings.getDataAnalyzerTimeStep();
 
-            int fiveMinuteCount = client.getJobCount(jobStatus, gateway, 5);
+            int fiveMinuteCount = registryHandler.getJobCount(jobStatus, gateway, 5);
 
-            int tenMinuteCount = client.getJobCount(jobStatus, gateway, 10);
+            int tenMinuteCount = registryHandler.getJobCount(jobStatus, gateway, 10);
 
-            int fifteenMinuteCount = client.getJobCount(jobStatus, gateway, 15);
+            int fifteenMinuteCount = registryHandler.getJobCount(jobStatus, gateway, 15);
 
             double fiveMinuteAverage = fiveMinuteCount * time / (5 * 60);
 
@@ -67,7 +64,7 @@ public class DataAnalyzerImpl implements DataAnalyzer {
             LOGGER.info("service rate: 5 min avg " + fiveMinuteAverage + " 10 min avg " + tenMinuteAverage
                     + " 15 min avg " + fifteenMinuteAverage);
 
-            Map<String, Double> timeDistribution = client.getAVGTimeDistribution(gateway, 15);
+            Map<String, Double> timeDistribution = registryHandler.getAVGTimeDistribution(gateway, 15);
 
             String msg = "";
             for (Map.Entry<String, Double> entry : timeDistribution.entrySet()) {
@@ -78,14 +75,6 @@ public class DataAnalyzerImpl implements DataAnalyzer {
         } catch (Exception ex) {
             String msg = "Error occurred while executing data analyzer" + ex.getMessage();
             LOGGER.error(msg, ex);
-            if (client != null) {
-                this.registryClientPool.returnBrokenResource(client);
-            }
-            client = null;
-        } finally {
-            if (client != null) {
-                this.registryClientPool.returnResource(client);
-            }
         }
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/DefaultComputeResourceSelectionPolicy.java b/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/DefaultComputeResourceSelectionPolicy.java
index cc7f04902e..f04a9bce21 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/DefaultComputeResourceSelectionPolicy.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/DefaultComputeResourceSelectionPolicy.java
@@ -42,7 +42,7 @@ public class DefaultComputeResourceSelectionPolicy extends ComputeResourceSelect
 
     @Override
     public Optional<ComputationalResourceSchedulingModel> selectComputeResource(String processId) {
-        RegistryService.Client registryClient = this.registryClientPool.getResource();
+        RegistryService.Iface registryClient = this.registryHandler;
         try {
             ProcessModel processModel = registryClient.getProcess(processId);
 
@@ -70,12 +70,6 @@ public class DefaultComputeResourceSelectionPolicy extends ComputeResourceSelect
             }
         } catch (Exception exception) {
             LOGGER.error(" Exception occurred while scheduling Process with Id {}", processId, exception);
-            this.registryClientPool.returnBrokenResource(registryClient);
-            registryClient = null;
-        } finally {
-            if (registryClient != null) {
-                this.registryClientPool.returnResource(registryClient);
-            }
         }
         return Optional.empty();
     }
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/ExponentialBackOffReScheduler.java b/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/ExponentialBackOffReScheduler.java
index eb88364a05..20c7f3d4eb 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/ExponentialBackOffReScheduler.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/ExponentialBackOffReScheduler.java
@@ -24,7 +24,6 @@ import java.util.List;
 import java.util.Optional;
 import org.apache.airavata.common.config.ServerSettings;
 import org.apache.airavata.common.exception.ApplicationSettingsException;
-import org.apache.airavata.common.util.ThriftClientPool;
 import org.apache.airavata.model.application.io.InputDataObjectType;
 import org.apache.airavata.model.error.ExperimentNotFoundException;
 import org.apache.airavata.model.experiment.ExperimentModel;
@@ -43,16 +42,16 @@ public class ExponentialBackOffReScheduler implements ReScheduler {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ExponentialBackOffReScheduler.class);
 
-    protected ThriftClientPool<RegistryService.Client> registryClientPool = Utils.getRegistryServiceClientPool();
+    protected RegistryService.Iface registryHandler = Utils.getRegistryHandler();
 
     @Override
     public void reschedule(ProcessModel processModel, ProcessState processState) {
-        RegistryService.Client client = null;
+
         try {
-            client = this.registryClientPool.getResource();
+
             int maxReschedulingCount = ServerSettings.getMetaschedulerReschedulingThreshold();
             List<ProcessStatus> processStatusList = processModel.getProcessStatuses();
-            ExperimentModel experimentModel = client.getExperiment(processModel.getExperimentId());
+            ExperimentModel experimentModel = registryHandler.getExperiment(processModel.getExperimentId());
             LOGGER.info("Rescheduling process with Id " + processModel.getProcessId() + " experimentId "
                     + processModel.getExperimentId());
             String selectionPolicyClass = ServerSettings.getComputeResourceSelectionPolicyClass();
@@ -63,7 +62,7 @@ public class ExponentialBackOffReScheduler implements ReScheduler {
                         policy.selectComputeResource(processModel.getProcessId());
 
                 if (computationalResourceSchedulingModel.isPresent()) {
-                    updateResourceSchedulingModel(processModel, experimentModel, client);
+                    updateResourceSchedulingModel(processModel, experimentModel, registryHandler);
                     Utils.updateProcessStatusAndPublishStatus(
                             ProcessState.DEQUEUING,
                             processModel.getProcessId(),
@@ -80,10 +79,10 @@ public class ExponentialBackOffReScheduler implements ReScheduler {
                             experimentModel.getGatewayId());
                 } else {
 
-                    client.deleteJobs(processModel.getProcessId());
+                    registryHandler.deleteJobs(processModel.getProcessId());
                     LOGGER.debug("Cleaned up current  job stack for process " + processModel.getProcessId()
                             + " experimentId " + processModel.getExperimentId());
-                    ProcessStatus processStatus = client.getProcessStatus(processModel.getProcessId());
+                    ProcessStatus processStatus = registryHandler.getProcessStatus(processModel.getProcessId());
                     long pastValue = processStatus.getTimeOfStateChange();
 
                     int value = fib(currentCount);
@@ -93,7 +92,7 @@ public class ExponentialBackOffReScheduler implements ReScheduler {
                     double scanningInterval = ServerSettings.getMetaschedulerJobScanningInterval();
 
                     if (currentTime >= (pastValue + value * scanningInterval * 1000)) {
-                        updateResourceSchedulingModel(processModel, experimentModel, client);
+                        updateResourceSchedulingModel(processModel, experimentModel, registryHandler);
                         Utils.saveAndPublishProcessStatus(
                                 ProcessState.DEQUEUING,
                                 processModel.getProcessId(),
@@ -104,14 +103,7 @@ public class ExponentialBackOffReScheduler implements ReScheduler {
             }
             return;
         } catch (Exception exception) {
-            if (client != null) {
-                registryClientPool.returnBrokenResource(client);
-                client = null;
-            }
-        } finally {
-            if (client != null) {
-                registryClientPool.returnResource(client);
-            }
+            LOGGER.error("Error rescheduling process " + processModel.getProcessId(), exception);
         }
     }
 
@@ -132,7 +124,7 @@ public class ExponentialBackOffReScheduler implements ReScheduler {
     }
 
     private void updateResourceSchedulingModel(
-            ProcessModel processModel, ExperimentModel experimentModel, RegistryService.Client registryClient)
+            ProcessModel processModel, ExperimentModel experimentModel, RegistryService.Iface registryClient)
             throws TException, ExperimentNotFoundException, ApplicationSettingsException, ClassNotFoundException,
                     IllegalAccessException, InstantiationException, RegistryServiceException {
         String selectionPolicyClass = ServerSettings.getComputeResourceSelectionPolicyClass();
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/MultipleComputeResourcePolicy.java b/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/MultipleComputeResourcePolicy.java
index d8fbff7158..9b8d10cf9d 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/MultipleComputeResourcePolicy.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/MultipleComputeResourcePolicy.java
@@ -43,7 +43,7 @@ public class MultipleComputeResourcePolicy extends ComputeResourceSelectionPolic
 
     @Override
     public Optional<ComputationalResourceSchedulingModel> selectComputeResource(String processId) {
-        RegistryService.Client registryClient = super.registryClientPool.getResource();
+        RegistryService.Iface registryClient = super.registryHandler;
         try {
 
             ProcessModel processModel = registryClient.getProcess(processId);
@@ -78,12 +78,6 @@ public class MultipleComputeResourcePolicy extends ComputeResourceSelectionPolic
 
         } catch (Exception exception) {
             LOGGER.error(" Exception occurred while scheduling Process with Id {}", processId, exception);
-            this.registryClientPool.returnBrokenResource(registryClient);
-            registryClient = null;
-        } finally {
-            if (registryClient != null) {
-                this.registryClientPool.returnResource(registryClient);
-            }
         }
 
         return Optional.empty();
diff --git a/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/ProcessScannerImpl.java b/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/ProcessScannerImpl.java
index f583f09d2f..d3114e61b5 100644
--- a/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/ProcessScannerImpl.java
+++ b/airavata-api/src/main/java/org/apache/airavata/execution/scheduler/ProcessScannerImpl.java
@@ -21,7 +21,6 @@ package org.apache.airavata.execution.scheduler;
 
 import java.util.List;
 import org.apache.airavata.common.config.ServerSettings;
... 11365 lines suppressed ...