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/17 23:57:18 UTC

[camel-karavan] 01/02: Refactor #817

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 c9b43bc576ba5e3a28e0ef579040a94e7f3b5e2d
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Mon Jul 17 18:14:30 2023 -0400

    Refactor #817
---
 .../camel/karavan/api/ConfigurationResource.java   |  44 +-------
 .../apache/camel/karavan/api/DevModeResource.java  |  59 ++++++----
 .../camel/karavan/api/InfrastructureResource.java  |  33 +++---
 .../apache/camel/karavan/api/KameletResources.java |  12 +--
 .../apache/camel/karavan/api/LogWatchResource.java |  11 +-
 .../camel/karavan/api/ProjectFileResource.java     |  16 +--
 .../camel/karavan/api/ProjectGitResource.java      |   2 +-
 .../apache/camel/karavan/api/ProjectResource.java  |  34 +++---
 .../org/apache/camel/karavan/api/SseResource.java  |   5 -
 .../apache/camel/karavan/api/StatusResource.java   |  21 ++--
 .../karavan/datagrid/DevModeCommandListener.java   |  31 ------
 .../karavan/datagrid/DevModeStatusListener.java    |  31 ------
 .../karavan/datagrid/model/DevModeCommand.java     |  83 --------------
 .../karavan/datagrid/model/DevModeCommandName.java |  12 ---
 .../karavan/datagrid/model/DevModeCommandType.java |   9 --
 .../camel/karavan/datagrid/model/Environment.java  |  46 --------
 .../camel/karavan/docker/DockerEventListener.java  |  33 +++---
 .../apache/camel/karavan/docker/DockerService.java |  67 ++++++++++--
 .../camel/karavan/docker/InfinispanContainer.java  |  48 ---------
 .../camel/karavan/health/KaravanLiveness.java      |  17 ---
 .../InfinispanService.java}                        |  63 ++---------
 .../model/CamelStatus.java                         |   2 +-
 .../model/CamelStatusName.java                     |   2 +-
 .../{datagrid => infinispan}/model/CommitInfo.java |   2 +-
 .../model/ContainerInfo.java                       |   2 +-
 .../model/DeploymentStatus.java                    |   2 +-
 .../model/DevModeStatus.java                       |   5 +-
 .../{datagrid => infinispan}/model/GitConfig.java  |   2 +-
 .../{datagrid => infinispan}/model/GitRepo.java    |   2 +-
 .../model/GitRepoFile.java                         |   2 +-
 .../{datagrid => infinispan}/model/GroupedKey.java |   2 +-
 .../model/KaravanSchema.java                       |   6 +-
 .../model/PipelineStatus.java                      |   2 +-
 .../{datagrid => infinispan}/model/PodStatus.java  |   2 +-
 .../{datagrid => infinispan}/model/Project.java    |   2 +-
 .../model/ProjectFile.java                         |   2 +-
 .../model/ServiceStatus.java                       |   2 +-
 .../karavan/kubernetes/DeploymentEventHandler.java |  18 ++--
 .../karavan/kubernetes/KubernetesService.java      |  39 +++----
 .../kubernetes/PipelineRunEventHandler.java        |  22 ++--
 .../camel/karavan/kubernetes/PodEventHandler.java  |  18 ++--
 .../karavan/kubernetes/ServiceEventHandler.java    |  16 +--
 .../karavan/listener/DevModeCommandListener.java   |  46 --------
 .../karavan/listener/DevModeStatusListener.java    |  29 -----
 .../apache/camel/karavan/service/CamelService.java |  49 ++++-----
 .../apache/camel/karavan/service/CodeService.java  |  14 +--
 .../apache/camel/karavan/service/EventService.java | 120 +++++++++++++++++++++
 .../apache/camel/karavan/service/GitService.java   |   5 +-
 .../camel/karavan/service/KaravanService.java      |  71 ++----------
 .../camel/karavan/service/ProjectService.java      |  65 +++++------
 .../camel/karavan/service/ScheduledService.java    |  62 +++++++++++
 .../apache/camel/karavan/shared/ConfigService.java |  67 ++++++++++++
 .../apache/camel/karavan/shared/Configuration.java |  72 +++++++++++++
 .../org/apache/camel/karavan/shared/EventType.java |  24 +++++
 .../src/main/resources/application.properties      |   2 +
 .../camel/karavan/datagrid/DataGridTest.java       |  83 --------------
 .../camel/karavan/infinispan/DataGridTest.java     |  54 ++++++++++
 57 files changed, 732 insertions(+), 860 deletions(-)

diff --git a/karavan-cloud/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
index 795f61be..b60449e4 100644
--- a/karavan-cloud/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,9 +16,7 @@
  */
 package org.apache.camel.karavan.api;
 
-import org.apache.camel.karavan.datagrid.DatagridService;
-import org.apache.camel.karavan.kubernetes.KubernetesService;
-import org.eclipse.microprofile.config.inject.ConfigProperty;
+import org.apache.camel.karavan.shared.ConfigService;
 
 import javax.inject.Inject;
 import javax.ws.rs.GET;
@@ -26,53 +24,17 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
 
 @Path("/api/configuration")
 public class ConfigurationResource {
 
-    @ConfigProperty(name = "karavan.version")
-    String version;
-
-    @ConfigProperty(name = "karavan.environment")
-    String environment;
-
-    @ConfigProperty(name = "karavan.default-runtime")
-    String runtime;
-
-    @ConfigProperty(name = "karavan.runtimes")
-    List<String> runtimes;
-
-    @Inject
-    DatagridService datagridService;
-
     @Inject
-    KubernetesService kubernetesService;
+    ConfigService configService;
 
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public Response getConfiguration() throws Exception {
-        return Response.ok(
-                Map.of(
-                        "version", version,
-                        "infrastructure", kubernetesService.inKubernetes() ? "kubernetes" : "docker",
-                        "environment", environment,
-                        "environments", datagridService.getEnvironments().stream()
-                                .map(e -> e.getName())
-                                        .sorted((o1, o2) -> {
-                                            if (o1.startsWith("dev") && o2.startsWith("test")) return -1;
-                                            if (o1.startsWith("test") && o2.startsWith("dev")) return 1;
-                                            if (o1.startsWith("test") && o2.startsWith("prod")) return -1;
-                                            if (o1.startsWith("prod") && o2.startsWith("test")) return 1;
-                                            return o1.compareTo(o2);
-                                        })
-                                .collect(Collectors.toList()),
-                        "runtime", runtime,
-                        "runtimes", runtimes
-                )
-        ).build();
+        return Response.ok(configService.getConfiguration()).build();
     }
 
 }
\ No newline at end of file
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java
index 403ad264..f703d5cf 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java
@@ -16,25 +16,24 @@
  */
 package org.apache.camel.karavan.api;
 
-import org.apache.camel.karavan.datagrid.DatagridService;
-import org.apache.camel.karavan.datagrid.model.*;
+import org.apache.camel.karavan.docker.DockerService;
+import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.CamelStatus;
+import org.apache.camel.karavan.infinispan.model.DevModeStatus;
+import org.apache.camel.karavan.infinispan.model.PodStatus;
+import org.apache.camel.karavan.infinispan.model.Project;
+import org.apache.camel.karavan.kubernetes.KubernetesService;
 import org.apache.camel.karavan.service.CamelService;
+import org.apache.camel.karavan.shared.ConfigService;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 
 import javax.inject.Inject;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
+import javax.ws.rs.*;
 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.CamelService.DEVMODE_SUFFIX;
