diff --git a/data-index/data-index-common/src/main/java/org/kie/kogito/index/CommonUtils.java b/data-index/data-index-common/src/main/java/org/kie/kogito/index/CommonUtils.java
index 47e70d8f7b..7e51c14c83 100644
--- a/data-index/data-index-common/src/main/java/org/kie/kogito/index/CommonUtils.java
+++ b/data-index/data-index-common/src/main/java/org/kie/kogito/index/CommonUtils.java
@@ -21,6 +21,8 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
 
 import org.slf4j.Logger;
@@ -67,6 +69,25 @@ public static TypeDefinitionRegistry loadSchemaDefinitionFile(String fileName) {
         }
     }
 
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    public static Map mergeMap(Map source, Map target) {
+        if (source == null) {
+            return target;
+        } else if (target == null) {
+            return source;
+        } else {
+            Map result = new HashMap(target);
+            source.forEach((key, value) -> result.merge(key, value, (targetValue, srcValue) -> {
+                if (srcValue instanceof Map && targetValue instanceof Map) {
+                    return mergeMap((Map) srcValue, (Map) targetValue);
+                } else {
+                    return srcValue;
+                }
+            }));
+            return result;
+        }
+    }
+
     private static String getContext(String processId) {
         return processId != null && processId.contains(".") ? processId.substring(processId.lastIndexOf('.') + 1) : processId;
     }
diff --git a/data-index/data-index-common/src/main/java/org/kie/kogito/index/service/ProcessDefinitionHelper.java b/data-index/data-index-common/src/main/java/org/kie/kogito/index/service/ProcessDefinitionHelper.java
index 6ce25264c2..df9b8e3fdb 100644
--- a/data-index/data-index-common/src/main/java/org/kie/kogito/index/service/ProcessDefinitionHelper.java
+++ b/data-index/data-index-common/src/main/java/org/kie/kogito/index/service/ProcessDefinitionHelper.java
@@ -18,23 +18,18 @@
  */
 package org.kie.kogito.index.service;
 
-import java.util.AbstractMap;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
-import java.util.stream.Collectors;
 
 import org.kie.kogito.event.process.NodeDefinition;
 import org.kie.kogito.event.process.ProcessDefinitionDataEvent;
 import org.kie.kogito.event.process.ProcessDefinitionEventBody;
-import org.kie.kogito.index.json.JsonUtils;
+import org.kie.kogito.index.CommonUtils;
 import org.kie.kogito.index.model.Node;
 import org.kie.kogito.index.model.ProcessDefinition;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
-
 import jakarta.enterprise.context.ApplicationScoped;
 
 import static java.util.stream.Collectors.toList;
@@ -62,8 +57,9 @@ public static ProcessDefinition merge(ProcessDefinition instance, ProcessDefinit
         instance.setEndpoint(doMerge(data.getEndpoint(), instance.getEndpoint()));
         instance.setDescription(doMerge(data.getDescription(), instance.getDescription()));
         instance.setAnnotations(doMerge(data.getAnnotations(), instance.getAnnotations()));
-        instance.setMetadata(doMerge(toStringMap(data.getMetadata()), instance.getMetadata()));
+        instance.setMetadata(CommonUtils.mergeMap(data.getMetadata(), instance.getMetadata()));
         instance.setNodes(doMerge(nodeDefinitions(data), instance.getNodes()));
+
         instance.setSource(doMerge(data.getSource(), instance.getSource()));
         return instance;
     }
@@ -81,7 +77,7 @@ private static Node nodeDefinition(NodeDefinition definition) {
         node.setName(definition.getName());
         node.setUniqueId(definition.getUniqueId());
         node.setType(definition.getType());
-        node.setMetadata(toStringMap(definition.getMetadata()));
+        node.setMetadata(definition.getMetadata());
         return node;
     }
 
@@ -94,22 +90,4 @@ private static <T> T doMerge(T incoming, T current) {
         return current;
     }
 
-    private static Map<String, String> toStringMap(Map<String, ?> input) {
-        if (input == null) {
-            return null;
-        }
-        return input.entrySet().stream()
-                .map(entry -> {
-                    if (String.class.isInstance(entry.getValue())) {
-                        return entry;
-                    }
-                    String value = null;
-                    try {
-                        value = JsonUtils.getObjectMapper().writeValueAsString(entry.getValue());
-                    } catch (JsonProcessingException e) {
-                        throw new RuntimeException(e);
-                    }
-                    return new AbstractMap.SimpleEntry<>(entry.getKey(), value);
-                }).collect(Collectors.toMap(Map.Entry::getKey, e -> (String) e.getValue()));
-    }
 }
