You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2023/07/10 15:55:20 UTC

[camel-karavan] branch main updated (acb7a506 -> fa503138)

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

marat pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git


    omit acb7a506 Karavan CLI doc updated
    omit fa463394 DatagridService in karaan-app #817
    omit 04c47f46 Reusable DatagridService #817
    omit 00c6c2f2 Reusable DatagridService #817
    omit a80a1415 Group karavan cloud modules to one folder #817
    omit 4d8b717f Release tools exec mode
     new fa503138 Release tools exec mode

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (acb7a506)
            \
             N -- N -- N   refs/heads/main (fa503138)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 karavan-cloud/docs/karavan-secret-real.yaml | 15 ---------------
 1 file changed, 15 deletions(-)
 delete mode 100644 karavan-cloud/docs/karavan-secret-real.yaml


[camel-karavan] 01/01: Release tools exec mode

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

marat pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git

commit fa5031384fb34b58472abfda1f0a2e8df2535c53
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Sun Jul 9 07:46:18 2023 -0400

    Release tools exec mode
    
    Group karavan cloud modules to one folder #817
    
    Reusable DatagridService #817
    
    Reusable DatagridService #817
    
    DatagridService in karaan-app #817
    
    Karavan CLI doc updated
    
    Removed data
---
 .github/workflows/app.yml                          |   1 +
 .github/workflows/builder.yml                      |   5 +-
 .github/workflows/runner.yml                       |   5 +-
 .gitignore                                         |   1 +
 karavan-app/.mvn/wrapper/maven-wrapper.jar         | Bin 62547 -> 0 bytes
 .../karavan/listener/ClientRunnerListener.java     |  46 ---
 .../karavan/listener/LocalRunnerListener.java      |  48 ---
 .../camel/karavan/listener/RunnerListener.java     |  35 --
 .../apache/camel/karavan/model/CamelStatus.java    | 124 -------
 .../org/apache/camel/karavan/model/PodStatus.java  | 209 -----------
 .../camel/karavan/model/ProjectStoreSchema.java    |  13 -
 .../apache/camel/karavan/model/RunnerCommand.java  |  13 -
 .../apache/camel/karavan/model/RunnerStatus.java   |  15 -
 .../camel/karavan/service/InfinispanService.java   | 400 ---------------------
 karavan-cli/CLI.md                                 |  31 --
 .../docker/Dockerfile.builder                      |   0
 .../docker/Dockerfile.runner                       |   0
 karavan-cloud/{ => docs}/AWS.md                    |   0
 .../{ => docs}/AWS/karavan-acl-environments.yaml   |   0
 karavan-cloud/{ => docs}/AWS/karavan-acl.yaml      |   0
 .../AWS/karavan-app-deployment-public.yaml         |   0
 .../{ => docs}/AWS/karavan-app-ingress.yaml        |   0
 .../AWS/karavan-app-service-node-port.yaml         |   0
 karavan-cloud/{ => docs}/AWS/karavan-pvc.yaml      |   0
 .../{ => docs}/AWS/karavan-quarkus-pipeline.yaml   |   0
 .../{ => docs}/AWS/karavan-quarkus-task-aws.yaml   |   0
 karavan-cloud/{ => docs}/AWS/karavan-sc.yaml       |   0
 karavan-cloud/{ => docs}/AWS/karavan-secret.yaml   |   0
 .../AWS/karavan-spring-boot-pipeline.yaml          |   0
 .../AWS/karavan-spring-boot-task-aws.yaml          |   0
 karavan-cloud/{ => docs}/AWS/kustomization.yaml    |   0
 .../{ => docs}/AWS/pipeline-service-account.yaml   |   0
 karavan-cloud/{ => docs}/MINIKUBE.md               |   0
 karavan-cloud/{ => docs}/OPENSHIFT.md              |   0
 karavan-cloud/{ => docs}/OPENSHIFT_DEMO.md         |   0
 karavan-cloud/{ => docs}/README.md                 |   0
 .../{ => docs}/keycloack/karavan-realm.json        |   0
 .../{ => docs}/minikube/karavan-app-ingress.yaml   |   0
 .../{ => docs}/minikube/karavan-secret.yaml        |   0
 karavan-cloud/{ => docs}/minikube/karavan.yaml     |   0
 karavan-cloud/{ => docs}/openshift/catalog.yaml    |   0
 .../{ => docs}/openshift/gitea-operator.yaml       |   0
 karavan-cloud/{ => docs}/openshift/gitea.yaml      |   0
 .../{ => docs}/openshift/karavan-operator.yaml     |   0
 .../{ => docs}/openshift/karavan-secret.yaml       |   0
 karavan-cloud/{ => docs}/openshift/karavan.yaml    |   0
 .../{ => docs}/openshift/pipeline-operator.yaml    |   0
 .../karavan-app}/.dockerignore                     |   0
 .../.mvn/wrapper/maven-wrapper.properties          |   0
 .../Dockerfile.distroless.dockerignore             |   0
 .../Dockerfile.legacy-jar.dockerignore             |   0
 .../Dockerfile.multistage.dockerignore             |   0
 {karavan-app => karavan-cloud/karavan-app}/mvnw    |   0
 .../karavan-app}/mvnw.cmd                          |   0
 {karavan-app => karavan-cloud/karavan-app}/pom.xml |  56 +--
 .../src/main/docker/Dockerfile.distroless          |   0
 .../src/main/docker/Dockerfile.legacy-jar          |   0
 .../src/main/docker/Dockerfile.multistage          |   0
 .../org/apache/camel/karavan/api/AuthResource.java |   0
 .../camel/karavan/api/ComponentResources.java      |   0
 .../camel/karavan/api/ConfigurationResource.java   |  11 +-
 .../apache/camel/karavan/api/KameletResources.java |  12 +-
 .../camel/karavan/api/KubernetesResource.java      |   3 +-
 .../apache/camel/karavan/api/LogWatchResource.java |   0
 .../camel/karavan/api/ProjectFileResource.java     |   3 +-
 .../camel/karavan/api/ProjectGitResource.java      |   0
 .../apache/camel/karavan/api/ProjectResource.java  |   4 +-
 .../apache/camel/karavan/api/RunnerResource.java   |  22 +-
 .../org/apache/camel/karavan/api/SseResource.java  |   0
 .../apache/camel/karavan/api/StatusResource.java   |   3 +-
 .../apache/camel/karavan/api/UsersResource.java    |   0
 .../karavan/handler/DeploymentEventHandler.java    |  18 +-
 .../karavan/handler/PipelineRunEventHandler.java   |  22 +-
 .../camel/karavan/handler/PodEventHandler.java     |  16 +-
 .../camel/karavan/handler/ServiceEventHandler.java |  16 +-
 .../camel/karavan/health/KaravanLiveness.java      |   0
 .../karavan/listener/DevModeCommandListener.java   |  46 +++
 .../apache/camel/karavan/service/AuthService.java  |   0
 .../apache/camel/karavan/service/CodeService.java  |   9 +-
 .../apache/camel/karavan/service/GitService.java   |   0
 .../camel/karavan/service/KaravanService.java      |  11 +-
 .../camel/karavan/service/KubernetesService.java   |  17 +-
 .../camel/karavan/service/ProjectService.java      |   2 +-
 .../camel/karavan/service/RunnerService.java       |  26 +-
 .../apache/camel/karavan/service/ServiceUtil.java  |   6 +-
 .../camel/karavan/service/StatusService.java       |  94 ++---
 .../src/main/resources/application.properties      |   0
 .../src/main/resources/components/.gitignore       |   0
 .../src/main/resources/kamelets/.gitignore         |   0
 .../pipelines/karavan-pipeline-dev-quarkus.yaml    |   0
 .../karavan-pipeline-dev-spring-boot.yaml          |   0
 .../pipelines/karavan-task-dev-quarkus.yaml        |   0
 .../pipelines/karavan-task-dev-spring-boot.yaml    |   0
 .../quarkus-kubernetes-application.properties      |   0
 .../quarkus-openshift-application.properties       |   0
 ...arkus-org.apache.camel.AggregationStrategy.java |   0
 .../quarkus-org.apache.camel.Processor.java        |   0
 .../spring-boot-kubernetes-application.properties  |   0
 .../spring-boot-openshift-application.properties   |   0
 ...-boot-org.apache.camel.AggregationStrategy.java |   0
 .../spring-boot-org.apache.camel.Processor.java    |   0
 .../karavan-app}/src/main/webui/.gitignore         |   0
 .../karavan-app}/src/main/webui/package-lock.json  |  30 +-
 .../karavan-app}/src/main/webui/package.json       |   4 +-
 .../karavan-app}/src/main/webui/public/favicon.ico | Bin
 .../karavan-app}/src/main/webui/public/index.html  |   0
 .../src/main/webui/public/karavan-logo-light.png   | Bin
 .../src/main/webui/public/manifest.json            |   0
 .../karavan-app}/src/main/webui/public/robots.txt  |   0
 .../karavan-app}/src/main/webui/src/Logo.tsx       |   0
 .../karavan-app}/src/main/webui/src/Main.tsx       |   0
 .../karavan-app}/src/main/webui/src/MainLogin.tsx  |   0
 .../src/main/webui/src/Notification.tsx            |   0
 .../src/main/webui/src/api/KaravanApi.tsx          |   0
 .../src/main/webui/src/api/ProjectEventBus.ts      |   0
 .../src/main/webui/src/api/ProjectModels.ts        |   1 +
 .../src/main/webui/src/api/ProjectService.ts       |   0
 .../src/main/webui/src/api/ProjectStore.ts         |   0
 .../karavan-app}/src/main/webui/src/api/SsoApi.tsx |   0
 .../src/main/webui/src/common/MainToolbar.tsx      |   0
 .../main/webui/src/components/ComponentCard.tsx    |   0
 .../main/webui/src/components/ComponentModal.tsx   |   0
 .../main/webui/src/components/ComponentsPage.tsx   |   0
 .../main/webui/src/config/ConfigurationPage.tsx    |   0
 .../src/main/webui/src/dashboard/DashboardPage.tsx |   0
 .../main/webui/src/designer/KaravanDesigner.tsx    |   0
 .../src/main/webui/src/designer/beans/BeanCard.tsx |   0
 .../webui/src/designer/beans/BeanProperties.tsx    |   0
 .../webui/src/designer/beans/BeansDesigner.tsx     |   0
 .../src/main/webui/src/designer/karavan.css        |   0
 .../src/main/webui/src/designer/rest/RestCard.tsx  |   0
 .../src/designer/rest/RestConfigurationCard.tsx    |   0
 .../main/webui/src/designer/rest/RestDesigner.tsx  |   0
 .../webui/src/designer/rest/RestMethodCard.tsx     |   0
 .../webui/src/designer/rest/RestMethodSelector.tsx |   0
 .../webui/src/designer/route/DslConnections.tsx    |   0
 .../main/webui/src/designer/route/DslElement.tsx   |   0
 .../webui/src/designer/route/DslProperties.tsx     |   0
 .../main/webui/src/designer/route/DslSelector.tsx  |   0
 .../webui/src/designer/route/RouteDesigner.tsx     |   0
 .../src/designer/route/RouteDesignerLogic.tsx      |   0
 .../route/property/ComponentParameterField.tsx     |   0
 .../designer/route/property/DataFormatField.tsx    |   0
 .../designer/route/property/DslPropertyField.tsx   |   0
 .../designer/route/property/ExpressionField.tsx    |   0
 .../route/property/KameletPropertyField.tsx        |   0
 .../designer/route/property/KubernetesSelector.tsx |   0
 .../src/designer/route/property/ModalEditor.tsx    |   0
 .../src/designer/route/property/ObjectField.tsx    |   0
 .../src/designer/templates/TemplatesDesigner.tsx   |   0
 .../src/main/webui/src/designer/utils/CamelUi.tsx  |   0
 .../main/webui/src/designer/utils/DslMetaModel.ts  |   0
 .../src/main/webui/src/designer/utils/EventBus.ts  |   0
 .../webui/src/designer/utils/KaravanComponents.tsx |   0
 .../main/webui/src/designer/utils/KaravanIcons.tsx |   0
 .../main/webui/src/designer/utils/KubernetesAPI.ts |   0
 .../main/webui/src/designer/utils/MediaTypes.ts    |   0
 .../src/main/webui/src/eip/EipCard.tsx             |   0
 .../src/main/webui/src/eip/EipModal.tsx            |   0
 .../src/main/webui/src/eip/EipPage.tsx             |   0
 .../karavan-app}/src/main/webui/src/index.css      |   0
 .../karavan-app}/src/main/webui/src/index.tsx      |   0
 .../src/main/webui/src/kamelets/KameletCard.tsx    |   0
 .../src/main/webui/src/kamelets/KameletModal.tsx   |   0
 .../src/main/webui/src/kamelets/KameletsPage.tsx   |   0
 .../src/main/webui/src/project/ProjectPage.tsx     |   0
 .../src/main/webui/src/project/ProjectPanel.tsx    |   0
 .../src/main/webui/src/project/ProjectTitle.tsx    |   0
 .../src/main/webui/src/project/ProjectToolbar.tsx  |   0
 .../src/main/webui/src/project/RunnerToolbar.tsx   |   0
 .../webui/src/project/dashboard/DashboardTab.tsx   |   0
 .../src/project/dashboard/RunnerInfoContext.tsx    |   0
 .../src/project/dashboard/RunnerInfoMemory.tsx     |   0
 .../webui/src/project/dashboard/RunnerInfoPod.tsx  |   0
 .../src/main/webui/src/project/file/FileEditor.tsx |   0
 .../webui/src/project/file/PropertiesTable.tsx     |   0
 .../main/webui/src/project/file/PropertyField.tsx  |   0
 .../webui/src/project/files/CreateFileModal.tsx    |   0
 .../webui/src/project/files/DeleteFileModal.tsx    |   0
 .../src/main/webui/src/project/files/FilesTab.tsx  |   0
 .../main/webui/src/project/files/FilesToolbar.tsx  |   0
 .../webui/src/project/files/UploadFileModal.tsx    |   0
 .../src/main/webui/src/project/log/ProjectLog.tsx  |   0
 .../main/webui/src/project/log/ProjectLogPanel.tsx |   0
 .../src/project/pipeline/ProjectPipelineTab.tsx    |   0
 .../webui/src/project/pipeline/ProjectStatus.tsx   |   0
 .../src/project/trace/RunnerInfoTraceModal.tsx     |   0
 .../src/project/trace/RunnerInfoTraceNode.tsx      |   0
 .../src/main/webui/src/project/trace/TraceTab.tsx  |   0
 .../main/webui/src/projects/CreateProjectModal.tsx |   0
 .../main/webui/src/projects/DeleteProjectModal.tsx |   0
 .../src/main/webui/src/projects/ProjectsPage.tsx   |   0
 .../main/webui/src/projects/ProjectsTableRow.tsx   |   0
 .../src/main/webui/src/react-app-env.d.ts          |   0
 .../karavan-app}/src/main/webui/tsconfig.json      |   0
 .../karavan-bashi}/.dockerignore                   |   0
 .../karavan-bashi}/.gitignore                      |   0
 .../karavan-bashi}/.mvn/wrapper/.gitignore         |   0
 .../.mvn/wrapper/MavenWrapperDownloader.java       |   0
 .../.mvn/wrapper/maven-wrapper.properties          |   0
 .../karavan-bashi}/mvnw                            |   0
 .../karavan-bashi}/mvnw.cmd                        |   0
 .../karavan-bashi}/pom.xml                         |  33 +-
 .../karavan-bashi}/src/main/docker/Dockerfile.jvm  |   0
 .../src/main/docker/Dockerfile.legacy-jar          |   0
 .../src/main/docker/Dockerfile.native              |   0
 .../src/main/docker/Dockerfile.native-micro        |   0
 .../camel/karavan/bashi/ConductorService.java      |   0
 .../org/apache/camel/karavan/bashi/Constants.java  |   0
 .../apache/camel/karavan/bashi/KaravanBashi.java   |   0
 .../camel/karavan/bashi/RunnerStatusService.java   |   0
 .../karavan/bashi/docker/DockerEventListener.java  |   0
 .../camel/karavan/bashi/docker/DockerService.java  |   0
 .../bashi/infinispan/ClientRunnerListener.java     |   0
 .../camel/karavan/bashi/infinispan/GroupedKey.java |   0
 .../bashi/infinispan/InfinispanService.java        |   0
 .../camel/karavan/bashi/infinispan/PodStatus.java  |   0
 .../bashi/infinispan/ProjectStoreSchema.java       |   0
 .../karavan/bashi/infinispan/RunnerCommand.java    |   0
 .../src/main/resources/application.properties      |   0
 .../.mvn/wrapper/maven-wrapper.properties          |   0
 karavan-cloud/karavan-cli/CLI.md                   |  35 ++
 .../karavan-cli}/INFINISPAN.md                     |   0
 {karavan-cli => karavan-cloud/karavan-cli}/mvnw    |   0
 .../karavan-cli}/mvnw.cmd                          |   0
 {karavan-cli => karavan-cloud/karavan-cli}/pom.xml |  27 ++
 .../org/apache/camel/karavan/cli/CommandUtils.java |   0
 .../org/apache/camel/karavan/cli/Constants.java    |   0
 .../apache/camel/karavan/cli/InstallCommand.java   |   0
 .../apache/camel/karavan/cli/KaravanCommand.java   |   0
 .../apache/camel/karavan/cli/KaravanConfig.java    |   0
 .../apache/camel/karavan/cli/ResourceUtils.java    |   0
 .../apache/camel/karavan/cli/UpgradeCommand.java   |   0
 .../karavan/cli/resources/KaravanConfigMap.java    |   0
 .../karavan/cli/resources/KaravanDeployment.java   |   0
 .../camel/karavan/cli/resources/KaravanPvc.java    |   0
 .../camel/karavan/cli/resources/KaravanRole.java   |   0
 .../camel/karavan/cli/resources/KaravanSecret.java |   0
 .../karavan/cli/resources/KaravanService.java      |   0
 .../cli/resources/KaravanServiceAccount.java       |   0
 .../camel/karavan/cli/resources/KaravanTekton.java |   0
 .../apache/camel/karavan/cli/resources/Nexus.java  |   0
 .../src/main/resources/application.properties      |   0
 .../karavan-cli}/src/main/resources/dashboard.yaml |   0
 .../src/main/resources/infinispan-secrets.yaml     |   0
 .../src/main/resources/infinispan-values.yaml      |   0
 .../karavan-cli}/src/main/resources/pipelines.yaml |   0
 .../resources/quarkus-builder-script-kubernetes.sh |   0
 .../resources/quarkus-builder-script-openshift.sh  |   0
 .../karavan-cli}/src/main/resources/settings.xml   |   0
 .../spring-boot-builder-script-kubernetes.sh       |   0
 .../spring-boot-builder-script-openshift.sh        |   0
 .../.mvn/wrapper/maven-wrapper.properties          |   0
 .../karavan-datagrid}/mvnw                         |   0
 .../karavan-datagrid}/mvnw.cmd                     |   0
 .../karavan-datagrid}/pom.xml                      | 160 ++-------
 .../karavan/datagrid/ClientRunnerListener.java     |  31 ++
 .../camel/karavan/datagrid/DatagridService.java    | 383 ++++++++++++++++++++
 .../camel/karavan/datagrid/model/CamelStatus.java  |  67 ++++
 .../karavan/datagrid/model/CamelStatusName.java    |  15 +
 .../camel/karavan/datagrid/model/CommandName.java  |  10 +
 .../camel/karavan/datagrid}/model/CommitInfo.java  |   2 +-
 .../karavan/datagrid}/model/DeploymentStatus.java  |   2 +-
 .../karavan/datagrid/model/DevModeCommand.java     |  54 +++
 .../karavan/datagrid/model/DevModeStatus.java      |  45 +++
 .../camel/karavan/datagrid}/model/Environment.java |   2 +-
 .../camel/karavan/datagrid}/model/GitConfig.java   |   2 +-
 .../camel/karavan/datagrid}/model/GitRepo.java     |   2 +-
 .../camel/karavan/datagrid}/model/GitRepoFile.java |   2 +-
 .../camel/karavan/datagrid}/model/GroupedKey.java  |   2 +-
 .../karavan/datagrid}/model/KaravanGroup.java      |   2 +-
 .../karavan/datagrid/model/KaravanSchema.java      |  23 ++
 .../camel/karavan/datagrid}/model/KaravanUser.java |   2 +-
 .../karavan/datagrid}/model/PipelineStatus.java    |   2 +-
 .../camel/karavan/datagrid/model/PodStatus.java    | 100 ++++++
 .../camel/karavan/datagrid}/model/Project.java     |   2 +-
 .../camel/karavan/datagrid}/model/ProjectFile.java |   2 +-
 .../karavan/datagrid}/model/ServiceStatus.java     |   2 +-
 .../src/main/resources/application.properties      |  15 +
 .../src/main/resources/command-cache-config.xml    |   6 +
 .../src/main/resources/data-cache-config.xml       |   6 +
 .../camel/karavan/datagrid/DevCommandTest.java     |  60 ++++
 .../src/test/resources/application.properties      |  14 +
 .../karavan-operator}/.gitignore                   |   0
 .../.mvn/wrapper/maven-wrapper.properties          |   0
 .../karavan-operator}/Makefile                     |   0
 .../karavan-operator}/PROJECT                      |   0
 .../karavan-operator}/mvnw                         |   0
 .../karavan-operator}/mvnw.cmd                     |   0
 .../karavan-operator}/pom.xml                      |   0
 .../resources/deployments-role.yaml                |   0
 .../karavan-operator}/resources/karavan.yaml       |   0
 .../apache/camel/karavan/operator/Constants.java   |   0
 .../camel/karavan/operator/KaravanReconciler.java  |   0
 .../org/apache/camel/karavan/operator/Utils.java   |   0
 .../operator/resource/KaravanDeployment.java       |   0
 .../karavan/operator/resource/KaravanPvcData.java  |   0
 .../karavan/operator/resource/KaravanPvcJbang.java |   0
 .../operator/resource/KaravanPvcM2Cache.java       |   0
 .../karavan/operator/resource/KaravanRole.java     |   0
 .../operator/resource/KaravanRoleBinding.java      |   0
 .../operator/resource/KaravanRoleBindingView.java  |   0
 .../karavan/operator/resource/KaravanRoute.java    |   0
 .../karavan/operator/resource/KaravanService.java  |   0
 .../operator/resource/KaravanServiceAccount.java   |   0
 .../operator/resource/KaravanTektonPipeline.java   |   0
 .../operator/resource/KaravanTektonTask.java       |   0
 .../operator/resource/PipelineRoleBinding.java     |   0
 .../operator/resource/PipelineRoleDeployer.java    |   0
 .../operator/resource/PipelineServiceAccount.java  |   0
 .../camel/karavan/operator/spec/CamelRuntime.java  |   0
 .../camel/karavan/operator/spec/Karavan.java       |   0
 .../operator/spec/KaravanOperatorCSVMetadata.java  |   0
 .../camel/karavan/operator/spec/KaravanSpec.java   |   0
 .../camel/karavan/operator/spec/KaravanStatus.java |   0
 .../operator/watcher/TektonCrdEventHandler.java    |   0
 .../watcher/TektonSubscriptionEventHandler.java    |   0
 .../src/main/kubernetes/karavan.svg                |   0
 .../src/main/resources/application.properties      |   0
 .../resources/quarkus-builder-script-kubernetes.sh |   0
 .../resources/quarkus-builder-script-openshift.sh  |   0
 .../spring-boot-builder-script-kubernetes.sh       |   0
 .../spring-boot-builder-script-openshift.sh        |   0
 .../karavan/operator/KaravanReconcilerE2E.java     |   0
 .../karavan/operator/KaravanReconcilerTest.java    |   0
 .../src/test/resources/application.properties      |   0
 .../src/test/resources/kubernetes/kubernetes.yaml  |   0
 .../src/test/resources/kubernetes/pipelines.yaml   |   0
 .../src/test/resources/kubernetes/tasks.yaml       |   0
 karavan-cloud/pom.xml                              |  96 +++++
 karavan-core/package-lock.json                     |   4 +-
 karavan-space/src/designer/karavan.css             |   8 +
 release-utils/release.sh                           |   0
 333 files changed, 1285 insertions(+), 1311 deletions(-)

diff --git a/.github/workflows/app.yml b/.github/workflows/app.yml
index 51b2f2bd..9bd9ebb5 100644
--- a/.github/workflows/app.yml
+++ b/.github/workflows/app.yml
@@ -3,6 +3,7 @@ name: cloud-native app
 on:
   push:
     branches: [ main ]
+    paths: ['karavan-cloud/karavan-app/**']
   workflow_dispatch:
   pull_request:
     branches: [ main ]
diff --git a/.github/workflows/builder.yml b/.github/workflows/builder.yml
index 886de714..39eb276d 100644
--- a/.github/workflows/builder.yml
+++ b/.github/workflows/builder.yml
@@ -3,6 +3,7 @@ name: builder image
 on:
   push:
     branches: [ main ]
+    paths: ['karavan-cloud/docker/Dockerfile.builder']
   workflow_dispatch:
 
 env:
@@ -29,7 +30,7 @@ jobs:
       - name: Build and push Docker image
         uses: docker/build-push-action@v3
         with:
-          context: .
-          file: karavan-builder/Dockerfile
+          context: ./karavan-cloud/docker
+          file: karavan-cloud/docker/Dockerfile.builder
           push: true
           tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.TAG }}
diff --git a/.github/workflows/runner.yml b/.github/workflows/runner.yml
index 0172f360..06b15668 100644
--- a/.github/workflows/runner.yml
+++ b/.github/workflows/runner.yml
@@ -3,6 +3,7 @@ name: runner image
 on:
   push:
     branches: [ main ]
+    paths: ['karavan-cloud/docker/Dockerfile.runner']
   workflow_dispatch:
 
 env:
@@ -29,7 +30,7 @@ jobs:
       - name: Build and push Docker image
         uses: docker/build-push-action@v3
         with:
-          context: ./karavan-runner
-          file: karavan-runner/Dockerfile
+          context: ./karavan-cloud/docker
+          file: karavan-cloud/docker/Dockerfile.runner
           push: true
           tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.TAG }}
diff --git a/.gitignore b/.gitignore
index 44e2293c..e73e69cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@ pom.xml.tag
 pom.xml.releaseBackup
 pom.xml.versionsBackup
 release.properties
+dependency-reduced-pom.xml
 
 # Eclipse
 .project