+import static org.apache.camel.karavan.shared.ConfigService.DEVMODE_SUFFIX;
 
 @Path("/api/devmode")
 public class DevModeResource {
@@ -46,18 +45,28 @@ public class DevModeResource {
     CamelService camelService;
 
     @Inject
-    DatagridService datagridService;
+    InfinispanService infinispanService;
+
+    @Inject
+    KubernetesService kubernetesService;
+
+    @Inject
+    DockerService dockerService;
 
     @POST
     @Produces(MediaType.APPLICATION_JSON)
     @Consumes(MediaType.APPLICATION_JSON)
     @Path("/{jBangOptions}")
-    public Response runProjectWithJBangOptions(Project project, @PathParam("jBangOptions") String jBangOptions) {
+    public Response runProjectWithJBangOptions(Project project, @PathParam("jBangOptions") String jBangOptions) throws InterruptedException {
         String runnerName = project.getProjectId() + "-" + DEVMODE_SUFFIX;
-        PodStatus status = datagridService.getDevModePodStatuses(runnerName, environment);
+        PodStatus status = infinispanService.getDevModePodStatuses(runnerName, environment);
         if (status == null) {
-            datagridService.saveDevModeStatus(new DevModeStatus(project.getProjectId(), null, null, false));
-            datagridService.sendDevModeCommand(DevModeCommand.createForProject(DevModeCommandName.RUN, project.getProjectId()));
+            infinispanService.saveDevModeStatus(new DevModeStatus(project.getProjectId(), null, null, false));
+            if (ConfigService.inKubernetes()) {
+                kubernetesService.createRunner(project, runnerName, "");
+            } else {
+                dockerService.createRunner(project, runnerName, "");
+            }
             return Response.ok(runnerName).build();
         }
         return Response.notModified().build();
@@ -66,7 +75,7 @@ public class DevModeResource {
     @POST
     @Produces(MediaType.APPLICATION_JSON)
     @Consumes(MediaType.APPLICATION_JSON)
-    public Response runProject(Project project) {
+    public Response runProject(Project project) throws InterruptedException {
         return runProjectWithJBangOptions(project, "");
     }
 
@@ -83,17 +92,23 @@ public class DevModeResource {
     @Consumes(MediaType.APPLICATION_JSON)
     @Path("/{projectId}/{deletePVC}")
     public Response deleteRunner(@PathParam("projectId") String projectId, @PathParam("deletePVC") boolean deletePVC) {
-        datagridService.sendDevModeCommand(DevModeCommand.createForProject(DevModeCommandName.DELETE, projectId));
-        datagridService.deleteDevModeStatus(projectId);
+        String runnerName = projectId + "-" + DEVMODE_SUFFIX;
+        if (ConfigService.inKubernetes()) {
+            kubernetesService.deleteRunner(runnerName, deletePVC);
+        } else {
+            dockerService.stopContainer(runnerName);
+            dockerService.deleteContainer(runnerName);
+        }
+        infinispanService.deleteDevModeStatus(projectId);
         return Response.accepted().build();
     }
 
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/pod/{projectId}")
-    public Response getPodStatus(@PathParam("projectId") String projectId) {
+    public Response getPodStatus(@PathParam("projectId") String projectId) throws RuntimeException {
         String runnerName = projectId + "-" + DEVMODE_SUFFIX;
-        Optional<PodStatus> ps =  datagridService.getPodStatuses(projectId, environment).stream()
+        Optional<PodStatus> ps =  infinispanService.getPodStatuses(projectId, environment).stream()
                 .filter(podStatus -> podStatus.getName().equals(runnerName))
                 .findFirst();
         if (ps.isPresent()) {
@@ -107,7 +122,7 @@ public class DevModeResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/status/{projectId}/{statusName}")
     public Response getCamelStatusByProjectAndEnv(@PathParam("projectId") String projectId, @PathParam("statusName") String statusName) {
-        CamelStatus status = datagridService.getCamelStatus(projectId, environment, statusName);
+        CamelStatus status = infinispanService.getCamelStatus(projectId, environment, statusName);
         if (status != null) {
             return Response.ok(status).build();
         } else {
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java
index 8e0032f1..5c8410ca 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java
@@ -19,12 +19,13 @@ package org.apache.camel.karavan.api;
 import io.smallrye.mutiny.Multi;
 import io.vertx.mutiny.core.eventbus.EventBus;
 import io.vertx.mutiny.core.eventbus.Message;
-import org.apache.camel.karavan.datagrid.DatagridService;
-import org.apache.camel.karavan.datagrid.model.DeploymentStatus;
-import org.apache.camel.karavan.datagrid.model.PodStatus;
-import org.apache.camel.karavan.datagrid.model.Project;
-import org.apache.camel.karavan.datagrid.model.ServiceStatus;
+import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.DeploymentStatus;
+import org.apache.camel.karavan.infinispan.model.PodStatus;
+import org.apache.camel.karavan.infinispan.model.Project;
+import org.apache.camel.karavan.infinispan.model.ServiceStatus;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
+import org.apache.camel.karavan.shared.ConfigService;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
@@ -43,7 +44,7 @@ public class InfrastructureResource {
     EventBus eventBus;
 
     @Inject
-    DatagridService datagridService;
+    InfinispanService infinispanService;
 
     @Inject
     KubernetesService kubernetesService;
@@ -58,7 +59,7 @@ public class InfrastructureResource {
     @Consumes(MediaType.APPLICATION_JSON)
     @Path("/pipeline/{env}")
     public String createPipeline(@PathParam("env") String env, Project project) throws Exception {
-        Project p = datagridService.getProject(project.getProjectId());
+        Project p = infinispanService.getProject(project.getProjectId());
         return kubernetesService.createPipelineRun(project);
     }
 
@@ -99,7 +100,7 @@ public class InfrastructureResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/deployment")
     public List<DeploymentStatus> getAllDeploymentStatuses() throws Exception {
-        return datagridService.getDeploymentStatuses().stream()
+        return infinispanService.getDeploymentStatuses().stream()
                 .sorted(Comparator.comparing(DeploymentStatus::getProjectId))
                 .collect(Collectors.toList());
     }
@@ -108,7 +109,7 @@ public class InfrastructureResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/deployment/{env}")
     public List<DeploymentStatus> getDeploymentStatusesByEnv(@PathParam("env") String env) throws Exception {
-        return datagridService.getDeploymentStatuses(env).stream()
+        return infinispanService.getDeploymentStatuses(env).stream()
                 .sorted(Comparator.comparing(DeploymentStatus::getProjectId))
                 .collect(Collectors.toList());
     }
@@ -134,7 +135,7 @@ public class InfrastructureResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/service")
     public List<ServiceStatus> getAllServiceStatuses() throws Exception {
-        return datagridService.getServiceStatuses().stream()
+        return infinispanService.getServiceStatuses().stream()
                 .sorted(Comparator.comparing(ServiceStatus::getProjectId))
                 .collect(Collectors.toList());
     }
@@ -143,7 +144,7 @@ public class InfrastructureResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/pod/{env}")
     public List<PodStatus> getPodStatusesByEnv(@PathParam("env") String env) throws Exception {
-        return datagridService.getPodStatuses(env).stream()
+        return infinispanService.getPodStatuses(env).stream()
                 .sorted(Comparator.comparing(PodStatus::getProjectId))
                 .collect(Collectors.toList());
     }
@@ -152,7 +153,7 @@ public class InfrastructureResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/pod/{projectId}/{env}")
     public List<PodStatus> getPodStatusesByProjectAndEnv(@PathParam("projectId") String projectId, @PathParam("env") String env) throws Exception {
-        return datagridService.getPodStatuses(projectId, env).stream()
+        return infinispanService.getPodStatuses(projectId, env).stream()
                 .filter(podStatus -> !podStatus.getInDevMode())
                 .sorted(Comparator.comparing(PodStatus::getName))
                 .collect(Collectors.toList());
@@ -178,7 +179,7 @@ public class InfrastructureResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/configmaps")
     public Response getConfigMaps() throws Exception {
-        if (kubernetesService.inKubernetes()) {
+        if (ConfigService.inKubernetes()) {
             return Response.ok(kubernetesService.getConfigMaps(kubernetesService.getNamespace())).build();
         } else {
             return Response.ok(List.of()).build();
@@ -189,7 +190,7 @@ public class InfrastructureResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/secrets")
     public Response getSecrets() throws Exception {
-        if (kubernetesService.inKubernetes()) {
+        if (ConfigService.inKubernetes()) {
             return Response.ok(kubernetesService.getSecrets(kubernetesService.getNamespace())).build();
         } else {
             return Response.ok(List.of()).build();
@@ -200,10 +201,10 @@ public class InfrastructureResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/services")
     public Response getServices() throws Exception {
-        if (kubernetesService.inKubernetes()) {
+        if (ConfigService.inKubernetes()) {
             return Response.ok(kubernetesService.getServices(kubernetesService.getNamespace())).build();
         } else {
-            List<String> list = datagridService.getContainerInfos(environment).stream()
+            List<String> list = infinispanService.getContainerInfos(environment).stream()
                     .map(ci -> ci.getPorts().stream().map(i -> ci.getContainerName() + ":" + i).collect(Collectors.toList()))
                     .flatMap(List::stream).collect(Collectors.toList());
             return Response.ok(list).build();
diff --git a/karavan-cloud/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
index e3788f2c..6d6f777e 100644
--- a/karavan-cloud/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,9 +16,9 @@
  */
 package org.apache.camel.karavan.api;
 
-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.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.Project;
+import org.apache.camel.karavan.infinispan.model.ProjectFile;
 import org.apache.camel.karavan.service.CodeService;
 import org.yaml.snakeyaml.Yaml;
 
@@ -36,7 +36,7 @@ import java.util.stream.Collectors;
 public class KameletResources {
 
     @Inject
-    DatagridService datagridService;
+    InfinispanService infinispanService;
 
     @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 = datagridService.getProjectFiles(Project.NAME_KAMELETS);
+        List<ProjectFile> custom = infinispanService.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 datagridService.getProjectFiles(Project.NAME_KAMELETS).stream()
+        return infinispanService.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-cloud/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
index b6d14670..3a235592 100644
--- a/karavan-cloud/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
@@ -17,10 +17,9 @@
 package org.apache.camel.karavan.api;
 
 import io.fabric8.kubernetes.client.dsl.LogWatch;
-import org.apache.camel.karavan.datagrid.DatagridService;
-import org.apache.camel.karavan.datagrid.model.DevModeCommand;
-import org.apache.camel.karavan.datagrid.model.DevModeCommandName;
+import org.apache.camel.karavan.infinispan.InfinispanService;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
+import org.apache.camel.karavan.shared.ConfigService;
 import org.eclipse.microprofile.context.ManagedExecutor;
 import org.jboss.logging.Logger;
 
@@ -48,7 +47,7 @@ public class LogWatchResource {
     KubernetesService kubernetesService;
 
     @Inject
-    DatagridService datagridService;
+    InfinispanService infinispanService;
 
     @Inject
     ManagedExecutor managedExecutor;
@@ -63,10 +62,10 @@ public class LogWatchResource {
     ) {
         managedExecutor.execute(() -> {
             LOGGER.info("LogWatch for " + name + " starting...");
-            if (kubernetesService.inKubernetes()) {
+            if (ConfigService.inKubernetes()) {
                 getKubernetesLogs(type, name, eventSink, sse);
             } else {
-                datagridService.sendDevModeCommand(DevModeCommand.createForContainer(DevModeCommandName.LOG, name));
+//                infinispanService.sendDevModeCommand(DevModeCommand.createForContainer(DevModeCommandName.LOG, name));
             }
         });
     }
diff --git a/karavan-cloud/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
index 3d693921..638024ff 100644
--- a/karavan-cloud/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
@@ -16,8 +16,8 @@
  */
 package org.apache.camel.karavan.api;
 
-import org.apache.camel.karavan.datagrid.DatagridService;
-import org.apache.camel.karavan.datagrid.model.ProjectFile;
+import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.ProjectFile;
 import org.apache.camel.karavan.service.CodeService;
 
 import javax.inject.Inject;
@@ -41,7 +41,7 @@ import java.util.stream.Collectors;
 public class ProjectFileResource {
 
     @Inject
-    DatagridService datagridService;
+    InfinispanService infinispanService;
 
     @Inject
     CodeService codeService;
@@ -51,7 +51,7 @@ public class ProjectFileResource {
     @Path("/{projectId}")
     public List<ProjectFile> get(@HeaderParam("username") String username,
                                  @PathParam("projectId") String projectId) throws Exception {
-        return datagridService.getProjectFiles(projectId).stream()
+        return infinispanService.getProjectFiles(projectId).stream()
                 .sorted(Comparator.comparing(ProjectFile::getName))
                 .collect(Collectors.toList());
     }
@@ -61,7 +61,7 @@ public class ProjectFileResource {
     @Consumes(MediaType.APPLICATION_JSON)
     public ProjectFile save(ProjectFile file) throws Exception {
         file.setLastUpdate(Instant.now().toEpochMilli());
-        datagridService.saveProjectFile(file);
+        infinispanService.saveProjectFile(file);
         return file;
     }
 
@@ -71,7 +71,7 @@ public class ProjectFileResource {
     public void delete(@HeaderParam("username") String username,
                        @PathParam("project") String project,
                        @PathParam("filename") String filename) throws Exception {
-        datagridService.deleteProjectFile(
+        infinispanService.deleteProjectFile(
                 URLDecoder.decode(project, StandardCharsets.UTF_8.toString()),
                 URLDecoder.decode(filename, StandardCharsets.UTF_8.toString())
         );
@@ -85,11 +85,11 @@ public class ProjectFileResource {
                                    @PathParam("integrationName") String integrationName,
                                    @PathParam("generateRest") boolean generateRest,
                                    @PathParam("generateRoutes") boolean generateRoutes, ProjectFile file) throws Exception {
-        datagridService.saveProjectFile(file);
+        infinispanService.saveProjectFile(file);
         if (generateRest) {
             String yaml = codeService.generate(file.getName(), file.getCode(), generateRoutes);
             ProjectFile integration = new ProjectFile(integrationName, yaml, file.getProjectId(), Instant.now().toEpochMilli());
-            datagridService.saveProjectFile(integration);
+            infinispanService.saveProjectFile(integration);
             return file;
         }
         return file;
diff --git a/karavan-cloud/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
index c6c67825..e35386b0 100644
--- a/karavan-cloud/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
@@ -16,7 +16,7 @@
  */
 package org.apache.camel.karavan.api;
 
-import org.apache.camel.karavan.datagrid.model.Project;
+import org.apache.camel.karavan.infinispan.model.Project;
 import org.apache.camel.karavan.service.ProjectService;
 
 import javax.inject.Inject;
diff --git a/karavan-cloud/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
index 5d2049ca..343aeedb 100644
--- a/karavan-cloud/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
@@ -16,10 +16,10 @@
  */
 package org.apache.camel.karavan.api;
 
-import org.apache.camel.karavan.datagrid.DatagridService;
-import org.apache.camel.karavan.datagrid.model.GroupedKey;
-import org.apache.camel.karavan.datagrid.model.Project;
-import org.apache.camel.karavan.datagrid.model.ProjectFile;
+import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.GroupedKey;
+import org.apache.camel.karavan.infinispan.model.Project;
+import org.apache.camel.karavan.infinispan.model.ProjectFile;
 import org.apache.camel.karavan.service.CodeService;
 import org.apache.camel.karavan.service.GitService;
 import javax.inject.Inject;
@@ -42,7 +42,7 @@ import java.util.stream.Collectors;
 public class ProjectResource {
 
     @Inject
-    DatagridService datagridService;
+    InfinispanService infinispanService;
 
     @Inject
     GitService gitService;
@@ -53,7 +53,7 @@ public class ProjectResource {
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public List<Project> getAll() throws Exception {
-        return datagridService.getProjects().stream()
+        return infinispanService.getProjects().stream()
                 .sorted((p1, p2) -> {
                     if (p1.getProjectId().equalsIgnoreCase(Project.NAME_TEMPLATES)) return 1;
                     if (p2.getProjectId().equalsIgnoreCase(Project.NAME_TEMPLATES)) return 1;
@@ -68,18 +68,18 @@ public class ProjectResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/{project}")
     public Project get(@PathParam("project") String project) throws Exception {
-        return datagridService.getProject(project);
+        return infinispanService.getProject(project);
     }
 
     @POST
     @Produces(MediaType.APPLICATION_JSON)
     @Consumes(MediaType.APPLICATION_JSON)
     public Project save(Project project) throws Exception {
-        boolean isNew = datagridService.getProject(project.getProjectId()) != null;
-        datagridService.saveProject(project);
+        boolean isNew = infinispanService.getProject(project.getProjectId()) != null;
+        infinispanService.saveProject(project);
         if (isNew){
             ProjectFile appProp = codeService.getApplicationProperties(project);
-            datagridService.saveProjectFile(appProp);
+            infinispanService.saveProjectFile(appProp);
         }
         return project;
     }
@@ -90,9 +90,9 @@ public class ProjectResource {
     public void delete(@HeaderParam("username") String username,
                           @PathParam("project") String project) throws Exception {
         String projectId = URLDecoder.decode(project, StandardCharsets.UTF_8.toString());
-        gitService.deleteProject(projectId, datagridService.getProjectFiles(projectId));
-        datagridService.getProjectFiles(projectId).forEach(file -> datagridService.deleteProjectFile(projectId, file.getName()));
-        datagridService.deleteProject(projectId);
+        gitService.deleteProject(projectId, infinispanService.getProjectFiles(projectId));
+        infinispanService.getProjectFiles(projectId).forEach(file -> infinispanService.deleteProjectFile(projectId, file.getName()));
+        infinispanService.deleteProject(projectId);
     }
 
     @POST
@@ -101,11 +101,11 @@ public class ProjectResource {
     @Path("/copy/{sourceProject}")
     public Project copy(@PathParam("sourceProject") String sourceProject, Project project) throws Exception {
 //        Save project
-        Project s = datagridService.getProject(sourceProject);
+        Project s = infinispanService.getProject(sourceProject);
         project.setRuntime(s.getRuntime());
-        datagridService.saveProject(project);
+        infinispanService.saveProject(project);
 //        Copy files
-        Map<GroupedKey, ProjectFile> map = datagridService.getProjectFilesMap(sourceProject).entrySet().stream()
+        Map<GroupedKey, ProjectFile> map = infinispanService.getProjectFilesMap(sourceProject).entrySet().stream()
                 .collect(Collectors.toMap(
                         e -> new GroupedKey(project.getProjectId(), e.getKey().getEnv(), e.getKey().getKey()),
                         e -> {
@@ -114,7 +114,7 @@ public class ProjectResource {
                             return file;
                         })
                 );
-        datagridService.saveProjectFiles(map);
+        infinispanService.saveProjectFiles(map);
         return project;
     }
 }
\ No newline at end of file
diff --git a/karavan-cloud/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
index 1a916862..025fdf70 100644
--- a/karavan-cloud/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
@@ -56,11 +56,6 @@ public class SseResource {
     @OnOverflow(value = OnOverflow.Strategy.BUFFER, bufferSize = 1000)
     Emitter<JsonObject> emitter;
 
-//    @Scheduled(every="1s")
-//    void increment() {
-//        emitter.send(JsonObject.of("name", "marat1", "marat",  new Date()));
-//        emitter.send(JsonObject.of("name", "marat2", "marat",  new Date()));
-//    }
 
     @GET
     @Produces(MediaType.SERVER_SENT_EVENTS)
diff --git a/karavan-cloud/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
index 29304c19..c9f5bbdd 100644
--- a/karavan-cloud/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
@@ -17,8 +17,8 @@
 package org.apache.camel.karavan.api;
 
 import io.vertx.core.eventbus.EventBus;
-import org.apache.camel.karavan.datagrid.DatagridService;
-import org.apache.camel.karavan.datagrid.model.*;
+import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.*;
 import org.jboss.logging.Logger;
 
 import javax.inject.Inject;
@@ -37,7 +37,7 @@ public class StatusResource {
     private static final Logger LOGGER = Logger.getLogger(StatusResource.class.getName());
 
     @Inject
-    DatagridService datagridService;
+    InfinispanService infinispanService;
 
     @Inject
     EventBus bus;
@@ -46,7 +46,7 @@ public class StatusResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/pipeline/{projectId}/{env}")
     public Response getPipelineStatus(@PathParam("projectId") String projectId, @PathParam("env") String env) {
-        PipelineStatus status = datagridService.getPipelineStatus(projectId, env);
+        PipelineStatus status = infinispanService.getPipelineStatus(projectId, env);
         if (status != null) {
             return Response.ok(status).build();
         } else {
@@ -58,12 +58,9 @@ public class StatusResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/deployment/{name}/{env}")
     public Response getDeploymentStatus(@PathParam("name") String name, @PathParam("env") String env) {
-        Optional<Environment> environment = datagridService.getEnvironments().stream().filter(e -> e.getName().equals(env)).findFirst();
-        if (environment.isPresent()){
-            DeploymentStatus status = datagridService.getDeploymentStatus(name, env);
-            if (status != null) {
-                return Response.ok(status).build();
-            }
+        DeploymentStatus status = infinispanService.getDeploymentStatus(name, env);
+        if (status != null) {
+            return Response.ok(status).build();
         }
         return Response.noContent().build();
     }
@@ -72,7 +69,7 @@ public class StatusResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/camel/{projectId}/{env}")
     public Response getCamelStatusByProjectAndEnv(@PathParam("projectId") String projectId, @PathParam("env") String env) {
-        CamelStatus status = datagridService.getCamelStatus(projectId, env, CamelStatusName.context.name());
+        CamelStatus status = infinispanService.getCamelStatus(projectId, env, CamelStatusName.context.name());
         if (status != null) {
             return Response.ok(status).build();
         } else {
@@ -84,6 +81,6 @@ public class StatusResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/camel/{env}")
     public List<CamelStatus> getCamelStatusByEnv(@PathParam("env") String env) {
-        return datagridService.getCamelStatusesByEnv(env, CamelStatusName.context);
+        return infinispanService.getCamelStatusesByEnv(env, CamelStatusName.context);
     }
 }
\ No newline at end of file
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/DevModeCommandListener.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/DevModeCommandListener.java
deleted file mode 100644
index 09f07eaa..00000000
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/DevModeCommandListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-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 DevModeCommandListener {
-
-    private final EventBus eventBus;
-
-    public DevModeCommandListener(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-app/src/main/java/org/apache/camel/karavan/datagrid/DevModeStatusListener.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/DevModeStatusListener.java
deleted file mode 100644
index 7d9a88b4..00000000
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/DevModeStatusListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-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 DevModeStatusListener {
-
-    private final EventBus eventBus;
-
-    public DevModeStatusListener(EventBus eventBus) {
-        this.eventBus = eventBus;
-    }
-
-    @ClientCacheEntryCreated
-    public void entryCreated(ClientCacheEntryCreatedEvent<GroupedKey> event) {
-        eventBus.publish(DatagridService.ADDRESS_DEVMODE_STATUS_INTERNAL, JsonObject.mapFrom(event.getKey()));
-    }
-
-    @ClientCacheEntryModified
-    public void entryModified(ClientCacheEntryModifiedEvent<GroupedKey> event) {
-        eventBus.publish(DatagridService.ADDRESS_DEVMODE_STATUS_INTERNAL, JsonObject.mapFrom(event.getKey()));
-    }
-
-}
\ No newline at end of file
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeCommand.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeCommand.java
deleted file mode 100644
index c364c997..00000000
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeCommand.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.apache.camel.karavan.datagrid.model;
-
-import org.infinispan.protostream.annotations.ProtoFactory;
-import org.infinispan.protostream.annotations.ProtoField;
-
-import java.time.Instant;
-
-public class DevModeCommand {
-
-    public static final String CACHE = "devmode_commands";
-    public static final String DEVMODE_SUFFIX = "-devmode";
-    @ProtoField(number = 1)
-    DevModeCommandName commandName;
-    @ProtoField(number = 2)
-    String projectId;
-    @ProtoField(number = 3)
-    String containerName;
-    @ProtoField(number = 4)
-    DevModeCommandType type;
-    @ProtoField(number = 5)
-    Long time;
-
-    @ProtoFactory
-    public DevModeCommand(DevModeCommandName commandName, String projectId, String containerName, DevModeCommandType type, Long time) {
-        this.commandName = commandName;
-        this.projectId = projectId;
-        this.containerName = containerName;
-        this.type = type;
-        this.time = time;
-    }
-
-    public static DevModeCommand createForProject(DevModeCommandName commandName, String projectId) {
-        return new DevModeCommand(commandName, projectId, projectId + DEVMODE_SUFFIX, DevModeCommandType.DEVMODE, Instant.now().toEpochMilli());
-    }
-
-    public static DevModeCommand createForContainer(DevModeCommandName commandName, String containerName) {
-        return new DevModeCommand(commandName, null, containerName, DevModeCommandType.DEVMODE, Instant.now().toEpochMilli());
-    }
-
-    public static DevModeCommand createDevServiceCommand(DevModeCommandName commandName, String serviceName) {
-        return new DevModeCommand(commandName, null, serviceName, DevModeCommandType.DEVSERVICE, Instant.now().toEpochMilli());
-    }
-
-    public DevModeCommandName getCommandName() {
-        return commandName;
-    }
-
-    public void setCommandName(DevModeCommandName commandName) {
-        this.commandName = commandName;
-    }
-
-    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 DevModeCommandType getType() {
-        return type;
-    }
-
-    public void setType(DevModeCommandType type) {
-        this.type = type;
-    }
-
-    public Long getTime() {
-        return time;
-    }
-
-    public void setTime(Long time) {
-        this.time = time;
-    }
-}
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeCommandName.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeCommandName.java
deleted file mode 100644
index aa0a550b..00000000
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeCommandName.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.apache.camel.karavan.datagrid.model;
-
-import org.infinispan.protostream.annotations.ProtoEnumValue;
-
-public enum DevModeCommandName {
-
-        @ProtoEnumValue(number = 0, name = "RUN") RUN,
-        @ProtoEnumValue (number = 1, name = "STOP") STOP,
-        @ProtoEnumValue (number = 2, name = "DELETE") DELETE,
-        @ProtoEnumValue (number = 3, name = "RELOAD") RELOAD,
-        @ProtoEnumValue (number = 4, name = "LOG") LOG
-}
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeCommandType.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeCommandType.java
deleted file mode 100644
index c0a1d582..00000000
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeCommandType.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.apache.camel.karavan.datagrid.model;
-
-import org.infinispan.protostream.annotations.ProtoEnumValue;
-
-public enum DevModeCommandType {
-
-        @ProtoEnumValue(number = 0, name = "DEVMODE") DEVMODE,
-        @ProtoEnumValue (number = 1, name = "DEVSERVICE") DEVSERVICE
-}
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/Environment.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/Environment.java
deleted file mode 100644
index 0c7a9ac6..00000000
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/Environment.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.apache.camel.karavan.datagrid.model;
-
-import org.infinispan.protostream.annotations.ProtoFactory;
-import org.infinispan.protostream.annotations.ProtoField;
-
-public class Environment {
-    public static final String CACHE = "environments";
-
-    @ProtoField(number = 1)
-    String name;
-    @ProtoField(number = 2)
-    String cluster;
-    @ProtoField(number = 3)
-    String namespace;
-
-    @ProtoFactory
-    public Environment(String name, String cluster, String namespace) {
-        this.name = name;
-        this.cluster = cluster;
-        this.namespace = namespace;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getCluster() {
-        return cluster;
-    }
-
-    public void setCluster(String cluster) {
-        this.cluster = cluster;
-    }
-
-    public String getNamespace() {
-        return namespace;
-    }
-
-    public void setNamespace(String namespace) {
-        this.namespace = namespace;
-    }
-}
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java
index 2480ee80..cda60bf5 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java
@@ -6,10 +6,10 @@ import com.github.dockerjava.api.model.ContainerPort;
 import com.github.dockerjava.api.model.Event;
 import com.github.dockerjava.api.model.EventType;
 import io.vertx.core.eventbus.EventBus;
-import org.apache.camel.karavan.datagrid.DatagridService;
-import org.apache.camel.karavan.datagrid.model.ContainerInfo;
-import org.apache.camel.karavan.datagrid.model.DevModeStatus;
-import org.apache.camel.karavan.datagrid.model.PodStatus;
+import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.ContainerInfo;
+import org.apache.camel.karavan.infinispan.model.DevModeStatus;
+import org.apache.camel.karavan.infinispan.model.PodStatus;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
@@ -23,7 +23,8 @@ import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
-import static org.apache.camel.karavan.datagrid.model.DevModeCommand.DEVMODE_SUFFIX;
+import static org.apache.camel.karavan.shared.EventType.INFINISPAN_STARTED;
+import static org.apache.camel.karavan.shared.ConfigService.DEVMODE_SUFFIX;
 
 @ApplicationScoped
 public class DockerEventListener implements ResultCallback<Event> {
@@ -38,7 +39,7 @@ public class DockerEventListener implements ResultCallback<Event> {
     EventBus eventBus;
 
     @Inject
-    DatagridService datagridService;
+    InfinispanService infinispanService;
 
     private static final Logger LOGGER = Logger.getLogger(DockerEventListener.class.getName());
 
@@ -66,14 +67,14 @@ public class DockerEventListener implements ResultCallback<Event> {
     }
 
     public void onContainerEvent(Event event, Container container) {
-        if (datagridService.isReady()) {
+        if (infinispanService.isReady()) {
             String name = container.getNames()[0].replace("/", "");
             if (Arrays.asList("destroy", "stop", "die", "kill", "pause", "destroy", "rename").contains(event.getStatus())) {
-                datagridService.deleteContainerInfo(name);
+                infinispanService.deleteContainerInfo(name);
             } else if (Arrays.asList("create", "start", "unpause").contains(event.getStatus())) {
                 List<Integer> ports = Arrays.stream(container.getPorts()).map(ContainerPort::getPrivatePort).filter(Objects::nonNull).collect(Collectors.toList());
                 ContainerInfo ci = new ContainerInfo(name, container.getId(), container.getImage(), ports, environment);
-                datagridService.saveContainerInfo(ci);
+                infinispanService.saveContainerInfo(ci);
             }
         }
     }
@@ -82,32 +83,32 @@ public class DockerEventListener implements ResultCallback<Event> {
         String status = event.getStatus();
         String health = status.replace("health_status: ", "");
         LOGGER.infof("Container %s health status: %s", container.getNames()[0], health);
-        eventBus.publish(DockerService.ADDRESS_INFINISPAN_STARTED, health);
+        eventBus.publish(INFINISPAN_STARTED, health);
     }
 
     public void onDevModeEvent(Event event, Container container) {
         try {
-            if (datagridService.isReady()) {
+            if (infinispanService.isReady()) {
                 String status = event.getStatus();
                 String name = container.getNames()[0].replace("/", "");
                 if (Arrays.asList("stop", "die", "kill", "pause", "destroy").contains(event.getStatus())) {
                     String projectId = name.replace(DEVMODE_SUFFIX, "");
-                    datagridService.deletePodStatus(projectId, environment, name);
-                    datagridService.deleteCamelStatuses(projectId, environment);
+                    infinispanService.deletePodStatus(projectId, environment, name);
+                    infinispanService.deleteCamelStatuses(projectId, environment);
                 } else if (Arrays.asList("start", "unpause").contains(event.getStatus())) {
                     String projectId = name.replace(DEVMODE_SUFFIX, "");
                     PodStatus ps = new PodStatus(name, true, null, projectId, environment, true, Instant.ofEpochSecond(container.getCreated()).toString());
-                    datagridService.savePodStatus(ps);
+                    infinispanService.savePodStatus(ps);
                 } else if (status.startsWith("health_status:")) {
                     String health = status.replace("health_status: ", "");
                     LOGGER.infof("Container %s health status: %s", container.getNames()[0], health);
                     //update DevModeStatus
                     String containerName = container.getNames()[0].replace("/", "");
-                    DevModeStatus dms = datagridService.getDevModeStatus(container.getLabels().get("projectId"));
+                    DevModeStatus dms = infinispanService.getDevModeStatus(container.getLabels().get("projectId"));
                     if (dms != null) {
                         dms.setContainerName(containerName);
                         dms.setContainerId(container.getId());
-                        datagridService.saveDevModeStatus(dms);
+                        infinispanService.saveDevModeStatus(dms);
                     }
                 }
             }
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java
index 357b5d87..8b36c505 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java
@@ -16,6 +16,8 @@ import io.quarkus.scheduler.Scheduled;
 import io.smallrye.mutiny.tuples.Tuple2;
 import io.vertx.core.eventbus.EventBus;
 import io.vertx.core.json.JsonObject;
+import org.apache.camel.karavan.infinispan.model.Project;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
 import javax.enterprise.context.ApplicationScoped;
@@ -26,29 +28,72 @@ import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
-import static org.apache.camel.karavan.service.KaravanService.DEVMODE_SUFFIX;
+import static org.apache.camel.karavan.shared.EventType.CONTAINER_STATS;
+import static org.apache.camel.karavan.shared.EventType.INFINISPAN_HEALTH;
+import static org.apache.camel.karavan.shared.ConfigService.DEVMODE_SUFFIX;
 
 @ApplicationScoped
 public class DockerService {
 
     private static final Logger LOGGER = Logger.getLogger(DockerService.class.getName());
 
-    public static final String ADDRESS_INFINISPAN_STARTED = "ADDRESS_INFINISPAN_STARTED";
-
     public static final String NETWORK_NAME = "karavan";
     private static final DecimalFormat formatCpu = new DecimalFormat("0.00");
     private static final DecimalFormat formatMiB = new DecimalFormat("0.0");
     private static final DecimalFormat formatGiB = new DecimalFormat("0.00");
     private static final Map<String, Tuple2<Long, Long>> previousStats = new ConcurrentHashMap<>();
 
+    @ConfigProperty(name = "runner.image")
+    String runnerImage;
+
+    @ConfigProperty(name = "infinispan.image")
+    String infinispanImage;
+    @ConfigProperty(name = "infinispan.port")
+    String infinispanPort;
+    @ConfigProperty(name = "infinispan.username")
+    String infinispanUsername;
+    @ConfigProperty(name = "infinispan.password")
+    String infinispanPassword;
+
     @Inject
     DockerEventListener dockerEventListener;
 
     @Inject
     EventBus eventBus;
 
-    @Scheduled(every = "{karavan.container-stats-interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
-    void collectContainersStats() {
+    public void createRunner(Project project, String runnerName, String jBangOptions) throws InterruptedException {
+        String projectId = project.getProjectId();
+        LOGGER.infof("DevMode starting for %s", projectId);
+        HealthCheck healthCheck = new HealthCheck().withTest(List.of("CMD", "curl", "-f", "http://localhost:8080/q/dev/health"))
+                .withInterval(10000000000L).withTimeout(10000000000L).withStartPeriod(10000000000L).withRetries(30);
+        createContainer(runnerName, runnerImage,
+                List.of(), "", false, healthCheck,
+                Map.of("type", "devmode", "projectId", projectId));
+        startContainer(runnerName);
+        LOGGER.infof("DevMode started for %s", projectId);
+    }
+
+    public static final String INFINISPAN_CONTAINER_NAME = "infinispan";
+
+    public void startInfinispan() {
+        try {
+            LOGGER.info("Infinispan is starting...");
+
+            HealthCheck healthCheck = new HealthCheck().withTest(List.of("CMD", "curl", "-f", "http://localhost:11222/rest/v2/cache-managers/default/health/status"))
+                    .withInterval(10000000000L).withTimeout(10000000000L).withStartPeriod(10000000000L).withRetries(30);
+
+            createContainer(INFINISPAN_CONTAINER_NAME, infinispanImage,
+                    List.of("USER=" + infinispanUsername, "PASS=" + infinispanPassword),
+                    infinispanPort, true, healthCheck, Map.of()
+            );
+            startContainer(INFINISPAN_CONTAINER_NAME);
+            LOGGER.info("Infinispan is started");
+        } catch (Exception e) {
+            LOGGER.error(e.getMessage());
+        }
+    }
+
+    public void collectContainersStats() {
         getDockerClient().listContainersCmd().exec().forEach(container -> {
             Statistics stats = getContainerStats(container.getId());
 
@@ -61,7 +106,7 @@ public class DockerService {
                     "memory", memoryUsage + " / " + memoryLimit,
                     "cpu", formatCpu(name, stats)
             );
-//            eventBus.publish(ADDRESS_CONTAINER_STATS, data);
+            eventBus.publish(CONTAINER_STATS, data);
         });
     }
 
@@ -69,6 +114,10 @@ public class DockerService {
         getDockerClient().eventsCmd().exec(dockerEventListener);
     }
 
+    public void stopListeners() throws IOException {
+        dockerEventListener.close();
+    }
+
     public void createNetwork() {
         if (!getDockerClient().listNetworksCmd().exec().stream()
                 .filter(n -> n.getName().equals(NETWORK_NAME))
@@ -84,13 +133,13 @@ public class DockerService {
         }
     }
 
-    public void checkDataGridHealth() {
+    public void checkInfinispanHealth() {
         getDockerClient().listContainersCmd().exec().stream()
                 .filter(c -> c.getState().equals("running"))
                 .forEach(c -> {
                     HealthState hs = getDockerClient().inspectContainerCmd(c.getId()).exec().getState().getHealth();
-                    if (c.getNames()[0].equals("/" + InfinispanContainer.INFINISPAN_CONTAINER_NAME)) {
-//                        eventBus.publish(ADDRESS_INFINISPAN_HEALTH, hs.getStatus());
+                    if (c.getNames()[0].equals("/" + INFINISPAN_CONTAINER_NAME)) {
+                        eventBus.publish(INFINISPAN_HEALTH, hs.getStatus());
                     }
                 });
     }
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/docker/InfinispanContainer.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/docker/InfinispanContainer.java
deleted file mode 100644
index dd7b596c..00000000
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/docker/InfinispanContainer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.apache.camel.karavan.docker;
-
-import com.github.dockerjava.api.model.HealthCheck;
-import org.eclipse.microprofile.config.inject.ConfigProperty;
-import org.jboss.logging.Logger;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-import java.util.List;
-import java.util.Map;
-
-@ApplicationScoped
-public class InfinispanContainer {
-
-    @ConfigProperty(name = "infinispan.image")
-    String infinispanImage;
-    @ConfigProperty(name = "infinispan.port")
-    String infinispanPort;
-    @ConfigProperty(name = "infinispan.username")
-    String infinispanUsername;
-    @ConfigProperty(name = "infinispan.password")
-    String infinispanPassword;
-
-    @Inject
-    DockerService dockerService;
-
-    private static final Logger LOGGER = Logger.getLogger(InfinispanContainer.class.getName());
-
-    public static final String INFINISPAN_CONTAINER_NAME = "infinispan";
-
-    public void startInfinispan() {
-        try {
-            LOGGER.info("Infinispan is starting...");
-
-            HealthCheck healthCheck = new HealthCheck().withTest(List.of("CMD", "curl", "-f", "http://localhost:11222/rest/v2/cache-managers/default/health/status"))
-                    .withInterval(10000000000L).withTimeout(10000000000L).withStartPeriod(10000000000L).withRetries(30);
-
-            dockerService.createContainer(INFINISPAN_CONTAINER_NAME, infinispanImage,
-                    List.of("USER=" + infinispanUsername, "PASS=" + infinispanPassword),
-                    infinispanPort, true, healthCheck, Map.of()
-            );
-            dockerService.startContainer(INFINISPAN_CONTAINER_NAME);
-            LOGGER.info("Infinispan is started");
-        } catch (Exception e) {
-            LOGGER.error(e.getMessage());
-        }
-    }
-}
\ No newline at end of file
diff --git a/karavan-cloud/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
deleted file mode 100644
index e08c3ad6..00000000
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/health/KaravanLiveness.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.apache.camel.karavan.health;
-
-import org.eclipse.microprofile.health.HealthCheck;
-import org.eclipse.microprofile.health.HealthCheckResponse;
-import org.eclipse.microprofile.health.Liveness;
-
-import javax.enterprise.context.ApplicationScoped;
-
-@Liveness
-@ApplicationScoped
-public class KaravanLiveness implements HealthCheck {
-
-    @Override
-    public HealthCheckResponse call() {
-        return HealthCheckResponse.up("Karavan in running");
-    }
-}
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/DatagridService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java
similarity index 84%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/DatagridService.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java
index eb898981..24879223 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/DatagridService.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java
@@ -14,14 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.karavan.datagrid;
+package org.apache.camel.karavan.infinispan;
 
-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.infinispan.model.*;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
+import org.eclipse.microprofile.faulttolerance.Fallback;
 import org.infinispan.client.hotrod.RemoteCache;
 import org.infinispan.client.hotrod.RemoteCacheManager;
 import org.infinispan.client.hotrod.Search;
@@ -48,12 +47,7 @@ import static org.infinispan.query.remote.client.ProtobufMetadataManagerConstant
 
 @Default
 @ApplicationScoped
-public class DatagridService  {
-
-    public static final String ADDRESS_DEVMODE_COMMAND = "ADDRESS_DEVMODE_COMMAND";
-    public static final String ADDRESS_DEVMODE_STATUS = "ADDRESS_DEVMODE_STATUS";
-    protected static final String ADDRESS_DEVMODE_COMMAND_INTERNAL = "ADDRESS_DEVMODE_COMMAND_INTERNAL";
-    protected static final String ADDRESS_DEVMODE_STATUS_INTERNAL = "ADDRESS_DEVMODE_STATUS_INTERNAL";
+public class InfinispanService {
 
     @ConfigProperty(name ="infinispan.hosts")
     String infinispanHosts;
@@ -69,11 +63,9 @@ public class DatagridService  {
     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, DevModeStatus> devmodeStatuses;
     private RemoteCache<GroupedKey, ContainerInfo> containers;
-    private RemoteCache<GroupedKey, DevModeCommand> devmodeCommands;
     private final AtomicBoolean ready = new AtomicBoolean(false);
 
     private RemoteCacheManager cacheManager;
@@ -81,12 +73,12 @@ public class DatagridService  {
     @Inject
     EventBus eventBus;
 
-    private static final Logger LOGGER = Logger.getLogger(DatagridService.class.getName());
+    private static final Logger LOGGER = Logger.getLogger(InfinispanService.class.getName());
 
     private static final String DEFAULT_ENVIRONMENT = "dev";
 
     public void start() {
-        LOGGER.info("DatagridService is starting in remote mode");
+        LOGGER.info("InfinispanService is starting in remote mode");
 
         ProtoStreamMarshaller marshaller = new ProtoStreamMarshaller();
         marshaller.register(new KaravanSchemaImpl());
@@ -104,7 +96,6 @@ public class DatagridService  {
 
         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);
@@ -116,15 +107,12 @@ public class DatagridService  {
         deploymentStatuses = getOrCreateCache(DeploymentStatus.CACHE, false);
         devmodeStatuses = getOrCreateCache(DevModeStatus.CACHE, false);
         containers = getOrCreateCache(ContainerInfo.CACHE, false);
-        devmodeCommands = getOrCreateCache(DevModeCommand.CACHE, true);
 
-        cacheManager.getCache(DevModeCommand.CACHE).addClientListener(new DevModeCommandListener(eventBus));
-        cacheManager.getCache(DevModeStatus.CACHE).addClientListener(new DevModeStatusListener(eventBus));
         // Grab the generated protobuf schema and registers in the server.
         cacheManager.getCache(PROTOBUF_METADATA_CACHE_NAME).put("karavan.proto", getResourceFile("/proto/karavan.proto"));
 
         ready.set(true);
-        LOGGER.info("DatagridService is started in remote mode");
+        LOGGER.info("InfinispanService is started in remote mode");
     }
 
     public boolean isReady() {
@@ -136,20 +124,6 @@ public class DatagridService  {
         return cacheManager.administration().getOrCreateCache(name, new StringConfiguration(String.format(config, name)));
     }
 
-    @ConsumeEvent(value = ADDRESS_DEVMODE_COMMAND_INTERNAL, blocking = true, ordered = true, local = false)
-    void sendCommand(JsonObject message) {
-        GroupedKey key = message.mapTo(GroupedKey.class);
-        DevModeCommand command = getDevModeCommand(key);
-        eventBus.publish(DatagridService.ADDRESS_DEVMODE_COMMAND, JsonObject.mapFrom(command));
-    }
-
-    @ConsumeEvent(value = ADDRESS_DEVMODE_STATUS_INTERNAL, blocking = true, ordered = true, local = false)
-    void sendStatus(JsonObject message) {
-        GroupedKey key = message.mapTo(GroupedKey.class);
-        DevModeStatus status = devmodeStatuses.get(key);
-        eventBus.publish(DatagridService.ADDRESS_DEVMODE_STATUS, JsonObject.mapFrom(status));
-    }
-
     public List<Project> getProjects() {
         return projects.values().stream().collect(Collectors.toList());
     }
@@ -333,14 +307,6 @@ public class DatagridService  {
         });
     }
 
-    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));
     }
@@ -381,18 +347,6 @@ public class DatagridService  {
        return new ArrayList<>(devmodeStatuses.values());
     }
 
-    public void sendDevModeCommand(DevModeCommand command) {
-        devmodeCommands.put(GroupedKey.create(command.getContainerName(), DEFAULT_ENVIRONMENT, command.getTime().toString()), command);
-    }
-
-    public DevModeCommand getDevModeCommand(GroupedKey key) {
-        return devmodeCommands.get(key);
-    }
-
-    public void deleteDevModeCommand(DevModeCommand command) {
-        containers.remove(GroupedKey.create(command.getContainerName(), DEFAULT_ENVIRONMENT, command.getTime().toString()));
-    }
-
     public void saveContainerInfo(ContainerInfo ci) {
         containers.put(GroupedKey.create(ci.getContainerName(), ci.getEnv() != null ? ci.getEnv() : DEFAULT_ENVIRONMENT, ci.getContainerName()), ci);
     }
@@ -418,14 +372,13 @@ public class DatagridService  {
             podStatuses.clearAsync(),
             pipelineStatuses.clearAsync(),
             camelStatuses.clearAsync(),
-            devmodeCommands.clearAsync(),
             devmodeStatuses.clearAsync()
         ).join();
     }
 
     private String getResourceFile(String path) {
         try {
-            InputStream inputStream = DatagridService.class.getResourceAsStream(path);
+            InputStream inputStream = InfinispanService.class.getResourceAsStream(path);
             return new BufferedReader(new InputStreamReader(inputStream))
                     .lines().collect(Collectors.joining(System.getProperty("line.separator")));
         } catch (Exception e) {
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/CamelStatus.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CamelStatus.java
similarity index 96%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/CamelStatus.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CamelStatus.java
index cf58dca9..382a29d8 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/CamelStatus.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CamelStatus.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/CamelStatusName.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CamelStatusName.java
similarity index 92%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/CamelStatusName.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CamelStatusName.java
index 681558a3..502446c3 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/CamelStatusName.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CamelStatusName.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 import org.infinispan.protostream.annotations.ProtoEnumValue;
 
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/CommitInfo.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CommitInfo.java
similarity index 95%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/CommitInfo.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CommitInfo.java
index eec06683..b7ee2075 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/CommitInfo.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CommitInfo.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 import java.util.List;
 
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/ContainerInfo.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ContainerInfo.java
similarity index 96%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/ContainerInfo.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ContainerInfo.java
index c23dcd16..985e70b3 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/ContainerInfo.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ContainerInfo.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DeploymentStatus.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/DeploymentStatus.java
similarity index 98%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DeploymentStatus.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/DeploymentStatus.java
index a0af1d46..95e35d67 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DeploymentStatus.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/DeploymentStatus.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeStatus.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/DevModeStatus.java
similarity index 95%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeStatus.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/DevModeStatus.java
index cae45fbb..c45208d3 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/DevModeStatus.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/DevModeStatus.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
@@ -33,6 +33,9 @@ public class DevModeStatus {
         this.logging = false;
     }
 
+    public DevModeStatus() {
+    }
+
     public String getProjectId() {
         return projectId;
     }
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/GitConfig.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GitConfig.java
similarity index 94%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/GitConfig.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GitConfig.java
index 7d078e3f..285c8017 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/GitConfig.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GitConfig.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 public class GitConfig {
     private String uri;
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/GitRepo.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GitRepo.java
similarity index 95%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/GitRepo.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GitRepo.java
index aab289c6..4736814f 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/GitRepo.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GitRepo.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 import java.util.List;
 
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/GitRepoFile.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GitRepoFile.java
similarity index 93%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/GitRepoFile.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GitRepoFile.java
index 8f8db5dc..a1186efe 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/GitRepoFile.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GitRepoFile.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 public class GitRepoFile {
     private String name;
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/GroupedKey.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GroupedKey.java
similarity index 97%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/GroupedKey.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GroupedKey.java
index ae06b8e9..1f1632ca 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/GroupedKey.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GroupedKey.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/KaravanSchema.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/KaravanSchema.java
similarity index 78%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/KaravanSchema.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/KaravanSchema.java
index 22d5e741..4176d04f 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/KaravanSchema.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/KaravanSchema.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 import org.infinispan.protostream.GeneratedSchema;
 import org.infinispan.protostream.annotations.AutoProtoSchemaBuilder;
@@ -12,12 +12,8 @@ import org.infinispan.protostream.annotations.AutoProtoSchemaBuilder;
                 CamelStatus.class,
                 DeploymentStatus.class,
                 PodStatus.class,
-                Environment.class,
                 ServiceStatus.class,
-                DevModeCommandName.class,
-                DevModeCommandType.class,
                 CamelStatusName.class,
-                DevModeCommand.class,
                 DevModeStatus.class,
                 ContainerInfo.class
         },
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/PipelineStatus.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/PipelineStatus.java
similarity index 97%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/PipelineStatus.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/PipelineStatus.java
index 70d29ac8..fd0831d0 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/PipelineStatus.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/PipelineStatus.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/PodStatus.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/PodStatus.java
similarity index 98%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/PodStatus.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/PodStatus.java
index c1ee17e8..f7aaa40e 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/PodStatus.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/PodStatus.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/Project.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java
similarity index 97%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/Project.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java
index ae366f07..92e06f90 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/Project.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/ProjectFile.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ProjectFile.java
similarity index 97%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/ProjectFile.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ProjectFile.java
index 853be3a6..14cc3adf 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/ProjectFile.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ProjectFile.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 import org.infinispan.protostream.annotations.ProtoDoc;
 import org.infinispan.protostream.annotations.ProtoFactory;
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/ServiceStatus.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ServiceStatus.java
similarity index 97%
rename from karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/ServiceStatus.java
rename to karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ServiceStatus.java
index 07316505..9ce1d073 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/datagrid/model/ServiceStatus.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ServiceStatus.java
@@ -1,4 +1,4 @@
-package org.apache.camel.karavan.datagrid.model;
+package org.apache.camel.karavan.infinispan.model;
 
 import org.infinispan.protostream.annotations.ProtoFactory;
 import org.infinispan.protostream.annotations.ProtoField;
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java
index a94b121e..cca7c4f4 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java
@@ -2,18 +2,18 @@ package org.apache.camel.karavan.kubernetes;
 
 import io.fabric8.kubernetes.api.model.apps.Deployment;
 import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
-import org.apache.camel.karavan.datagrid.DatagridService;
-import org.apache.camel.karavan.datagrid.model.DeploymentStatus;
+import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.DeploymentStatus;
 import org.jboss.logging.Logger;
 
 public class DeploymentEventHandler implements ResourceEventHandler<Deployment> {
 
     private static final Logger LOGGER = Logger.getLogger(DeploymentEventHandler.class.getName());
-    private final DatagridService datagridService;
+    private final InfinispanService infinispanService;
     private final KubernetesService kubernetesService;
 
-    public DeploymentEventHandler(DatagridService datagridService, KubernetesService kubernetesService) {
-        this.datagridService = datagridService;
+    public DeploymentEventHandler(InfinispanService infinispanService, KubernetesService kubernetesService) {
+        this.infinispanService = infinispanService;
         this.kubernetesService = kubernetesService;
     }
 
@@ -22,7 +22,7 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment>
         try {
             LOGGER.info("onAdd " + deployment.getMetadata().getName());
             DeploymentStatus ds = getDeploymentStatus(deployment);
-            datagridService.saveDeploymentStatus(ds);
+            infinispanService.saveDeploymentStatus(ds);
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
@@ -33,7 +33,7 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment>
         try {
             LOGGER.info("onUpdate " + newDeployment.getMetadata().getName());
             DeploymentStatus ds = getDeploymentStatus(newDeployment);
-            datagridService.saveDeploymentStatus(ds);
+            infinispanService.saveDeploymentStatus(ds);
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
@@ -48,8 +48,8 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment>
                     deployment.getMetadata().getNamespace(),
                     kubernetesService.getCluster(),
                     kubernetesService.environment);
-            datagridService.deleteDeploymentStatus(ds);
-            datagridService.deleteCamelStatuses(deployment.getMetadata().getName(), ds.getEnv());
+            infinispanService.deleteDeploymentStatus(ds);
+            infinispanService.deleteCamelStatuses(deployment.getMetadata().getName(), ds.getEnv());
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java
index 8ded5a49..dc6fb90f 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java
@@ -27,12 +27,12 @@ import io.fabric8.openshift.api.model.ImageStream;
 import io.fabric8.openshift.client.OpenShiftClient;
 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.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.Project;
+import org.apache.camel.karavan.infinispan.model.ProjectFile;
 import org.apache.camel.karavan.service.CodeService;
+import org.apache.camel.karavan.shared.ConfigService;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.eclipse.microprofile.health.HealthCheck;
 import org.eclipse.microprofile.health.HealthCheckResponse;
@@ -54,8 +54,6 @@ import static org.apache.camel.karavan.service.CodeService.APPLICATION_PROPERTIE
 public class KubernetesService implements HealthCheck {
 
     private static final Logger LOGGER = Logger.getLogger(KubernetesService.class.getName());
-    public static final String START_INFORMERS = "start-informers";
-    public static final String STOP_INFORMERS = "stop-informers";
     public static final int INFORMERS = 4;
     private static final String CAMEL_PREFIX = "camel";
     private static final String KARAVAN_PREFIX = "karavan";
@@ -67,7 +65,7 @@ public class KubernetesService implements HealthCheck {
     EventBus eventBus;
 
     @Inject
-    DatagridService datagridService;
+    InfinispanService infinispanService;
 
     @Produces
     public KubernetesClient kubernetesClient() {
@@ -95,30 +93,29 @@ public class KubernetesService implements HealthCheck {
 
     List<SharedIndexInformer> informers = new ArrayList<>(INFORMERS);
 
-    @ConsumeEvent(value = START_INFORMERS, blocking = true)
-    void startInformers(String data) {
+    public void startInformers(String data) {
         try {
             stopInformers(null);
             LOGGER.info("Starting Kubernetes Informers");
 
             SharedIndexInformer<Deployment> deploymentInformer = kubernetesClient().apps().deployments().inNamespace(getNamespace())
                     .withLabels(getRuntimeLabels()).inform();
-            deploymentInformer.addEventHandlerWithResyncPeriod(new DeploymentEventHandler(datagridService, this), 30 * 1000L);
+            deploymentInformer.addEventHandlerWithResyncPeriod(new DeploymentEventHandler(infinispanService, this), 30 * 1000L);
             informers.add(deploymentInformer);
 
             SharedIndexInformer<Service> serviceInformer = kubernetesClient().services().inNamespace(getNamespace())
                     .withLabels(getRuntimeLabels()).inform();
-            serviceInformer.addEventHandlerWithResyncPeriod(new ServiceEventHandler(datagridService, this), 30 * 1000L);
+            serviceInformer.addEventHandlerWithResyncPeriod(new ServiceEventHandler(infinispanService, this), 30 * 1000L);
             informers.add(serviceInformer);
 
             SharedIndexInformer<PipelineRun> pipelineRunInformer = tektonClient().v1beta1().pipelineRuns().inNamespace(getNamespace())
                     .withLabels(getRuntimeLabels()).inform();
-            pipelineRunInformer.addEventHandlerWithResyncPeriod(new PipelineRunEventHandler(datagridService, this), 30 * 1000L);
+            pipelineRunInformer.addEventHandlerWithResyncPeriod(new PipelineRunEventHandler(infinispanService, this), 30 * 1000L);
             informers.add(pipelineRunInformer);
 
             SharedIndexInformer<Pod> podRunInformer = kubernetesClient().pods().inNamespace(getNamespace())
                     .withLabels(getRuntimeLabels()).inform();
-            podRunInformer.addEventHandlerWithResyncPeriod(new PodEventHandler(datagridService, this), 30 * 1000L);
+            podRunInformer.addEventHandlerWithResyncPeriod(new PodEventHandler(infinispanService, this), 30 * 1000L);
             informers.add(podRunInformer);
 
             LOGGER.info("Started Kubernetes Informers");
@@ -130,7 +127,7 @@ public class KubernetesService implements HealthCheck {
 
     @Override
     public HealthCheckResponse call() {
-        if (inKubernetes()) {
+        if (ConfigService.inKubernetes()) {
             if (informers.size() == INFORMERS) {
                 return HealthCheckResponse.up("All Kubernetes informers are running.");
             } else {
@@ -141,8 +138,7 @@ public class KubernetesService implements HealthCheck {
         }
     }
 
-    @ConsumeEvent(value = STOP_INFORMERS, blocking = true)
-    void stopInformers(String data) {
+    public void stopInformers(String data) {
         LOGGER.info("Stop Kubernetes Informers");
         informers.forEach(SharedIndexInformer::close);
         informers.clear();
@@ -389,11 +385,11 @@ public class KubernetesService implements HealthCheck {
         return result;
     }
 
-    public String tryCreateRunner(Project project, String runnerName, String jBangOptions) {
+    public void createRunner(Project project, String runnerName, String jBangOptions) {
         createPVC(runnerName);
         Pod old = kubernetesClient().pods().inNamespace(getNamespace()).withName(runnerName).get();
         if (old == null) {
-            ProjectFile properties = datagridService.getProjectFile(project.getProjectId(), APPLICATION_PROPERTIES_FILENAME);
+            ProjectFile properties = infinispanService.getProjectFile(project.getProjectId(), APPLICATION_PROPERTIES_FILENAME);
             Map<String, String> containerResources = CodeService
                     .getRunnerContainerResourcesMap(properties, isOpenshift(), project.getRuntime().equals("quarkus"));
             Pod pod = getRunnerPod(project.getProjectId(), runnerName, jBangOptions, containerResources);
@@ -401,7 +397,6 @@ public class KubernetesService implements HealthCheck {
             LOGGER.info("Created pod " + result.getMetadata().getName());
         }
         createService(runnerName);
-        return runnerName;
     }
 
     public void deleteRunner(String name, boolean deletePVC) {
@@ -542,7 +537,7 @@ public class KubernetesService implements HealthCheck {
     }
 
     public boolean isOpenshift() {
-        return inKubernetes() ? kubernetesClient().isAdaptable(OpenShiftClient.class) : false;
+        return ConfigService.inKubernetes() ? kubernetesClient().isAdaptable(OpenShiftClient.class) : false;
     }
 
     public String getCluster() {
@@ -553,8 +548,4 @@ public class KubernetesService implements HealthCheck {
         return currentNamespace;
     }
 
-    public boolean inKubernetes() {
-        return Objects.nonNull(System.getenv("KUBERNETES_SERVICE_HOST"));
-    }
-
 }
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PipelineRunEventHandler.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PipelineRunEventHandler.java
index 441e019c..9dcf5c1f 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PipelineRunEventHandler.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PipelineRunEventHandler.java
@@ -2,9 +2,9 @@ package org.apache.camel.karavan.kubernetes;
 
 import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
 import io.fabric8.tekton.pipeline.v1beta1.PipelineRun;
-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.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.PipelineStatus;
+import org.apache.camel.karavan.infinispan.model.Project;
 import org.jboss.logging.Logger;
 
 import java.time.Instant;
@@ -12,11 +12,11 @@ import java.time.Instant;
 public class PipelineRunEventHandler implements ResourceEventHandler<PipelineRun> {
 
     private static final Logger LOGGER = Logger.getLogger(PipelineRunEventHandler.class.getName());
-    private DatagridService datagridService;
+    private InfinispanService infinispanService;
     private KubernetesService kubernetesService;
 
-    public PipelineRunEventHandler(DatagridService datagridService, KubernetesService kubernetesService) {
-        this.datagridService = datagridService;
+    public PipelineRunEventHandler(InfinispanService infinispanService, KubernetesService kubernetesService) {
+        this.infinispanService = infinispanService;
         this.kubernetesService = kubernetesService;
     }
 
@@ -25,7 +25,7 @@ public class PipelineRunEventHandler implements ResourceEventHandler<PipelineRun
         try {
             LOGGER.info("onAdd " + pipelineRun.getMetadata().getName());
             PipelineStatus ps = getPipelineStatus(pipelineRun);
-            if (ps != null) datagridService.savePipelineStatus(ps);
+            if (ps != null) infinispanService.savePipelineStatus(ps);
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
@@ -36,7 +36,7 @@ public class PipelineRunEventHandler implements ResourceEventHandler<PipelineRun
         try {
             LOGGER.info("onUpdate " + newPipelineRun.getMetadata().getName());
             PipelineStatus ps = getPipelineStatus(newPipelineRun);
-            if (ps != null) datagridService.savePipelineStatus(ps);
+            if (ps != null) infinispanService.savePipelineStatus(ps);
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
@@ -48,10 +48,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 = datagridService.getProject(projectId);
+                Project project = infinispanService.getProject(projectId);
                 if (project != null) {
                     PipelineStatus ps = new PipelineStatus(project.getProjectId(), kubernetesService.environment);
-                    datagridService.deletePipelineStatus(ps);
+                    infinispanService.deletePipelineStatus(ps);
                 }
             }
         } catch (Exception e){
@@ -62,7 +62,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 = datagridService.getProject(projectId);
+            Project project = infinispanService.getProject(projectId);
             if (project != null) {
                 PipelineStatus pipelineStatus = new PipelineStatus(project.getProjectId(), kubernetesService.environment);
 
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java
index ab4aad86..3c0e6f84 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java
@@ -5,21 +5,21 @@ 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.datagrid.DatagridService;
-import org.apache.camel.karavan.datagrid.model.PodStatus;
+import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.PodStatus;
 import org.jboss.logging.Logger;
 
 import static org.apache.camel.karavan.service.CodeService.DEFAULT_CONTAINER_RESOURCES;
-import static org.apache.camel.karavan.service.CamelService.DEVMODE_SUFFIX;
+import static org.apache.camel.karavan.shared.ConfigService.DEVMODE_SUFFIX;
 
 public class PodEventHandler implements ResourceEventHandler<Pod> {
 
     private static final Logger LOGGER = Logger.getLogger(PodEventHandler.class.getName());
-    private final DatagridService datagridService;
+    private final InfinispanService infinispanService;
     private final KubernetesService kubernetesService;
 
-    public PodEventHandler(DatagridService datagridService, KubernetesService kubernetesService) {
-        this.datagridService = datagridService;
+    public PodEventHandler(InfinispanService infinispanService, KubernetesService kubernetesService) {
+        this.infinispanService = infinispanService;
         this.kubernetesService = kubernetesService;
     }
 
@@ -28,7 +28,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
         try {
             LOGGER.info("onAdd " + pod.getMetadata().getName());
             PodStatus ps = getPodStatus(pod);
-            datagridService.savePodStatus(ps);
+            infinispanService.savePodStatus(ps);
         } catch (Exception e){
             LOGGER.error(e.getMessage(), e.getCause());
         }
@@ -39,7 +39,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
         try {
             LOGGER.info("onUpdate " + newPod.getMetadata().getName());
             PodStatus ps = getPodStatus(newPod);
-            datagridService.savePodStatus(ps);
+            infinispanService.savePodStatus(ps);
         } catch (Exception e){
             LOGGER.error(e.getMessage(), e.getCause());
         }
@@ -51,7 +51,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
             LOGGER.info("onDelete " + pod.getMetadata().getName());
             String deployment = pod.getMetadata().getLabels().get("app");
             String projectId = deployment != null ? deployment : pod.getMetadata().getLabels().get("karavan/projectId");
-            datagridService.deletePodStatus(projectId, kubernetesService.environment, pod.getMetadata().getName());
+            infinispanService.deletePodStatus(projectId, kubernetesService.environment, pod.getMetadata().getName());
         } catch (Exception e){
             LOGGER.error(e.getMessage(), e.getCause());
         }
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java
index 01c97b9c..9be837ee 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java
@@ -2,18 +2,18 @@ package org.apache.camel.karavan.kubernetes;
 
 import io.fabric8.kubernetes.api.model.Service;
 import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
-import org.apache.camel.karavan.datagrid.DatagridService;
-import org.apache.camel.karavan.datagrid.model.ServiceStatus;
+import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.ServiceStatus;
 import org.jboss.logging.Logger;
 
 public class ServiceEventHandler implements ResourceEventHandler<Service> {
 
     private static final Logger LOGGER = Logger.getLogger(ServiceEventHandler.class.getName());
-    private DatagridService datagridService;
+    private InfinispanService infinispanService;
     private KubernetesService kubernetesService;
 
-    public ServiceEventHandler(DatagridService datagridService, KubernetesService kubernetesService) {
-        this.datagridService = datagridService;
+    public ServiceEventHandler(InfinispanService infinispanService, KubernetesService kubernetesService) {
+        this.infinispanService = infinispanService;
         this.kubernetesService = kubernetesService;
     }
 
@@ -22,7 +22,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> {
         try {
             LOGGER.info("onAdd " + service.getMetadata().getName());
             ServiceStatus ds = getServiceStatus(service);
-            datagridService.saveServiceStatus(ds);
+            infinispanService.saveServiceStatus(ds);
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
@@ -33,7 +33,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> {
         try {
             LOGGER.info("onUpdate " + newService.getMetadata().getName());
             ServiceStatus ds = getServiceStatus(newService);
-            datagridService.saveServiceStatus(ds);
+            infinispanService.saveServiceStatus(ds);
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
@@ -48,7 +48,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> {
                     service.getMetadata().getNamespace(),
                     kubernetesService.getCluster(),
                     kubernetesService.environment);
-            datagridService.deleteServiceStatus(ds);
+            infinispanService.deleteServiceStatus(ds);
         } catch (Exception e){
             LOGGER.error(e.getMessage());
         }
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
deleted file mode 100644
index 152ebe52..00000000
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/listener/DevModeCommandListener.java
+++ /dev/null
@@ -1,46 +0,0 @@
-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.DevModeCommand;
-import org.apache.camel.karavan.datagrid.model.DevModeCommandName;
-import org.apache.camel.karavan.datagrid.model.Project;
-import org.apache.camel.karavan.kubernetes.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.CamelService.DEVMODE_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() + "-" + DEVMODE_SUFFIX;
-            if (Objects.equals(command.getCommandName(), DevModeCommandName.RUN)) {
-                Project p = datagridService.getProject(command.getProjectId());
-                kubernetesService.tryCreateRunner(p, runnerName, "");
-            } else if (Objects.equals(command.getCommandName(), DevModeCommandName.DELETE)){
-                kubernetesService.deleteRunner(runnerName, false);
-                datagridService.deleteDevModeStatus(command.getProjectId());
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/listener/DevModeStatusListener.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/listener/DevModeStatusListener.java
deleted file mode 100644
index d8930a39..00000000
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/listener/DevModeStatusListener.java
+++ /dev/null
@@ -1,29 +0,0 @@
-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.DevModeStatus;
-import org.apache.camel.karavan.service.CamelService;
-import org.jboss.logging.Logger;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-
-@ApplicationScoped
-public class DevModeStatusListener {
-
-    private static final Logger LOGGER = Logger.getLogger(DevModeStatusListener.class.getName());
-
-    @Inject
-    CamelService camelService;
-
-    @ConsumeEvent(value = DatagridService.ADDRESS_DEVMODE_STATUS, blocking = true, ordered = true)
-    void receiveCommand(JsonObject message) {
-        LOGGER.info("received Status " + message);
-        DevModeStatus status = message.mapTo(DevModeStatus.class);
-        if (!status.getCodeLoaded() && status.getContainerId() != null) {
-            camelService.reloadProjectCode(status.getProjectId());
-        }
-    }
-}
\ No newline at end of file
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java
index c8cca2b9..70d988d6 100644
--- a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java
@@ -16,7 +16,6 @@
  */
 package org.apache.camel.karavan.service;
 
-import io.quarkus.scheduler.Scheduled;
 import io.quarkus.vertx.ConsumeEvent;
 import io.vertx.core.json.JsonObject;
 import io.vertx.mutiny.core.Vertx;
@@ -24,9 +23,13 @@ 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.datagrid.DatagridService;
-import org.apache.camel.karavan.datagrid.model.*;
+import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.CamelStatus;
+import org.apache.camel.karavan.infinispan.model.CamelStatusName;
+import org.apache.camel.karavan.infinispan.model.DevModeStatus;
+import org.apache.camel.karavan.infinispan.model.PodStatus;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
+import org.apache.camel.karavan.shared.ConfigService;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.eclipse.microprofile.faulttolerance.CircuitBreaker;
 import org.jboss.logging.Logger;
@@ -37,16 +40,17 @@ import java.util.Arrays;
 import java.util.Objects;
 import java.util.concurrent.ExecutionException;
 
+import static org.apache.camel.karavan.shared.ConfigService.DEVMODE_SUFFIX;
+
 @ApplicationScoped
 public class CamelService {
 
     private static final Logger LOGGER = Logger.getLogger(CamelService.class.getName());
     public static final String CMD_COLLECT_CAMEL_STATUS = "collect-camel-status";
     public static final String CMD_DELETE_CAMEL_STATUS = "delete-camel-status";
-    public static final String DEVMODE_SUFFIX = "devmode";
 
     @Inject
-    DatagridService datagridService;
+    InfinispanService infinispanService;
 
     @Inject
     KubernetesService kubernetesService;
@@ -73,11 +77,11 @@ public class CamelService {
         LOGGER.info("Reload project code " + projectId);
         String containerName = projectId + "-" + DEVMODE_SUFFIX;
         try {
-            datagridService.getProjectFiles(projectId).forEach(projectFile -> putRequest(containerName, projectFile.getName(), projectFile.getCode(), 1000));
+            infinispanService.getProjectFiles(projectId).forEach(projectFile -> putRequest(containerName, projectFile.getName(), projectFile.getCode(), 1000));
             reloadRequest(containerName);
-            DevModeStatus dms = datagridService.getDevModeStatus(projectId);
+            DevModeStatus dms = infinispanService.getDevModeStatus(projectId);
             dms.setCodeLoaded(true);
-            datagridService.saveDevModeStatus(dms);
+            infinispanService.saveDevModeStatus(dms);
         } catch (Exception ex) {
             LOGGER.error(ex.getMessage());
         }
@@ -107,27 +111,25 @@ public class CamelService {
     }
 
     public String getContainerAddress(String containerName) {
-        if (kubernetesService.inKubernetes()) {
+        if (ConfigService.inKubernetes()) {
             return "http://" + containerName + "." + kubernetesService.getNamespace() + ".svc.cluster.local";
         } else {
             return "http://" + containerName + ":8080";
         }
     }
 
-    @Scheduled(every = "{karavan.devmode-status-interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
-    void collectDevModeStatuses() {
-        if (datagridService.isReady()) {
-            datagridService.getDevModeStatuses().forEach(dms -> {
+    public void collectDevModeStatuses() {
+        if (infinispanService.isReady()) {
+            infinispanService.getDevModeStatuses().forEach(dms -> {
                 CamelStatusRequest csr = new CamelStatusRequest(dms.getProjectId(), dms.getContainerName());
                 eventBus.publish(CMD_COLLECT_CAMEL_STATUS, JsonObject.mapFrom(csr));
             });
         }
     }
 
-    @Scheduled(every = "{karavan.camel-status-interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
-    void collectNonDevModeStatuses() {
-        if (datagridService.isReady()) {
-            datagridService.getPodStatuses(environment).forEach(pod -> {
+    public void collectNonDevModeStatuses() {
+        if (infinispanService.isReady()) {
+            infinispanService.getPodStatuses(environment).forEach(pod -> {
                 CamelStatusRequest csr = new CamelStatusRequest(pod.getProjectId(), pod.getName());
                 eventBus.publish(CMD_COLLECT_CAMEL_STATUS, JsonObject.mapFrom(csr));
             });
@@ -142,16 +144,15 @@ public class CamelService {
             String status = getCamelStatus(containerName, statusName);
             if (status != null) {
                 CamelStatus cs = new CamelStatus(dms.getProjectId(), containerName, statusName, status, environment);
-                datagridService.saveCamelStatus(cs);
+                infinispanService.saveCamelStatus(cs);
             }
         });
     }
 
-    @Scheduled(every = "{karavan.devmode-status-interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
-    void cleanupDevModeStatuses() {
-        if (datagridService.isReady()) {
-            datagridService.getDevModeStatuses().forEach(dms -> {
-                PodStatus pod = datagridService.getDevModePodStatuses(dms.getProjectId(), environment);
+    public void cleanupDevModeStatuses() {
+        if (infinispanService.isReady()) {
+            infinispanService.getDevModeStatuses().forEach(dms -> {
+                PodStatus pod = infinispanService.getDevModePodStatuses(dms.getProjectId(), environment);
                 if (pod == null) {
                     eventBus.publish(CMD_DELETE_CAMEL_STATUS, JsonObject.mapFrom(dms));
                 }
@@ -163,7 +164,7 @@ public class CamelService {
     public void cleanupDevModeStatus(JsonObject data) {
         DevModeStatus dms = data.mapTo(DevModeStatus.class);
         Arrays.stream(CamelStatusName.values()).forEach(name -> {
-            datagridService.deleteCamelStatus(dms.getProjectId(), name.name(), environment);
+            infinispanService.deleteCamelStatus(dms.getProjectId(), name.name(), environment);
         });
     }
 
diff --git a/karavan-cloud/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
index 261bad1f..1c1e902b 100644
--- a/karavan-cloud/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,11 +26,11 @@ 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.datagrid.DatagridService;
-import org.apache.camel.karavan.datagrid.model.GitRepo;
-import org.apache.camel.karavan.datagrid.model.GitRepoFile;
-import org.apache.camel.karavan.datagrid.model.Project;
-import org.apache.camel.karavan.datagrid.model.ProjectFile;
+import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.GitRepo;
+import org.apache.camel.karavan.infinispan.model.GitRepoFile;
+import org.apache.camel.karavan.infinispan.model.Project;
+import org.apache.camel.karavan.infinispan.model.ProjectFile;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
 import org.jboss.logging.Logger;
 import org.yaml.snakeyaml.Yaml;
@@ -56,7 +56,7 @@ public class CodeService {
     KubernetesService kubernetesService;
 
     @Inject
-    DatagridService datagridService;
+    InfinispanService infinispanService;
 
     @Inject
     Engine engine;
@@ -88,7 +88,7 @@ public class CodeService {
 
     private String getTemplateText(String fileName) {
         try {
-            List<ProjectFile> files = datagridService.getProjectFiles(Project.NAME_TEMPLATES);
+            List<ProjectFile> files = infinispanService.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-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java
new file mode 100644
index 00000000..64ef9255
--- /dev/null
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java
@@ -0,0 +1,120 @@
+package org.apache.camel.karavan.service;
+
+import io.quarkus.vertx.ConsumeEvent;
+import io.vertx.core.eventbus.EventBus;
+import io.vertx.core.json.JsonObject;
+import org.apache.camel.karavan.docker.DockerService;
+import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.DevModeStatus;
+import org.apache.camel.karavan.infinispan.model.PodStatus;
+import org.apache.camel.karavan.kubernetes.KubernetesService;
+import org.apache.camel.karavan.shared.ConfigService;
+import org.apache.camel.karavan.shared.EventType;
+import org.jboss.logging.Logger;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import java.io.IOException;
+
+import static org.apache.camel.karavan.shared.EventType.*;
+
+@ApplicationScoped
+public class EventService {
+
+    private static final Logger LOGGER = Logger.getLogger(EventService.class.getName());
+    private static final String HEALTHY = "healthy";
+
+    @Inject
+    InfinispanService infinispanService;
+
+    @Inject
+    KubernetesService kubernetesService;
+
+    @Inject
+    DockerService dockerService;
+
+    @Inject
+    CamelService camelService;
+
+    @Inject
+    ProjectService projectService;
+
+    @Inject
+    ConfigService configService;
+
+    @Inject
+    EventBus bus;
+
+    @ConsumeEvent(value = START_KARAVAN, blocking = true, ordered = true)
+    void startKaravan(String data) {
+        if (!ConfigService.inKubernetes()) {
+            LOGGER.info("Starting Karavan with Docker");
+            dockerService.createNetwork();
+            dockerService.checkInfinispanHealth();
+            dockerService.startListeners();
+            dockerService.startInfinispan();
+        } else {
+            LOGGER.info("Starting Karavan in " + (kubernetesService.isOpenshift() ? "OpenShift" : "Kubernetes"));
+            startServices(HEALTHY);
+        }
+    }
+
+    @ConsumeEvent(value = INFINISPAN_STARTED, blocking = true, ordered = true)
+    void startServices(String infinispanHealth){
+        if (infinispanHealth.equals(HEALTHY)) {
+            infinispanService.start();
+            infinispanService.clearAllStatuses();
+            bus.publish(EventType.IMPORT_PROJECTS, "");
+            bus.publish(EventType.START_INFRASTRUCTURE_LISTENERS, "");
+        }
+    }
+
+    @ConsumeEvent(value = START_INFRASTRUCTURE_LISTENERS, blocking = true, ordered = true)
+    void startInfrastructureListeners(String data) {
+        LOGGER.info("Start Infrastructure Listeners");
+        if (ConfigService.inKubernetes()) {
+            kubernetesService.startInformers(data);
+        } else {
+            dockerService.startListeners();
+        }
+    }
+
+    @ConsumeEvent(value = STOP_INFRASTRUCTURE_LISTENERS, blocking = true)
+    void stopInfrastructureListeners(String data) throws IOException {
+        LOGGER.info("Stop Infrastructure Listeners");
+        if (ConfigService.inKubernetes()) {
+            kubernetesService.stopInformers(data);
+        } else {
+            dockerService.stopListeners();
+        }
+    }
+
+    @ConsumeEvent(value = IMPORT_PROJECTS, blocking = true)
+    public void importProjects(String data) {
+        projectService.importProjects(data);
+    }
+
+    @ConsumeEvent(value = ADDRESS_DEVMODE_STATUS, blocking = true, ordered = true)
+    void receiveCommand(JsonObject message) {
+        LOGGER.info("received Status " + message);
+        DevModeStatus status = message.mapTo(DevModeStatus.class);
+        if (!status.getCodeLoaded() && status.getContainerId() != null) {
+            camelService.reloadProjectCode(status.getProjectId());
+        }
+    }
+
+    @ConsumeEvent(value = CONTAINER_STATS, blocking = true, ordered = true)
+    public void saveStats(JsonObject data) {
+        String projectId = data.getString("projectId");
+        String memory = data.getString("memory");
+        String cpu = data.getString("cpu");
+        if (infinispanService.isReady()) {
+            PodStatus podStatus = infinispanService.getDevModePodStatuses(projectId, configService.getConfiguration().getEnvironment());
+            if (podStatus != null) {
+                podStatus.setCpuInfo(cpu);
+                podStatus.setMemoryInfo(memory);
+                infinispanService.savePodStatus(podStatus);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/karavan-cloud/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
index 4135cf34..90c8b61b 100644
--- a/karavan-cloud/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
@@ -19,8 +19,9 @@ package org.apache.camel.karavan.service;
 import io.fabric8.kubernetes.api.model.Secret;
 import io.smallrye.mutiny.tuples.Tuple2;
 import io.vertx.core.Vertx;
-import org.apache.camel.karavan.datagrid.model.*;
+import org.apache.camel.karavan.infinispan.model.*;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
+import org.apache.camel.karavan.shared.ConfigService;
 import org.eclipse.jgit.api.CheckoutCommand;
 import org.eclipse.jgit.api.CloneCommand;
 import org.eclipse.jgit.api.FetchCommand;
@@ -132,7 +133,7 @@ public class GitService {
     public GitConfig getGitConfig() {
         String propertiesPrefix = "karavan.";
         String branch = ConfigProvider.getConfig().getValue(propertiesPrefix + "git-branch", String.class);
-        if (kubernetesService.inKubernetes()) {
+        if (ConfigService.inKubernetes()) {
             LOGGER.info("inKubernetes " + kubernetesService.getNamespace());
             Secret secret = kubernetesService.getKaravanSecret();
             String uri = new String(Base64.getDecoder().decode(secret.getData().get("git-repository").getBytes(StandardCharsets.UTF_8)));
diff --git a/karavan-cloud/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
index cb97a85b..12a1c409 100644
--- a/karavan-cloud/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
@@ -18,91 +18,32 @@ package org.apache.camel.karavan.service;
 
 import io.quarkus.runtime.ShutdownEvent;
 import io.quarkus.runtime.StartupEvent;
-import io.quarkus.vertx.ConsumeEvent;
 import io.vertx.core.eventbus.EventBus;
-import org.apache.camel.karavan.datagrid.DatagridService;
-import org.apache.camel.karavan.datagrid.model.Environment;
-import org.apache.camel.karavan.kubernetes.KubernetesService;
-import org.apache.camel.karavan.docker.DockerService;
-import org.apache.camel.karavan.docker.InfinispanContainer;
-import org.eclipse.microprofile.config.inject.ConfigProperty;
+import org.apache.camel.karavan.shared.EventType;
 import org.jboss.logging.Logger;
 
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.event.Observes;
 import javax.inject.Inject;
 
+import static org.apache.camel.karavan.shared.EventType.START_KARAVAN;
+
 @ApplicationScoped
 public class KaravanService {
 
     private static final Logger LOGGER = Logger.getLogger(KaravanService.class.getName());
 
-    public static final String DEVMODE_SUFFIX = "-devmode";
-
-    private static final String HEALTHY = "healthy";
-
-    @Inject
-    DatagridService datagridService;
-
-    @Inject
-    KubernetesService kubernetesService;
-
-    @Inject
-    DockerService dockerService;
-
-    @Inject
-    InfinispanContainer infinispanContainer;
-
     @Inject
     EventBus bus;
 
-    @ConfigProperty(name = "karavan.environment")
-    String environment;
-
     void onStart(@Observes StartupEvent ev) {
-        if (!kubernetesService.inKubernetes()) {
-            LOGGER.info("Start Karavan with Docker");
-            dockerService.createNetwork();
-            dockerService.checkDataGridHealth();
-            dockerService.startListeners();
-            infinispanContainer.startInfinispan();
-        } else {
-            LOGGER.info("Start Karavan in " + (kubernetesService.isOpenshift() ? "OpenShift" : "Kubernetes"));
-            startServices(HEALTHY);
-        }
-    }
-
-    @ConsumeEvent(value = DockerService.ADDRESS_INFINISPAN_STARTED, blocking = true, ordered = true)
-    void startServices(String infinispanHealth){
-        if (infinispanHealth.equals(HEALTHY)) {
-            datagridService.start();
-            datagridService.clearAllStatuses();
-            setEnvironment();
-            initialImport();
-            startInformers();
-        }
+        LOGGER.info("Starting Karavan");
+        bus.publish(START_KARAVAN, "");
     }
 
     void onStop(@Observes ShutdownEvent ev) {
         LOGGER.info("Stop Karavan");
-        bus.publish(KubernetesService.STOP_INFORMERS, "");
-    }
-
-    void setEnvironment() {
-        String cluster = kubernetesService.getCluster();
-        String namespace = kubernetesService.getNamespace();
-        datagridService.saveEnvironment(new Environment(environment, cluster, namespace));
-    }
-
-    void initialImport() {
-        bus.publish(ProjectService.IMPORT_PROJECTS, "");
+        bus.publish(EventType.STOP_INFRASTRUCTURE_LISTENERS, "");
     }
 
-    void startInformers() {
-        if (kubernetesService.inKubernetes()) {
-            bus.publish(KubernetesService.START_INFORMERS, "");
-        } else {
-
-        }
-    }
 }
diff --git a/karavan-cloud/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
index 13dbaf38..0b223eeb 100644
--- a/karavan-cloud/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
@@ -19,10 +19,10 @@ package org.apache.camel.karavan.service;
 import io.quarkus.scheduler.Scheduled;
 import io.quarkus.vertx.ConsumeEvent;
 import io.smallrye.mutiny.tuples.Tuple2;
-import org.apache.camel.karavan.datagrid.DatagridService;
-import org.apache.camel.karavan.datagrid.model.GitRepo;
-import org.apache.camel.karavan.datagrid.model.Project;
-import org.apache.camel.karavan.datagrid.model.ProjectFile;
+import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.GitRepo;
+import org.apache.camel.karavan.infinispan.model.Project;
+import org.apache.camel.karavan.infinispan.model.ProjectFile;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
@@ -38,16 +38,17 @@ import java.time.Instant;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import static org.apache.camel.karavan.shared.EventType.IMPORT_PROJECTS;
+
 @Default
 @Readiness
 @ApplicationScoped
 public class ProjectService implements HealthCheck{
 
     private static final Logger LOGGER = Logger.getLogger(ProjectService.class.getName());
-    public static final String IMPORT_PROJECTS = "import-projects";
 
     @Inject
-    DatagridService datagridService;
+    InfinispanService infinispanService;
 
     @Inject
     KubernetesService kubernetesService;
@@ -73,20 +74,19 @@ public class ProjectService implements HealthCheck{
         }
     }
 
-    @Scheduled(every = "{karavan.git-pull-interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
-    void pullCommits() {
+    public void pullCommits() {
         if (readyToPull.get()) {
             LOGGER.info("Pull commits...");
-            Tuple2<String, Integer> lastCommit = datagridService.getLastCommit();
+            Tuple2<String, Integer> lastCommit = infinispanService.getLastCommit();
             gitService.getCommitsAfterCommit(lastCommit.getItem2()).forEach(commitInfo -> {
-                if (!datagridService.hasCommit(commitInfo.getCommitId())) {
+                if (!infinispanService.hasCommit(commitInfo.getCommitId())) {
                     commitInfo.getRepos().forEach(repo -> {
                         Project project = importProjectFromRepo(repo);
                         kubernetesService.createPipelineRun(project);
                     });
-                    datagridService.saveCommit(commitInfo.getCommitId(), commitInfo.getTime());
+                    infinispanService.saveCommit(commitInfo.getCommitId(), commitInfo.getTime());
                 }
-                datagridService.saveLastCommit(commitInfo.getCommitId());
+                infinispanService.saveLastCommit(commitInfo.getCommitId());
             });
         }
     }
@@ -94,20 +94,21 @@ public class ProjectService implements HealthCheck{
     void importCommits() {
         LOGGER.info("Import commits...");
         gitService.getAllCommits().forEach(commitInfo -> {
-            datagridService.saveCommit(commitInfo.getCommitId(), commitInfo.getTime());
-            datagridService.saveLastCommit(commitInfo.getCommitId());
+            infinispanService.saveCommit(commitInfo.getCommitId(), commitInfo.getTime());
+            infinispanService.saveLastCommit(commitInfo.getCommitId());
         });
         readyToPull.set(true);
     }
 
     @ConsumeEvent(value = IMPORT_PROJECTS, blocking = true)
-    void importProjects(String data) {
-        if (datagridService.getProjects().isEmpty()) {
+    public void importProjects(String data) {
+        if (infinispanService.getProjects().isEmpty()) {
             importAllProjects();
         }
         addTemplatesProject();
         importCommits();
     }
+
     private void importAllProjects() {
         LOGGER.info("Import projects from Git");
         try {
@@ -124,11 +125,11 @@ public class ProjectService implements HealthCheck{
                 } else {
                     project = getProjectFromRepo(repo);
                 }
-                datagridService.saveProject(project);
+                infinispanService.saveProject(project);
 
                 repo.getFiles().forEach(repoFile -> {
                     ProjectFile file = new ProjectFile(repoFile.getName(), repoFile.getBody(), folderName, repoFile.getLastCommitTimestamp());
-                    datagridService.saveProjectFile(file);
+                    infinispanService.saveProjectFile(file);
                 });
             });
             addKameletsProject();
@@ -152,10 +153,10 @@ public class ProjectService implements HealthCheck{
         LOGGER.info("Import project from GitRepo " + repo.getName());
         try {
             Project project = getProjectFromRepo(repo);
-            datagridService.saveProject(project);
+            infinispanService.saveProject(project);
             repo.getFiles().forEach(repoFile -> {
                 ProjectFile file = new ProjectFile(repoFile.getName(), repoFile.getBody(), repo.getName(), repoFile.getLastCommitTimestamp());
-                datagridService.saveProjectFile(file);
+                infinispanService.saveProjectFile(file);
             });
             return project;
         } catch (Exception e) {
@@ -174,25 +175,25 @@ public class ProjectService implements HealthCheck{
     }
 
     public Project commitAndPushProject(String projectId, String message) throws Exception {
-        Project p = datagridService.getProject(projectId);
-        List<ProjectFile> files = datagridService.getProjectFiles(projectId);
+        Project p = infinispanService.getProject(projectId);
+        List<ProjectFile> files = infinispanService.getProjectFiles(projectId);
         RevCommit commit = gitService.commitAndPushProject(p, files, message);
         String commitId = commit.getId().getName();
         Long lastUpdate = commit.getCommitTime() * 1000L;
         p.setLastCommit(commitId);
         p.setLastCommitTimestamp(lastUpdate);
-        datagridService.saveProject(p);
-        datagridService.saveCommit(commitId, commit.getCommitTime());
+        infinispanService.saveProject(p);
+        infinispanService.saveCommit(commitId, commit.getCommitTime());
         return p;
     }
 
     void addKameletsProject() {
         LOGGER.info("Add custom kamelets project if not exists");
         try {
-            Project kamelets  = datagridService.getProject(Project.NAME_KAMELETS);
+            Project kamelets  = infinispanService.getProject(Project.NAME_KAMELETS);
             if (kamelets == null) {
                 kamelets = new Project(Project.NAME_KAMELETS, "Custom Kamelets", "Custom Kamelets", "", "", Instant.now().toEpochMilli());
-                datagridService.saveProject(kamelets);
+                infinispanService.saveProject(kamelets);
                 commitAndPushProject(Project.NAME_KAMELETS, "Add custom kamelets");
             }
         } catch (Exception e) {
@@ -203,14 +204,14 @@ public class ProjectService implements HealthCheck{
     void addTemplatesProject() {
         LOGGER.info("Add templates project if not exists");
         try {
-            Project templates  = datagridService.getProject(Project.NAME_TEMPLATES);
+            Project templates  = infinispanService.getProject(Project.NAME_TEMPLATES);
             if (templates == null) {
                 templates = new Project(Project.NAME_TEMPLATES, "Templates", "Templates", "", "", Instant.now().toEpochMilli());
-                datagridService.saveProject(templates);
+                infinispanService.saveProject(templates);
 
                 codeService.getApplicationPropertiesTemplates().forEach((name, value) -> {
                     ProjectFile file = new ProjectFile(name, value, Project.NAME_TEMPLATES, Instant.now().toEpochMilli());
-                    datagridService.saveProjectFile(file);
+                    infinispanService.saveProjectFile(file);
                 });
                 commitAndPushProject(Project.NAME_TEMPLATES, "Add default templates");
             }
@@ -222,14 +223,14 @@ public class ProjectService implements HealthCheck{
     void addPipelinesProject() {
         LOGGER.info("Add pipelines project if not exists");
         try {
-            Project pipelines  = datagridService.getProject(Project.NAME_PIPELINES);
+            Project pipelines  = infinispanService.getProject(Project.NAME_PIPELINES);
             if (pipelines == null) {
                 pipelines = new Project(Project.NAME_PIPELINES, "Pipelines", "CI/CD Pipelines", "", "", Instant.now().toEpochMilli());
-                datagridService.saveProject(pipelines);
+                infinispanService.saveProject(pipelines);
 
                 codeService.getApplicationPropertiesTemplates().forEach((name, value) -> {
                     ProjectFile file = new ProjectFile(name, value, Project.NAME_PIPELINES, Instant.now().toEpochMilli());
-                    datagridService.saveProjectFile(file);
+                    infinispanService.saveProjectFile(file);
                 });
                 commitAndPushProject(Project.NAME_PIPELINES, "Add default pipelines");
             }
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java
new file mode 100644
index 00000000..4a1103b4
--- /dev/null
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.quarkus.scheduler.Scheduled;
+import org.apache.camel.karavan.docker.DockerService;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+
+@ApplicationScoped
+public class ScheduledService {
+
+    @Inject
+    DockerService dockerService;
+
+    @Inject
+    ProjectService projectService;
+
+    @Inject
+    CamelService camelService;
+
+    @Scheduled(every = "{karavan.container-stats-interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
+    void collectContainersStats() {
+        dockerService.collectContainersStats();
+    }
+
+    @Scheduled(every = "{karavan.devmode-status-interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
+    void collectDevModeCamelStatuses() {
+        camelService.collectDevModeStatuses();
+    }
+
+    @Scheduled(every = "{karavan.camel-status-interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
+    void collectNonDevModeCamelStatuses() {
+        camelService.collectNonDevModeStatuses();
+    }
+
+    @Scheduled(every = "{karavan.devmode-status-interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
+    void cleanupDevModeStatuses() {
+        camelService.cleanupDevModeStatuses();
+    }
+
+    @Scheduled(every = "{karavan.git-pull-interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
+    void pullCommitsFromGit() {
+        projectService.pullCommits();
+    }
+
+}
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/shared/ConfigService.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/shared/ConfigService.java
new file mode 100644
index 00000000..c8efcdb8
--- /dev/null
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/shared/ConfigService.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.karavan.shared;
+
+import io.quarkus.runtime.StartupEvent;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.event.Observes;
+import java.util.List;
+import java.util.Objects;
+
+@ApplicationScoped
+public class ConfigService {
+
+    public static final String DEVMODE_SUFFIX = "-devmode";
+
+    @ConfigProperty(name = "karavan.version")
+    String version;
+
+    @ConfigProperty(name = "karavan.environment")
+    String environment;
+
+    @ConfigProperty(name = "karavan.environments")
+    List<String> environments;
+
+    @ConfigProperty(name = "karavan.default-runtime")
+    String runtime;
+
+    @ConfigProperty(name = "karavan.runtimes")
+    List<String> runtimes;
+
+    private Configuration configuration;
+
+    void onStart(@Observes StartupEvent ev) {
+        configuration = new Configuration(
+                version,
+                 inKubernetes() ? "kubernetes" : "docker",
+                 environment,
+                 environments,
+                 runtime,
+                 runtimes
+        );
+    }
+
+    public Configuration getConfiguration() {
+        return configuration;
+    }
+
+    public static boolean inKubernetes() {
+        return Objects.nonNull(System.getenv("KUBERNETES_SERVICE_HOST"));
+    }
+}
\ No newline at end of file
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/shared/Configuration.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/shared/Configuration.java
new file mode 100644
index 00000000..2e39bbb0
--- /dev/null
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/shared/Configuration.java
@@ -0,0 +1,72 @@
+package org.apache.camel.karavan.shared;
+
+import java.util.List;
+
+public class Configuration {
+    private String version;
+    private String infrastructure;
+    private String environment;
+    private List<String> environments;
+    private String runtime;
+    private List<String> runtimes;
+
+    public Configuration() {
+    }
+
+    public Configuration(String version, String infrastructure, String environment, List<String> environments, String runtime, List<String> runtimes) {
+        this.version = version;
+        this.infrastructure = infrastructure;
+        this.environment = environment;
+        this.environments = environments;
+        this.runtime = runtime;
+        this.runtimes = runtimes;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public String getInfrastructure() {
+        return infrastructure;
+    }
+
+    public void setInfrastructure(String infrastructure) {
+        this.infrastructure = infrastructure;
+    }
+
+    public String getEnvironment() {
+        return environment;
+    }
+
+    public void setEnvironment(String environment) {
+        this.environment = environment;
+    }
+
+    public List<String> getEnvironments() {
+        return environments;
+    }
+
+    public void setEnvironments(List<String> environments) {
+        this.environments = environments;
+    }
+
+    public String getRuntime() {
+        return runtime;
+    }
+
+    public void setRuntime(String runtime) {
+        this.runtime = runtime;
+    }
+
+    public List<String> getRuntimes() {
+        return runtimes;
+    }
+
+    public void setRuntimes(List<String> runtimes) {
+        this.runtimes = runtimes;
+    }
+}
diff --git a/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/shared/EventType.java b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/shared/EventType.java
new file mode 100644
index 00000000..7b7af56e
--- /dev/null
+++ b/karavan-cloud/karavan-app/src/main/java/org/apache/camel/karavan/shared/EventType.java
@@ -0,0 +1,24 @@
+package org.apache.camel.karavan.shared;
+
+public class EventType {
+
+    public static final String START_KARAVAN = "START_KARAVAN";
+
+    //    Start Kubernetes or Docker event Listeners
+    public static final String START_INFRASTRUCTURE_LISTENERS = "START_INFRASTRUCTURE_LISTENERS";
+    public static final String STOP_INFRASTRUCTURE_LISTENERS = "STOP_INFRASTRUCTURE_LISTENERS";
+
+    //    Import projects from Git repository
+    public static final String IMPORT_PROJECTS = "IMPORT_PROJECTS";
+
+
+
+    public static final String INFINISPAN_STARTED = "INFINISPAN_STARTED";
+    public static final String INFINISPAN_HEALTH = "INFINISPAN_HEALTH";
+
+    public static final String CONTAINER_STATS = "ADDRESS_CONTAINER_STATS";
+
+    public static final String ADDRESS_DEVMODE_STATUS = "ADDRESS_DEVMODE_STATUS";
+    public static final String ADDRESS_DEVMODE_COMMAND_INTERNAL = "ADDRESS_DEVMODE_COMMAND_INTERNAL";
+    public static final String ADDRESS_DEVMODE_STATUS_INTERNAL = "ADDRESS_DEVMODE_STATUS_INTERNAL";
+}
diff --git a/karavan-cloud/karavan-app/src/main/resources/application.properties b/karavan-cloud/karavan-app/src/main/resources/application.properties
index 9d5ac6fe..b153e02b 100644
--- a/karavan-cloud/karavan-app/src/main/resources/application.properties
+++ b/karavan-cloud/karavan-app/src/main/resources/application.properties
@@ -1,5 +1,6 @@
 karavan.version=3.21.1-SNAPSHOT
 karavan.environment=dev
+karavan.environments=dev,test,prod
 karavan.default-runtime=quarkus
 karavan.runtimes=quarkus,spring-boot
 karavan.camel-status-interval=10s
@@ -7,6 +8,7 @@ karavan.devmode-status-interval=2s
 karavan.container-status-interval=10s
 karavan.container-stats-interval=10s
 quarkus.scheduler.enabled=true
+runner.image=marat/karavan
 
 # Git repository Configuration
 karavan.git-repository=${GIT_REPOSITORY}
diff --git a/karavan-cloud/karavan-app/src/test/java/org/apache/camel/karavan/datagrid/DataGridTest.java b/karavan-cloud/karavan-app/src/test/java/org/apache/camel/karavan/datagrid/DataGridTest.java
deleted file mode 100644
index 4a07ba7f..00000000
--- a/karavan-cloud/karavan-app/src/test/java/org/apache/camel/karavan/datagrid/DataGridTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-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.DatagridService;
-import org.apache.camel.karavan.datagrid.model.*;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInstance;
-
-import javax.inject.Inject;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-@QuarkusTest
-@TestInstance(TestInstance.Lifecycle.PER_CLASS)
-public class DataGridTest {
-
-    @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 testContainersStatuses() throws InterruptedException {
-        ContainerInfo ci = new ContainerInfo("demo", "id", "image", List.of(8080, 8081, 8082), "dev");
-        datagridService.saveContainerInfo(ci);
-        List<ContainerInfo> list = datagridService.getContainerInfos("dev");
-        System.out.println(list);
-        assertEquals(1, list.size());
-    }
-
-    @Test
-    public void sendCommand() throws InterruptedException {
-        List<DevModeCommand> commandsSent = List.of(
-                DevModeCommand.createForProject(DevModeCommandName.RUN, "test1"),
-                DevModeCommand.createForProject(DevModeCommandName.RELOAD, "test1"),
-                DevModeCommand.createForProject(DevModeCommandName.DELETE, "test1"),
-                DevModeCommand.createForProject(DevModeCommandName.RUN, "test1")
-        );
-        commandsSent.forEach(devModeCommand -> datagridService.sendDevModeCommand(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());
-    }
-
-    @Test
-    public void testProjectFiles() throws InterruptedException {
-        List<ProjectFile> files = datagridService.getProjectFiles("xxx");
-        assertEquals(0, files.size());
-    }
-
-    @Test
-    public void testCamelStatuses() throws InterruptedException {
-        CamelStatus cs = new CamelStatus("test1", "container1", CamelStatusName.context, "", "dev");
-        datagridService.saveCamelStatus(cs);
-        List<CamelStatus> list = datagridService.getCamelStatusesByEnv("dev", CamelStatusName.context);
-        System.out.println(list);
-        assertEquals(1, list.size());
-    }
-}
diff --git a/karavan-cloud/karavan-app/src/test/java/org/apache/camel/karavan/infinispan/DataGridTest.java b/karavan-cloud/karavan-app/src/test/java/org/apache/camel/karavan/infinispan/DataGridTest.java
new file mode 100644
index 00000000..0ed05edb
--- /dev/null
+++ b/karavan-cloud/karavan-app/src/test/java/org/apache/camel/karavan/infinispan/DataGridTest.java
@@ -0,0 +1,54 @@
+package org.apache.camel.karavan.infinispan;
+
+
+import io.quarkus.test.junit.QuarkusTest;
+import org.apache.camel.karavan.infinispan.model.CamelStatus;
+import org.apache.camel.karavan.infinispan.model.CamelStatusName;
+import org.apache.camel.karavan.infinispan.model.ContainerInfo;
+import org.apache.camel.karavan.infinispan.model.ProjectFile;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@QuarkusTest
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class DataGridTest {
+
+    @Inject
+    InfinispanService infinispanService;
+
+    @BeforeAll
+    public void setup() {
+        infinispanService.start();
+    }
+
+    @Test
+    public void testContainersStatuses() throws InterruptedException {
+        ContainerInfo ci = new ContainerInfo("demo", "id", "image", List.of(8080, 8081, 8082), "dev");
+        infinispanService.saveContainerInfo(ci);
+        List<ContainerInfo> list = infinispanService.getContainerInfos("dev");
+        System.out.println(list);
+        assertEquals(1, list.size());
+    }
+
+    @Test
+    public void testProjectFiles() throws InterruptedException {
+        List<ProjectFile> files = infinispanService.getProjectFiles("xxx");
+        assertEquals(0, files.size());
+    }
+
+    @Test
+    public void testCamelStatuses() throws InterruptedException {
+        CamelStatus cs = new CamelStatus("test1", "container1", CamelStatusName.context, "", "dev");
+        infinispanService.saveCamelStatus(cs);
+        List<CamelStatus> list = infinispanService.getCamelStatusesByEnv("dev", CamelStatusName.context);
+        System.out.println(list);
+        assertEquals(1, list.size());
+    }
+}