diff --git a/data-index/data-index-common/src/test/java/org/kie/kogito/index/CommonUtilsTest.java b/data-index/data-index-common/src/test/java/org/kie/kogito/index/CommonUtilsTest.java
new file mode 100644
index 0000000000..20e43ebb9d
--- /dev/null
+++ b/data-index/data-index-common/src/test/java/org/kie/kogito/index/CommonUtilsTest.java
@@ -0,0 +1,45 @@
+/*
+ * 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.kie.kogito.index;
+
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class CommonUtilsTest {
+
+    @Test
+    void testSimpleMergeMap() {
+        Map src = Map.of("name", "Javierito", "different", "remain");
+        Map target = Map.of("name", "Fulanito", "other", "remain");
+        assertThat(CommonUtils.mergeMap(src, target)).isEqualTo(Map.of("name", "Javierito", "other", "remain", "different", "remain"));
+    }
+
+    @Test
+    void testComplexMergeMap() {
+        Map nestedSrc = Map.of("name", "Javierito", "different", "remain");
+        Map nestedTarget = Map.of("name", "Fulanito", "other", "remain");
+        Map src = Map.of("nested", nestedSrc);
+        Map target = Map.of("nested", nestedTarget);
+        assertThat(CommonUtils.mergeMap(src, target)).isEqualTo(Map.of("nested", Map.of("name", "Javierito", "other", "remain", "different", "remain")));
+    }
+
+}
diff --git a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/Node.java b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/Node.java
index 84939239e9..3f71c8bd93 100644
--- a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/Node.java
+++ b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/Node.java
@@ -30,7 +30,7 @@ public class Node {
     @JsonProperty("nodeType")
     private String type;
     private String uniqueId;
-    private Map<String, String> metadata;
+    private Map<String, ?> metadata;
 
     public String getId() {
         return id;
@@ -64,11 +64,11 @@ public void setUniqueId(String uniqueId) {
         this.uniqueId = uniqueId;
     }
 
-    public Map<String, String> getMetadata() {
+    public Map<String, ?> getMetadata() {
         return metadata;
     }
 
-    public void setMetadata(Map<String, String> metadata) {
+    public void setMetadata(Map<String, ?> metadata) {
         this.metadata = metadata;
     }
 
diff --git a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinition.java b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinition.java
index e6e2450ea0..6f9241c125 100644
--- a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinition.java
+++ b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinition.java
@@ -35,7 +35,7 @@ public class ProcessDefinition {
     private String source;
     private String description;
     private Set<String> annotations;
-    private Map<String, String> metadata;
+    private Map<String, ?> metadata;
     private List<Node> nodes;
 
     public String getId() {
@@ -126,11 +126,11 @@ public void setAnnotations(Set<String> annotations) {
         this.annotations = annotations;
     }
 
-    public Map<String, String> getMetadata() {
+    public Map<String, ?> getMetadata() {
         return metadata;
     }
 
-    public void setMetadata(Map<String, String> metadata) {
+    public void setMetadata(Map<String, ?> metadata) {
         this.metadata = metadata;
     }
 
diff --git a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/EntryMarshaller.java b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/EntryMarshaller.java
index 504d14aa25..01251f4ce9 100644
--- a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/EntryMarshaller.java
+++ b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/EntryMarshaller.java
@@ -43,7 +43,11 @@ public Entry readFrom(ProtoStreamReader reader) throws IOException {
     @Override
     public void writeTo(ProtoStreamWriter writer, Entry entry) throws IOException {
         writer.writeString(KEY, entry.getKey());
-        writer.writeString(VALUE, entry.getValue());
+        writer.writeString(VALUE, toString(entry.getValue()));
+    }
+    
+    private String toString (Object str) {
+    	return str != null ? str.toString() : null;
     }
 
     @Override
diff --git a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeMarshaller.java b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeMarshaller.java
index 2b7b998c5a..f4e78aa245 100644
--- a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeMarshaller.java
+++ b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeMarshaller.java
@@ -67,16 +67,16 @@ Function<NodeMetadata, Map<String, String>> toNodeMetadataMap() {
         };
     }
 
-    Function<Map<String, String>, NodeMetadata> toNodeMetadata() {
+    Function<Map<String, ?>, NodeMetadata> toNodeMetadata() {
         return m -> {
             if (m == null) {
                 return null;
             }
             NodeMetadata meta = new NodeMetadata();
-            meta.setAction(m.get(NodeMetadataMarshaller.ACTION));
-            meta.setState(m.get(NodeMetadataMarshaller.STATE));
-            meta.setUniqueId(m.get(NodeMetadataMarshaller.UNIQUE_ID));
-            meta.setBranch(m.get(NodeMetadataMarshaller.BRANCH));
+            meta.setAction((String)m.get(NodeMetadataMarshaller.ACTION));
+            meta.setState((String)m.get(NodeMetadataMarshaller.STATE));
+            meta.setUniqueId((String)m.get(NodeMetadataMarshaller.UNIQUE_ID));
+            meta.setBranch((String)m.get(NodeMetadataMarshaller.BRANCH));
             return meta;
         };
     }
diff --git a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshaller.java b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshaller.java
index 720fdf1e02..5ceae9aa8f 100644
--- a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshaller.java
+++ b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshaller.java
@@ -72,7 +72,7 @@ public ProcessDefinition readFrom(ProtoStreamReader reader) throws IOException {
         return pd;
     }
 
-    private static Map<String, String> buildMetadata(ProtoStreamReader reader) throws IOException {
+    private static Map<String, ?> buildMetadata(ProtoStreamReader reader) throws IOException {
         return Optional.ofNullable(reader.readCollection(METADATA, new HashSet<>(), Entry.class))
                 .map(entries -> entries.stream().collect(Collectors.toMap(Entry::getKey, Entry::getValue)))
                 .orElse(null);
diff --git a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/model/Entry.java b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/model/Entry.java
index 2e3dcee8a5..7e29493a68 100644
--- a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/model/Entry.java
+++ b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/model/Entry.java
@@ -25,12 +25,12 @@ public class Entry {
 
     private String key;
 
-    private String value;
+    private Object value;
 
     public Entry() {
     }
 
-    public Entry(String key, String value) {
+    public Entry(String key, Object value) {
         this.key = key;
         this.value = value;
     }
@@ -43,7 +43,7 @@ public void setKey(String key) {
         this.key = key;
     }
 
-    public String getValue() {
+    public Object getValue() {
         return value;
     }
 
diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeEntity.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeEntity.java
index f11c3d2b47..583ce4f5d5 100644
--- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeEntity.java
+++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeEntity.java
@@ -55,7 +55,7 @@ public class NodeEntity extends AbstractEntity {
             foreignKey = @ForeignKey(name = "fk_definitions_nodes_metadata_definitions_nodes"))
     @MapKeyColumn(name = "name")
     @Column(name = "meta_value")
-    private Map<String, String> metadata;
+    private Map<String, ?> metadata;
 
     @Id
     @ManyToOne(cascade = CascadeType.ALL, optional = false)
@@ -96,11 +96,11 @@ public void setType(String type) {
         this.type = type;
     }
 
-    public Map<String, String> getMetadata() {
+    public Map<String, ?> getMetadata() {
         return metadata;
     }
 
-    public void setMetadata(Map<String, String> metadata) {
+    public void setMetadata(Map<String, ?> metadata) {
         this.metadata = metadata;
     }
 
diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntity.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntity.java
index a7158f31bb..db81b64231 100644
--- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntity.java
+++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntity.java
@@ -80,7 +80,7 @@ public class ProcessDefinitionEntity extends AbstractEntity {
             foreignKey = @ForeignKey(name = "fk_definitions_metadata"))
     @MapKeyColumn(name = "name")
     @Column(name = "meta_value")
-    private Map<String, String> metadata;
+    private Map<String, ?> metadata;
 
     @Override
     public String getId() {
@@ -171,11 +171,11 @@ public void setAnnotations(Set<String> annotations) {
         this.annotations = annotations;
     }
 
-    public Map<String, String> getMetadata() {
+    public Map<String, ?> getMetadata() {
         return metadata;
     }
 
-    public void setMetadata(Map<String, String> metadata) {
+    public void setMetadata(Map<String, ?> metadata) {
         this.metadata = metadata;
     }
 
diff --git a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntity.java b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntity.java
index b009835ade..46eda01227 100644
--- a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntity.java
+++ b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntity.java
@@ -40,7 +40,7 @@ public class ProcessDefinitionEntity {
 
     private Set<String> annotations;
 
-    private Map<String, String> metadata;
+    private Map<String, ?> metadata;
 
     private Set<String> roles;
 
@@ -148,11 +148,11 @@ public void setAnnotations(Set<String> annotations) {
         this.annotations = annotations;
     }
 
-    public Map<String, String> getMetadata() {
+    public Map<String, ?> getMetadata() {
         return metadata;
     }
 
-    public void setMetadata(Map<String, String> metadata) {
+    public void setMetadata(Map<String, ?> metadata) {
         this.metadata = metadata;
     }
 
@@ -193,7 +193,7 @@ public static class NodeEntity {
         private String uniqueId;
         private String type;
 
-        private Map<String, String> metadata;
+        private Map<String, ?> metadata;
 
         public String getId() {
             return id;
@@ -227,11 +227,11 @@ public void setType(String type) {
             this.type = type;
         }
 
-        public Map<String, String> getMetadata() {
+        public Map<String, ?> getMetadata() {
             return metadata;
         }
 
-        public void setMetadata(Map<String, String> metadata) {
+        public void setMetadata(Map<String, ?> metadata) {
             this.metadata = metadata;
         }