diff --git a/karavan-app/.mvn/wrapper/maven-wrapper.jar b/karavan-app/.mvn/wrapper/maven-wrapper.jar
deleted file mode 100644
index cb28b0e3..00000000
Binary files a/karavan-app/.mvn/wrapper/maven-wrapper.jar and /dev/null differ
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/listener/ClientRunnerListener.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/ClientRunnerListener.java
deleted file mode 100644
index b1aabaa6..00000000
--- a/karavan-app/src/main/java/org/apache/camel/karavan/listener/ClientRunnerListener.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.apache.camel.karavan.listener;
-
-import org.apache.camel.karavan.model.GroupedKey;
-import org.apache.camel.karavan.model.RunnerCommand;
-import org.apache.camel.karavan.service.InfinispanService;
-import org.apache.camel.karavan.service.KubernetesService;
-import org.infinispan.client.hotrod.annotation.ClientCacheEntryCreated;
-import org.infinispan.client.hotrod.annotation.ClientCacheEntryModified;
-import org.infinispan.client.hotrod.annotation.ClientListener;
-import org.infinispan.client.hotrod.event.ClientCacheEntryCreatedEvent;
-import org.infinispan.client.hotrod.event.ClientCacheEntryModifiedEvent;
-
-import java.util.Objects;
-
-@ClientListener
-public class ClientRunnerListener extends RunnerListener {
-
-    public ClientRunnerListener(InfinispanService infinispanService, KubernetesService kubernetesService) {
-        super(infinispanService, kubernetesService);
-    }
-
-    @ClientCacheEntryCreated
-    public void entryCreated(ClientCacheEntryCreatedEvent<GroupedKey> event) {
-        System.out.println("entryCreated");
-        String command = event.getKey().getKey();
-        String projectId = event.getKey().getGroup();
-        if (Objects.equals(command, RunnerCommand.NAME.run.name())) {
-            startRunner(projectId);
-        } else if (Objects.equals(command, RunnerCommand.NAME.delete.name())) {
-            stopRunner(projectId);
-        }
-    }
-
-    @ClientCacheEntryModified
-    public void entryModified(ClientCacheEntryModifiedEvent<GroupedKey> event) {
-        System.out.println("entryModified");
-        String command = event.getKey().getKey();
-        String projectId = event.getKey().getGroup();
-        if (Objects.equals(command, RunnerCommand.NAME.run.name())) {
-            startRunner(projectId);
-        } else if (Objects.equals(command, RunnerCommand.NAME.delete.name())) {
-            stopRunner(projectId);
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/listener/LocalRunnerListener.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/LocalRunnerListener.java
deleted file mode 100644
index d7db9d7e..00000000
--- a/karavan-app/src/main/java/org/apache/camel/karavan/listener/LocalRunnerListener.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.apache.camel.karavan.listener;
-
-import org.apache.camel.karavan.model.GroupedKey;
-import org.apache.camel.karavan.model.RunnerCommand;
-import org.apache.camel.karavan.service.InfinispanService;
-import org.apache.camel.karavan.service.KubernetesService;
-import org.infinispan.notifications.Listener;
-import org.infinispan.notifications.cachelistener.annotation.CacheEntryCreated;
-import org.infinispan.notifications.cachelistener.annotation.CacheEntryModified;
-import org.infinispan.notifications.cachelistener.event.CacheEntryCreatedEvent;
-import org.infinispan.notifications.cachelistener.event.CacheEntryModifiedEvent;
-
-import java.util.Objects;
-
-
-@Listener(primaryOnly = true)
-public class LocalRunnerListener extends RunnerListener {
-
-    public LocalRunnerListener(InfinispanService infinispanService, KubernetesService kubernetesService) {
-        super(infinispanService, kubernetesService);
-    }
-
-    @CacheEntryCreated
-    public void entryCreated(CacheEntryCreatedEvent<GroupedKey, String> event) {
-        if (!event.isPre()) {
-            String command = event.getKey().getKey();
-            String projectId = event.getKey().getGroup();
-            if (Objects.equals(command, RunnerCommand.NAME.run.name())) {
-                startRunner(projectId);
-            } else if (Objects.equals(command, RunnerCommand.NAME.delete.name())) {
-                stopRunner(projectId);
-            }
-        }
-    }
-
-    @CacheEntryModified
-    public void entryModified(CacheEntryModifiedEvent<GroupedKey, String> event) {
-        if (!event.isPre()) {
-            String command = event.getKey().getKey();
-            String projectId = event.getKey().getGroup();
-            if (Objects.equals(command, RunnerCommand.NAME.run.name())) {
-                startRunner(projectId);
-            } else if (Objects.equals(command, RunnerCommand.NAME.delete.name())) {
-                stopRunner(projectId);
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/listener/RunnerListener.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/RunnerListener.java
deleted file mode 100644
index 15699939..00000000
--- a/karavan-app/src/main/java/org/apache/camel/karavan/listener/RunnerListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.apache.camel.karavan.listener;
-
-import org.apache.camel.karavan.model.Project;
-import org.apache.camel.karavan.service.InfinispanService;
-import org.apache.camel.karavan.service.KubernetesService;
-
-import static org.apache.camel.karavan.service.RunnerService.RUNNER_SUFFIX;
-
-public class RunnerListener {
-
-    protected final InfinispanService infinispanService;
-
-    protected final KubernetesService kubernetesService;
-
-    public RunnerListener(InfinispanService infinispanService, KubernetesService kubernetesService) {
-        this.infinispanService = infinispanService;
-        this.kubernetesService = kubernetesService;
-    }
-
-    protected void startRunner(String projectId) {
-        String runnerName = projectId + "-" + RUNNER_SUFFIX;
-        if (kubernetesService.inKubernetes()) {
-            Project p = infinispanService.getProject(projectId);
-            kubernetesService.tryCreateRunner(p, runnerName, "");
-        }
-    }
-
-    protected void stopRunner(String projectId) {
-        String runnerName = projectId + "-" + RUNNER_SUFFIX;
-        if (kubernetesService.inKubernetes()) {
-            kubernetesService.deleteRunner(runnerName, false);
-            infinispanService.deleteRunnerStatuses(runnerName);
-        }
-    }
-}
\ No newline at end of file
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/CamelStatus.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/CamelStatus.java
deleted file mode 100644
index a040c559..00000000
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/CamelStatus.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package org.apache.camel.karavan.model;
-
-import org.infinispan.protostream.annotations.ProtoEnumValue;
-import org.infinispan.protostream.annotations.ProtoFactory;
-import org.infinispan.protostream.annotations.ProtoField;
-
-public class CamelStatus {
-    public static final String CACHE = "camel_statuses";
-    @ProtoField(number = 1)
-    String projectId;
-    @ProtoField(number = 2)
-    Status contextStatus;
-    @ProtoField(number = 3)
-    Status consumerStatus;
-    @ProtoField(number = 4)
-    Status routesStatus;
-    @ProtoField(number = 5)
-    Status registryStatus;
-    @ProtoField(number = 6)
-    String contextVersion;
-    @ProtoField(number = 7)
-    String env;
-
-    public enum Status {
-        @ProtoEnumValue(number = 0, name = "DOWN")
-        DOWN,
-        @ProtoEnumValue(number = 1, name = "UP")
-        UP,
-        @ProtoEnumValue(number = 2, name = "UNDEFINED")
-        UNDEFINED
-    }
-
-    public CamelStatus() {
-    }
-
-    public CamelStatus(String projectId, String env) {
-        this.projectId = projectId;
-        this.env = env;
-        this.contextStatus = Status.UNDEFINED;
-        this.consumerStatus = Status.UNDEFINED;
-        this.routesStatus = Status.UNDEFINED;
-        this.registryStatus = Status.UNDEFINED;
-    }
-
-    @ProtoFactory
-    public CamelStatus(String projectId, Status contextStatus, Status consumerStatus, Status routesStatus, Status registryStatus, String contextVersion, String env) {
-        this.projectId = projectId;
-        this.contextStatus = contextStatus;
-        this.consumerStatus = consumerStatus;
-        this.routesStatus = routesStatus;
-        this.registryStatus = registryStatus;
-        this.contextVersion = contextVersion;
-        this.env = env;
-    }
-
-    public String getProjectId() {
-        return projectId;
-    }
-
-    public void setProjectId(String projectId) {
-        this.projectId = projectId;
-    }
-
-    public Status getContextStatus() {
-        return contextStatus;
-    }
-
-    public void setContextStatus(Status contextStatus) {
-        this.contextStatus = contextStatus;
-    }
-
-    public Status getConsumerStatus() {
-        return consumerStatus;
-    }
-
-    public void setConsumerStatus(Status consumerStatus) {
-        this.consumerStatus = consumerStatus;
-    }
-
-    public Status getRoutesStatus() {
-        return routesStatus;
-    }
-
-    public void setRoutesStatus(Status routesStatus) {
-        this.routesStatus = routesStatus;
-    }
-
-    public Status getRegistryStatus() {
-        return registryStatus;
-    }
-
-    public void setRegistryStatus(Status registryStatus) {
-        this.registryStatus = registryStatus;
-    }
-
-    public String getContextVersion() {
-        return contextVersion;
-    }
-
-    public void setContextVersion(String contextVersion) {
-        this.contextVersion = contextVersion;
-    }
-
-    public String getEnv() {
-        return env;
-    }
-
-    public void setEnv(String env) {
-        this.env = env;
-    }
-
-    @Override
-    public String toString() {
-        return "CamelStatus{" +
-                "projectId='" + projectId + '\'' +
-                ", contextStatus=" + contextStatus +
-                ", consumerStatus=" + consumerStatus +
-                ", routesStatus=" + routesStatus +
-                ", registryStatus=" + registryStatus +
-                ", contextVersion='" + contextVersion + '\'' +
-                ", env='" + env + '\'' +
-                '}';
-    }
-}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/PodStatus.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/PodStatus.java
deleted file mode 100644
index ed937174..00000000
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/PodStatus.java
+++ /dev/null
@@ -1,209 +0,0 @@
-package org.apache.camel.karavan.model;
-
-import org.infinispan.protostream.annotations.ProtoFactory;
-import org.infinispan.protostream.annotations.ProtoField;
-
-public class PodStatus {
-    public static final String CACHE = "pod_statuses";
-    @ProtoField(number = 1)
-    String name;
-    @ProtoField(number = 2)
-    String phase;
-    @ProtoField(number = 3)
-    Boolean initialized;
-    @ProtoField(number = 4)
-    Boolean ready;
-    @ProtoField(number = 5)
-    Boolean terminating;
-    @ProtoField(number = 6)
-    String reason;
-    @ProtoField(number = 7)
-    String deployment;
-    @ProtoField(number = 8)
-    String project;
-    @ProtoField(number = 9)
-    String env;
-    @ProtoField(number = 10)
-    Boolean runner;
-    @ProtoField(number = 11)
-    String requestMemory;
-    @ProtoField(number = 12)
-    String requestCpu;
-    @ProtoField(number = 13)
-    String limitMemory;
-    @ProtoField(number = 14)
-    String limitCpu;
-    @ProtoField(number = 15)
-    String creationTimestamp;
-
-    public PodStatus(String name, String project, String env) {
-        this.name = name;
-        this.phase = "";
-        this.initialized = false;
-        this.ready = false;
-        this.terminating = false;
-        this.reason = "";
-        this.project = project;
-        this.env = env;
-    }
-
-    @ProtoFactory
-    public PodStatus(String name, String phase, Boolean initialized, Boolean ready, Boolean terminating, String reason, String deployment, String project, String env, Boolean runner, String requestMemory, String requestCpu, String limitMemory, String limitCpu, String creationTimestamp) {
-        this.name = name;
-        this.phase = phase;
-        this.initialized = initialized;
-        this.ready = ready;
-        this.terminating = terminating;
-        this.reason = reason;
-        this.deployment = deployment;
-        this.project = project;
-        this.env = env;
-        this.runner = runner;
-        this.requestMemory = requestMemory;
-        this.requestCpu = requestCpu;
-        this.limitMemory = limitMemory;
-        this.limitCpu = limitCpu;
-        this.creationTimestamp = creationTimestamp;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getPhase() {
-        return phase;
-    }
-
-    public void setPhase(String phase) {
-        this.phase = phase;
-    }
-
-    public Boolean getInitialized() {
-        return initialized;
-    }
-
-    public void setInitialized(Boolean initialized) {
-        this.initialized = initialized;
-    }
-
-    public Boolean getReady() {
-        return ready;
-    }
-
-    public void setReady(Boolean ready) {
-        this.ready = ready;
-    }
-
-    public Boolean getTerminating() {
-        return terminating;
-    }
-
-    public void setTerminating(Boolean terminating) {
-        this.terminating = terminating;
-    }
-
-    public String getReason() {
-        return reason;
-    }
-
-    public void setReason(String reason) {
-        this.reason = reason;
-    }
-
-    public String getDeployment() {
-        return deployment;
-    }
-
-    public void setDeployment(String deployment) {
-        this.deployment = deployment;
-    }
-
-    public String getProject() {
-        return project;
-    }
-
-    public void setProject(String project) {
-        this.project = project;
-    }
-
-    public String getEnv() {
-        return env;
-    }
-
-    public void setEnv(String env) {
-        this.env = env;
-    }
-
-    public Boolean getRunner() {
-        return runner;
-    }
-
-    public void setRunner(Boolean runner) {
-        this.runner = runner;
-    }
-
-    public String getRequestMemory() {
-        return requestMemory;
-    }
-
-    public void setRequestMemory(String requestMemory) {
-        this.requestMemory = requestMemory;
-    }
-
-    public String getRequestCpu() {
-        return requestCpu;
-    }
-
-    public void setRequestCpu(String requestCpu) {
-        this.requestCpu = requestCpu;
-    }
-
-    public String getLimitMemory() {
-        return limitMemory;
-    }
-
-    public void setLimitMemory(String limitMemory) {
-        this.limitMemory = limitMemory;
-    }
-
-    public String getLimitCpu() {
-        return limitCpu;
-    }
-
-    public void setLimitCpu(String limitCpu) {
-        this.limitCpu = limitCpu;
-    }
-
-    public String getCreationTimestamp() {
-        return creationTimestamp;
-    }
-
-    public void setCreationTimestamp(String creationTimestamp) {
-        this.creationTimestamp = creationTimestamp;
-    }
-
-    @Override
-    public String toString() {
-        return "PodStatus{" +
-                "name='" + name + '\'' +
-                ", phase='" + phase + '\'' +
-                ", initialized=" + initialized +
-                ", ready=" + ready +
-                ", terminating=" + terminating +
-                ", reason='" + reason + '\'' +
-                ", deployment='" + deployment + '\'' +
-                ", project='" + project + '\'' +
-                ", env='" + env + '\'' +
-                ", runner=" + runner +
-                ", requestMemory='" + requestMemory + '\'' +
-                ", requestCpu='" + requestCpu + '\'' +
-                ", limitMemory='" + limitMemory + '\'' +
-                ", limitCpu='" + limitCpu + '\'' +
-                ", creationTimestamp='" + creationTimestamp + '\'' +
-                '}';
-    }
-}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectStoreSchema.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectStoreSchema.java
deleted file mode 100644
index c9b1e7af..00000000
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectStoreSchema.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.apache.camel.karavan.model;
-
-import org.infinispan.protostream.GeneratedSchema;
-import org.infinispan.protostream.annotations.AutoProtoSchemaBuilder;
-
-@AutoProtoSchemaBuilder(
-        includeClasses = {
-                GroupedKey.class, Project.class, ProjectFile.class, PipelineStatus.class, CamelStatus.class, DeploymentStatus.class,
-                PodStatus.class, Environment.class, ServiceStatus.class
-        },
-        schemaPackageName = "karavan")
-public interface ProjectStoreSchema extends GeneratedSchema {
-}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/RunnerCommand.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/RunnerCommand.java
deleted file mode 100644
index ccd2ce62..00000000
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/RunnerCommand.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.apache.camel.karavan.model;
-
-public class RunnerCommand {
-
-    public enum NAME {
-        run,
-        delete,
-        reload
-    }
-
-    public static final String CACHE = "runner_commands";
-
-}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/RunnerStatus.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/RunnerStatus.java
deleted file mode 100644
index f1928a20..00000000
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/RunnerStatus.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.apache.camel.karavan.model;
-
-public class RunnerStatus {
-
-    public enum NAME {
-        context,
-        inflight,
-        memory,
-        properties,
-        route,
-        trace,
-        jvm,
-        source
-    }
-}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/InfinispanService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/InfinispanService.java
deleted file mode 100644
index 08738cdb..00000000
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/InfinispanService.java
+++ /dev/null
@@ -1,400 +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.camel.karavan.service;
-
-import io.smallrye.mutiny.tuples.Tuple2;
-import org.apache.camel.karavan.listener.ClientRunnerListener;
-import org.apache.camel.karavan.listener.LocalRunnerListener;
-import org.apache.camel.karavan.model.*;
-import org.eclipse.microprofile.health.HealthCheck;
-import org.eclipse.microprofile.health.HealthCheckResponse;
-import org.eclipse.microprofile.health.Readiness;
-import org.infinispan.client.hotrod.RemoteCache;
-import org.infinispan.client.hotrod.RemoteCacheManager;
-import org.infinispan.client.hotrod.Search;
-import org.infinispan.commons.api.BasicCache;
-import org.infinispan.commons.api.CacheContainerAdmin;
-import org.infinispan.commons.configuration.StringConfiguration;
-import org.infinispan.configuration.cache.CacheMode;
-import org.infinispan.configuration.cache.ConfigurationBuilder;
-import org.infinispan.configuration.global.GlobalConfigurationBuilder;
-import org.infinispan.manager.DefaultCacheManager;
-import org.infinispan.query.dsl.QueryFactory;
-import org.jboss.logging.Logger;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.inject.Default;
-import javax.inject.Inject;
-import java.time.Instant;
-import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.stream.Collectors;
-
-import static org.apache.camel.karavan.service.ServiceUtil.APPLICATION_PROPERTIES_FILENAME;
-
-@Default
-@Readiness
-@ApplicationScoped
-public class InfinispanService implements HealthCheck  {
-
-    private BasicCache<GroupedKey, Project> projects;
-    private BasicCache<GroupedKey, ProjectFile> files;
-    private BasicCache<GroupedKey, PipelineStatus> pipelineStatuses;
-    private BasicCache<GroupedKey, DeploymentStatus> deploymentStatuses;
-    private BasicCache<GroupedKey, PodStatus> podStatuses;
-    private BasicCache<GroupedKey, CamelStatus> camelStatuses;
-    private BasicCache<GroupedKey, ServiceStatus> serviceStatuses;
-    private BasicCache<String, Environment> environments;
-    private BasicCache<String, String> commits;
-    private BasicCache<GroupedKey, String> runnerStatuses;
-    private BasicCache<GroupedKey, String> runnerCommands;
-    private final AtomicBoolean ready = new AtomicBoolean(false);
-
-    @Inject
-    RemoteCacheManager remoteCacheManager;
-
-    DefaultCacheManager localCacheManager;
-
-    @Inject
-    CodeService codeService;
-
-    private static final String CACHE_CONFIG = "<distributed-cache name=\"%s\">"
-            + " <encoding media-type=\"application/x-protostream\"/>"
-            + " <groups enabled=\"true\"/>"
-            + "</distributed-cache>";
-
-    private static final Logger LOGGER = Logger.getLogger(InfinispanService.class.getName());
-
-    void start() {
-        if (remoteCacheManager == null) {
-            LOGGER.info("InfinispanService is starting in local mode");
-            GlobalConfigurationBuilder global = GlobalConfigurationBuilder.defaultClusteredBuilder();
-            localCacheManager = new DefaultCacheManager(global.build());
-            ConfigurationBuilder builder = new ConfigurationBuilder();
-            builder.clustering().cacheMode(CacheMode.LOCAL);
-            environments = localCacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(Environment.CACHE, builder.build());
-            projects = localCacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(Project.CACHE, builder.build());
-            files = localCacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(ProjectFile.CACHE, builder.build());
-            pipelineStatuses = localCacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(PipelineStatus.CACHE, builder.build());
-            deploymentStatuses = localCacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(DeploymentStatus.CACHE, builder.build());
-            podStatuses = localCacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(PodStatus.CACHE, builder.build());
-            serviceStatuses = localCacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(ServiceStatus.CACHE, builder.build());
-            camelStatuses = localCacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(CamelStatus.CACHE, builder.build());
-            commits = localCacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache("commits", builder.build());
-            runnerStatuses = localCacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache("runner_statuses", builder.build());
-            runnerCommands = localCacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(RunnerCommand.CACHE, builder.build());
-            cleanData();
-        } else {
-            LOGGER.info("InfinispanService is starting in remote mode");
-            environments = remoteCacheManager.administration().getOrCreateCache(Environment.CACHE, new StringConfiguration(String.format(CACHE_CONFIG, Environment.CACHE)));
-            projects = remoteCacheManager.administration().getOrCreateCache(Project.CACHE, new StringConfiguration(String.format(CACHE_CONFIG, Project.CACHE)));
-            files = remoteCacheManager.administration().getOrCreateCache(ProjectFile.CACHE, new StringConfiguration(String.format(CACHE_CONFIG, ProjectFile.CACHE)));
-            pipelineStatuses = remoteCacheManager.administration().getOrCreateCache(PipelineStatus.CACHE, new StringConfiguration(String.format(CACHE_CONFIG, PipelineStatus.CACHE)));
-            deploymentStatuses = remoteCacheManager.administration().getOrCreateCache(DeploymentStatus.CACHE, new StringConfiguration(String.format(CACHE_CONFIG, DeploymentStatus.CACHE)));
-            podStatuses = remoteCacheManager.administration().getOrCreateCache(PodStatus.CACHE, new StringConfiguration(String.format(CACHE_CONFIG, PodStatus.CACHE)));
-            serviceStatuses = remoteCacheManager.administration().getOrCreateCache(ServiceStatus.CACHE, new StringConfiguration(String.format(CACHE_CONFIG, ServiceStatus.CACHE)));
-            camelStatuses = remoteCacheManager.administration().getOrCreateCache(CamelStatus.CACHE, new StringConfiguration(String.format(CACHE_CONFIG, CamelStatus.CACHE)));
-            commits = remoteCacheManager.administration().getOrCreateCache("commits", new StringConfiguration(String.format(CACHE_CONFIG, "commits")));
-            runnerStatuses = remoteCacheManager.administration().getOrCreateCache("runner_statuses", new StringConfiguration(String.format(CACHE_CONFIG, "runner_statuses")));
-            runnerCommands = remoteCacheManager.administration().getOrCreateCache(RunnerCommand.CACHE, new StringConfiguration(String.format(CACHE_CONFIG, RunnerCommand.CACHE)));
-        }
-        addListeners();
-        ready.set(true);
-    }
-
-    @Inject
-    KubernetesService kubernetesService;
-
-    private void addListeners() {
-        if (remoteCacheManager != null) {
-            remoteCacheManager.getCache(RunnerCommand.CACHE).addClientListener(new ClientRunnerListener(this, kubernetesService));
-        } else {
-            localCacheManager.getCache(RunnerCommand.CACHE).addListener(new LocalRunnerListener(this, kubernetesService));
-        }
-    }
-
-    private void cleanData() {
-        environments.clear();
-        deploymentStatuses.clear();
-        podStatuses.clear();
-        pipelineStatuses.clear();
-        camelStatuses.clear();
-    }
-
-
-    public List<Project> getProjects() {
-        return projects.values().stream().collect(Collectors.toList());
-    }
-
-    public void saveProject(Project project, boolean imported) {
-        GroupedKey key = GroupedKey.create(project.getProjectId(), project.getProjectId());
-        boolean isNew = !projects.containsKey(key);
-        projects.put(key, project);
-        if (isNew && !imported){
-            String filename = APPLICATION_PROPERTIES_FILENAME;
-            String code = codeService.getApplicationProperties(project);
-            files.put(new GroupedKey(project.getProjectId(), filename), new ProjectFile(filename, code, project.getProjectId(), Instant.now().toEpochMilli()));
-        }
-    }
-
-    public List<ProjectFile> getProjectFiles(String projectId) {
-        if (remoteCacheManager == null) {
-            return files.values().stream()
-                    .filter(f -> f.getProjectId().equals(projectId))
-                    .collect(Collectors.toList());
-        } else {
-            QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) files);
-            return queryFactory.<ProjectFile>create("FROM karavan.ProjectFile WHERE projectId = :projectId")
-                    .setParameter("projectId", projectId)
-                    .execute().list();
-        }
-    }
-
-    public ProjectFile getProjectFile(String projectId, String filename) {
-        if (remoteCacheManager == null) {
-            return files.values().stream()
-                    .filter(f -> f.getProjectId().equals(projectId) && f.getName().equals(filename))
-                    .findFirst().orElse(new ProjectFile());
-        } else {
-            QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) files);
-            return queryFactory.<ProjectFile>create("FROM karavan.ProjectFile WHERE projectId = :projectId AND name = :name")
-                    .setParameter("projectId", projectId)
-                    .setParameter("name", filename)
-                    .execute().list().get(0);
-        }
-    }
-
-    public void saveProjectFile(ProjectFile file) {
-        files.put(GroupedKey.create(file.getProjectId(), file.getName()), file);
-    }
-
-    public void saveProjectFiles(Map<GroupedKey, ProjectFile> f) {
-        Map<GroupedKey, ProjectFile> files = new HashMap<>(f.size());
-        f.forEach((groupedKey, projectFile) -> {
-            projectFile.setLastUpdate(Instant.now().toEpochMilli());
-        });
-        files.putAll(files);
-    }
-
-    public void deleteProject(String project) {
-        projects.remove(GroupedKey.create(project, project));
-    }
-
-    public void deleteProjectFile(String project, String filename) {
-        files.remove(GroupedKey.create(project, filename));
-    }
-
-    public Project getProject(String project) {
-        return projects.get(GroupedKey.create(project, project));
-    }
-
-    public PipelineStatus getPipelineStatus(String projectId, String environment) {
-        return pipelineStatuses.get(GroupedKey.create(projectId, environment));
-    }
-
-    public void savePipelineStatus(PipelineStatus status) {
-        pipelineStatuses.put(GroupedKey.create(status.getProjectId(), status.getEnv()), status);
-    }
-
-    public void deletePipelineStatus(PipelineStatus status) {
-        pipelineStatuses.remove(GroupedKey.create(status.getProjectId(), status.getEnv()));
-    }
-
-    public DeploymentStatus getDeploymentStatus(String name, String namespace, String cluster) {
-        String deploymentId = name + ":" + namespace + ":" + cluster;
-        return deploymentStatuses.get(GroupedKey.create(name, deploymentId));
-    }
-
-    public void saveDeploymentStatus(DeploymentStatus status) {
-        deploymentStatuses.put(GroupedKey.create(status.getName(), status.getId()), status);
-    }
-
-    public void deleteDeploymentStatus(DeploymentStatus status) {
-        deploymentStatuses.remove(GroupedKey.create(status.getName(), status.getId()));
-    }
-
-    public List<DeploymentStatus> getDeploymentStatuses() {
-        return deploymentStatuses.values().stream().collect(Collectors.toList());
-    }
-
-    public List<DeploymentStatus> getDeploymentStatuses(String env) {
-        if (remoteCacheManager == null) {
-            return  deploymentStatuses.values().stream()
-                    .filter(s -> s.getEnv().equals(env))
-                    .collect(Collectors.toList());
-        } else {
-            QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) deploymentStatuses);
-            return queryFactory.<DeploymentStatus>create("FROM karavan.DeploymentStatus WHERE env = :env")
-                    .setParameter("env", env)
-                    .execute().list();
-        }
-    }
-
-    public void saveServiceStatus(ServiceStatus status) {
-        serviceStatuses.put(GroupedKey.create(status.getName(), status.getId()), status);
-    }
-
-    public void deleteServiceStatus(ServiceStatus status) {
-        serviceStatuses.remove(GroupedKey.create(status.getName(), status.getId()));
-    }
-
-    public List<ServiceStatus> getServiceStatuses() {
-        return new ArrayList<>(serviceStatuses.values());
-    }
-
-    public List<PodStatus> getPodStatuses(String projectId, String env) {
-        if (remoteCacheManager == null) {
-            return podStatuses.values().stream()
-                    .filter(s -> s.getEnv().equals(env) && s.getProject().equals(projectId))
-                    .collect(Collectors.toList());
-        } else {
-            QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) podStatuses);
-            return queryFactory.<PodStatus>create("FROM karavan.PodStatus WHERE project = :project AND env = :env")
-                    .setParameter("project", projectId)
-                    .setParameter("env", env)
-                    .execute().list();
-        }
-    }
-
-    public List<PodStatus> getPodStatuses(String env) {
-        if (remoteCacheManager == null) {
-            return podStatuses.values().stream()
-                    .filter(s -> s.getEnv().equals(env))
-                    .collect(Collectors.toList());
-        } else {
-            QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) podStatuses);
-            return queryFactory.<PodStatus>create("FROM karavan.PodStatus WHERE env = :env")
-                    .setParameter("env", env)
-                    .execute().list();
-        }
-    }
-
-    public void savePodStatus(PodStatus status) {
-        podStatuses.put(GroupedKey.create(status.getProject(), status.getName()), status);
-    }
-
-    public void deletePodStatus(PodStatus status) {
-        podStatuses.remove(GroupedKey.create(status.getProject(), status.getName()));
-    }
-
-    public CamelStatus getCamelStatus(String projectId, String env) {
-        return camelStatuses.get(GroupedKey.create(projectId, env));
-    }
-
-    public List<CamelStatus> getCamelStatuses(String env) {
-        if (remoteCacheManager == null) {
-            return camelStatuses.values().stream()
-                    .filter(s -> s.getEnv().equals(env))
-                    .collect(Collectors.toList());
-        } else {
-            QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) camelStatuses);
-            return queryFactory.<CamelStatus>create("FROM karavan.CamelStatus WHERE env = :env")
-                    .setParameter("env", env)
-                    .execute().list();
-        }
-    }
-
-    public void saveCamelStatus(CamelStatus status) {
-        camelStatuses.put(GroupedKey.create(status.getProjectId(), status.getEnv()), status);
-    }
-
-    public void deleteCamelStatus(String name, String env) {
-        camelStatuses.remove(GroupedKey.create(name, env));
-    }
-
-    public String getRunnerStatus(String podName, RunnerStatus.NAME statusName) {
-        return runnerStatuses.get(GroupedKey.create(podName, statusName.name()));
-    }
-
-    public void saveRunnerStatus(String podName, RunnerStatus.NAME statusName, String status) {
-        runnerStatuses.put(GroupedKey.create(podName, statusName.name()), status);
-    }
-
-    public void saveRunnerStatus(String podName, String statusName, String status) {
-        runnerStatuses.put(GroupedKey.create(podName, statusName), status);
-    }
-
-    public void deleteRunnerStatus(String podName, RunnerStatus.NAME statusName) {
-        runnerStatuses.remove(GroupedKey.create(podName, statusName.name()));
-    }
-
-    public void deleteRunnerStatus(String podName, String statusName) {
-        runnerStatuses.remove(GroupedKey.create(podName, statusName));
-    }
-
-    public void deleteRunnerStatuses(String podName) {
-        Arrays.stream(RunnerStatus.NAME.values()).forEach(statusName -> {
-            runnerStatuses.remove(GroupedKey.create(podName, statusName.name()));
-        });
-    }
-
-    public List<Environment> getEnvironments() {
-        return new ArrayList<>(environments.values());
-    }
-
-    public void saveEnvironment(Environment environment) {
-        environments.put(environment.getName(), environment);
-    }
-
-    public void saveCommit(String commitId, int time) {
-        commits.put(commitId, String.valueOf(time));
-    }
-
-    public void saveLastCommit(String commitId) {
-        commits.put("lastCommitId", commitId);
-    }
-
-    public Tuple2<String, Integer> getLastCommit() {
-        String lastCommitId = commits.get("lastCommitId");
-        String time = commits.get(lastCommitId);
-        return Tuple2.of(lastCommitId, Integer.parseInt(time));
-    }
-
-    public boolean hasCommit(String commitId) {
-        return commits.get(commitId) != null;
-    }
-
-    public void sendRunnerCommand(String projectId, RunnerCommand.NAME command) {
-        runnerCommands.put(GroupedKey.create(projectId, command.name()), UUID.randomUUID().toString());
-    }
-
-    @Override
-    public HealthCheckResponse call() {
-        if (remoteCacheManager == null && ready.get()){
-            return HealthCheckResponse.up("Infinispan Service is running in local mode.");
-        }
-        else {
-            if (remoteCacheManager != null && remoteCacheManager.isStarted() && ready.get()) {
-                return HealthCheckResponse.up("Infinispan Service is running in cluster mode.");
-            }
-            else {
-                return HealthCheckResponse.down("Infinispan Service is not running.");
-            }
-        }
-    }
-
-    protected void clearAllStatuses() {
-        CompletableFuture.allOf(
-            deploymentStatuses.clearAsync(),
-            podStatuses.clearAsync(),
-            pipelineStatuses.clearAsync(),
-            camelStatuses.clearAsync(),
-            runnerStatuses.clearAsync()
-        ).join();
-    }
-}
diff --git a/karavan-cli/CLI.md b/karavan-cli/CLI.md
deleted file mode 100644
index d5a637ba..00000000
--- a/karavan-cli/CLI.md
+++ /dev/null
@@ -1,31 +0,0 @@
-## Install Karavan with CLI
-
-### Requirements
-1. minikube v1.30+ installed with `--driver=hyperkit`
-
-### Installation
-1. Start minikube
-    ```
-    minikube start --driver=hyperkit
-    ```
-2. Enable registry addon
-    ```
-    minikube addons enable registry
-    ```
-3. Start dashboard (optional)
-    ```
-    minikube dashboard
-    ```
-4. Package karavan-cli
-    ```
-    mvn clean package
-    ```
-5. Install Karavan
-    ```
-    java -jar target/karavan-cli-VERSION.jar install --git-repository=$GIT_REPOSITORY --git-password=$GIT_TOKEN --git-username=$GIT_USERNAME  --node-port=30777
-    ```
-5. Get karavan service URL
-    ```
-    minikube service karavan --url --namespace karavan
-    ```
-   Use karavan URL to connect to the application
diff --git a/karavan-builder/Dockerfile b/karavan-cloud/docker/Dockerfile.builder
similarity index 100%
rename from karavan-builder/Dockerfile
rename to karavan-cloud/docker/Dockerfile.builder
diff --git a/karavan-runner/Dockerfile b/karavan-cloud/docker/Dockerfile.runner
similarity index 100%
rename from karavan-runner/Dockerfile
rename to karavan-cloud/docker/Dockerfile.runner
diff --git a/karavan-cloud/AWS.md b/karavan-cloud/docs/AWS.md
similarity index 100%
rename from karavan-cloud/AWS.md
rename to karavan-cloud/docs/AWS.md
diff --git a/karavan-cloud/AWS/karavan-acl-environments.yaml b/karavan-cloud/docs/AWS/karavan-acl-environments.yaml
similarity index 100%
rename from karavan-cloud/AWS/karavan-acl-environments.yaml
rename to karavan-cloud/docs/AWS/karavan-acl-environments.yaml
diff --git a/karavan-cloud/AWS/karavan-acl.yaml b/karavan-cloud/docs/AWS/karavan-acl.yaml
similarity index 100%
rename from karavan-cloud/AWS/karavan-acl.yaml
rename to karavan-cloud/docs/AWS/karavan-acl.yaml
diff --git a/karavan-cloud/AWS/karavan-app-deployment-public.yaml b/karavan-cloud/docs/AWS/karavan-app-deployment-public.yaml
similarity index 100%
rename from karavan-cloud/AWS/karavan-app-deployment-public.yaml
rename to karavan-cloud/docs/AWS/karavan-app-deployment-public.yaml
diff --git a/karavan-cloud/AWS/karavan-app-ingress.yaml b/karavan-cloud/docs/AWS/karavan-app-ingress.yaml
similarity index 100%
rename from karavan-cloud/AWS/karavan-app-ingress.yaml
rename to karavan-cloud/docs/AWS/karavan-app-ingress.yaml
diff --git a/karavan-cloud/AWS/karavan-app-service-node-port.yaml b/karavan-cloud/docs/AWS/karavan-app-service-node-port.yaml
similarity index 100%
rename from karavan-cloud/AWS/karavan-app-service-node-port.yaml
rename to karavan-cloud/docs/AWS/karavan-app-service-node-port.yaml
diff --git a/karavan-cloud/AWS/karavan-pvc.yaml b/karavan-cloud/docs/AWS/karavan-pvc.yaml
similarity index 100%
rename from karavan-cloud/AWS/karavan-pvc.yaml
rename to karavan-cloud/docs/AWS/karavan-pvc.yaml
diff --git a/karavan-cloud/AWS/karavan-quarkus-pipeline.yaml b/karavan-cloud/docs/AWS/karavan-quarkus-pipeline.yaml
similarity index 100%
rename from karavan-cloud/AWS/karavan-quarkus-pipeline.yaml
rename to karavan-cloud/docs/AWS/karavan-quarkus-pipeline.yaml
diff --git a/karavan-cloud/AWS/karavan-quarkus-task-aws.yaml b/karavan-cloud/docs/AWS/karavan-quarkus-task-aws.yaml
similarity index 100%
rename from karavan-cloud/AWS/karavan-quarkus-task-aws.yaml
rename to karavan-cloud/docs/AWS/karavan-quarkus-task-aws.yaml
diff --git a/karavan-cloud/AWS/karavan-sc.yaml b/karavan-cloud/docs/AWS/karavan-sc.yaml
similarity index 100%
rename from karavan-cloud/AWS/karavan-sc.yaml
rename to karavan-cloud/docs/AWS/karavan-sc.yaml
diff --git a/karavan-cloud/AWS/karavan-secret.yaml b/karavan-cloud/docs/AWS/karavan-secret.yaml
similarity index 100%
rename from karavan-cloud/AWS/karavan-secret.yaml
rename to karavan-cloud/docs/AWS/karavan-secret.yaml
diff --git a/karavan-cloud/AWS/karavan-spring-boot-pipeline.yaml b/karavan-cloud/docs/AWS/karavan-spring-boot-pipeline.yaml
similarity index 100%
rename from karavan-cloud/AWS/karavan-spring-boot-pipeline.yaml
rename to karavan-cloud/docs/AWS/karavan-spring-boot-pipeline.yaml
diff --git a/karavan-cloud/AWS/karavan-spring-boot-task-aws.yaml b/karavan-cloud/docs/AWS/karavan-spring-boot-task-aws.yaml
similarity index 100%
rename from karavan-cloud/AWS/karavan-spring-boot-task-aws.yaml
rename to karavan-cloud/docs/AWS/karavan-spring-boot-task-aws.yaml
diff --git a/karavan-cloud/AWS/kustomization.yaml b/karavan-cloud/docs/AWS/kustomization.yaml
similarity index 100%
rename from karavan-cloud/AWS/kustomization.yaml
rename to karavan-cloud/docs/AWS/kustomization.yaml
diff --git a/karavan-cloud/AWS/pipeline-service-account.yaml b/karavan-cloud/docs/AWS/pipeline-service-account.yaml
similarity index 100%
rename from karavan-cloud/AWS/pipeline-service-account.yaml
rename to karavan-cloud/docs/AWS/pipeline-service-account.yaml
diff --git a/karavan-cloud/MINIKUBE.md b/karavan-cloud/docs/MINIKUBE.md
similarity index 100%
rename from karavan-cloud/MINIKUBE.md
rename to karavan-cloud/docs/MINIKUBE.md
diff --git a/karavan-cloud/OPENSHIFT.md b/karavan-cloud/docs/OPENSHIFT.md
similarity index 100%
rename from karavan-cloud/OPENSHIFT.md
rename to karavan-cloud/docs/OPENSHIFT.md
diff --git a/karavan-cloud/OPENSHIFT_DEMO.md b/karavan-cloud/docs/OPENSHIFT_DEMO.md
similarity index 100%
rename from karavan-cloud/OPENSHIFT_DEMO.md
rename to karavan-cloud/docs/OPENSHIFT_DEMO.md
diff --git a/karavan-cloud/README.md b/karavan-cloud/docs/README.md
similarity index 100%
rename from karavan-cloud/README.md
rename to karavan-cloud/docs/README.md
diff --git a/karavan-cloud/keycloack/karavan-realm.json b/karavan-cloud/docs/keycloack/karavan-realm.json
similarity index 100%
rename from karavan-cloud/keycloack/karavan-realm.json
rename to karavan-cloud/docs/keycloack/karavan-realm.json
diff --git a/karavan-cloud/minikube/karavan-app-ingress.yaml b/karavan-cloud/docs/minikube/karavan-app-ingress.yaml
similarity index 100%
rename from karavan-cloud/minikube/karavan-app-ingress.yaml
rename to karavan-cloud/docs/minikube/karavan-app-ingress.yaml
diff --git a/karavan-cloud/minikube/karavan-secret.yaml b/karavan-cloud/docs/minikube/karavan-secret.yaml
similarity index 100%
rename from karavan-cloud/minikube/karavan-secret.yaml
rename to karavan-cloud/docs/minikube/karavan-secret.yaml
diff --git a/karavan-cloud/minikube/karavan.yaml b/karavan-cloud/docs/minikube/karavan.yaml
similarity index 100%
rename from karavan-cloud/minikube/karavan.yaml
rename to karavan-cloud/docs/minikube/karavan.yaml
diff --git a/karavan-cloud/openshift/catalog.yaml b/karavan-cloud/docs/openshift/catalog.yaml
similarity index 100%
rename from karavan-cloud/openshift/catalog.yaml
rename to karavan-cloud/docs/openshift/catalog.yaml
diff --git a/karavan-cloud/openshift/gitea-operator.yaml b/karavan-cloud/docs/openshift/gitea-operator.yaml
similarity index 100%
rename from karavan-cloud/openshift/gitea-operator.yaml
rename to karavan-cloud/docs/openshift/gitea-operator.yaml
diff --git a/karavan-cloud/openshift/gitea.yaml b/karavan-cloud/docs/openshift/gitea.yaml
similarity index 100%
rename from karavan-cloud/openshift/gitea.yaml
rename to karavan-cloud/docs/openshift/gitea.yaml
diff --git a/karavan-cloud/openshift/karavan-operator.yaml b/karavan-cloud/docs/openshift/karavan-operator.yaml
similarity index 100%
rename from karavan-cloud/openshift/karavan-operator.yaml
rename to karavan-cloud/docs/openshift/karavan-operator.yaml
diff --git a/karavan-cloud/openshift/karavan-secret.yaml b/karavan-cloud/docs/openshift/karavan-secret.yaml
similarity index 100%
rename from karavan-cloud/openshift/karavan-secret.yaml
rename to karavan-cloud/docs/openshift/karavan-secret.yaml
diff --git a/karavan-cloud/openshift/karavan.yaml b/karavan-cloud/docs/openshift/karavan.yaml
similarity index 100%
rename from karavan-cloud/openshift/karavan.yaml
rename to karavan-cloud/docs/openshift/karavan.yaml
diff --git a/karavan-cloud/openshift/pipeline-operator.yaml b/karavan-cloud/docs/openshift/pipeline-operator.yaml
similarity index 100%
rename from karavan-cloud/openshift/pipeline-operator.yaml
rename to karavan-cloud/docs/openshift/pipeline-operator.yaml
diff --git a/karavan-app/.dockerignore b/karavan-cloud/karavan-app/.dockerignore
similarity index 100%
rename from karavan-app/.dockerignore
rename to karavan-cloud/karavan-app/.dockerignore
diff --git a/karavan-app/.mvn/wrapper/maven-wrapper.properties b/karavan-cloud/karavan-app/.mvn/wrapper/maven-wrapper.properties
similarity index 100%
copy from karavan-app/.mvn/wrapper/maven-wrapper.properties
copy to karavan-cloud/karavan-app/.mvn/wrapper/maven-wrapper.properties
diff --git a/karavan-app/Dockerfile.distroless.dockerignore b/karavan-cloud/karavan-app/Dockerfile.distroless.dockerignore
similarity index 100%
rename from karavan-app/Dockerfile.distroless.dockerignore
rename to karavan-cloud/karavan-app/Dockerfile.distroless.dockerignore
diff --git a/karavan-app/Dockerfile.legacy-jar.dockerignore b/karavan-cloud/karavan-app/Dockerfile.legacy-jar.dockerignore
similarity index 100%
rename from karavan-app/Dockerfile.legacy-jar.dockerignore
rename to karavan-cloud/karavan-app/Dockerfile.legacy-jar.dockerignore
diff --git a/karavan-app/Dockerfile.multistage.dockerignore b/karavan-cloud/karavan-app/Dockerfile.multistage.dockerignore
similarity index 100%
rename from karavan-app/Dockerfile.multistage.dockerignore
rename to karavan-cloud/karavan-app/Dockerfile.multistage.dockerignore
diff --git a/karavan-app/mvnw b/karavan-cloud/karavan-app/mvnw
similarity index 100%
copy from karavan-app/mvnw
copy to karavan-cloud/karavan-app/mvnw
diff --git a/karavan-app/mvnw.cmd b/karavan-cloud/karavan-app/mvnw.cmd
similarity index 100%
copy from karavan-app/mvnw.cmd
copy to karavan-cloud/karavan-app/mvnw.cmd
diff --git a/karavan-app/pom.xml b/karavan-cloud/karavan-app/pom.xml
similarity index 83%
copy from karavan-app/pom.xml
copy to karavan-cloud/karavan-app/pom.xml
index eb8d93c7..56f58bde 100644
--- a/karavan-app/pom.xml
+++ b/karavan-cloud/karavan-app/pom.xml
@@ -17,39 +17,20 @@
          xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <modelVersion>4.0.0</modelVersion>
-    <groupId>org.apache.camel.karavan</groupId>
-    <version>3.21.1-SNAPSHOT</version>
     <artifactId>karavan</artifactId>
-    <properties>
-        <compiler-plugin.version>3.10.1</compiler-plugin.version>
-        <maven.compiler.parameters>true</maven.compiler.parameters>
-        <maven.compiler.source>11</maven.compiler.source>
-        <maven.compiler.target>11</maven.compiler.target>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
-        <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
-        <quarkus.platform.version>2.16.7.Final</quarkus.platform.version>
-        <camel-quarkus.version>2.16.7</camel-quarkus.version>
-        <camel.version>3.21.0</camel.version>
-        <surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
-        <infinispan.version>14.0.6.Final</infinispan.version>
-        <tekton.version>6.3.1</tekton.version>
-        <jgit.version>2.3.1</jgit.version>
-        <quinoa.version>1.2.4</quinoa.version>
-    </properties>
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>${quarkus.platform.group-id}</groupId>
-                <artifactId>${quarkus.platform.artifact-id}</artifactId>
-                <version>${quarkus.platform.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
+    <parent>
+        <groupId>org.apache.camel.karavan</groupId>
+        <artifactId>karavan-cloud</artifactId>
+        <version>3.21.1-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
     <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.karavan</groupId>
+            <artifactId>karavan-datagrid</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-vertx</artifactId>
@@ -78,10 +59,6 @@
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-arc</artifactId>
         </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-scheduler</artifactId>
-        </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-smallrye-openapi</artifactId>
@@ -91,10 +68,6 @@
             <artifactId>quarkus-jgit</artifactId>
             <version>${jgit.version}</version>
         </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-infinispan-client</artifactId>
-        </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-kubernetes-client</artifactId>
@@ -132,11 +105,6 @@
             <artifactId>tekton-client</artifactId>
             <version>${tekton.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.infinispan</groupId>
-            <artifactId>infinispan-core</artifactId>
-            <version>${infinispan.version}</version>
-        </dependency>
         <dependency>
             <groupId>io.micrometer</groupId>
             <artifactId>micrometer-registry-prometheus</artifactId>
diff --git a/karavan-app/src/main/docker/Dockerfile.distroless b/karavan-cloud/karavan-app/src/main/docker/Dockerfile.distroless
similarity index 100%
rename from karavan-app/src/main/docker/Dockerfile.distroless
rename to karavan-cloud/karavan-app/src/main/docker/Dockerfile.distroless
diff --git a/karavan-app/src/main/docker/Dockerfile.legacy-jar b/karavan-cloud/karavan-app/src/main/docker/Dockerfile.legacy-jar
similarity index 100%
rename from karavan-app/src/main/docker/Dockerfile.legacy-jar
rename to karavan-cloud/karavan-app/src/main/docker/Dockerfile.legacy-jar
diff --git a/karavan-app/src/main/docker/Dockerfile.multistage b/karavan-cloud/karavan-app/src/main/docker/Dockerfile.multistage
similarity index 100%
rename from karavan-app/src/main/docker/Dockerfile.multistage
rename to karavan-cloud/karavan-app/src/main/docker/Dockerfile.multistage
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/AuthResource.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/AuthResource.java
similarity index 100%
rename from karavan-app/src/main/java/org/apache/camel/karavan/api/AuthResource.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/AuthResource.java
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/ComponentResources.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/ComponentResources.java
similarity index 100%
rename from karavan-app/src/main/java/org/apache/camel/karavan/api/ComponentResources.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/ComponentResources.java
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/ConfigurationResource.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/ConfigurationResource.java
similarity index 87%
rename from karavan-app/src/main/java/org/apache/camel/karavan/api/ConfigurationResource.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/ConfigurationResource.java
index 031829d3..486e8fba 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/ConfigurationResource.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/ConfigurationResource.java
@@ -16,7 +16,8 @@
  */
 package org.apache.camel.karavan.api;
 
-import org.apache.camel.karavan.service.InfinispanService;
+import org.apache.camel.karavan.datagrid.DatagridService;
+import org.apache.camel.karavan.service.KubernetesService;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 
 import javax.inject.Inject;
@@ -45,7 +46,10 @@ public class ConfigurationResource {
     List<String> runtimes;
 
     @Inject
-    InfinispanService infinispanService;
+    DatagridService datagridService;
+
+    @Inject
+    KubernetesService kubernetesService;
 
     @GET
     @Produces(MediaType.APPLICATION_JSON)
@@ -53,8 +57,9 @@ public class ConfigurationResource {
         return Response.ok(
                 Map.of(
                         "version", version,
+                        "inKubernetes", kubernetesService.inKubernetes(),
                         "environment", environment,
-                        "environments", infinispanService.getEnvironments().stream()
+                        "environments", datagridService.getEnvironments().stream()
                                 .map(e -> e.getName())
                                         .sorted((o1, o2) -> {
                                             if (o1.startsWith("dev") && o2.startsWith("test")) return -1;
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
similarity index 85%
rename from karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
index 9b5e1818..e3788f2c 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
@@ -16,10 +16,10 @@
  */
 package org.apache.camel.karavan.api;
 
-import org.apache.camel.karavan.model.Project;
-import org.apache.camel.karavan.model.ProjectFile;
+import org.apache.camel.karavan.datagrid.DatagridService;
+import org.apache.camel.karavan.datagrid.model.Project;
+import org.apache.camel.karavan.datagrid.model.ProjectFile;
 import org.apache.camel.karavan.service.CodeService;
-import org.apache.camel.karavan.service.InfinispanService;
 import org.yaml.snakeyaml.Yaml;
 
 import javax.inject.Inject;
@@ -36,7 +36,7 @@ import java.util.stream.Collectors;
 public class KameletResources {
 
     @Inject
-    InfinispanService infinispanService;
+    DatagridService datagridService;
 
     @Inject
     CodeService codeService;
@@ -45,7 +45,7 @@ public class KameletResources {
     @Produces(MediaType.TEXT_PLAIN)
     public String getKamelets() {
         StringBuilder kamelets = new StringBuilder(codeService.getResourceFile("/kamelets/kamelets.yaml"));
-        List<ProjectFile> custom = infinispanService.getProjectFiles(Project.NAME_KAMELETS);
+        List<ProjectFile> custom = datagridService.getProjectFiles(Project.NAME_KAMELETS);
         if (custom.size() > 0) {
             kamelets.append("\n---\n");
             kamelets.append(custom.stream()
@@ -60,7 +60,7 @@ public class KameletResources {
     @Path("/names")
     public List<String> getCustomNames() {
         Yaml yaml = new Yaml();
-        return infinispanService.getProjectFiles(Project.NAME_KAMELETS).stream()
+        return datagridService.getProjectFiles(Project.NAME_KAMELETS).stream()
                 .map(projectFile -> {
                     Map<String, LinkedHashMap> obj = yaml.load(projectFile.getCode());
                     LinkedHashMap<String, Object> metadata = obj.get("metadata");
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/KubernetesResource.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/KubernetesResource.java
similarity index 98%
rename from karavan-app/src/main/java/org/apache/camel/karavan/api/KubernetesResource.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/KubernetesResource.java
index 1e7b601b..572942fb 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/KubernetesResource.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/KubernetesResource.java
@@ -23,7 +23,6 @@ import org.apache.camel.karavan.model.DeploymentStatus;
 import org.apache.camel.karavan.model.PodStatus;
 import org.apache.camel.karavan.model.Project;
 import org.apache.camel.karavan.model.ServiceStatus;
-import org.apache.camel.karavan.service.InfinispanService;
 import org.apache.camel.karavan.service.KubernetesService;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
@@ -43,7 +42,7 @@ public class KubernetesResource {
     EventBus eventBus;
 
     @Inject
-    InfinispanService infinispanService;
+    DatagridService datagridService;
 
     @Inject
     KubernetesService kubernetesService;
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java
similarity index 100%
rename from karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
similarity index 97%
rename from karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
index 02dc7adf..651e6e67 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
@@ -18,7 +18,6 @@ package org.apache.camel.karavan.api;
 
 import org.apache.camel.karavan.model.ProjectFile;
 import org.apache.camel.karavan.service.CodeService;
-import org.apache.camel.karavan.service.InfinispanService;
 
 import javax.inject.Inject;
 import javax.ws.rs.Consumes;
@@ -41,7 +40,7 @@ import java.util.stream.Collectors;
 public class ProjectFileResource {
 
     @Inject
-    InfinispanService infinispanService;
+    DatagridService datagridService;
 
     @Inject
     CodeService codeService;
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java
similarity index 100%
rename from karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
similarity index 96%
rename from karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
index 0961e4a5..dde6c2cd 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
@@ -19,7 +19,6 @@ package org.apache.camel.karavan.api;
 import org.apache.camel.karavan.model.GroupedKey;
 import org.apache.camel.karavan.model.Project;
 import org.apache.camel.karavan.model.ProjectFile;
-import org.apache.camel.karavan.service.InfinispanService;
 import org.apache.camel.karavan.service.GitService;
 import javax.inject.Inject;
 import javax.ws.rs.Consumes;
@@ -33,7 +32,6 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import java.net.URLDecoder;
 import java.nio.charset.StandardCharsets;
-import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -42,7 +40,7 @@ import java.util.stream.Collectors;
 public class ProjectResource {
 
     @Inject
-    InfinispanService infinispanService;
+    DatagridService datagridService;
 
     @Inject
     GitService gitService;
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/RunnerResource.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/RunnerResource.java
similarity index 80%
rename from karavan-app/src/main/java/org/apache/camel/karavan/api/RunnerResource.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/RunnerResource.java
index 712be7d1..dcd9f04f 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/RunnerResource.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/RunnerResource.java
@@ -16,11 +16,8 @@
  */
 package org.apache.camel.karavan.api;
 
-import org.apache.camel.karavan.model.PodStatus;
-import org.apache.camel.karavan.model.Project;
-import org.apache.camel.karavan.model.RunnerCommand;
-import org.apache.camel.karavan.model.RunnerStatus;
-import org.apache.camel.karavan.service.InfinispanService;
+import org.apache.camel.karavan.datagrid.DatagridService;
+import org.apache.camel.karavan.datagrid.model.*;
 import org.apache.camel.karavan.service.RunnerService;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 
@@ -34,6 +31,7 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.time.Instant;
 import java.util.Optional;
 
 import static org.apache.camel.karavan.service.RunnerService.RUNNER_SUFFIX;
@@ -49,7 +47,7 @@ public class RunnerResource {
     RunnerService runnerServices;
 
     @Inject
-    InfinispanService infinispanService;
+    DatagridService datagridService;
 
     @POST
     @Produces(MediaType.APPLICATION_JSON)
@@ -57,10 +55,10 @@ public class RunnerResource {
     @Path("/{jBangOptions}")
     public Response runProjectWithJBangOptions(Project project, @PathParam("jBangOptions") String jBangOptions) {
         String runnerName = project.getProjectId() + "-" + RUNNER_SUFFIX;
-        String status = infinispanService.getRunnerStatus(runnerName, RunnerStatus.NAME.context);
+        PodStatus status = datagridService.getDevModePodStatuses(runnerName, environment);
         if (status == null) {
-            infinispanService.saveRunnerStatus(runnerName, STATUS_NEED_INITIAL_LOAD, STATUS_NEED_INITIAL_LOAD);
-            infinispanService.sendRunnerCommand(project.getProjectId(), RunnerCommand.NAME.run);
+            datagridService.saveDevModeStatus(new DevModeStatus(project.getProjectId(), null, false));
+            datagridService.sendDevModeCommand(project.getProjectId(), new DevModeCommand(CommandName.DELETE, Instant.now().toEpochMilli()));
             return Response.ok(runnerName).build();
         }
         return Response.notModified().build();
@@ -86,7 +84,7 @@ public class RunnerResource {
     @Consumes(MediaType.APPLICATION_JSON)
     @Path("/{projectId}/{deletePVC}")
     public Response deleteRunner(@PathParam("projectId") String projectId, @PathParam("deletePVC") boolean deletePVC) {
-        infinispanService.sendRunnerCommand(projectId, RunnerCommand.NAME.delete);
+        datagridService.sendDevModeCommand(projectId, new DevModeCommand(CommandName.DELETE, Instant.now().toEpochMilli()));
         return Response.accepted().build();
     }
 
@@ -95,7 +93,7 @@ public class RunnerResource {
     @Path("/pod/{projectId}")
     public Response getPodStatus(@PathParam("projectId") String projectId) {
         String runnerName = projectId + "-" + RUNNER_SUFFIX;
-        Optional<PodStatus> ps =  infinispanService.getPodStatuses(projectId, environment).stream()
+        Optional<PodStatus> ps =  datagridService.getPodStatuses(projectId, environment).stream()
                 .filter(podStatus -> podStatus.getName().equals(runnerName))
                 .findFirst();
         if (ps.isPresent()) {
@@ -110,7 +108,7 @@ public class RunnerResource {
     @Path("/console/{projectId}/{statusName}")
     public Response getCamelStatusByProjectAndEnv(@PathParam("projectId") String projectId, @PathParam("statusName") String statusName) {
         String name = projectId + "-" + RUNNER_SUFFIX;
-        String status = infinispanService.getRunnerStatus(name, RunnerStatus.NAME.valueOf(statusName));
+        CamelStatus status = datagridService.getCamelStatus(name, statusName, environment);
         if (status != null) {
             return Response.ok(status).build();
         } else {
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/SseResource.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/SseResource.java
similarity index 100%
rename from karavan-app/src/main/java/org/apache/camel/karavan/api/SseResource.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/SseResource.java
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java
similarity index 97%
rename from karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java
index c8fa5f0d..eaac70e3 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java
@@ -22,7 +22,6 @@ import org.apache.camel.karavan.model.CamelStatus;
 import org.apache.camel.karavan.model.DeploymentStatus;
 import org.apache.camel.karavan.model.Environment;
 import org.apache.camel.karavan.model.PipelineStatus;
-import org.apache.camel.karavan.service.InfinispanService;
 import org.apache.camel.karavan.service.StatusService;
 import org.jboss.logging.Logger;
 
@@ -43,7 +42,7 @@ public class StatusResource {
     private static final Logger LOGGER = Logger.getLogger(StatusResource.class.getName());
 
     @Inject
-    InfinispanService infinispanService;
+    DatagridService datagridService;
 
     @Inject
     EventBus bus;
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/UsersResource.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/UsersResource.java
similarity index 100%
rename from karavan-app/src/main/java/org/apache/camel/karavan/api/UsersResource.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/UsersResource.java
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/handler/DeploymentEventHandler.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/handler/DeploymentEventHandler.java
similarity index 83%
rename from karavan-app/src/main/java/org/apache/camel/karavan/handler/DeploymentEventHandler.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/handler/DeploymentEventHandler.java
index 2db98365..615e2e1e 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/handler/DeploymentEventHandler.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/handler/DeploymentEventHandler.java
@@ -2,19 +2,19 @@ package org.apache.camel.karavan.handler;
 
 import io.fabric8.kubernetes.api.model.apps.Deployment;
 import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
-import org.apache.camel.karavan.model.DeploymentStatus;
-import org.apache.camel.karavan.service.InfinispanService;
+import org.apache.camel.karavan.datagrid.DatagridService;
+import org.apache.camel.karavan.datagrid.model.DeploymentStatus;
 import org.apache.camel.karavan.service.KubernetesService;
 import org.jboss.logging.Logger;
 
 public class DeploymentEventHandler implements ResourceEventHandler<Deployment> {
 
     private static final Logger LOGGER = Logger.getLogger(DeploymentEventHandler.class.getName());
-    private final InfinispanService infinispanService;
+    private final DatagridService datagridService;
     private final KubernetesService kubernetesService;
 
-    public DeploymentEventHandler(InfinispanService infinispanService, KubernetesService kubernetesService) {
-        this.infinispanService = infinispanService;
+    public DeploymentEventHandler(DatagridService datagridService, KubernetesService kubernetesService) {
+        this.datagridService = datagridService;
         this.kubernetesService = kubernetesService;
     }
 
@@ -23,7 +23,7 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment>
         try {
             LOGGER.info("onAdd " + deployment.getMetadata().getName());
             DeploymentStatus ds = getDeploymentStatus(deployment);
-            infinispanService.saveDeploymentStatus(ds);
+            datagridService.saveDeploymentStatus(ds);
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
@@ -34,7 +34,7 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment>
         try {
             LOGGER.info("onUpdate " + newDeployment.getMetadata().getName());
             DeploymentStatus ds = getDeploymentStatus(newDeployment);
-            infinispanService.saveDeploymentStatus(ds);
+            datagridService.saveDeploymentStatus(ds);
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
@@ -49,8 +49,8 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment>
                     deployment.getMetadata().getNamespace(),
                     kubernetesService.getCluster(),
                     kubernetesService.environment);
-            infinispanService.deleteDeploymentStatus(ds);
-            infinispanService.deleteCamelStatus(ds.getName(), ds.getEnv());
+            datagridService.deleteDeploymentStatus(ds);
+            datagridService.deleteCamelStatus(ds.getName(), ds.getEnv());
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/handler/PipelineRunEventHandler.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/handler/PipelineRunEventHandler.java
similarity index 82%
rename from karavan-app/src/main/java/org/apache/camel/karavan/handler/PipelineRunEventHandler.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/handler/PipelineRunEventHandler.java
index 9f2c0038..25f1112f 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/handler/PipelineRunEventHandler.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/handler/PipelineRunEventHandler.java
@@ -2,9 +2,9 @@ package org.apache.camel.karavan.handler;
 
 import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
 import io.fabric8.tekton.pipeline.v1beta1.PipelineRun;
-import org.apache.camel.karavan.model.PipelineStatus;
-import org.apache.camel.karavan.model.Project;
-import org.apache.camel.karavan.service.InfinispanService;
+import org.apache.camel.karavan.datagrid.DatagridService;
+import org.apache.camel.karavan.datagrid.model.PipelineStatus;
+import org.apache.camel.karavan.datagrid.model.Project;
 import org.apache.camel.karavan.service.KubernetesService;
 import org.jboss.logging.Logger;
 
@@ -13,11 +13,11 @@ import java.time.Instant;
 public class PipelineRunEventHandler implements ResourceEventHandler<PipelineRun> {
 
     private static final Logger LOGGER = Logger.getLogger(PipelineRunEventHandler.class.getName());
-    private InfinispanService infinispanService;
+    private DatagridService datagridService;
     private KubernetesService kubernetesService;
 
-    public PipelineRunEventHandler(InfinispanService infinispanService, KubernetesService kubernetesService) {
-        this.infinispanService = infinispanService;
+    public PipelineRunEventHandler(DatagridService datagridService, KubernetesService kubernetesService) {
+        this.datagridService = datagridService;
         this.kubernetesService = kubernetesService;
     }
 
@@ -26,7 +26,7 @@ public class PipelineRunEventHandler implements ResourceEventHandler<PipelineRun
         try {
             LOGGER.info("onAdd " + pipelineRun.getMetadata().getName());
             PipelineStatus ps = getPipelineStatus(pipelineRun);
-            if (ps != null) infinispanService.savePipelineStatus(ps);
+            if (ps != null) datagridService.savePipelineStatus(ps);
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
@@ -37,7 +37,7 @@ public class PipelineRunEventHandler implements ResourceEventHandler<PipelineRun
         try {
             LOGGER.info("onUpdate " + newPipelineRun.getMetadata().getName());
             PipelineStatus ps = getPipelineStatus(newPipelineRun);
-            if (ps != null) infinispanService.savePipelineStatus(ps);
+            if (ps != null) datagridService.savePipelineStatus(ps);
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
@@ -49,10 +49,10 @@ public class PipelineRunEventHandler implements ResourceEventHandler<PipelineRun
             LOGGER.info("onDelete " + pipelineRun.getMetadata().getName());
             String projectId = pipelineRun.getMetadata().getLabels().get("karavan-project-id");
             if (projectId != null) {
-                Project project = infinispanService.getProject(projectId);
+                Project project = datagridService.getProject(projectId);
                 if (project != null) {
                     PipelineStatus ps = new PipelineStatus(project.getProjectId(), kubernetesService.environment);
-                    infinispanService.deletePipelineStatus(ps);
+                    datagridService.deletePipelineStatus(ps);
                 }
             }
         } catch (Exception e){
@@ -63,7 +63,7 @@ public class PipelineRunEventHandler implements ResourceEventHandler<PipelineRun
     public PipelineStatus getPipelineStatus( PipelineRun pipelineRun) {
         String projectId = pipelineRun.getMetadata().getLabels().get("karavan-project-id");
         if (projectId != null) {
-            Project project = infinispanService.getProject(projectId);
+            Project project = datagridService.getProject(projectId);
             if (project != null) {
                 PipelineStatus pipelineStatus = new PipelineStatus(project.getProjectId(), kubernetesService.environment);
 
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/handler/PodEventHandler.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/handler/PodEventHandler.java
similarity index 90%
rename from karavan-app/src/main/java/org/apache/camel/karavan/handler/PodEventHandler.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/handler/PodEventHandler.java
index 508c753d..604682fc 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/handler/PodEventHandler.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/handler/PodEventHandler.java
@@ -5,8 +5,8 @@ import io.fabric8.kubernetes.api.model.Pod;
 import io.fabric8.kubernetes.api.model.Quantity;
 import io.fabric8.kubernetes.api.model.ResourceRequirements;
 import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
-import org.apache.camel.karavan.model.PodStatus;
-import org.apache.camel.karavan.service.InfinispanService;
+import org.apache.camel.karavan.datagrid.DatagridService;
+import org.apache.camel.karavan.datagrid.model.PodStatus;
 import org.apache.camel.karavan.service.KubernetesService;
 import org.jboss.logging.Logger;
 
@@ -16,11 +16,11 @@ import static org.apache.camel.karavan.service.ServiceUtil.DEFAULT_CONTAINER_RES
 public class PodEventHandler implements ResourceEventHandler<Pod> {
 
     private static final Logger LOGGER = Logger.getLogger(PodEventHandler.class.getName());
-    private final InfinispanService infinispanService;
+    private final DatagridService datagridService;
     private final KubernetesService kubernetesService;
 
-    public PodEventHandler(InfinispanService infinispanService, KubernetesService kubernetesService) {
-        this.infinispanService = infinispanService;
+    public PodEventHandler(DatagridService datagridService, KubernetesService kubernetesService) {
+        this.datagridService = datagridService;
         this.kubernetesService = kubernetesService;
     }
 
@@ -29,7 +29,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
         try {
             LOGGER.info("onAdd " + pod.getMetadata().getName());
             PodStatus ps = getPodStatus(pod);
-            infinispanService.savePodStatus(ps);
+            datagridService.savePodStatus(ps);
         } catch (Exception e){
             LOGGER.error(e.getMessage(), e.getCause());
         }
@@ -40,7 +40,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
         try {
             LOGGER.info("onUpdate " + newPod.getMetadata().getName());
             PodStatus ps = getPodStatus(newPod);
-            infinispanService.savePodStatus(ps);
+            datagridService.savePodStatus(ps);
         } catch (Exception e){
             LOGGER.error(e.getMessage(), e.getCause());
         }
@@ -56,7 +56,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
                     pod.getMetadata().getName(),
                     project,
                     kubernetesService.environment);
-            infinispanService.deletePodStatus(ps);
+            datagridService.deletePodStatus(ps);
         } catch (Exception e){
             LOGGER.error(e.getMessage(), e.getCause());
         }
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/handler/ServiceEventHandler.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/handler/ServiceEventHandler.java
similarity index 84%
rename from karavan-app/src/main/java/org/apache/camel/karavan/handler/ServiceEventHandler.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/handler/ServiceEventHandler.java
index ac0343ca..8a4cfed5 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/handler/ServiceEventHandler.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/handler/ServiceEventHandler.java
@@ -2,19 +2,19 @@ package org.apache.camel.karavan.handler;
 
 import io.fabric8.kubernetes.api.model.Service;
 import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
-import org.apache.camel.karavan.model.ServiceStatus;
-import org.apache.camel.karavan.service.InfinispanService;
+import org.apache.camel.karavan.datagrid.DatagridService;
+import org.apache.camel.karavan.datagrid.model.ServiceStatus;
 import org.apache.camel.karavan.service.KubernetesService;
 import org.jboss.logging.Logger;
 
 public class ServiceEventHandler implements ResourceEventHandler<Service> {
 
     private static final Logger LOGGER = Logger.getLogger(ServiceEventHandler.class.getName());
-    private InfinispanService infinispanService;
+    private DatagridService datagridService;
     private KubernetesService kubernetesService;
 
-    public ServiceEventHandler(InfinispanService infinispanService, KubernetesService kubernetesService) {
-        this.infinispanService = infinispanService;
+    public ServiceEventHandler(DatagridService datagridService, KubernetesService kubernetesService) {
+        this.datagridService = datagridService;
         this.kubernetesService = kubernetesService;
     }
 
@@ -23,7 +23,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> {
         try {
             LOGGER.info("onAdd " + service.getMetadata().getName());
             ServiceStatus ds = getServiceStatus(service);
-            infinispanService.saveServiceStatus(ds);
+            datagridService.saveServiceStatus(ds);
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
@@ -34,7 +34,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> {
         try {
             LOGGER.info("onUpdate " + newService.getMetadata().getName());
             ServiceStatus ds = getServiceStatus(newService);
-            infinispanService.saveServiceStatus(ds);
+            datagridService.saveServiceStatus(ds);
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
@@ -49,7 +49,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> {
                     service.getMetadata().getNamespace(),
                     kubernetesService.getCluster(),
                     kubernetesService.environment);
-            infinispanService.deleteServiceStatus(ds);
+            datagridService.deleteServiceStatus(ds);
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/health/KaravanLiveness.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/health/KaravanLiveness.java
similarity index 100%
rename from karavan-app/src/main/java/org/apache/camel/karavan/health/KaravanLiveness.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/health/KaravanLiveness.java
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/listener/DevModeCommandListener.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/listener/DevModeCommandListener.java
new file mode 100644
index 00000000..1c7aed52
--- /dev/null
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/listener/DevModeCommandListener.java
@@ -0,0 +1,46 @@
+package org.apache.camel.karavan.listener;
+
+import io.quarkus.vertx.ConsumeEvent;
+import io.vertx.core.json.JsonObject;
+import org.apache.camel.karavan.datagrid.DatagridService;
+import org.apache.camel.karavan.datagrid.model.CommandName;
+import org.apache.camel.karavan.datagrid.model.DevModeCommand;
+import org.apache.camel.karavan.datagrid.model.Project;
+import org.apache.camel.karavan.service.KubernetesService;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+
+import java.util.Objects;
+
+import static org.apache.camel.karavan.service.RunnerService.RUNNER_SUFFIX;
+
+@ApplicationScoped
+public class DevModeCommandListener {
+
+    @ConfigProperty(name = "karavan.environment")
+    String environment;
+
+    @Inject
+    DatagridService datagridService;
+
+    @Inject
+    KubernetesService kubernetesService;
+
+    @ConsumeEvent(value = DatagridService.ADDRESS_DEVMODE_COMMAND, blocking = true, ordered = true)
+    void receiveCommand(JsonObject message) {
+        System.out.println("receiveCommand " + message);
+        if (kubernetesService.inKubernetes()) {
+            DevModeCommand command = message.mapTo(DevModeCommand.class);
+            String runnerName = command.getProjectId() + "-" + RUNNER_SUFFIX;
+            if (Objects.equals(command.getCommandName(), CommandName.RUN)) {
+                Project p = datagridService.getProject(command.getProjectId());
+                kubernetesService.tryCreateRunner(p, runnerName, "");
+            } else if (Objects.equals(command.getCommandName(), CommandName.DELETE)){
+                kubernetesService.deleteRunner(runnerName, false);
+                datagridService.deleteCamelStatus(command.getProjectId(), environment);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/AuthService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/AuthService.java
similarity index 100%
rename from karavan-app/src/main/java/org/apache/camel/karavan/service/AuthService.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/AuthService.java
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java
similarity index 95%
rename from karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java
index 489ae1c5..1c9ca5cb 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java
@@ -26,8 +26,9 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.generator.openapi.RestDslGenerator;
 import org.apache.camel.impl.lw.LightweightCamelContext;
 import org.apache.camel.karavan.api.KameletResources;
-import org.apache.camel.karavan.model.Project;
-import org.apache.camel.karavan.model.ProjectFile;
+import org.apache.camel.karavan.datagrid.DatagridService;
+import org.apache.camel.karavan.datagrid.model.Project;
+import org.apache.camel.karavan.datagrid.model.ProjectFile;
 import org.jboss.logging.Logger;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.constructor.SafeConstructor;
@@ -56,7 +57,7 @@ public class CodeService {
     KubernetesService kubernetesService;
 
     @Inject
-    InfinispanService infinispanService;
+    DatagridService datagridService;
 
     @Inject
     Engine engine;
@@ -80,7 +81,7 @@ public class CodeService {
 
     private String getTemplateText(String fileName) {
         try {
-            List<ProjectFile> files = infinispanService.getProjectFiles(Project.NAME_TEMPLATES);
+            List<ProjectFile> files = datagridService.getProjectFiles(Project.NAME_TEMPLATES);
             return files.stream().filter(f -> f.getName().equalsIgnoreCase(fileName))
                     .map(ProjectFile::getCode).findFirst().orElse(null);
         } catch (Exception e) {
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
similarity index 100%
rename from karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java
similarity index 87%
rename from karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java
index bd0feafd..b0b1f359 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java
@@ -19,7 +19,8 @@ package org.apache.camel.karavan.service;
 import io.quarkus.runtime.ShutdownEvent;
 import io.quarkus.runtime.StartupEvent;
 import io.vertx.core.eventbus.EventBus;
-import org.apache.camel.karavan.model.Environment;
+import org.apache.camel.karavan.datagrid.DatagridService;
+import org.apache.camel.karavan.datagrid.model.Environment;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
@@ -33,7 +34,7 @@ public class KaravanService {
     private static final Logger LOGGER = Logger.getLogger(KaravanService.class.getName());
 
     @Inject
-    InfinispanService infinispanService;
+    DatagridService datagridService;
 
     @Inject
     KubernetesService kubernetesService;
@@ -46,8 +47,8 @@ public class KaravanService {
 
     void onStart(@Observes StartupEvent ev) {
         LOGGER.info("Start Karavan");
-        infinispanService.start();
-        infinispanService.clearAllStatuses();
+        datagridService.start();
+        datagridService.clearAllStatuses();
         setEnvironment();
         initialImport();
         startInformers();
@@ -61,7 +62,7 @@ public class KaravanService {
     void setEnvironment() {
         String cluster = kubernetesService.getCluster();
         String namespace = kubernetesService.getNamespace();
-        infinispanService.saveEnvironment(new Environment(environment, cluster, namespace));
+        datagridService.saveEnvironment(new Environment(environment, cluster, namespace));
     }
 
     void initialImport() {
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java
similarity index 97%
rename from karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java
index 69203f3b..875120d8 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java
@@ -29,9 +29,10 @@ import io.fabric8.tekton.client.DefaultTektonClient;
 import io.fabric8.tekton.pipeline.v1beta1.*;
 import io.quarkus.vertx.ConsumeEvent;
 import io.vertx.mutiny.core.eventbus.EventBus;
+import org.apache.camel.karavan.datagrid.DatagridService;
+import org.apache.camel.karavan.datagrid.model.Project;
+import org.apache.camel.karavan.datagrid.model.ProjectFile;
 import org.apache.camel.karavan.handler.*;
-import org.apache.camel.karavan.model.Project;
-import org.apache.camel.karavan.model.ProjectFile;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.eclipse.microprofile.health.HealthCheck;
 import org.eclipse.microprofile.health.HealthCheckResponse;
@@ -67,7 +68,7 @@ public class KubernetesService implements HealthCheck {
     EventBus eventBus;
 
     @Inject
-    InfinispanService infinispanService;
+    DatagridService datagridService;
 
     @Produces
     public KubernetesClient kubernetesClient() {
@@ -103,22 +104,22 @@ public class KubernetesService implements HealthCheck {
 
             SharedIndexInformer<Deployment> deploymentInformer = kubernetesClient().apps().deployments().inNamespace(getNamespace())
                     .withLabels(getRuntimeLabels()).inform();
-            deploymentInformer.addEventHandlerWithResyncPeriod(new DeploymentEventHandler(infinispanService, this), 30 * 1000L);
+            deploymentInformer.addEventHandlerWithResyncPeriod(new DeploymentEventHandler(datagridService, this), 30 * 1000L);
             informers.add(deploymentInformer);
 
             SharedIndexInformer<Service> serviceInformer = kubernetesClient().services().inNamespace(getNamespace())
                     .withLabels(getRuntimeLabels()).inform();
-            serviceInformer.addEventHandlerWithResyncPeriod(new ServiceEventHandler(infinispanService, this), 30 * 1000L);
+            serviceInformer.addEventHandlerWithResyncPeriod(new ServiceEventHandler(datagridService, this), 30 * 1000L);
             informers.add(serviceInformer);
 
             SharedIndexInformer<PipelineRun> pipelineRunInformer = tektonClient().v1beta1().pipelineRuns().inNamespace(getNamespace())
                     .withLabels(getRuntimeLabels()).inform();
-            pipelineRunInformer.addEventHandlerWithResyncPeriod(new PipelineRunEventHandler(infinispanService, this), 30 * 1000L);
+            pipelineRunInformer.addEventHandlerWithResyncPeriod(new PipelineRunEventHandler(datagridService, this), 30 * 1000L);
             informers.add(pipelineRunInformer);
 
             SharedIndexInformer<Pod> podRunInformer = kubernetesClient().pods().inNamespace(getNamespace())
                     .withLabels(getRuntimeLabels()).inform();
-            podRunInformer.addEventHandlerWithResyncPeriod(new PodEventHandler(infinispanService, this), 30 * 1000L);
+            podRunInformer.addEventHandlerWithResyncPeriod(new PodEventHandler(datagridService, this), 30 * 1000L);
             informers.add(podRunInformer);
 
             LOGGER.info("Started Kubernetes Informers");
@@ -393,7 +394,7 @@ public class KubernetesService implements HealthCheck {
         createPVC(runnerName);
         Pod old = kubernetesClient().pods().inNamespace(getNamespace()).withName(runnerName).get();
         if (old == null) {
-            ProjectFile properties = infinispanService.getProjectFile(project.getProjectId(), APPLICATION_PROPERTIES_FILENAME);
+            ProjectFile properties = datagridService.getProjectFile(project.getProjectId(), APPLICATION_PROPERTIES_FILENAME);
             Map<String, String> containerResources = ServiceUtil
                     .getRunnerContainerResourcesMap(properties, isOpenshift(), project.getRuntime().equals("quarkus"));
             Pod pod = getRunnerPod(project.getProjectId(), runnerName, jBangOptions, containerResources);
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
similarity index 99%
rename from karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
index f3f7bd7e..16e7a71e 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
@@ -45,7 +45,7 @@ public class ProjectService implements HealthCheck{
     public static final String IMPORT_PROJECTS = "import-projects";
 
     @Inject
-    InfinispanService infinispanService;
+    DatagridService datagridService;
 
     @Inject
     KubernetesService kubernetesService;
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/RunnerService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/RunnerService.java
similarity index 84%
rename from karavan-app/src/main/java/org/apache/camel/karavan/service/RunnerService.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/RunnerService.java
index a0eefe52..6e1a4d2b 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/RunnerService.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/RunnerService.java
@@ -16,7 +16,6 @@
  */
 package org.apache.camel.karavan.service;
 
-import io.fabric8.kubernetes.api.model.Pod;
 import io.quarkus.scheduler.Scheduled;
 import io.quarkus.vertx.ConsumeEvent;
 import io.vertx.core.json.JsonObject;
@@ -25,10 +24,7 @@ import io.vertx.mutiny.core.buffer.Buffer;
 import io.vertx.mutiny.core.eventbus.EventBus;
 import io.vertx.mutiny.ext.web.client.HttpResponse;
 import io.vertx.mutiny.ext.web.client.WebClient;
-import org.apache.camel.karavan.model.PodStatus;
-import org.apache.camel.karavan.model.Project;
-import org.apache.camel.karavan.model.ProjectFile;
-import org.apache.camel.karavan.model.RunnerStatus;
+import org.apache.camel.karavan.datagrid.DatagridService;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.eclipse.microprofile.faulttolerance.CircuitBreaker;
 import org.jboss.logging.Logger;
@@ -36,11 +32,9 @@ import org.jboss.logging.Logger;
 import javax.enterprise.context.ApplicationScoped;
 import javax.inject.Inject;
 import java.util.Arrays;
-import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.ExecutionException;
 
-import static org.apache.camel.karavan.service.ServiceUtil.APPLICATION_PROPERTIES_FILENAME;
 
 @ApplicationScoped
 public class RunnerService {
@@ -51,7 +45,7 @@ public class RunnerService {
     public static final String STATUS_NEED_INITIAL_LOAD = "NEED_INITIAL_LOAD";
 
     @Inject
-    InfinispanService infinispanService;
+    DatagridService datagridService;
 
     @Inject
     KubernetesService kubernetesService;
@@ -78,12 +72,12 @@ public class RunnerService {
         LOGGER.info("Reload project code " + projectId);
         String runnerName = projectId + "-" + RUNNER_SUFFIX;
         try {
-            infinispanService.getProjectFiles(projectId).forEach(projectFile -> putRequest(runnerName, projectFile.getName(), projectFile.getCode(), 1000));
+            datagridService.getProjectFiles(projectId).forEach(projectFile -> putRequest(runnerName, projectFile.getName(), projectFile.getCode(), 1000));
             reloadRequest(runnerName);
         } catch (Exception ex) {
             LOGGER.error(ex.getMessage());
         }
-        infinispanService.deleteRunnerStatus(runnerName, STATUS_NEED_INITIAL_LOAD);
+        datagridService.deleteDevModeStatus(projectId);
     }
 
     @CircuitBreaker(requestVolumeThreshold = 10, failureRatio = 0.5, delay = 1000)
@@ -120,8 +114,8 @@ public class RunnerService {
     @Scheduled(every = "{karavan.runner-status-interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
     void collectRunnerStatus() {
         System.out.println("collectRunnerStatus");
-        if (infinispanService.call().getStatus().name().equals("UP")) {
-            infinispanService.getPodStatuses(environment).stream().filter(PodStatus::getRunner).forEach(podStatus -> {
+        if (datagridService.call().getStatus().name().equals("UP")) {
+            datagridService.getPodStatuses(environment).stream().filter(PodStatus::getRunner).forEach(podStatus -> {
                 eventBus.publish(CMD_COLLECT_RUNNER_STATUS, podStatus.getName());
             });
         }
@@ -129,21 +123,21 @@ public class RunnerService {
 
     @ConsumeEvent(value = CMD_COLLECT_RUNNER_STATUS, blocking = true, ordered = false)
     public void collectRunnerStatuses(String podName) {
-        String oldContext = infinispanService.getRunnerStatus(podName, RunnerStatus.NAME.context);
+        String oldContext = datagridService.getRunnerStatus(podName, RunnerStatus.NAME.context);
         String newContext = getRunnerStatus(podName, RunnerStatus.NAME.context);
         if (newContext != null) {
-            infinispanService.saveRunnerStatus(podName, RunnerStatus.NAME.context, newContext);
+            datagridService.saveRunnerStatus(podName, RunnerStatus.NAME.context, newContext);
             Arrays.stream(RunnerStatus.NAME.values())
                     .filter(name -> !name.equals(RunnerStatus.NAME.context))
                     .forEach(statusName -> {
                         String status = getRunnerStatus(podName, statusName);
                         if (status != null) {
-                            infinispanService.saveRunnerStatus(podName, statusName, status);
+                            datagridService.saveRunnerStatus(podName, statusName, status);
                         }
                     });
             reloadCode(podName, oldContext, newContext);
         } else {
-            infinispanService.deleteRunnerStatuses(podName);
+            datagridService.deleteRunnerStatuses(podName);
         }
     }
 
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/ServiceUtil.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/ServiceUtil.java
similarity index 96%
rename from karavan-app/src/main/java/org/apache/camel/karavan/service/ServiceUtil.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/ServiceUtil.java
index 54ffebb1..a6709d91 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/ServiceUtil.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/ServiceUtil.java
@@ -16,9 +16,9 @@
  */
 package org.apache.camel.karavan.service;
 
-import org.apache.camel.karavan.model.GitRepo;
-import org.apache.camel.karavan.model.GitRepoFile;
-import org.apache.camel.karavan.model.ProjectFile;
+import org.apache.camel.karavan.datagrid.model.GitRepo;
+import org.apache.camel.karavan.datagrid.model.GitRepoFile;
+import org.apache.camel.karavan.datagrid.model.ProjectFile;
 
 import java.util.*;
 import java.util.stream.Collectors;
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/StatusService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/StatusService.java
similarity index 74%
rename from karavan-app/src/main/java/org/apache/camel/karavan/service/StatusService.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/StatusService.java
index 99917a5e..9573d34a 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/StatusService.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/StatusService.java
@@ -25,10 +25,8 @@ import io.vertx.mutiny.core.buffer.Buffer;
 import io.vertx.mutiny.core.eventbus.EventBus;
 import io.vertx.mutiny.ext.web.client.HttpResponse;
 import io.vertx.mutiny.ext.web.client.WebClient;
-import org.apache.camel.karavan.model.CamelStatus;
-import org.apache.camel.karavan.model.DeploymentStatus;
-import org.apache.camel.karavan.model.Environment;
-import org.apache.camel.karavan.model.Project;
+import org.apache.camel.karavan.datagrid.DatagridService;
+import org.apache.camel.karavan.datagrid.model.*;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.eclipse.microprofile.faulttolerance.Retry;
 import org.eclipse.microprofile.faulttolerance.CircuitBreaker;
@@ -53,7 +51,7 @@ public class StatusService {
     public static final String CMD_SAVE_STATUS = "save-statuses";
 
     @Inject
-    InfinispanService infinispanService;
+    DatagridService datagridService;
 
     @Inject
     KubernetesService kubernetesService;
@@ -85,9 +83,9 @@ public class StatusService {
     public void collectProjectStatus(JsonObject data) {
         String projectId = data.getString("projectId");
         String env = data.getString("env");
-        Optional<Environment> environment = infinispanService.getEnvironments().stream().filter(e -> e.getName().equals(env)).findFirst();
+        Optional<Environment> environment = datagridService.getEnvironments().stream().filter(e -> e.getName().equals(env)).findFirst();
         if (environment.isPresent()){
-            DeploymentStatus status = infinispanService.getDeploymentStatus(projectId, environment.get().getNamespace(), environment.get().getCluster());
+            DeploymentStatus status = datagridService.getDeploymentStatus(projectId, environment.get().getNamespace(), environment.get().getCluster());
             if (status != null && status.getReadyReplicas() > 0) {
                 if ((System.currentTimeMillis() - lastCollect.getOrDefault(projectId, 0L)) > threshold) {
                     collectStatusesForProject(projectId);
@@ -101,7 +99,7 @@ public class StatusService {
     public void collectAllStatuses(String data) {
         String all = "ALL_PROJECTS";
         if ((System.currentTimeMillis() - lastCollect.getOrDefault(all, 0L)) > threshold) {
-            infinispanService.getDeploymentStatuses().forEach(d -> {
+            datagridService.getDeploymentStatuses().forEach(d -> {
                 eventBus.publish(CMD_COLLECT_PROJECT_STATUS, new JsonObject(Map.of("projectId", d.getName(), "env", d.getEnv())));
             });
             lastCollect.put(all, System.currentTimeMillis());
@@ -112,7 +110,7 @@ public class StatusService {
     public void saveStatus(String status) {
         try {
             CamelStatus cs = mapper.readValue(status, CamelStatus.class);
-            infinispanService.saveCamelStatus(cs);
+            datagridService.saveCamelStatus(cs);
         } catch (Exception ex) {
             LOGGER.error(ex.getMessage());
         }
@@ -120,7 +118,7 @@ public class StatusService {
 
     private void collectStatusesForProject(String projectId) {
         LOGGER.info("Collect Camel status for project " + projectId);
-        Project project = infinispanService.getProject(projectId);
+        Project project = datagridService.getProject(projectId);
         String runtime = project.getRuntime();
         String path = runtime.equalsIgnoreCase("quarkus") ? "/q/health" : "/actuator/health";
         String separator = ProfileManager.getActiveProfile().equals("dev") ? "-" : ".";
@@ -155,10 +153,8 @@ public class StatusService {
                     JsonObject context = checks.stream().filter(o -> Objects.equals(o.getString("name"), "context")).findFirst().get();
                     return new CamelStatus(
                             projectId,
-                            getQuarkusStatus(checks, "context"),
-                            getQuarkusStatus(checks, "camel-consumers"),
-                            getQuarkusStatus(checks, "camel-routes"),
-                            getQuarkusStatus(checks, "camel-registry"),
+                            null,
+                            CamelStatusName.context,
                             context.getJsonObject("data").getString("context.version"),
                             environment
                     );
@@ -169,44 +165,54 @@ public class StatusService {
 
                     return new CamelStatus(
                             projectId,
-                            getSpringStatus(details, "context"),
-                            getSpringStatus(details, "consumer"),
-                            getSpringStatus(details, "route"),
-                            CamelStatus.Status.UNDEFINED,
+                            null,
+                            CamelStatusName.context,
                             null,
                             environment
                     );
                 }
             } else {
-                return new CamelStatus(projectId, environment);
+                return new CamelStatus(
+                        projectId,
+                        null,
+                        CamelStatusName.context,
+                        null,
+                        environment
+                );
             }
         } catch (Exception ex) {
             LOGGER.error(ex.getMessage());
-            return new CamelStatus(projectId, environment);
-        }
-    }
-    private CamelStatus.Status getSpringStatus(JsonObject object, String name){
-        try {
-            String res = object.getString(name);
-            if (res == null) {
-                Optional<String> fname = object.fieldNames().stream().filter(fn -> fn.startsWith(name)).findFirst();
-                if (fname.isPresent()) {
-                    res = object.getString(fname.get());
-                }
-            }
-            return res.equals("UP") ? CamelStatus.Status.UP : CamelStatus.Status.DOWN;
-        } catch (Exception e){
-            return CamelStatus.Status.UNDEFINED;
-        }
-    }
-
-
-    private CamelStatus.Status getQuarkusStatus(List<JsonObject> checks, String name){
-        try {
-            JsonObject res = checks.stream().filter(o -> o.getString("name").equals(name)).findFirst().get();
-            return res.getString("status").equals("UP") ? CamelStatus.Status.UP : CamelStatus.Status.DOWN;
-        } catch (Exception e){
-            return CamelStatus.Status.UNDEFINED;
+            return new CamelStatus(
+                    projectId,
+                    null,
+                    CamelStatusName.context,
+                    null,
+                    environment
+            );
         }
     }
+//    private CamelStatus.Status getSpringStatus(JsonObject object, String name){
+//        try {
+//            String res = object.getString(name);
+//            if (res == null) {
+//                Optional<String> fname = object.fieldNames().stream().filter(fn -> fn.startsWith(name)).findFirst();
+//                if (fname.isPresent()) {
+//                    res = object.getString(fname.get());
+//                }
+//            }
+//            return res.equals("UP") ? CamelStatus.Status.UP : CamelStatus.Status.DOWN;
+//        } catch (Exception e){
+//            return CamelStatus.Status.UNDEFINED;
+//        }
+//    }
+
+
+//    private CamelStatus.Status getQuarkusStatus(List<JsonObject> checks, String name){
+//        try {
+//            JsonObject res = checks.stream().filter(o -> o.getString("name").equals(name)).findFirst().get();
+//            return res.getString("status").equals("UP") ? CamelStatus.Status.UP : CamelStatus.Status.DOWN;
+//        } catch (Exception e){
+//            return CamelStatus.Status.UNDEFINED;
+//        }
+//    }
 }
\ No newline at end of file
diff --git a/karavan-app/src/main/resources/application.properties b/karavan-cloud/karavan-app/src/main/resources/application.properties
similarity index 100%
rename from karavan-app/src/main/resources/application.properties
rename to karavan-cloud/karavan-app/src/main/resources/application.properties
diff --git a/karavan-app/src/main/resources/components/.gitignore b/karavan-cloud/karavan-app/src/main/resources/components/.gitignore
similarity index 100%
rename from karavan-app/src/main/resources/components/.gitignore
rename to karavan-cloud/karavan-app/src/main/resources/components/.gitignore
diff --git a/karavan-app/src/main/resources/kamelets/.gitignore b/karavan-cloud/karavan-app/src/main/resources/kamelets/.gitignore
similarity index 100%
rename from karavan-app/src/main/resources/kamelets/.gitignore
rename to karavan-cloud/karavan-app/src/main/resources/kamelets/.gitignore
diff --git a/karavan-app/src/main/resources/pipelines/karavan-pipeline-dev-quarkus.yaml b/karavan-cloud/karavan-app/src/main/resources/pipelines/karavan-pipeline-dev-quarkus.yaml
similarity index 100%
rename from karavan-app/src/main/resources/pipelines/karavan-pipeline-dev-quarkus.yaml
rename to karavan-cloud/karavan-app/src/main/resources/pipelines/karavan-pipeline-dev-quarkus.yaml
diff --git a/karavan-app/src/main/resources/pipelines/karavan-pipeline-dev-spring-boot.yaml b/karavan-cloud/karavan-app/src/main/resources/pipelines/karavan-pipeline-dev-spring-boot.yaml
similarity index 100%
rename from karavan-app/src/main/resources/pipelines/karavan-pipeline-dev-spring-boot.yaml
rename to karavan-cloud/karavan-app/src/main/resources/pipelines/karavan-pipeline-dev-spring-boot.yaml
diff --git a/karavan-app/src/main/resources/pipelines/karavan-task-dev-quarkus.yaml b/karavan-cloud/karavan-app/src/main/resources/pipelines/karavan-task-dev-quarkus.yaml
similarity index 100%
rename from karavan-app/src/main/resources/pipelines/karavan-task-dev-quarkus.yaml
rename to karavan-cloud/karavan-app/src/main/resources/pipelines/karavan-task-dev-quarkus.yaml
diff --git a/karavan-app/src/main/resources/pipelines/karavan-task-dev-spring-boot.yaml b/karavan-cloud/karavan-app/src/main/resources/pipelines/karavan-task-dev-spring-boot.yaml
similarity index 100%
rename from karavan-app/src/main/resources/pipelines/karavan-task-dev-spring-boot.yaml
rename to karavan-cloud/karavan-app/src/main/resources/pipelines/karavan-task-dev-spring-boot.yaml
diff --git a/karavan-app/src/main/resources/snippets/quarkus-kubernetes-application.properties b/karavan-cloud/karavan-app/src/main/resources/snippets/quarkus-kubernetes-application.properties
similarity index 100%
rename from karavan-app/src/main/resources/snippets/quarkus-kubernetes-application.properties
rename to karavan-cloud/karavan-app/src/main/resources/snippets/quarkus-kubernetes-application.properties
diff --git a/karavan-app/src/main/resources/snippets/quarkus-openshift-application.properties b/karavan-cloud/karavan-app/src/main/resources/snippets/quarkus-openshift-application.properties
similarity index 100%
rename from karavan-app/src/main/resources/snippets/quarkus-openshift-application.properties
rename to karavan-cloud/karavan-app/src/main/resources/snippets/quarkus-openshift-application.properties
diff --git a/karavan-app/src/main/resources/snippets/quarkus-org.apache.camel.AggregationStrategy.java b/karavan-cloud/karavan-app/src/main/resources/snippets/quarkus-org.apache.camel.AggregationStrategy.java
similarity index 100%
rename from karavan-app/src/main/resources/snippets/quarkus-org.apache.camel.AggregationStrategy.java
rename to karavan-cloud/karavan-app/src/main/resources/snippets/quarkus-org.apache.camel.AggregationStrategy.java
diff --git a/karavan-app/src/main/resources/snippets/quarkus-org.apache.camel.Processor.java b/karavan-cloud/karavan-app/src/main/resources/snippets/quarkus-org.apache.camel.Processor.java
similarity index 100%
rename from karavan-app/src/main/resources/snippets/quarkus-org.apache.camel.Processor.java
rename to karavan-cloud/karavan-app/src/main/resources/snippets/quarkus-org.apache.camel.Processor.java
diff --git a/karavan-app/src/main/resources/snippets/spring-boot-kubernetes-application.properties b/karavan-cloud/karavan-app/src/main/resources/snippets/spring-boot-kubernetes-application.properties
similarity index 100%
rename from karavan-app/src/main/resources/snippets/spring-boot-kubernetes-application.properties
rename to karavan-cloud/karavan-app/src/main/resources/snippets/spring-boot-kubernetes-application.properties
diff --git a/karavan-app/src/main/resources/snippets/spring-boot-openshift-application.properties b/karavan-cloud/karavan-app/src/main/resources/snippets/spring-boot-openshift-application.properties
similarity index 100%
rename from karavan-app/src/main/resources/snippets/spring-boot-openshift-application.properties
rename to karavan-cloud/karavan-app/src/main/resources/snippets/spring-boot-openshift-application.properties
diff --git a/karavan-app/src/main/resources/snippets/spring-boot-org.apache.camel.AggregationStrategy.java b/karavan-cloud/karavan-app/src/main/resources/snippets/spring-boot-org.apache.camel.AggregationStrategy.java
similarity index 100%
rename from karavan-app/src/main/resources/snippets/spring-boot-org.apache.camel.AggregationStrategy.java
rename to karavan-cloud/karavan-app/src/main/resources/snippets/spring-boot-org.apache.camel.AggregationStrategy.java
diff --git a/karavan-app/src/main/resources/snippets/spring-boot-org.apache.camel.Processor.java b/karavan-cloud/karavan-app/src/main/resources/snippets/spring-boot-org.apache.camel.Processor.java
similarity index 100%
rename from karavan-app/src/main/resources/snippets/spring-boot-org.apache.camel.Processor.java
rename to karavan-cloud/karavan-app/src/main/resources/snippets/spring-boot-org.apache.camel.Processor.java
diff --git a/karavan-app/src/main/webui/.gitignore b/karavan-cloud/karavan-app/src/main/webui/.gitignore
similarity index 100%
rename from karavan-app/src/main/webui/.gitignore
rename to karavan-cloud/karavan-app/src/main/webui/.gitignore
diff --git a/karavan-app/src/main/webui/package-lock.json b/karavan-cloud/karavan-app/src/main/webui/package-lock.json
similarity index 99%
rename from karavan-app/src/main/webui/package-lock.json
rename to karavan-cloud/karavan-app/src/main/webui/package-lock.json
index 2c544d86..3b0697d6 100644
--- a/karavan-app/src/main/webui/package-lock.json
+++ b/karavan-cloud/karavan-app/src/main/webui/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "karavan",
-  "version": "3.20.2-SNAPSHOT",
+  "version": "3.21.1-SNAPSHOT",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "karavan",
-      "version": "3.20.2-SNAPSHOT",
+      "version": "3.21.1-SNAPSHOT",
       "dependencies": {
         "@microsoft/fetch-event-source": "^2.0.1",
         "@monaco-editor/react": "4.5.0",
@@ -23,7 +23,7 @@
         "dagre": "0.8.5",
         "file-saver": "2.0.5",
         "html-to-image": "1.11.11",
-        "karavan-core": "file:../../../../karavan-core",
+        "karavan-core": "file:../../../../../karavan-core",
         "keycloak-js": "21.1.1",
         "react": "18.2.0",
         "react-dom": "18.2.0",
@@ -45,8 +45,30 @@
         "typescript": "^4.9.5"
       }
     },
+    "../../../../../karavan-core": {
+      "version": "3.21.1-SNAPSHOT",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@types/js-yaml": "^4.0.5",
+        "@types/uuid": "^8.3.4",
+        "typescript": "^4.9.4",
+        "uuid": "8.3.2"
+      },
+      "devDependencies": {
+        "@types/chai": "^4.3.0",
+        "@types/dagre": "^0.7.47",
+        "@types/mocha": "^9.1.0",
+        "@types/node": "^18.11.18",
+        "chai": "^4.3.4",
+        "cross-env": "^7.0.3",
+        "fs": "^0.0.1-security",
+        "mocha": "^9.2.0",
+        "ts-node": "^10.4.0"
+      }
+    },
     "../../../../karavan-core": {
       "version": "3.20.2-SNAPSHOT",
+      "extraneous": true,
       "license": "Apache-2.0",
       "dependencies": {
         "@types/js-yaml": "^4.0.5",
@@ -12660,7 +12682,7 @@
       }
     },
     "node_modules/karavan-core": {
-      "resolved": "../../../../karavan-core",
+      "resolved": "../../../../../karavan-core",
       "link": true
     },
     "node_modules/keycloak-js": {
diff --git a/karavan-app/src/main/webui/package.json b/karavan-cloud/karavan-app/src/main/webui/package.json
similarity index 85%
rename from karavan-app/src/main/webui/package.json
rename to karavan-cloud/karavan-app/src/main/webui/package.json
index bcdde439..35bc5da2 100644
--- a/karavan-app/src/main/webui/package.json
+++ b/karavan-cloud/karavan-app/src/main/webui/package.json
@@ -3,7 +3,7 @@
   "version": "3.21.1-SNAPSHOT",
   "private": true,
   "scripts": {
-    "copy-designer": "cp -r ../../../../karavan-designer/src/designer src && cp -r ../../../../karavan-designer/src/kamelets src && cp -r ../../../../karavan-designer/src/components src && cp -r ../../../../karavan-designer/src/eip src",
+    "copy-designer": "cp -r ../../../../../karavan-designer/src/designer src && cp -r ../../../../../karavan-designer/src/kamelets src && cp -r ../../../../../karavan-designer/src/components src && cp -r ../../../../../karavan-designer/src/eip src",
     "start": "npm run copy-designer && react-scripts start",
     "build": "npm run copy-designer && DISABLE_ESLINT_PLUGIN=true react-scripts build"
   },
@@ -41,7 +41,7 @@
     "dagre": "0.8.5",
     "file-saver": "2.0.5",
     "html-to-image": "1.11.11",
-    "karavan-core": "file:../../../../karavan-core",
+    "karavan-core": "file:../../../../../karavan-core",
     "keycloak-js": "21.1.1",
     "react": "18.2.0",
     "react-dom": "18.2.0",
diff --git a/karavan-app/src/main/webui/public/favicon.ico b/karavan-cloud/karavan-app/src/main/webui/public/favicon.ico
similarity index 100%
rename from karavan-app/src/main/webui/public/favicon.ico
rename to karavan-cloud/karavan-app/src/main/webui/public/favicon.ico
diff --git a/karavan-app/src/main/webui/public/index.html b/karavan-cloud/karavan-app/src/main/webui/public/index.html
similarity index 100%
rename from karavan-app/src/main/webui/public/index.html
rename to karavan-cloud/karavan-app/src/main/webui/public/index.html
diff --git a/karavan-app/src/main/webui/public/karavan-logo-light.png b/karavan-cloud/karavan-app/src/main/webui/public/karavan-logo-light.png
similarity index 100%
rename from karavan-app/src/main/webui/public/karavan-logo-light.png
rename to karavan-cloud/karavan-app/src/main/webui/public/karavan-logo-light.png
diff --git a/karavan-app/src/main/webui/public/manifest.json b/karavan-cloud/karavan-app/src/main/webui/public/manifest.json
similarity index 100%
rename from karavan-app/src/main/webui/public/manifest.json
rename to karavan-cloud/karavan-app/src/main/webui/public/manifest.json
diff --git a/karavan-app/src/main/webui/public/robots.txt b/karavan-cloud/karavan-app/src/main/webui/public/robots.txt
similarity index 100%
rename from karavan-app/src/main/webui/public/robots.txt
rename to karavan-cloud/karavan-app/src/main/webui/public/robots.txt
diff --git a/karavan-app/src/main/webui/src/Logo.tsx b/karavan-cloud/karavan-app/src/main/webui/src/Logo.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/Logo.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/Logo.tsx
diff --git a/karavan-app/src/main/webui/src/Main.tsx b/karavan-cloud/karavan-app/src/main/webui/src/Main.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/Main.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/Main.tsx
diff --git a/karavan-app/src/main/webui/src/MainLogin.tsx b/karavan-cloud/karavan-app/src/main/webui/src/MainLogin.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/MainLogin.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/MainLogin.tsx
diff --git a/karavan-app/src/main/webui/src/Notification.tsx b/karavan-cloud/karavan-app/src/main/webui/src/Notification.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/Notification.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/Notification.tsx
diff --git a/karavan-app/src/main/webui/src/api/KaravanApi.tsx b/karavan-cloud/karavan-app/src/main/webui/src/api/KaravanApi.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/api/KaravanApi.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/api/KaravanApi.tsx
diff --git a/karavan-app/src/main/webui/src/api/ProjectEventBus.ts b/karavan-cloud/karavan-app/src/main/webui/src/api/ProjectEventBus.ts
similarity index 100%
rename from karavan-app/src/main/webui/src/api/ProjectEventBus.ts
rename to karavan-cloud/karavan-app/src/main/webui/src/api/ProjectEventBus.ts
diff --git a/karavan-app/src/main/webui/src/api/ProjectModels.ts b/karavan-cloud/karavan-app/src/main/webui/src/api/ProjectModels.ts
similarity index 99%
rename from karavan-app/src/main/webui/src/api/ProjectModels.ts
rename to karavan-cloud/karavan-app/src/main/webui/src/api/ProjectModels.ts
index 852cab1a..07bbee92 100644
--- a/karavan-app/src/main/webui/src/api/ProjectModels.ts
+++ b/karavan-cloud/karavan-app/src/main/webui/src/api/ProjectModels.ts
@@ -2,6 +2,7 @@ import {v4 as uuidv4} from "uuid";
 
 export class AppConfig {
     version: string = '';
+    inKubernetes: boolean = true;
     environment: string = '';
     environments: string[] = [];
     runtime: string = '';
diff --git a/karavan-app/src/main/webui/src/api/ProjectService.ts b/karavan-cloud/karavan-app/src/main/webui/src/api/ProjectService.ts
similarity index 100%
rename from karavan-app/src/main/webui/src/api/ProjectService.ts
rename to karavan-cloud/karavan-app/src/main/webui/src/api/ProjectService.ts
diff --git a/karavan-app/src/main/webui/src/api/ProjectStore.ts b/karavan-cloud/karavan-app/src/main/webui/src/api/ProjectStore.ts
similarity index 100%
rename from karavan-app/src/main/webui/src/api/ProjectStore.ts
rename to karavan-cloud/karavan-app/src/main/webui/src/api/ProjectStore.ts
diff --git a/karavan-app/src/main/webui/src/api/SsoApi.tsx b/karavan-cloud/karavan-app/src/main/webui/src/api/SsoApi.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/api/SsoApi.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/api/SsoApi.tsx
diff --git a/karavan-app/src/main/webui/src/common/MainToolbar.tsx b/karavan-cloud/karavan-app/src/main/webui/src/common/MainToolbar.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/common/MainToolbar.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/common/MainToolbar.tsx
diff --git a/karavan-app/src/main/webui/src/components/ComponentCard.tsx b/karavan-cloud/karavan-app/src/main/webui/src/components/ComponentCard.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/components/ComponentCard.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/components/ComponentCard.tsx
diff --git a/karavan-app/src/main/webui/src/components/ComponentModal.tsx b/karavan-cloud/karavan-app/src/main/webui/src/components/ComponentModal.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/components/ComponentModal.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/components/ComponentModal.tsx
diff --git a/karavan-app/src/main/webui/src/components/ComponentsPage.tsx b/karavan-cloud/karavan-app/src/main/webui/src/components/ComponentsPage.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/components/ComponentsPage.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/components/ComponentsPage.tsx
diff --git a/karavan-app/src/main/webui/src/config/ConfigurationPage.tsx b/karavan-cloud/karavan-app/src/main/webui/src/config/ConfigurationPage.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/config/ConfigurationPage.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/config/ConfigurationPage.tsx
diff --git a/karavan-app/src/main/webui/src/dashboard/DashboardPage.tsx b/karavan-cloud/karavan-app/src/main/webui/src/dashboard/DashboardPage.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/dashboard/DashboardPage.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/dashboard/DashboardPage.tsx
diff --git a/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx
diff --git a/karavan-app/src/main/webui/src/designer/beans/BeanCard.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/beans/BeanCard.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/beans/BeanCard.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/beans/BeanCard.tsx
diff --git a/karavan-app/src/main/webui/src/designer/beans/BeanProperties.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/beans/BeanProperties.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/beans/BeanProperties.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/beans/BeanProperties.tsx
diff --git a/karavan-app/src/main/webui/src/designer/beans/BeansDesigner.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/beans/BeansDesigner.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/beans/BeansDesigner.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/beans/BeansDesigner.tsx
diff --git a/karavan-app/src/main/webui/src/designer/karavan.css b/karavan-cloud/karavan-app/src/main/webui/src/designer/karavan.css
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/karavan.css
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/karavan.css
diff --git a/karavan-app/src/main/webui/src/designer/rest/RestCard.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/rest/RestCard.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/rest/RestCard.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/rest/RestCard.tsx
diff --git a/karavan-app/src/main/webui/src/designer/rest/RestConfigurationCard.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/rest/RestConfigurationCard.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/rest/RestConfigurationCard.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/rest/RestConfigurationCard.tsx
diff --git a/karavan-app/src/main/webui/src/designer/rest/RestDesigner.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/rest/RestDesigner.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/rest/RestDesigner.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/rest/RestDesigner.tsx
diff --git a/karavan-app/src/main/webui/src/designer/rest/RestMethodCard.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/rest/RestMethodCard.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/rest/RestMethodCard.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/rest/RestMethodCard.tsx
diff --git a/karavan-app/src/main/webui/src/designer/rest/RestMethodSelector.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/rest/RestMethodSelector.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/rest/RestMethodSelector.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/rest/RestMethodSelector.tsx
diff --git a/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/route/DslConnections.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx
diff --git a/karavan-app/src/main/webui/src/designer/route/DslElement.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/route/DslElement.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/route/DslElement.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/route/DslElement.tsx
diff --git a/karavan-app/src/main/webui/src/designer/route/DslProperties.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/route/DslProperties.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/route/DslProperties.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/route/DslProperties.tsx
diff --git a/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/route/DslSelector.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx
diff --git a/karavan-app/src/main/webui/src/designer/route/RouteDesigner.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/route/RouteDesigner.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/route/RouteDesigner.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/route/RouteDesigner.tsx
diff --git a/karavan-app/src/main/webui/src/designer/route/RouteDesignerLogic.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/route/RouteDesignerLogic.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/route/RouteDesignerLogic.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/route/RouteDesignerLogic.tsx
diff --git a/karavan-app/src/main/webui/src/designer/route/property/ComponentParameterField.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/ComponentParameterField.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/route/property/ComponentParameterField.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/ComponentParameterField.tsx
diff --git a/karavan-app/src/main/webui/src/designer/route/property/DataFormatField.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/DataFormatField.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/route/property/DataFormatField.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/DataFormatField.tsx
diff --git a/karavan-app/src/main/webui/src/designer/route/property/DslPropertyField.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/DslPropertyField.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/route/property/DslPropertyField.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/DslPropertyField.tsx
diff --git a/karavan-app/src/main/webui/src/designer/route/property/ExpressionField.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/ExpressionField.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/route/property/ExpressionField.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/ExpressionField.tsx
diff --git a/karavan-app/src/main/webui/src/designer/route/property/KameletPropertyField.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/KameletPropertyField.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/route/property/KameletPropertyField.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/KameletPropertyField.tsx
diff --git a/karavan-app/src/main/webui/src/designer/route/property/KubernetesSelector.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/KubernetesSelector.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/route/property/KubernetesSelector.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/KubernetesSelector.tsx
diff --git a/karavan-app/src/main/webui/src/designer/route/property/ModalEditor.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/ModalEditor.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/route/property/ModalEditor.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/ModalEditor.tsx
diff --git a/karavan-app/src/main/webui/src/designer/route/property/ObjectField.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/ObjectField.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/route/property/ObjectField.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/route/property/ObjectField.tsx
diff --git a/karavan-app/src/main/webui/src/designer/templates/TemplatesDesigner.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/templates/TemplatesDesigner.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/templates/TemplatesDesigner.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/templates/TemplatesDesigner.tsx
diff --git a/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx
diff --git a/karavan-app/src/main/webui/src/designer/utils/DslMetaModel.ts b/karavan-cloud/karavan-app/src/main/webui/src/designer/utils/DslMetaModel.ts
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/utils/DslMetaModel.ts
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/utils/DslMetaModel.ts
diff --git a/karavan-app/src/main/webui/src/designer/utils/EventBus.ts b/karavan-cloud/karavan-app/src/main/webui/src/designer/utils/EventBus.ts
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/utils/EventBus.ts
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/utils/EventBus.ts
diff --git a/karavan-app/src/main/webui/src/designer/utils/KaravanComponents.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/utils/KaravanComponents.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/utils/KaravanComponents.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/utils/KaravanComponents.tsx
diff --git a/karavan-app/src/main/webui/src/designer/utils/KaravanIcons.tsx b/karavan-cloud/karavan-app/src/main/webui/src/designer/utils/KaravanIcons.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/utils/KaravanIcons.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/utils/KaravanIcons.tsx
diff --git a/karavan-app/src/main/webui/src/designer/utils/KubernetesAPI.ts b/karavan-cloud/karavan-app/src/main/webui/src/designer/utils/KubernetesAPI.ts
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/utils/KubernetesAPI.ts
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/utils/KubernetesAPI.ts
diff --git a/karavan-app/src/main/webui/src/designer/utils/MediaTypes.ts b/karavan-cloud/karavan-app/src/main/webui/src/designer/utils/MediaTypes.ts
similarity index 100%
rename from karavan-app/src/main/webui/src/designer/utils/MediaTypes.ts
rename to karavan-cloud/karavan-app/src/main/webui/src/designer/utils/MediaTypes.ts
diff --git a/karavan-app/src/main/webui/src/eip/EipCard.tsx b/karavan-cloud/karavan-app/src/main/webui/src/eip/EipCard.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/eip/EipCard.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/eip/EipCard.tsx
diff --git a/karavan-app/src/main/webui/src/eip/EipModal.tsx b/karavan-cloud/karavan-app/src/main/webui/src/eip/EipModal.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/eip/EipModal.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/eip/EipModal.tsx
diff --git a/karavan-app/src/main/webui/src/eip/EipPage.tsx b/karavan-cloud/karavan-app/src/main/webui/src/eip/EipPage.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/eip/EipPage.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/eip/EipPage.tsx
diff --git a/karavan-app/src/main/webui/src/index.css b/karavan-cloud/karavan-app/src/main/webui/src/index.css
similarity index 100%
rename from karavan-app/src/main/webui/src/index.css
rename to karavan-cloud/karavan-app/src/main/webui/src/index.css
diff --git a/karavan-app/src/main/webui/src/index.tsx b/karavan-cloud/karavan-app/src/main/webui/src/index.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/index.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/index.tsx
diff --git a/karavan-app/src/main/webui/src/kamelets/KameletCard.tsx b/karavan-cloud/karavan-app/src/main/webui/src/kamelets/KameletCard.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/kamelets/KameletCard.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/kamelets/KameletCard.tsx
diff --git a/karavan-app/src/main/webui/src/kamelets/KameletModal.tsx b/karavan-cloud/karavan-app/src/main/webui/src/kamelets/KameletModal.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/kamelets/KameletModal.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/kamelets/KameletModal.tsx
diff --git a/karavan-app/src/main/webui/src/kamelets/KameletsPage.tsx b/karavan-cloud/karavan-app/src/main/webui/src/kamelets/KameletsPage.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/kamelets/KameletsPage.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/kamelets/KameletsPage.tsx
diff --git a/karavan-app/src/main/webui/src/project/ProjectPage.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/ProjectPage.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/ProjectPage.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/ProjectPage.tsx
diff --git a/karavan-app/src/main/webui/src/project/ProjectPanel.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/ProjectPanel.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/ProjectPanel.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/ProjectPanel.tsx
diff --git a/karavan-app/src/main/webui/src/project/ProjectTitle.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/ProjectTitle.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/ProjectTitle.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/ProjectTitle.tsx
diff --git a/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/ProjectToolbar.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx
diff --git a/karavan-app/src/main/webui/src/project/RunnerToolbar.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/RunnerToolbar.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/RunnerToolbar.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/RunnerToolbar.tsx
diff --git a/karavan-app/src/main/webui/src/project/dashboard/DashboardTab.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/dashboard/DashboardTab.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/dashboard/DashboardTab.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/dashboard/DashboardTab.tsx
diff --git a/karavan-app/src/main/webui/src/project/dashboard/RunnerInfoContext.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/dashboard/RunnerInfoContext.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/dashboard/RunnerInfoContext.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/dashboard/RunnerInfoContext.tsx
diff --git a/karavan-app/src/main/webui/src/project/dashboard/RunnerInfoMemory.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/dashboard/RunnerInfoMemory.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/dashboard/RunnerInfoMemory.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/dashboard/RunnerInfoMemory.tsx
diff --git a/karavan-app/src/main/webui/src/project/dashboard/RunnerInfoPod.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/dashboard/RunnerInfoPod.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/dashboard/RunnerInfoPod.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/dashboard/RunnerInfoPod.tsx
diff --git a/karavan-app/src/main/webui/src/project/file/FileEditor.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/file/FileEditor.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/file/FileEditor.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/file/FileEditor.tsx
diff --git a/karavan-app/src/main/webui/src/project/file/PropertiesTable.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/file/PropertiesTable.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/file/PropertiesTable.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/file/PropertiesTable.tsx
diff --git a/karavan-app/src/main/webui/src/project/file/PropertyField.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/file/PropertyField.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/file/PropertyField.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/file/PropertyField.tsx
diff --git a/karavan-app/src/main/webui/src/project/files/CreateFileModal.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/files/CreateFileModal.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/files/CreateFileModal.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/files/CreateFileModal.tsx
diff --git a/karavan-app/src/main/webui/src/project/files/DeleteFileModal.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/files/DeleteFileModal.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/files/DeleteFileModal.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/files/DeleteFileModal.tsx
diff --git a/karavan-app/src/main/webui/src/project/files/FilesTab.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/files/FilesTab.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/files/FilesTab.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/files/FilesTab.tsx
diff --git a/karavan-app/src/main/webui/src/project/files/FilesToolbar.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/files/FilesToolbar.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/files/FilesToolbar.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/files/FilesToolbar.tsx
diff --git a/karavan-app/src/main/webui/src/project/files/UploadFileModal.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/files/UploadFileModal.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/files/UploadFileModal.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/files/UploadFileModal.tsx
diff --git a/karavan-app/src/main/webui/src/project/log/ProjectLog.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/log/ProjectLog.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/log/ProjectLog.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/log/ProjectLog.tsx
diff --git a/karavan-app/src/main/webui/src/project/log/ProjectLogPanel.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/log/ProjectLogPanel.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/log/ProjectLogPanel.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/log/ProjectLogPanel.tsx
diff --git a/karavan-app/src/main/webui/src/project/pipeline/ProjectPipelineTab.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/pipeline/ProjectPipelineTab.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/pipeline/ProjectPipelineTab.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/pipeline/ProjectPipelineTab.tsx
diff --git a/karavan-app/src/main/webui/src/project/pipeline/ProjectStatus.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/pipeline/ProjectStatus.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/pipeline/ProjectStatus.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/pipeline/ProjectStatus.tsx
diff --git a/karavan-app/src/main/webui/src/project/trace/RunnerInfoTraceModal.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/trace/RunnerInfoTraceModal.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/trace/RunnerInfoTraceModal.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/trace/RunnerInfoTraceModal.tsx
diff --git a/karavan-app/src/main/webui/src/project/trace/RunnerInfoTraceNode.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/trace/RunnerInfoTraceNode.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/trace/RunnerInfoTraceNode.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/trace/RunnerInfoTraceNode.tsx
diff --git a/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx b/karavan-cloud/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/project/trace/TraceTab.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx
diff --git a/karavan-app/src/main/webui/src/projects/CreateProjectModal.tsx b/karavan-cloud/karavan-app/src/main/webui/src/projects/CreateProjectModal.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/projects/CreateProjectModal.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/projects/CreateProjectModal.tsx
diff --git a/karavan-app/src/main/webui/src/projects/DeleteProjectModal.tsx b/karavan-cloud/karavan-app/src/main/webui/src/projects/DeleteProjectModal.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/projects/DeleteProjectModal.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/projects/DeleteProjectModal.tsx
diff --git a/karavan-app/src/main/webui/src/projects/ProjectsPage.tsx b/karavan-cloud/karavan-app/src/main/webui/src/projects/ProjectsPage.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/projects/ProjectsPage.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/projects/ProjectsPage.tsx
diff --git a/karavan-app/src/main/webui/src/projects/ProjectsTableRow.tsx b/karavan-cloud/karavan-app/src/main/webui/src/projects/ProjectsTableRow.tsx
similarity index 100%
rename from karavan-app/src/main/webui/src/projects/ProjectsTableRow.tsx
rename to karavan-cloud/karavan-app/src/main/webui/src/projects/ProjectsTableRow.tsx
diff --git a/karavan-app/src/main/webui/src/react-app-env.d.ts b/karavan-cloud/karavan-app/src/main/webui/src/react-app-env.d.ts
similarity index 100%
rename from karavan-app/src/main/webui/src/react-app-env.d.ts
rename to karavan-cloud/karavan-app/src/main/webui/src/react-app-env.d.ts
diff --git a/karavan-app/src/main/webui/tsconfig.json b/karavan-cloud/karavan-app/src/main/webui/tsconfig.json
similarity index 100%
rename from karavan-app/src/main/webui/tsconfig.json
rename to karavan-cloud/karavan-app/src/main/webui/tsconfig.json
diff --git a/karavan-bashi/.dockerignore b/karavan-cloud/karavan-bashi/.dockerignore
similarity index 100%
rename from karavan-bashi/.dockerignore
rename to karavan-cloud/karavan-bashi/.dockerignore
diff --git a/karavan-bashi/.gitignore b/karavan-cloud/karavan-bashi/.gitignore
similarity index 100%
rename from karavan-bashi/.gitignore
rename to karavan-cloud/karavan-bashi/.gitignore
diff --git a/karavan-bashi/.mvn/wrapper/.gitignore b/karavan-cloud/karavan-bashi/.mvn/wrapper/.gitignore
similarity index 100%
rename from karavan-bashi/.mvn/wrapper/.gitignore
rename to karavan-cloud/karavan-bashi/.mvn/wrapper/.gitignore
diff --git a/karavan-bashi/.mvn/wrapper/MavenWrapperDownloader.java b/karavan-cloud/karavan-bashi/.mvn/wrapper/MavenWrapperDownloader.java
similarity index 100%
rename from karavan-bashi/.mvn/wrapper/MavenWrapperDownloader.java
rename to karavan-cloud/karavan-bashi/.mvn/wrapper/MavenWrapperDownloader.java
diff --git a/karavan-bashi/.mvn/wrapper/maven-wrapper.properties b/karavan-cloud/karavan-bashi/.mvn/wrapper/maven-wrapper.properties
similarity index 100%
rename from karavan-bashi/.mvn/wrapper/maven-wrapper.properties
rename to karavan-cloud/karavan-bashi/.mvn/wrapper/maven-wrapper.properties
diff --git a/karavan-bashi/mvnw b/karavan-cloud/karavan-bashi/mvnw
similarity index 100%
rename from karavan-bashi/mvnw
rename to karavan-cloud/karavan-bashi/mvnw
diff --git a/karavan-bashi/mvnw.cmd b/karavan-cloud/karavan-bashi/mvnw.cmd
similarity index 100%
rename from karavan-bashi/mvnw.cmd
rename to karavan-cloud/karavan-bashi/mvnw.cmd
diff --git a/karavan-bashi/pom.xml b/karavan-cloud/karavan-bashi/pom.xml
similarity index 79%
rename from karavan-bashi/pom.xml
rename to karavan-cloud/karavan-bashi/pom.xml
index f13a3ce5..469f8942 100644
--- a/karavan-bashi/pom.xml
+++ b/karavan-cloud/karavan-bashi/pom.xml
@@ -2,32 +2,15 @@
 <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <modelVersion>4.0.0</modelVersion>
-    <groupId>org.apache.camel.karavan</groupId>
     <artifactId>karavan-bashi</artifactId>
-    <version>3.21.1-SNAPSHOT</version>
-    <properties>
-        <compiler-plugin.version>3.11.0</compiler-plugin.version>
-        <maven.compiler.release>11</maven.compiler.release>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
-        <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
-        <quarkus.platform.version>2.16.7.Final</quarkus.platform.version>
-        <skipITs>true</skipITs>
-        <surefire-plugin.version>3.0.0</surefire-plugin.version>
-        <docker-java.version>3.2.7</docker-java.version>
-    </properties>
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>${quarkus.platform.group-id}</groupId>
-                <artifactId>${quarkus.platform.artifact-id}</artifactId>
-                <version>${quarkus.platform.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
+
+    <parent>
+        <groupId>org.apache.camel.karavan</groupId>
+        <artifactId>karavan-cloud</artifactId>
+        <version>3.21.1-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
     <dependencies>
         <dependency>
             <groupId>io.quarkus</groupId>
diff --git a/karavan-bashi/src/main/docker/Dockerfile.jvm b/karavan-cloud/karavan-bashi/src/main/docker/Dockerfile.jvm
similarity index 100%
rename from karavan-bashi/src/main/docker/Dockerfile.jvm
rename to karavan-cloud/karavan-bashi/src/main/docker/Dockerfile.jvm
diff --git a/karavan-bashi/src/main/docker/Dockerfile.legacy-jar b/karavan-cloud/karavan-bashi/src/main/docker/Dockerfile.legacy-jar
similarity index 100%
rename from karavan-bashi/src/main/docker/Dockerfile.legacy-jar
rename to karavan-cloud/karavan-bashi/src/main/docker/Dockerfile.legacy-jar
diff --git a/karavan-bashi/src/main/docker/Dockerfile.native b/karavan-cloud/karavan-bashi/src/main/docker/Dockerfile.native
similarity index 100%
rename from karavan-bashi/src/main/docker/Dockerfile.native
rename to karavan-cloud/karavan-bashi/src/main/docker/Dockerfile.native
diff --git a/karavan-bashi/src/main/docker/Dockerfile.native-micro b/karavan-cloud/karavan-bashi/src/main/docker/Dockerfile.native-micro
similarity index 100%
rename from karavan-bashi/src/main/docker/Dockerfile.native-micro
rename to karavan-cloud/karavan-bashi/src/main/docker/Dockerfile.native-micro
diff --git a/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/ConductorService.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/ConductorService.java
similarity index 100%
rename from karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/ConductorService.java
rename to karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/ConductorService.java
diff --git a/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/Constants.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/Constants.java
similarity index 100%
rename from karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/Constants.java
rename to karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/Constants.java
diff --git a/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/KaravanBashi.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/KaravanBashi.java
similarity index 100%
rename from karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/KaravanBashi.java
rename to karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/KaravanBashi.java
diff --git a/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/RunnerStatusService.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/RunnerStatusService.java
similarity index 100%
rename from karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/RunnerStatusService.java
rename to karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/RunnerStatusService.java
diff --git a/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerEventListener.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerEventListener.java
similarity index 100%
rename from karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerEventListener.java
rename to karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerEventListener.java
diff --git a/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerService.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerService.java
similarity index 100%
rename from karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerService.java
rename to karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/docker/DockerService.java
diff --git a/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/ClientRunnerListener.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/ClientRunnerListener.java
similarity index 100%
rename from karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/ClientRunnerListener.java
rename to karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/ClientRunnerListener.java
diff --git a/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/GroupedKey.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/GroupedKey.java
similarity index 100%
rename from karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/GroupedKey.java
rename to karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/GroupedKey.java
diff --git a/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/InfinispanService.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/InfinispanService.java
similarity index 100%
rename from karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/InfinispanService.java
rename to karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/InfinispanService.java
diff --git a/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/PodStatus.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/PodStatus.java
similarity index 100%
rename from karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/PodStatus.java
rename to karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/PodStatus.java
diff --git a/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/ProjectStoreSchema.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/ProjectStoreSchema.java
similarity index 100%
rename from karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/ProjectStoreSchema.java
rename to karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/ProjectStoreSchema.java
diff --git a/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/RunnerCommand.java b/karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/RunnerCommand.java
similarity index 100%
rename from karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/RunnerCommand.java
rename to karavan-cloud/karavan-bashi/src/main/java/org/apache/camel/karavan/bashi/infinispan/RunnerCommand.java
diff --git a/karavan-bashi/src/main/resources/application.properties b/karavan-cloud/karavan-bashi/src/main/resources/application.properties
similarity index 100%
rename from karavan-bashi/src/main/resources/application.properties
rename to karavan-cloud/karavan-bashi/src/main/resources/application.properties
diff --git a/karavan-cli/.mvn/wrapper/maven-wrapper.properties b/karavan-cloud/karavan-cli/.mvn/wrapper/maven-wrapper.properties
similarity index 100%
rename from karavan-cli/.mvn/wrapper/maven-wrapper.properties
rename to karavan-cloud/karavan-cli/.mvn/wrapper/maven-wrapper.properties
diff --git a/karavan-cloud/karavan-cli/CLI.md b/karavan-cloud/karavan-cli/CLI.md
new file mode 100644
index 00000000..25165f74
--- /dev/null
+++ b/karavan-cloud/karavan-cli/CLI.md
@@ -0,0 +1,35 @@
+## Install Karavan with CLI
+
+### Requirements
+1. minikube v1.30+ installed with `--driver=hyperkit`
+
+### Installation
+1. Start minikube
+    ```
+    minikube start --driver=hyperkit
+    ```
+2. Enable registry addon
+    ```
+    minikube addons enable registry
+    ```
+3. Start dashboard (optional)
+    ```
+    minikube dashboard
+    ```
+4. Install Karavan using CLI
+
+    Option 1:
+    ```
+    mvn org.apache.maven.plugins:maven-dependency-plugin:3.0.2:copy -Dartifact=org.apache.camel.karavan:karavan-cli:$VERSION:jar -DoutputDirectory=. 
+
+    java -jar karavan-cli-$VERSION.jar install --git-repository=$GIT_REPOSITORY --git-password=$GIT_TOKEN --git-username=$GIT_USERNAME  --node-port=30777
+    ```
+    Option 2:
+    ```
+    jbang org.apache.camel.karavan:karavan-cli:$VERSION install --git-repository=$GIT_REPOSITORY --git-password=$GIT_TOKEN --git-username=$GIT_USERNAME  --node-port=30777
+    ```
+5. Get karavan service URL
+    ```
+    minikube service karavan --url --namespace karavan
+    ```
+   Use karavan URL to connect to the application
diff --git a/karavan-cli/INFINISPAN.md b/karavan-cloud/karavan-cli/INFINISPAN.md
similarity index 100%
rename from karavan-cli/INFINISPAN.md
rename to karavan-cloud/karavan-cli/INFINISPAN.md
diff --git a/karavan-cli/mvnw b/karavan-cloud/karavan-cli/mvnw
similarity index 100%
rename from karavan-cli/mvnw
rename to karavan-cloud/karavan-cli/mvnw
diff --git a/karavan-cli/mvnw.cmd b/karavan-cloud/karavan-cli/mvnw.cmd
similarity index 100%
rename from karavan-cli/mvnw.cmd
rename to karavan-cloud/karavan-cli/mvnw.cmd
diff --git a/karavan-cli/pom.xml b/karavan-cloud/karavan-cli/pom.xml
similarity index 83%
rename from karavan-cli/pom.xml
rename to karavan-cloud/karavan-cli/pom.xml
index 8daf369b..8206724f 100644
--- a/karavan-cli/pom.xml
+++ b/karavan-cloud/karavan-cli/pom.xml
@@ -8,6 +8,14 @@
     <name>karavan-cli</name>
     <version>3.21.1-SNAPSHOT</version>
     <packaging>jar</packaging>
+
+    <!-- Required to publish to the repo -->
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>30</version>
+    </parent>
+
     <properties>
         <compiler-plugin.version>3.10.1</compiler-plugin.version>
         <maven.compiler.parameters>true</maven.compiler.parameters>
@@ -69,6 +77,25 @@
 
     <build>
         <plugins>
+            <!-- We want to sign the artifact, the POM, and all attached artifacts -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-gpg-plugin</artifactId>
+                <configuration>
+                    <keyname>${gpg.keyname}</keyname>
+                    <passphrase>${gpg.passphrase}</passphrase>
+                    <useAgent>${gpg.useagent}</useAgent>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>sign-artifacts</id>
+                        <phase>verify</phase>
+                        <goals>
+                            <goal>sign</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-shade-plugin</artifactId>
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/CommandUtils.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/CommandUtils.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/CommandUtils.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/CommandUtils.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/Constants.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/Constants.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/Constants.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/Constants.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/InstallCommand.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/InstallCommand.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/InstallCommand.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/InstallCommand.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanCommand.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanCommand.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanCommand.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanCommand.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanConfig.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanConfig.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanConfig.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanConfig.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/ResourceUtils.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/ResourceUtils.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/ResourceUtils.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/ResourceUtils.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/UpgradeCommand.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/UpgradeCommand.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/UpgradeCommand.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/UpgradeCommand.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanConfigMap.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanConfigMap.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanConfigMap.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanConfigMap.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanDeployment.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanDeployment.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanDeployment.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanDeployment.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanPvc.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanPvc.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanPvc.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanPvc.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanRole.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanRole.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanRole.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanRole.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanSecret.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanSecret.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanSecret.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanSecret.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanService.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanService.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanService.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanService.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanServiceAccount.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanServiceAccount.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanServiceAccount.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanServiceAccount.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanTekton.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanTekton.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanTekton.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanTekton.java
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/Nexus.java b/karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/Nexus.java
similarity index 100%
rename from karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/Nexus.java
rename to karavan-cloud/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/Nexus.java
diff --git a/karavan-cli/src/main/resources/application.properties b/karavan-cloud/karavan-cli/src/main/resources/application.properties
similarity index 100%
rename from karavan-cli/src/main/resources/application.properties
rename to karavan-cloud/karavan-cli/src/main/resources/application.properties
diff --git a/karavan-cli/src/main/resources/dashboard.yaml b/karavan-cloud/karavan-cli/src/main/resources/dashboard.yaml
similarity index 100%
rename from karavan-cli/src/main/resources/dashboard.yaml
rename to karavan-cloud/karavan-cli/src/main/resources/dashboard.yaml
diff --git a/karavan-cli/src/main/resources/infinispan-secrets.yaml b/karavan-cloud/karavan-cli/src/main/resources/infinispan-secrets.yaml
similarity index 100%
rename from karavan-cli/src/main/resources/infinispan-secrets.yaml
rename to karavan-cloud/karavan-cli/src/main/resources/infinispan-secrets.yaml
diff --git a/karavan-cli/src/main/resources/infinispan-values.yaml b/karavan-cloud/karavan-cli/src/main/resources/infinispan-values.yaml
similarity index 100%
rename from karavan-cli/src/main/resources/infinispan-values.yaml
rename to karavan-cloud/karavan-cli/src/main/resources/infinispan-values.yaml
diff --git a/karavan-cli/src/main/resources/pipelines.yaml b/karavan-cloud/karavan-cli/src/main/resources/pipelines.yaml
similarity index 100%
rename from karavan-cli/src/main/resources/pipelines.yaml
rename to karavan-cloud/karavan-cli/src/main/resources/pipelines.yaml
diff --git a/karavan-cli/src/main/resources/quarkus-builder-script-kubernetes.sh b/karavan-cloud/karavan-cli/src/main/resources/quarkus-builder-script-kubernetes.sh
similarity index 100%
rename from karavan-cli/src/main/resources/quarkus-builder-script-kubernetes.sh
rename to karavan-cloud/karavan-cli/src/main/resources/quarkus-builder-script-kubernetes.sh
diff --git a/karavan-cli/src/main/resources/quarkus-builder-script-openshift.sh b/karavan-cloud/karavan-cli/src/main/resources/quarkus-builder-script-openshift.sh
similarity index 100%
rename from karavan-cli/src/main/resources/quarkus-builder-script-openshift.sh
rename to karavan-cloud/karavan-cli/src/main/resources/quarkus-builder-script-openshift.sh
diff --git a/karavan-cli/src/main/resources/settings.xml b/karavan-cloud/karavan-cli/src/main/resources/settings.xml
similarity index 100%
rename from karavan-cli/src/main/resources/settings.xml
rename to karavan-cloud/karavan-cli/src/main/resources/settings.xml
diff --git a/karavan-cli/src/main/resources/spring-boot-builder-script-kubernetes.sh b/karavan-cloud/karavan-cli/src/main/resources/spring-boot-builder-script-kubernetes.sh
similarity index 100%
rename from karavan-cli/src/main/resources/spring-boot-builder-script-kubernetes.sh
rename to karavan-cloud/karavan-cli/src/main/resources/spring-boot-builder-script-kubernetes.sh
diff --git a/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh b/karavan-cloud/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh
similarity index 100%
rename from karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh
rename to karavan-cloud/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh
diff --git a/karavan-operator/.mvn/wrapper/maven-wrapper.properties b/karavan-cloud/karavan-datagrid/.mvn/wrapper/maven-wrapper.properties
similarity index 100%
rename from karavan-operator/.mvn/wrapper/maven-wrapper.properties
rename to karavan-cloud/karavan-datagrid/.mvn/wrapper/maven-wrapper.properties
diff --git a/karavan-operator/mvnw b/karavan-cloud/karavan-datagrid/mvnw
similarity index 100%
rename from karavan-operator/mvnw
rename to karavan-cloud/karavan-datagrid/mvnw
diff --git a/karavan-operator/mvnw.cmd b/karavan-cloud/karavan-datagrid/mvnw.cmd
similarity index 100%
rename from karavan-operator/mvnw.cmd
rename to karavan-cloud/karavan-datagrid/mvnw.cmd
diff --git a/karavan-app/pom.xml b/karavan-cloud/karavan-datagrid/pom.xml
similarity index 55%
rename from karavan-app/pom.xml
rename to karavan-cloud/karavan-datagrid/pom.xml
index eb8d93c7..2a12db5c 100644
--- a/karavan-app/pom.xml
+++ b/karavan-cloud/karavan-datagrid/pom.xml
@@ -17,148 +17,31 @@
          xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <modelVersion>4.0.0</modelVersion>
-    <groupId>org.apache.camel.karavan</groupId>
-    <version>3.21.1-SNAPSHOT</version>
-    <artifactId>karavan</artifactId>
-    <properties>
-        <compiler-plugin.version>3.10.1</compiler-plugin.version>
-        <maven.compiler.parameters>true</maven.compiler.parameters>
-        <maven.compiler.source>11</maven.compiler.source>
-        <maven.compiler.target>11</maven.compiler.target>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
-        <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
-        <quarkus.platform.version>2.16.7.Final</quarkus.platform.version>
-        <camel-quarkus.version>2.16.7</camel-quarkus.version>
-        <camel.version>3.21.0</camel.version>
-        <surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
-        <infinispan.version>14.0.6.Final</infinispan.version>
-        <tekton.version>6.3.1</tekton.version>
-        <jgit.version>2.3.1</jgit.version>
-        <quinoa.version>1.2.4</quinoa.version>
-    </properties>
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>${quarkus.platform.group-id}</groupId>
-                <artifactId>${quarkus.platform.artifact-id}</artifactId>
-                <version>${quarkus.platform.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
+    <artifactId>karavan-datagrid</artifactId>
+    <parent>
+        <groupId>org.apache.camel.karavan</groupId>
+        <artifactId>karavan-cloud</artifactId>
+        <version>3.21.1-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
     <dependencies>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-vertx</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-smallrye-reactive-messaging</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-scheduler</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.smallrye.reactive</groupId>
-            <artifactId>smallrye-mutiny-vertx-web-client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-smallrye-fault-tolerance</artifactId>
-        </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-arc</artifactId>
         </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-scheduler</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-smallrye-openapi</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkiverse.jgit</groupId>
-            <artifactId>quarkus-jgit</artifactId>
-            <version>${jgit.version}</version>
+            <artifactId>quarkus-jackson</artifactId>
         </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-infinispan-client</artifactId>
         </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-kubernetes-client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-openshift-client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-minikube</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-oidc</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-elytron-security-properties-file</artifactId>
-        </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-smallrye-health</artifactId>
         </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-qute</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-scheduler</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.fabric8</groupId>
-            <artifactId>tekton-client</artifactId>
-            <version>${tekton.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.infinispan</groupId>
-            <artifactId>infinispan-core</artifactId>
-            <version>${infinispan.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>io.micrometer</groupId>
-            <artifactId>micrometer-registry-prometheus</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-        </dependency>
-        <!-- Code generator -->
-        <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-openapi-rest-dsl-generator</artifactId>
-            <version>${camel.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-container-image-docker</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-container-image-s2i</artifactId>
-        </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-junit5</artifactId>
@@ -169,27 +52,32 @@
             <artifactId>rest-assured</artifactId>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>io.quarkiverse.quinoa</groupId>
-            <artifactId>quarkus-quinoa</artifactId>
-            <version>${quinoa.version}</version>
-        </dependency>
     </dependencies>
+
     <build>
         <resources>
             <resource>
                 <directory>src/main/resources</directory>
                 <filtering>true</filtering>
                 <includes>
-                    <include>**/application.properties</include>
-                    <include>components/**</include>
-                    <include>kamelets/**</include>
-                    <include>snippets/**</include>
-                    <include>META-INF/**</include>
+                    <include>**/**.xml</include>
                 </includes>
             </resource>
         </resources>
         <plugins>
+            <plugin>
+                <groupId>io.smallrye</groupId>
+                <artifactId>jandex-maven-plugin</artifactId>
+                <version>${jandex-maven-plugin-version}</version>
+                <executions>
+                    <execution>
+                        <id>make-index</id>
+                        <goals>
+                            <goal>jandex</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
             <plugin>
                 <groupId>${quarkus.platform.group-id}</groupId>
                 <artifactId>quarkus-maven-plugin</artifactId>
diff --git a/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/ClientRunnerListener.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/ClientRunnerListener.java
new file mode 100644
index 00000000..8c33ac90
--- /dev/null
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/ClientRunnerListener.java
@@ -0,0 +1,31 @@
+package org.apache.camel.karavan.datagrid;
+
+import io.vertx.core.eventbus.EventBus;
+import io.vertx.core.json.JsonObject;
+import org.apache.camel.karavan.datagrid.model.GroupedKey;
+import org.infinispan.client.hotrod.annotation.ClientCacheEntryCreated;
+import org.infinispan.client.hotrod.annotation.ClientCacheEntryModified;
+import org.infinispan.client.hotrod.annotation.ClientListener;
+import org.infinispan.client.hotrod.event.ClientCacheEntryCreatedEvent;
+import org.infinispan.client.hotrod.event.ClientCacheEntryModifiedEvent;
+
+@ClientListener
+public class ClientRunnerListener {
+
+    private final EventBus eventBus;
+
+    public ClientRunnerListener(EventBus eventBus) {
+        this.eventBus = eventBus;
+    }
+
+    @ClientCacheEntryCreated
+    public void entryCreated(ClientCacheEntryCreatedEvent<GroupedKey> event) {
+        eventBus.publish(DatagridService.ADDRESS_DEVMODE_COMMAND_INTERNAL, JsonObject.mapFrom(event.getKey()));
+    }
+
+    @ClientCacheEntryModified
+    public void entryModified(ClientCacheEntryModifiedEvent<GroupedKey> event) {
+        eventBus.publish(DatagridService.ADDRESS_DEVMODE_COMMAND_INTERNAL, JsonObject.mapFrom(event.getKey()));
+    }
+
+}
\ No newline at end of file
diff --git a/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/DatagridService.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/DatagridService.java
new file mode 100644
index 00000000..f014714b
--- /dev/null
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/DatagridService.java
@@ -0,0 +1,383 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.camel.karavan.datagrid;
+
+import io.quarkus.vertx.ConsumeEvent;
+import io.smallrye.mutiny.tuples.Tuple2;
+import io.vertx.core.eventbus.EventBus;
+import io.vertx.core.json.JsonObject;
+import org.apache.camel.karavan.datagrid.model.*;
+import org.apache.camel.karavan.datagrid.model.KaravanSchemaImpl;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
+import org.eclipse.microprofile.health.HealthCheck;
+import org.eclipse.microprofile.health.HealthCheckResponse;
+import org.eclipse.microprofile.health.Readiness;
+import org.infinispan.client.hotrod.RemoteCache;
+import org.infinispan.client.hotrod.RemoteCacheManager;
+import org.infinispan.client.hotrod.Search;
+import org.infinispan.client.hotrod.configuration.ClientIntelligence;
+import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
+import org.infinispan.commons.configuration.StringConfiguration;
+import org.infinispan.commons.marshall.ProtoStreamMarshaller;
+import org.infinispan.query.dsl.QueryFactory;
+import org.jboss.logging.Logger;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Default;
+import javax.inject.Inject;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.time.Instant;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
+
+@Default
+@Readiness
+@ApplicationScoped
+public class DatagridService implements HealthCheck  {
+
+    public static final String ADDRESS_DEVMODE_COMMAND = "ADDRESS_DEVMODE_COMMAND";
+    protected static final String ADDRESS_DEVMODE_COMMAND_INTERNAL = "ADDRESS_DEVMODE_COMMAND_INTERNAL";
+
+    @ConfigProperty(name ="quarkus.infinispan-client.hosts")
+    String infinispanHosts;
+    @ConfigProperty(name ="quarkus.infinispan-client.username")
+    String infinispanUsername;
+    @ConfigProperty(name ="quarkus.infinispan-client.password")
+    String infinispanPassword;
+
+    private RemoteCache<GroupedKey, Project> projects;
+    private RemoteCache<GroupedKey, ProjectFile> files;
+    private RemoteCache<GroupedKey, PipelineStatus> pipelineStatuses;
+    private RemoteCache<GroupedKey, DeploymentStatus> deploymentStatuses;
+    private RemoteCache<GroupedKey, PodStatus> podStatuses;
+    private RemoteCache<GroupedKey, ServiceStatus> serviceStatuses;
+    private RemoteCache<GroupedKey, CamelStatus> camelStatuses;
+    private RemoteCache<String, Environment> environments;
+    private RemoteCache<String, String> commits;
+    private RemoteCache<GroupedKey, DevModeCommand> devmodeCommands;
+    private RemoteCache<GroupedKey, DevModeStatus> devmodeStatuses;
+    private final AtomicBoolean ready = new AtomicBoolean(false);
+
+    RemoteCacheManager cacheManager;
+
+    @Inject
+    EventBus eventBus;
+
+    private static final String CACHE_CONFIG = "<distributed-cache name=\"%s\">"
+            + " <encoding media-type=\"application/x-protostream\"/>"
+            + " <groups enabled=\"true\"/>"
+            + "</distributed-cache>";
+
+    private static final Logger LOGGER = Logger.getLogger(DatagridService.class.getName());
+
+    public void start() {
+        LOGGER.info("DatagridService is starting in remote mode");
+
+        ProtoStreamMarshaller marshaller = new ProtoStreamMarshaller();
+        marshaller.register(new KaravanSchemaImpl());
+
+        ConfigurationBuilder builder = new ConfigurationBuilder();
+        builder.socketTimeout(1000)
+                .connectionTimeout(10000)
+                .addServers(infinispanHosts)
+                .security()
+                .authentication().enable()
+                .username(infinispanUsername)
+                .password(infinispanPassword)
+                .clientIntelligence(ClientIntelligence.BASIC)
+                .marshaller(marshaller);
+
+        cacheManager = new RemoteCacheManager(builder.build());
+
+        environments = getOrCreateCache(Environment.CACHE, false);
+        projects = getOrCreateCache(Project.CACHE, false);
+        files = getOrCreateCache(ProjectFile.CACHE, false);
+        podStatuses = getOrCreateCache(PodStatus.CACHE, false);
+        pipelineStatuses = getOrCreateCache(PipelineStatus.CACHE, false);
+        deploymentStatuses = getOrCreateCache(DeploymentStatus.CACHE, false);
+        serviceStatuses = getOrCreateCache(ServiceStatus.CACHE, false);
+        camelStatuses = getOrCreateCache(CamelStatus.CACHE, false);
+        commits = getOrCreateCache("commits", false);
+        deploymentStatuses = getOrCreateCache(DeploymentStatus.CACHE, false);
+        devmodeCommands = getOrCreateCache(DevModeCommand.CACHE, true);
+
+        cacheManager.getCache(DevModeCommand.CACHE).addClientListener(new ClientRunnerListener(eventBus));
+        ready.set(true);
+        LOGGER.info("DatagridService is started in remote mode");
+    }
+
+    private <K, V> RemoteCache<K, V>  getOrCreateCache(String name, boolean command) {
+        String config = getResourceFile(command ? "/command-cache-config.xml" : "/data-cache-config.xml");
+        return cacheManager.administration().getOrCreateCache(name, new StringConfiguration(String.format(config, name)));
+
+    }
+
+    private void cleanData() {
+        environments.clear();
+        deploymentStatuses.clear();
+        podStatuses.clear();
+        pipelineStatuses.clear();
+        camelStatuses.clear();
+    }
+
+    @ConsumeEvent(value = ADDRESS_DEVMODE_COMMAND_INTERNAL, blocking = true, ordered = true, local = false)
+    void replyAsync(JsonObject message) {
+        GroupedKey key = message.mapTo(GroupedKey.class);
+        DevModeCommand command = getDevModeCommand(key);
+        eventBus.publish(DatagridService.ADDRESS_DEVMODE_COMMAND, JsonObject.mapFrom(command));
+    }
+
+    public List<Project> getProjects() {
+        return projects.values().stream().collect(Collectors.toList());
+    }
+
+    public void saveProject(Project project) {
+        GroupedKey key = GroupedKey.create(project.getProjectId(), project.getProjectId());
+        boolean isNew = !projects.containsKey(key);
+        projects.put(key, project);
+    }
+
+    public List<ProjectFile> getProjectFiles(String projectId) {
+        QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) files);
+        return queryFactory.<ProjectFile>create("FROM karavan.ProjectFile WHERE projectId = :projectId")
+                .setParameter("projectId", projectId)
+                .execute().list();
+    }
+
+    public ProjectFile getProjectFile(String projectId, String filename) {
+        QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) files);
+        return queryFactory.<ProjectFile>create("FROM karavan.ProjectFile WHERE projectId = :projectId AND name = :name")
+                .setParameter("projectId", projectId)
+                .setParameter("name", filename)
+                .execute().list().get(0);
+    }
+
+    public void saveProjectFile(ProjectFile file) {
+        files.put(GroupedKey.create(file.getProjectId(), file.getName()), file);
+    }
+
+    public void saveProjectFiles(Map<GroupedKey, ProjectFile> f) {
+        Map<GroupedKey, ProjectFile> files = new HashMap<>(f.size());
+        f.forEach((groupedKey, projectFile) -> {
+            projectFile.setLastUpdate(Instant.now().toEpochMilli());
+        });
+        files.putAll(files);
+    }
+
+    public void deleteProject(String project) {
+        projects.remove(GroupedKey.create(project, project));
+    }
+
+    public void deleteProjectFile(String project, String filename) {
+        files.remove(GroupedKey.create(project, filename));
+    }
+
+    public Project getProject(String project) {
+        return projects.get(GroupedKey.create(project, project));
+    }
+
+    public PipelineStatus getPipelineStatus(String projectId, String environment) {
+        return pipelineStatuses.get(GroupedKey.create(projectId, environment));
+    }
+
+    public void savePipelineStatus(PipelineStatus status) {
+        pipelineStatuses.put(GroupedKey.create(status.getProjectId(), status.getEnv()), status);
+    }
+
+    public void deletePipelineStatus(PipelineStatus status) {
+        pipelineStatuses.remove(GroupedKey.create(status.getProjectId(), status.getEnv()));
+    }
+
+    public DeploymentStatus getDeploymentStatus(String name, String namespace, String cluster) {
+        String deploymentId = name + ":" + namespace + ":" + cluster;
+        return deploymentStatuses.get(GroupedKey.create(name, deploymentId));
+    }
+
+    public void saveDeploymentStatus(DeploymentStatus status) {
+        deploymentStatuses.put(GroupedKey.create(status.getName(), status.getId()), status);
+    }
+
+    public void deleteDeploymentStatus(DeploymentStatus status) {
+        deploymentStatuses.remove(GroupedKey.create(status.getName(), status.getId()));
+    }
+
+    public List<DeploymentStatus> getDeploymentStatuses() {
+        return deploymentStatuses.values().stream().collect(Collectors.toList());
+    }
+
+    public List<DeploymentStatus> getDeploymentStatuses(String env) {
+        QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) deploymentStatuses);
+        return queryFactory.<DeploymentStatus>create("FROM karavan.DeploymentStatus WHERE env = :env")
+                .setParameter("env", env)
+                .execute().list();
+    }
+
+    public void saveServiceStatus(ServiceStatus status) {
+        serviceStatuses.put(GroupedKey.create(status.getName(), status.getId()), status);
+    }
+
+    public void deleteServiceStatus(ServiceStatus status) {
+        serviceStatuses.remove(GroupedKey.create(status.getName(), status.getId()));
+    }
+
+    public List<ServiceStatus> getServiceStatuses() {
+        return new ArrayList<>(serviceStatuses.values());
+    }
+
+    public List<PodStatus> getPodStatuses(String projectId, String env) {
+        QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) podStatuses);
+        return queryFactory.<PodStatus>create("FROM karavan.PodStatus WHERE projectId = :projectId AND env = :env")
+                .setParameter("project", projectId)
+                .setParameter("env", env)
+                .execute().list();
+    }
+
+    public PodStatus getDevModePodStatuses(String projectId, String env) {
+        QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) podStatuses);
+        return queryFactory.<PodStatus>create("FROM karavan.PodStatus WHERE projectId = :projectId AND env = :env AND inDevMode = true")
+                .setParameter("project", projectId)
+                .setParameter("env", env)
+                .execute().list().get(0);
+    }
+
+    public List<PodStatus> getPodStatuses(String env) {
+        QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) podStatuses);
+        return queryFactory.<PodStatus>create("FROM karavan.PodStatus WHERE env = :env")
+                .setParameter("env", env)
+                .execute().list();
+    }
+
+    public void savePodStatus(PodStatus status) {
+        podStatuses.put(GroupedKey.create(status.getProjectId(), status.getName()), status);
+    }
+
+    public void deletePodStatus(PodStatus status) {
+        podStatuses.remove(GroupedKey.create(status.getProjectId(), status.getName()));
+    }
+
+    public CamelStatus getCamelStatus(String projectId, String name, String env) {
+        QueryFactory queryFactory = Search.getQueryFactory(camelStatuses);
+        return queryFactory.<CamelStatus>create("FROM karavan.CamelStatus WHERE projectId = :projectId AND name = :name AND env = :env")
+                .setParameter("projectId", projectId)
+                .setParameter("name", name)
+                .setParameter("env", env)
+                .execute().list().get(0);
+    }
+
+    public List<CamelStatus> getCamelStatusesByEnv(String projectId, String env) {
+        QueryFactory queryFactory = Search.getQueryFactory(camelStatuses);
+        return queryFactory.<CamelStatus>create("FROM karavan.CamelStatus WHERE projectId = :projectId AND env = :env")
+                .setParameter("projectId", projectId)
+                .setParameter("env", env)
+                .execute().list();
+    }
+
+    public void saveCamelStatus(CamelStatus status) {
+        camelStatuses.put(GroupedKey.create(status.getProjectId(), status.getEnv()), status);
+    }
+
+    public void deleteCamelStatus(String projectId, String env) {
+        camelStatuses.remove(GroupedKey.create(projectId, env));
+    }
+
+    public List<Environment> getEnvironments() {
+        return new ArrayList<>(environments.values());
+    }
+
+    public void saveEnvironment(Environment environment) {
+        environments.put(environment.getName(), environment);
+    }
+
+    public void saveCommit(String commitId, int time) {
+        commits.put(commitId, String.valueOf(time));
+    }
+
+    public void saveLastCommit(String commitId) {
+        commits.put("lastCommitId", commitId);
+    }
+
+    public Tuple2<String, Integer> getLastCommit() {
+        String lastCommitId = commits.get("lastCommitId");
+        String time = commits.get(lastCommitId);
+        return Tuple2.of(lastCommitId, Integer.parseInt(time));
+    }
+
+    public boolean hasCommit(String commitId) {
+        return commits.get(commitId) != null;
+    }
+
+    public void saveDevModeStatus(DevModeStatus status) {
+        devmodeStatuses.put(GroupedKey.create(status.getProjectId(), status.getProjectId()), status);
+    }
+
+    public void deleteDevModeStatus(String projectId) {
+        devmodeStatuses.remove(GroupedKey.create(projectId, projectId));
+    }
+
+    public DevModeStatus getDevModeStatus(String projectId) {
+        return devmodeStatuses.get(GroupedKey.create(projectId, projectId));
+    }
+
+    public void sendDevModeCommand(String projectId, DevModeCommand command) {
+        if (command.getProjectId() == null) {
+            command.setProjectId(projectId);
+        }
+        devmodeCommands.put(GroupedKey.create(projectId, UUID.randomUUID().toString()), command);
+    }
+
+    public DevModeCommand getDevModeCommand(GroupedKey key) {
+        return devmodeCommands.get(key);
+    }
+
+    public DevModeCommand getDevModeCommand(String projectId) {
+        return getDevModeCommand(GroupedKey.create(projectId, projectId));
+    }
+
+    @Override
+    public HealthCheckResponse call() {
+        if (cacheManager != null && cacheManager.isStarted() && ready.get()) {
+            return HealthCheckResponse.up("Infinispan Service is running in cluster mode.");
+        }
+        else {
+            return HealthCheckResponse.down("Infinispan Service is not running.");
+        }
+    }
+
+    public void clearAllStatuses() {
+        CompletableFuture.allOf(
+            deploymentStatuses.clearAsync(),
+            podStatuses.clearAsync(),
+            pipelineStatuses.clearAsync(),
+            camelStatuses.clearAsync(),
+            devmodeCommands.clearAsync()
+        ).join();
+    }
+
+    private String getResourceFile(String path) {
+        try {
+            InputStream inputStream = DatagridService.class.getResourceAsStream(path);
+            return new BufferedReader(new InputStreamReader(inputStream))
+                    .lines().collect(Collectors.joining(System.getProperty("line.separator")));
+        } catch (Exception e) {
+            return null;
+        }
+    }
+}
diff --git a/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/CamelStatus.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/CamelStatus.java
new file mode 100644
index 00000000..cf58dca9
--- /dev/null
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/CamelStatus.java
@@ -0,0 +1,67 @@
+package org.apache.camel.karavan.datagrid.model;
+
+import org.infinispan.protostream.annotations.ProtoFactory;
+import org.infinispan.protostream.annotations.ProtoField;
+
+public class CamelStatus {
+    public static final String CACHE = "camel_statuses";
+    @ProtoField(number = 1)
+    String projectId;
+    @ProtoField(number = 2)
+    String containerName;
+    @ProtoField(number = 3)
+    CamelStatusName name;
+    @ProtoField(number = 4)
+    String status;
+    @ProtoField(number = 5)
+    String env;
+
+    @ProtoFactory
+    public CamelStatus(String projectId, String containerName, CamelStatusName name, String status, String env) {
+        this.projectId = projectId;
+        this.containerName = containerName;
+        this.name = name;
+        this.status = status;
+        this.env = env;
+    }
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getContainerName() {
+        return containerName;
+    }
+
+    public void setContainerName(String containerName) {
+        this.containerName = containerName;
+    }
+
+    public CamelStatusName getName() {
+        return name;
+    }
+
+    public void setName(CamelStatusName name) {
+        this.name = name;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getEnv() {
+        return env;
+    }
+
+    public void setEnv(String env) {
+        this.env = env;
+    }
+}
diff --git a/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/CamelStatusName.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/CamelStatusName.java
new file mode 100644
index 00000000..681558a3
--- /dev/null
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/CamelStatusName.java
@@ -0,0 +1,15 @@
+package org.apache.camel.karavan.datagrid.model;
+
+import org.infinispan.protostream.annotations.ProtoEnumValue;
+
+public enum CamelStatusName {
+
+        @ProtoEnumValue(number = 0, name = "context") context,
+        @ProtoEnumValue (number = 1, name = "inflight") inflight,
+        @ProtoEnumValue (number = 2, name = "memory") memory,
+        @ProtoEnumValue (number = 3, name = "properties") properties,
+        @ProtoEnumValue (number = 4, name = "route") route,
+        @ProtoEnumValue (number = 5, name = "trace") trace,
+        @ProtoEnumValue (number = 6, name = "jvm") jvm,
+        @ProtoEnumValue (number = 7, name = "source") source
+}
diff --git a/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/CommandName.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/CommandName.java
new file mode 100644
index 00000000..ff34f9ad
--- /dev/null
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/CommandName.java
@@ -0,0 +1,10 @@
+package org.apache.camel.karavan.datagrid.model;
+
+import org.infinispan.protostream.annotations.ProtoEnumValue;
+
+public enum CommandName {
+
+        @ProtoEnumValue(number = 0, name = "RUN") RUN,
+        @ProtoEnumValue (number = 1, name = "DELETE") DELETE,
+        @ProtoEnumValue (number = 2, name = "RELOAD") RELOAD
+}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/CommitInfo.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/CommitInfo.java
similarity index 95%
rename from karavan-app/src/main/java/org/apache/camel/karavan/model/CommitInfo.java
rename to karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/CommitInfo.java
index d028ca5b..eec06683 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/CommitInfo.java
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/CommitInfo.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.model;
+package org.apache.camel.karavan.datagrid.model;
 
 import java.util.List;
 
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/DeploymentStatus.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/DeploymentStatus.java
similarity index 98%
rename from karavan-app/src/main/java/org/apache/camel/karavan/model/DeploymentStatus.java
rename to karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/DeploymentStatus.java
index bfeeb43c..f8b3671e 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/DeploymentStatus.java
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/DeploymentStatus.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.model;
+package org.apache.camel.karavan.datagrid.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeCommand.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeCommand.java
new file mode 100644
index 00000000..1d5a6517
--- /dev/null
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeCommand.java
@@ -0,0 +1,54 @@
+package org.apache.camel.karavan.datagrid.model;
+
+import org.infinispan.protostream.annotations.ProtoFactory;
+import org.infinispan.protostream.annotations.ProtoField;
+
+public class DevModeCommand {
+
+    public static final String CACHE = "devmode_commands";
+    @ProtoField(number = 1)
+    CommandName commandName;
+    @ProtoField(number = 2)
+    String projectId;
+    @ProtoField(number = 3)
+    Long time;
+
+    @ProtoFactory
+    public DevModeCommand(CommandName commandName, String projectId, Long time) {
+        this.commandName = commandName;
+        this.projectId = projectId;
+        this.time = time;
+    }
+
+    public DevModeCommand(CommandName commandName, Long time) {
+        this.commandName = commandName;
+        this.time = time;
+    }
+
+    public DevModeCommand() {
+    }
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    public CommandName getCommandName() {
+        return commandName;
+    }
+
+    public void setCommandName(CommandName commandName) {
+        this.commandName = commandName;
+    }
+
+    public Long getTime() {
+        return time;
+    }
+
+    public void setTime(Long time) {
+        this.time = time;
+    }
+}
diff --git a/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeStatus.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeStatus.java
new file mode 100644
index 00000000..2c4c99d7
--- /dev/null
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeStatus.java
@@ -0,0 +1,45 @@
+package org.apache.camel.karavan.datagrid.model;
+
+import org.infinispan.protostream.annotations.ProtoFactory;
+import org.infinispan.protostream.annotations.ProtoField;
+
+public class DevModeStatus {
+    public static final String CACHE = "devmode_statuses";
+    @ProtoField(number = 1)
+    String projectId;
+    @ProtoField(number = 2)
+    String containerName;
+    @ProtoField(number = 3)
+    boolean codeLoaded;
+
+    @ProtoFactory
+    public DevModeStatus(String projectId, String containerName, boolean codeLoaded) {
+        this.projectId = projectId;
+        this.containerName = containerName;
+        this.codeLoaded = codeLoaded;
+    }
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getContainerName() {
+        return containerName;
+    }
+
+    public void setContainerName(String containerName) {
+        this.containerName = containerName;
+    }
+
+    public boolean isCodeLoaded() {
+        return codeLoaded;
+    }
+
+    public void setCodeLoaded(boolean codeLoaded) {
+        this.codeLoaded = codeLoaded;
+    }
+}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/Environment.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/Environment.java
similarity index 95%
rename from karavan-app/src/main/java/org/apache/camel/karavan/model/Environment.java
rename to karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/Environment.java
index 14ac9099..0c7a9ac6 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/Environment.java
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/Environment.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.model;
+package org.apache.camel.karavan.datagrid.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/GitConfig.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/GitConfig.java
similarity index 94%
rename from karavan-app/src/main/java/org/apache/camel/karavan/model/GitConfig.java
rename to karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/GitConfig.java
index c8b44a5e..7d078e3f 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/GitConfig.java
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/GitConfig.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.model;
+package org.apache.camel.karavan.datagrid.model;
 
 public class GitConfig {
     private String uri;
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/GitRepo.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/GitRepo.java
similarity index 95%
rename from karavan-app/src/main/java/org/apache/camel/karavan/model/GitRepo.java
rename to karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/GitRepo.java
index 25d222f7..aab289c6 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/GitRepo.java
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/GitRepo.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.model;
+package org.apache.camel.karavan.datagrid.model;
 
 import java.util.List;
 
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/GitRepoFile.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/GitRepoFile.java
similarity index 94%
rename from karavan-app/src/main/java/org/apache/camel/karavan/model/GitRepoFile.java
rename to karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/GitRepoFile.java
index 85052004..8f8db5dc 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/GitRepoFile.java
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/GitRepoFile.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.model;
+package org.apache.camel.karavan.datagrid.model;
 
 public class GitRepoFile {
     private String name;
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/GroupedKey.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/GroupedKey.java
similarity index 95%
rename from karavan-app/src/main/java/org/apache/camel/karavan/model/GroupedKey.java
rename to karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/GroupedKey.java
index 3ab02eaf..f0850327 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/GroupedKey.java
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/GroupedKey.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.model;
+package org.apache.camel.karavan.datagrid.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/KaravanGroup.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/KaravanGroup.java
similarity index 93%
rename from karavan-app/src/main/java/org/apache/camel/karavan/model/KaravanGroup.java
rename to karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/KaravanGroup.java
index e871a25d..6a194442 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/KaravanGroup.java
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/KaravanGroup.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.model;
+package org.apache.camel.karavan.datagrid.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/KaravanSchema.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/KaravanSchema.java
new file mode 100644
index 00000000..39e8e27f
--- /dev/null
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/KaravanSchema.java
@@ -0,0 +1,23 @@
+package org.apache.camel.karavan.datagrid.model;
+
+import org.infinispan.protostream.GeneratedSchema;
+import org.infinispan.protostream.annotations.AutoProtoSchemaBuilder;
+
+@AutoProtoSchemaBuilder(
+        includeClasses = {
+                GroupedKey.class,
+                Project.class,
+                ProjectFile.class,
+                PipelineStatus.class,
+                CamelStatus.class,
+                DeploymentStatus.class,
+                PodStatus.class,
+                Environment.class,
+                ServiceStatus.class,
+                CommandName.class,
+                CamelStatusName.class,
+                DevModeCommand.class
+        },
+        schemaPackageName = "karavan")
+public interface KaravanSchema extends GeneratedSchema {
+}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/KaravanUser.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/KaravanUser.java
similarity index 96%
rename from karavan-app/src/main/java/org/apache/camel/karavan/model/KaravanUser.java
rename to karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/KaravanUser.java
index d116ad89..6cfc3728 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/KaravanUser.java
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/KaravanUser.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.model;
+package org.apache.camel.karavan.datagrid.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/PipelineStatus.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/PipelineStatus.java
similarity index 97%
rename from karavan-app/src/main/java/org/apache/camel/karavan/model/PipelineStatus.java
rename to karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/PipelineStatus.java
index b80c379f..70d29ac8 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/PipelineStatus.java
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/PipelineStatus.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.model;
+package org.apache.camel.karavan.datagrid.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/PodStatus.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/PodStatus.java
new file mode 100644
index 00000000..79986b5b
--- /dev/null
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/PodStatus.java
@@ -0,0 +1,100 @@
+package org.apache.camel.karavan.datagrid.model;
+
+import org.infinispan.protostream.annotations.ProtoFactory;
+import org.infinispan.protostream.annotations.ProtoField;
+
+public class PodStatus {
+    public static final String CACHE = "pod_statuses";
+    @ProtoField(number = 1)
+    String name;
+    @ProtoField(number = 2)
+    Boolean ready;
+    @ProtoField(number = 3)
+    String deployment;
+    @ProtoField(number = 4)
+    String projectId;
+    @ProtoField(number = 5)
+    String env;
+    @ProtoField(number = 6)
+    Boolean inDevMode;
+    @ProtoField(number = 7)
+    String memoryInfo;
+    @ProtoField(number = 8)
+    String cpuInfo;
+
+    @ProtoFactory
+    public PodStatus(String name, Boolean ready, String deployment, String projectId, String env, Boolean inDevMode, String memoryInfo, String cpuInfo) {
+        this.name = name;
+        this.ready = ready;
+        this.deployment = deployment;
+        this.projectId = projectId;
+        this.env = env;
+        this.inDevMode = inDevMode;
+        this.memoryInfo = memoryInfo;
+        this.cpuInfo = cpuInfo;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Boolean getReady() {
+        return ready;
+    }
+
+    public void setReady(Boolean ready) {
+        this.ready = ready;
+    }
+
+    public String getDeployment() {
+        return deployment;
+    }
+
+    public void setDeployment(String deployment) {
+        this.deployment = deployment;
+    }
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getEnv() {
+        return env;
+    }
+
+    public void setEnv(String env) {
+        this.env = env;
+    }
+
+    public Boolean getInDevMode() {
+        return inDevMode;
+    }
+
+    public void setInDevMode(Boolean inDevMode) {
+        this.inDevMode = inDevMode;
+    }
+
+    public String getMemoryInfo() {
+        return memoryInfo;
+    }
+
+    public void setMemoryInfo(String memoryInfo) {
+        this.memoryInfo = memoryInfo;
+    }
+
+    public String getCpuInfo() {
+        return cpuInfo;
+    }
+
+    public void setCpuInfo(String cpuInfo) {
+        this.cpuInfo = cpuInfo;
+    }
+}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/Project.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/Project.java
similarity index 98%
rename from karavan-app/src/main/java/org/apache/camel/karavan/model/Project.java
rename to karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/Project.java
index 254d38c4..ae366f07 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/Project.java
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/Project.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.model;
+package org.apache.camel.karavan.datagrid.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectFile.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/ProjectFile.java
similarity index 97%
rename from karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectFile.java
rename to karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/ProjectFile.java
index ad1d6c6e..bab93c65 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectFile.java
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/ProjectFile.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.model;
+package org.apache.camel.karavan.datagrid.model;
 
 import org.infinispan.protostream.annotations.ProtoDoc;
 import org.infinispan.protostream.annotations.ProtoFactory;
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/ServiceStatus.java b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/ServiceStatus.java
similarity index 98%
rename from karavan-app/src/main/java/org/apache/camel/karavan/model/ServiceStatus.java
rename to karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/ServiceStatus.java
index 38dbde50..5864c563 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/ServiceStatus.java
+++ b/karavan-cloud/karavan-datagrid/src/main/java/org/apache/camel/karavan/datagrid/model/ServiceStatus.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.model;
+package org.apache.camel.karavan.datagrid.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-cloud/karavan-datagrid/src/main/resources/application.properties b/karavan-cloud/karavan-datagrid/src/main/resources/application.properties
new file mode 100644
index 00000000..d0c22e27
--- /dev/null
+++ b/karavan-cloud/karavan-datagrid/src/main/resources/application.properties
@@ -0,0 +1,15 @@
+
+# Infinispan Server address
+#quarkus.infinispan-client.hosts=infinispan:11222
+quarkus.infinispan-client.username=admin
+quarkus.infinispan-client.password=karavan
+
+quarkus.infinispan-client.devservices.enabled=true
+quarkus.infinispan-client.devservices.service-name=infinispan
+quarkus.infinispan-client.devservices.image-name=quay.io/infinispan/server:14.0.6.Final
+quarkus.infinispan-client.devservices.port=11222
+quarkus.infinispan-client.health.enabled=false
+
+# Infinispan client intelligence
+# Use BASIC as a Docker for Mac workaround
+quarkus.infinispan-client.client-intelligence=BASIC
diff --git a/karavan-cloud/karavan-datagrid/src/main/resources/command-cache-config.xml b/karavan-cloud/karavan-datagrid/src/main/resources/command-cache-config.xml
new file mode 100644
index 00000000..27481642
--- /dev/null
+++ b/karavan-cloud/karavan-datagrid/src/main/resources/command-cache-config.xml
@@ -0,0 +1,6 @@
+<distributed-cache name="%s" mode="SYNC">
+    <encoding media-type="application/x-protostream"/>
+    <locking isolation="REPEATABLE_READ"/>
+    <groups enabled="true"/>
+    <memory max-count="100000" when-full="REMOVE"/>
+</distributed-cache>
\ No newline at end of file
diff --git a/karavan-cloud/karavan-datagrid/src/main/resources/data-cache-config.xml b/karavan-cloud/karavan-datagrid/src/main/resources/data-cache-config.xml
new file mode 100644
index 00000000..31f6c304
--- /dev/null
+++ b/karavan-cloud/karavan-datagrid/src/main/resources/data-cache-config.xml
@@ -0,0 +1,6 @@
+<distributed-cache name="%s" mode="SYNC">
+    <encoding media-type="application/x-protostream"/>
+    <locking isolation="REPEATABLE_READ"/>
+    <groups enabled="true"/>
+    <memory max-count="1000000" when-full="REMOVE"/>
+</distributed-cache>
\ No newline at end of file
diff --git a/karavan-cloud/karavan-datagrid/src/test/java/org/apache/camel/karavan/datagrid/DevCommandTest.java b/karavan-cloud/karavan-datagrid/src/test/java/org/apache/camel/karavan/datagrid/DevCommandTest.java
new file mode 100644
index 00000000..8602f589
--- /dev/null
+++ b/karavan-cloud/karavan-datagrid/src/test/java/org/apache/camel/karavan/datagrid/DevCommandTest.java
@@ -0,0 +1,60 @@
+package org.apache.camel.karavan.datagrid;
+
+
+import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.vertx.ConsumeEvent;
+import io.vertx.core.json.JsonObject;
+import org.apache.camel.karavan.datagrid.model.CommandName;
+import org.apache.camel.karavan.datagrid.model.DevModeCommand;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+
+import javax.inject.Inject;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.*;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@QuarkusTest
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class DevCommandTest {
+
+    @Inject
+    DatagridService datagridService;
+
+    private List<DevModeCommand> commandsReceived = new ArrayList<>();
+
+    @BeforeAll
+    public void setup() {
+        datagridService.start();
+        commandsReceived.clear();
+    }
+
+    @ConsumeEvent(DatagridService.ADDRESS_DEVMODE_COMMAND)
+    void receiveCommand(JsonObject message) {
+        System.out.println("receiveCommand " + message);
+        commandsReceived.add(message.mapTo(DevModeCommand.class));
+    }
+
+    @Test
+    public void sendCommand() throws InterruptedException {
+        List<DevModeCommand> commandsSent = List.of(
+                new DevModeCommand(CommandName.RUN, Instant.now().toEpochMilli()),
+                new DevModeCommand(CommandName.RELOAD, Instant.now().toEpochMilli()),
+                new DevModeCommand(CommandName.DELETE, Instant.now().toEpochMilli()),
+                new DevModeCommand(CommandName.RUN, Instant.now().toEpochMilli())
+        );
+        commandsSent.forEach(devModeCommand -> datagridService.sendDevModeCommand("test1", devModeCommand));
+
+        CountDownLatch latch = new CountDownLatch(4);
+        latch.await(5, TimeUnit.SECONDS);
+        assertEquals(commandsSent.size(),  commandsReceived.size());
+        assertEquals(commandsSent.get(0).getCommandName().name(),  commandsReceived.get(0).getCommandName().name());
+        assertEquals(commandsSent.get(1).getCommandName().name(),  commandsReceived.get(1).getCommandName().name());
+        assertEquals(commandsSent.get(2).getCommandName().name(),  commandsReceived.get(2).getCommandName().name());
+    }
+
+}
diff --git a/karavan-cloud/karavan-datagrid/src/test/resources/application.properties b/karavan-cloud/karavan-datagrid/src/test/resources/application.properties
new file mode 100644
index 00000000..c721bbf1
--- /dev/null
+++ b/karavan-cloud/karavan-datagrid/src/test/resources/application.properties
@@ -0,0 +1,14 @@
+# Infinispan Server address
+#quarkus.infinispan-client.hosts=infinispan:11222
+quarkus.infinispan-client.username=admin
+quarkus.infinispan-client.password=password
+
+quarkus.infinispan-client.devservices.enabled=true
+quarkus.infinispan-client.devservices.service-name=infinispan
+quarkus.infinispan-client.devservices.image-name=quay.io/infinispan/server:14.0.6.Final
+quarkus.infinispan-client.devservices.port=11222
+quarkus.infinispan-client.health.enabled=false
+
+# Infinispan client intelligence
+# Use BASIC as a Docker for Mac workaround
+quarkus.infinispan-client.client-intelligence=BASIC
diff --git a/karavan-operator/.gitignore b/karavan-cloud/karavan-operator/.gitignore
similarity index 100%
rename from karavan-operator/.gitignore
rename to karavan-cloud/karavan-operator/.gitignore
diff --git a/karavan-app/.mvn/wrapper/maven-wrapper.properties b/karavan-cloud/karavan-operator/.mvn/wrapper/maven-wrapper.properties
similarity index 100%
rename from karavan-app/.mvn/wrapper/maven-wrapper.properties
rename to karavan-cloud/karavan-operator/.mvn/wrapper/maven-wrapper.properties
diff --git a/karavan-operator/Makefile b/karavan-cloud/karavan-operator/Makefile
similarity index 100%
rename from karavan-operator/Makefile
rename to karavan-cloud/karavan-operator/Makefile
diff --git a/karavan-operator/PROJECT b/karavan-cloud/karavan-operator/PROJECT
similarity index 100%
rename from karavan-operator/PROJECT
rename to karavan-cloud/karavan-operator/PROJECT
diff --git a/karavan-app/mvnw b/karavan-cloud/karavan-operator/mvnw
similarity index 100%
rename from karavan-app/mvnw
rename to karavan-cloud/karavan-operator/mvnw
diff --git a/karavan-app/mvnw.cmd b/karavan-cloud/karavan-operator/mvnw.cmd
similarity index 100%
rename from karavan-app/mvnw.cmd
rename to karavan-cloud/karavan-operator/mvnw.cmd
diff --git a/karavan-operator/pom.xml b/karavan-cloud/karavan-operator/pom.xml
similarity index 100%
rename from karavan-operator/pom.xml
rename to karavan-cloud/karavan-operator/pom.xml
diff --git a/karavan-operator/resources/deployments-role.yaml b/karavan-cloud/karavan-operator/resources/deployments-role.yaml
similarity index 100%
rename from karavan-operator/resources/deployments-role.yaml
rename to karavan-cloud/karavan-operator/resources/deployments-role.yaml
diff --git a/karavan-operator/resources/karavan.yaml b/karavan-cloud/karavan-operator/resources/karavan.yaml
similarity index 100%
rename from karavan-operator/resources/karavan.yaml
rename to karavan-cloud/karavan-operator/resources/karavan.yaml
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/Constants.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/Constants.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/Constants.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/Constants.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/KaravanReconciler.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/KaravanReconciler.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/KaravanReconciler.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/KaravanReconciler.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/Utils.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/Utils.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/Utils.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/Utils.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanDeployment.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanDeployment.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanDeployment.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanDeployment.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanPvcData.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanPvcData.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanPvcData.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanPvcData.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanPvcJbang.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanPvcJbang.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanPvcJbang.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanPvcJbang.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanPvcM2Cache.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanPvcM2Cache.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanPvcM2Cache.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanPvcM2Cache.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRole.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRole.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRole.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRole.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRoleBinding.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRoleBinding.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRoleBinding.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRoleBinding.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRoleBindingView.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRoleBindingView.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRoleBindingView.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRoleBindingView.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRoute.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRoute.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRoute.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanRoute.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanService.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanService.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanService.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanService.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanServiceAccount.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanServiceAccount.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanServiceAccount.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanServiceAccount.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanTektonPipeline.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanTektonPipeline.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanTektonPipeline.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanTektonPipeline.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanTektonTask.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanTektonTask.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanTektonTask.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/KaravanTektonTask.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/PipelineRoleBinding.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/PipelineRoleBinding.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/PipelineRoleBinding.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/PipelineRoleBinding.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/PipelineRoleDeployer.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/PipelineRoleDeployer.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/PipelineRoleDeployer.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/PipelineRoleDeployer.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/PipelineServiceAccount.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/PipelineServiceAccount.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/PipelineServiceAccount.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/resource/PipelineServiceAccount.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/CamelRuntime.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/CamelRuntime.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/CamelRuntime.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/CamelRuntime.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/Karavan.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/Karavan.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/Karavan.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/Karavan.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/KaravanOperatorCSVMetadata.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/KaravanOperatorCSVMetadata.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/KaravanOperatorCSVMetadata.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/KaravanOperatorCSVMetadata.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/KaravanSpec.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/KaravanSpec.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/KaravanSpec.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/KaravanSpec.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/KaravanStatus.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/KaravanStatus.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/KaravanStatus.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/spec/KaravanStatus.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/watcher/TektonCrdEventHandler.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/watcher/TektonCrdEventHandler.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/watcher/TektonCrdEventHandler.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/watcher/TektonCrdEventHandler.java
diff --git a/karavan-operator/src/main/java/org/apache/camel/karavan/operator/watcher/TektonSubscriptionEventHandler.java b/karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/watcher/TektonSubscriptionEventHandler.java
similarity index 100%
rename from karavan-operator/src/main/java/org/apache/camel/karavan/operator/watcher/TektonSubscriptionEventHandler.java
rename to karavan-cloud/karavan-operator/src/main/java/org/apache/camel/karavan/operator/watcher/TektonSubscriptionEventHandler.java
diff --git a/karavan-operator/src/main/kubernetes/karavan.svg b/karavan-cloud/karavan-operator/src/main/kubernetes/karavan.svg
similarity index 100%
rename from karavan-operator/src/main/kubernetes/karavan.svg
rename to karavan-cloud/karavan-operator/src/main/kubernetes/karavan.svg
diff --git a/karavan-operator/src/main/resources/application.properties b/karavan-cloud/karavan-operator/src/main/resources/application.properties
similarity index 100%
rename from karavan-operator/src/main/resources/application.properties
rename to karavan-cloud/karavan-operator/src/main/resources/application.properties
diff --git a/karavan-operator/src/main/resources/quarkus-builder-script-kubernetes.sh b/karavan-cloud/karavan-operator/src/main/resources/quarkus-builder-script-kubernetes.sh
similarity index 100%
rename from karavan-operator/src/main/resources/quarkus-builder-script-kubernetes.sh
rename to karavan-cloud/karavan-operator/src/main/resources/quarkus-builder-script-kubernetes.sh
diff --git a/karavan-operator/src/main/resources/quarkus-builder-script-openshift.sh b/karavan-cloud/karavan-operator/src/main/resources/quarkus-builder-script-openshift.sh
similarity index 100%
rename from karavan-operator/src/main/resources/quarkus-builder-script-openshift.sh
rename to karavan-cloud/karavan-operator/src/main/resources/quarkus-builder-script-openshift.sh
diff --git a/karavan-operator/src/main/resources/spring-boot-builder-script-kubernetes.sh b/karavan-cloud/karavan-operator/src/main/resources/spring-boot-builder-script-kubernetes.sh
similarity index 100%
rename from karavan-operator/src/main/resources/spring-boot-builder-script-kubernetes.sh
rename to karavan-cloud/karavan-operator/src/main/resources/spring-boot-builder-script-kubernetes.sh
diff --git a/karavan-operator/src/main/resources/spring-boot-builder-script-openshift.sh b/karavan-cloud/karavan-operator/src/main/resources/spring-boot-builder-script-openshift.sh
similarity index 100%
rename from karavan-operator/src/main/resources/spring-boot-builder-script-openshift.sh
rename to karavan-cloud/karavan-operator/src/main/resources/spring-boot-builder-script-openshift.sh
diff --git a/karavan-operator/src/test/java/org/apache/camel/karavan/operator/KaravanReconcilerE2E.java b/karavan-cloud/karavan-operator/src/test/java/org/apache/camel/karavan/operator/KaravanReconcilerE2E.java
similarity index 100%
rename from karavan-operator/src/test/java/org/apache/camel/karavan/operator/KaravanReconcilerE2E.java
rename to karavan-cloud/karavan-operator/src/test/java/org/apache/camel/karavan/operator/KaravanReconcilerE2E.java
diff --git a/karavan-operator/src/test/java/org/apache/camel/karavan/operator/KaravanReconcilerTest.java b/karavan-cloud/karavan-operator/src/test/java/org/apache/camel/karavan/operator/KaravanReconcilerTest.java
similarity index 100%
rename from karavan-operator/src/test/java/org/apache/camel/karavan/operator/KaravanReconcilerTest.java
rename to karavan-cloud/karavan-operator/src/test/java/org/apache/camel/karavan/operator/KaravanReconcilerTest.java
diff --git a/karavan-operator/src/test/resources/application.properties b/karavan-cloud/karavan-operator/src/test/resources/application.properties
similarity index 100%
rename from karavan-operator/src/test/resources/application.properties
rename to karavan-cloud/karavan-operator/src/test/resources/application.properties
diff --git a/karavan-operator/src/test/resources/kubernetes/kubernetes.yaml b/karavan-cloud/karavan-operator/src/test/resources/kubernetes/kubernetes.yaml
similarity index 100%
rename from karavan-operator/src/test/resources/kubernetes/kubernetes.yaml
rename to karavan-cloud/karavan-operator/src/test/resources/kubernetes/kubernetes.yaml
diff --git a/karavan-operator/src/test/resources/kubernetes/pipelines.yaml b/karavan-cloud/karavan-operator/src/test/resources/kubernetes/pipelines.yaml
similarity index 100%
rename from karavan-operator/src/test/resources/kubernetes/pipelines.yaml
rename to karavan-cloud/karavan-operator/src/test/resources/kubernetes/pipelines.yaml
diff --git a/karavan-operator/src/test/resources/kubernetes/tasks.yaml b/karavan-cloud/karavan-operator/src/test/resources/kubernetes/tasks.yaml
similarity index 100%
rename from karavan-operator/src/test/resources/kubernetes/tasks.yaml
rename to karavan-cloud/karavan-operator/src/test/resources/kubernetes/tasks.yaml
diff --git a/karavan-cloud/pom.xml b/karavan-cloud/pom.xml
new file mode 100644
index 00000000..9a48cdbd
--- /dev/null
+++ b/karavan-cloud/pom.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.apache.camel.karavan</groupId>
+    <artifactId>karavan-cloud</artifactId>
+    <version>3.21.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <properties>
+        <compiler-plugin.version>3.11.0</compiler-plugin.version>
+        <maven.compiler.parameters>true</maven.compiler.parameters>
+        <maven.compiler.source>11</maven.compiler.source>
+        <jandex-maven-plugin-version>3.1.1</jandex-maven-plugin-version>
+        <maven.compiler.target>11</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
+        <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
+        <quarkus.platform.version>2.16.7.Final</quarkus.platform.version>
+        <camel-quarkus.version>2.16.0</camel-quarkus.version>
+        <camel.version>3.21.0</camel.version>
+        <camel-kamelet.version>3.21.0</camel-kamelet.version>
+        <surefire-plugin.version>3.1.0</surefire-plugin.version>
+        <infinispan.version>14.0.9.Final</infinispan.version>
+        <tekton.version>6.3.1</tekton.version>
+        <jgit.version>2.3.1</jgit.version>
+        <quinoa.version>1.2.4</quinoa.version>
+        <resources-plugin.version>3.3.0</resources-plugin.version>
+        <kubernetes-client.version>6.7.1</kubernetes-client.version>
+
+        <picocli.version>4.7.3</picocli.version>
+        <log4j-version>2.20.0</log4j-version>
+        <slf4j-api-version>2.0.6</slf4j-api-version>
+        <log4j2-version>2.20.0</log4j2-version>
+
+        <docker-java.version>3.2.7</docker-java.version>
+
+        <maven-shade-plugin.version>3.4.1</maven-shade-plugin.version>
+        <maven-jar-plugin.version>3.3.0</maven-jar-plugin.version>
+        <quarkus-sdk.version>5.1.1</quarkus-sdk.version>
+        <quarkus.version>2.16.7.Final</quarkus.version>
+    </properties>
+
+    <modules>
+        <module>karavan-cli</module>
+        <module>karavan-datagrid</module>
+        <module>karavan-bashi</module>
+        <module>karavan-app</module>
+        <module>karavan-operator</module>
+    </modules>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>${quarkus.platform.group-id}</groupId>
+                <artifactId>${quarkus.platform.artifact-id}</artifactId>
+                <version>${quarkus.platform.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <repositories>
+        <repository>
+            <id>apache.snapshots</id>
+            <name>Apache Development Snapshot Repository</name>
+            <url>https://repository.apache.org/content/repositories/snapshots/</url>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${compiler-plugin.version}</version>
+                <configuration>
+                    <source>${maven.compiler.source}</source>
+                    <target>${maven.compiler.target}</target>
+                    <parameters>${maven.compiler.parameters}</parameters>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karavan-core/package-lock.json b/karavan-core/package-lock.json
index 5e986e63..0e183943 100644
--- a/karavan-core/package-lock.json
+++ b/karavan-core/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "karavan-core",
-  "version": "3.20.2-SNAPSHOT",
+  "version": "3.21.1-SNAPSHOT",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "karavan-core",
-      "version": "3.20.2-SNAPSHOT",
+      "version": "3.21.1-SNAPSHOT",
       "license": "Apache-2.0",
       "dependencies": {
         "@types/js-yaml": "^4.0.5",
diff --git a/karavan-space/src/designer/karavan.css b/karavan-space/src/designer/karavan.css
index f90cc42b..b62b241a 100644
--- a/karavan-space/src/designer/karavan.css
+++ b/karavan-space/src/designer/karavan.css
@@ -912,8 +912,16 @@
 
 .dsl-modal .pf-c-card__body {
     padding-bottom: 0;
+    height: 54px;
 }
 
+
+.dsl-modal .pf-c-card__body p {
+    overflow: hidden;
+    display: -webkit-box;
+    -webkit-line-clamp: 2;
+    -webkit-box-orient: vertical;
+}
 .dsl-modal .pf-c-card__footer {
     padding-bottom: 1em;
 }
diff --git a/release-utils/release.sh b/release-utils/release.sh
old mode 100644
new mode 100755