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

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


The following commit(s) were added to refs/heads/main by this push:
     new 9967be01033 CAMEL-20890: camel-core-model: Copy definitions to make 
deep copy for route templates to avoid side-effects when the template are 
reused to create multiple routes. (#14602)
9967be01033 is described below

commit 9967be010339c93208fc59adf5ea2923d0cb91fe
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Jun 19 19:47:07 2024 +0200

    CAMEL-20890: camel-core-model: Copy definitions to make deep copy for route 
templates to avoid side-effects when the template are reused to create multiple 
routes. (#14602)
---
 .../org/apache/camel/model/ChoiceDefinition.java   | 13 +-------
 .../org/apache/camel/model/CopyableDefinition.java |  4 +--
 .../apache/camel/model/DataFormatDefinition.java   |  4 +--
 .../apache/camel/model/LoadBalancerDefinition.java |  4 +--
 .../apache/camel/model/OnFallbackDefinition.java   |  2 +-
 .../org/apache/camel/model/OutputDefinition.java   |  2 +-
 .../apache/camel/model/OutputExpressionNode.java   |  2 +-
 .../apache/camel/model/ProcessorDefinition.java    |  2 +-
 .../camel/model/ProcessorDefinitionHelper.java     | 19 ++++++++---
 .../camel/model/RouteTemplateDefinition.java       |  2 +-
 .../org/apache/camel/model/SagaDefinition.java     | 13 +-------
 .../apache/camel/model/SetHeadersDefinition.java   | 12 +------
 .../apache/camel/model/SetVariablesDefinition.java | 12 +------
 .../java/org/apache/camel/model/TryDefinition.java | 13 +-------
 .../camel/model/dataformat/ASN1DataFormat.java     | 12 +++++++
 .../camel/model/dataformat/AvroDataFormat.java     | 33 +++++++++++++++++++
 .../camel/model/dataformat/BarcodeDataFormat.java  | 13 ++++++++
 .../camel/model/dataformat/Base64DataFormat.java   | 12 +++++++
 .../camel/model/dataformat/BeanioDataFormat.java   | 17 ++++++++++
 .../camel/model/dataformat/BindyDataFormat.java    | 15 +++++++++
 .../camel/model/dataformat/CBORDataFormat.java     | 21 ++++++++++++
 .../camel/model/dataformat/CryptoDataFormat.java   | 18 ++++++++++
 .../camel/model/dataformat/CsvDataFormat.java      | 38 ++++++++++++++++++++++
 .../camel/model/dataformat/CustomDataFormat.java   | 10 ++++++
 .../model/dataformat/DataFormatsDefinition.java    | 16 ++++++++-
 .../camel/model/dataformat/FhirDataformat.java     | 23 +++++++++++++
 .../camel/model/dataformat/FhirJsonDataFormat.java |  9 +++++
 .../camel/model/dataformat/FhirXmlDataFormat.java  |  9 +++++
 .../camel/model/dataformat/FlatpackDataFormat.java | 17 ++++++++++
 .../camel/model/dataformat/GrokDataFormat.java     | 13 ++++++++
 .../model/dataformat/GzipDeflaterDataFormat.java   |  9 +++++
 .../camel/model/dataformat/HL7DataFormat.java      | 11 +++++++
 .../camel/model/dataformat/IcalDataFormat.java     | 10 ++++++
 .../model/dataformat/JacksonXMLDataFormat.java     | 28 ++++++++++++++++
 .../camel/model/dataformat/JaxbDataFormat.java     | 29 +++++++++++++++++
 .../camel/model/dataformat/JsonApiDataFormat.java  | 13 ++++++++
 .../camel/model/dataformat/JsonDataFormat.java     | 35 ++++++++++++++++++++
 .../camel/model/dataformat/LZFDataFormat.java      | 10 ++++++
 .../model/dataformat/MimeMultipartDataFormat.java  | 14 ++++++++
 .../camel/model/dataformat/PGPDataFormat.java      | 24 ++++++++++++++
 .../model/dataformat/ParquetAvroDataFormat.java    | 13 ++++++++
 .../camel/model/dataformat/ProtobufDataFormat.java | 34 +++++++++++++++++++
 .../camel/model/dataformat/RssDataFormat.java      |  9 +++++
 .../camel/model/dataformat/SoapDataFormat.java     | 16 +++++++++
 .../camel/model/dataformat/SwiftMtDataFormat.java  | 10 ++++++
 .../camel/model/dataformat/SwiftMxDataFormat.java  | 15 +++++++++
 .../camel/model/dataformat/SyslogDataFormat.java   |  9 +++++
 .../camel/model/dataformat/TarFileDataFormat.java  | 13 ++++++++
 .../camel/model/dataformat/ThriftDataFormat.java   | 13 ++++++++
 .../model/dataformat/TidyMarkupDataFormat.java     | 12 +++++++
 .../dataformat/UniVocityAbstractDataFormat.java    | 18 ++++++++++
 .../model/dataformat/UniVocityCsvDataFormat.java   | 13 ++++++++
 .../model/dataformat/UniVocityFixedDataFormat.java | 12 +++++++
 .../camel/model/dataformat/UniVocityHeader.java    | 16 ++++++++-
 .../model/dataformat/UniVocityTsvDataFormat.java   | 10 ++++++
 .../model/dataformat/XMLSecurityDataFormat.java    | 24 ++++++++++++++
 .../camel/model/dataformat/YAMLDataFormat.java     | 23 +++++++++++++
 .../model/dataformat/YAMLTypeFilterDefinition.java | 16 ++++++++-
 .../model/dataformat/ZipDeflaterDataFormat.java    | 10 ++++++
 .../camel/model/dataformat/ZipFileDataFormat.java  | 13 ++++++++
 .../model/language/NamespaceAwareExpression.java   | 15 ++-------
 .../loadbalancer/CustomLoadBalancerDefinition.java |  1 +
 .../FailoverLoadBalancerDefinition.java            |  1 +
 .../loadbalancer/RandomLoadBalancerDefinition.java |  1 +
 .../RoundRobinLoadBalancerDefinition.java          |  1 +
 .../loadbalancer/StickyLoadBalancerDefinition.java |  1 +
 .../loadbalancer/TopicLoadBalancerDefinition.java  |  1 +
 .../WeightedLoadBalancerDefinition.java            |  1 +
 .../transformer/CustomTransformerDefinition.java   | 14 ++++++++
 .../DataFormatTransformerDefinition.java           | 13 ++++++++
 .../transformer/EndpointTransformerDefinition.java | 14 ++++++++
 .../transformer/LoadTransformerDefinition.java     | 15 ++++++++-
 .../model/transformer/TransformerDefinition.java   | 13 +++++++-
 .../model/transformer/TransformersDefinition.java  | 17 ++++++++--
 .../model/validator/CustomValidatorDefinition.java | 14 ++++++++
 .../validator/EndpointValidatorDefinition.java     | 14 ++++++++
 .../validator/PredicateValidatorDefinition.java    | 13 ++++++++
 .../camel/model/validator/ValidatorDefinition.java | 10 +++++-
 .../model/validator/ValidatorsDefinition.java      |  8 +++++
 .../camel/model/RouteTemplateDefinitionTest.java   |  3 +-
 80 files changed, 935 insertions(+), 97 deletions(-)

diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/ChoiceDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/ChoiceDefinition.java
index e752d246558..69192d540a2 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/ChoiceDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/ChoiceDefinition.java
@@ -64,7 +64,7 @@ public class ChoiceDefinition extends 
ProcessorDefinition<ChoiceDefinition> impl
 
     protected ChoiceDefinition(ChoiceDefinition source) {
         super(source);
-        this.whenClauses = copyWhenClauses(source);
+        this.whenClauses = 
ProcessorDefinitionHelper.deepCopyDefinitions(source.whenClauses);
         this.otherwise = source.otherwise != null ? 
source.otherwise.copyDefinition() : null;
         this.precondition = source.precondition;
     }
@@ -331,15 +331,4 @@ public class ChoiceDefinition extends 
ProcessorDefinition<ChoiceDefinition> impl
         }
     }
 
-    private static List<WhenDefinition> copyWhenClauses(ChoiceDefinition 
source) {
-        if (source.whenClauses != null) {
-            var answer = new ArrayList<WhenDefinition>();
-            for (var def : source.whenClauses) {
-                answer.add(def.copyDefinition());
-            }
-            return answer;
-        }
-        return null;
-    }
-
 }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/CopyableDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/CopyableDefinition.java
index cfd714aac43..262b8c1f396 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/CopyableDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/CopyableDefinition.java
@@ -20,10 +20,10 @@ package org.apache.camel.model;
  * This interface is used to copy {@link ProcessorDefinition 
ProcessorDefinitions} during instantiation of route
  * templates.
  */
-public interface CopyableDefinition {
+public interface CopyableDefinition<T> {
 
     /**
      * Makes a copy of this definition.
      */
-    ProcessorDefinition<?> copyDefinition();
+    T copyDefinition();
 }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/DataFormatDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/DataFormatDefinition.java
index 7594bab7006..503de71cf7e 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/DataFormatDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/DataFormatDefinition.java
@@ -30,7 +30,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "dataformat,transformation")
 @XmlType(name = "dataFormat")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class DataFormatDefinition extends IdentifiedType {
+public class DataFormatDefinition extends IdentifiedType implements 
CopyableDefinition<DataFormatDefinition> {
 
     @XmlTransient
     private DataFormat dataFormat;
@@ -50,7 +50,7 @@ public class DataFormatDefinition extends IdentifiedType {
     }
 
     public DataFormatDefinition copyDefinition() {
-        return new DataFormatDefinition(this);
+        throw new UnsupportedOperationException("Should be implemented in 
child classes");
     }
 
     protected DataFormatDefinition(String dataFormatName) {
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/LoadBalancerDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/LoadBalancerDefinition.java
index 85bd68e9b84..4fb0616b22b 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/LoadBalancerDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/LoadBalancerDefinition.java
@@ -21,7 +21,7 @@ import jakarta.xml.bind.annotation.XmlTransient;
 /**
  * Balances message processing among a number of nodes
  */
-public abstract class LoadBalancerDefinition extends IdentifiedType {
+public abstract class LoadBalancerDefinition extends IdentifiedType implements 
CopyableDefinition<LoadBalancerDefinition> {
 
     @XmlTransient
     private String loadBalancerTypeName;
@@ -37,8 +37,6 @@ public abstract class LoadBalancerDefinition extends 
IdentifiedType {
         this.loadBalancerTypeName = loadBalancerTypeName;
     }
 
-    protected abstract LoadBalancerDefinition copyDefinition();
-
     /**
      * Maximum number of outputs, as some load balancers only support 1 
processor
      */
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/OnFallbackDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/OnFallbackDefinition.java
index 7b6ad38c3b6..6bd6bd06226 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/OnFallbackDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/OnFallbackDefinition.java
@@ -48,7 +48,7 @@ public class OnFallbackDefinition extends 
ProcessorDefinition<OnFallbackDefiniti
     protected OnFallbackDefinition(OnFallbackDefinition source) {
         super(source);
         this.fallbackViaNetwork = source.fallbackViaNetwork;
-        this.outputs = 
ProcessorDefinitionHelper.copyDefinitions(source.outputs);
+        this.outputs = 
ProcessorDefinitionHelper.deepCopyDefinitions(source.outputs);
     }
 
     @Override
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/OutputDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/OutputDefinition.java
index 5634206975d..57d85d7b51e 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/OutputDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/OutputDefinition.java
@@ -42,7 +42,7 @@ public class OutputDefinition<Type extends 
ProcessorDefinition<Type>> extends Pr
 
     protected OutputDefinition(OutputDefinition<?> source) {
         super(source);
-        this.outputs = 
ProcessorDefinitionHelper.copyDefinitions(source.outputs);
+        this.outputs = 
ProcessorDefinitionHelper.deepCopyDefinitions(source.outputs);
     }
 
     @Override
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/OutputExpressionNode.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/OutputExpressionNode.java
index e03d7d8b5b2..cdd438ed548 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/OutputExpressionNode.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/OutputExpressionNode.java
@@ -43,7 +43,7 @@ public abstract class OutputExpressionNode extends 
ExpressionNode implements Out
 
     public OutputExpressionNode(OutputExpressionNode source) {
         super(source);
-        this.outputs = 
ProcessorDefinitionHelper.copyDefinitions(source.outputs);
+        this.outputs = 
ProcessorDefinitionHelper.deepCopyDefinitions(source.outputs);
     }
 
     public OutputExpressionNode(ExpressionDefinition expression) {
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java
index fa0371e16fa..391b2b6ea66 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java
@@ -78,7 +78,7 @@ import org.slf4j.Logger;
 @XmlAccessorType(XmlAccessType.FIELD)
 @SuppressWarnings("rawtypes")
 public abstract class ProcessorDefinition<Type extends 
ProcessorDefinition<Type>> extends OptionalIdentifiedDefinition<Type>
-        implements Block, CopyableDefinition {
+        implements Block, CopyableDefinition<ProcessorDefinition> {
     @XmlTransient
     private static final AtomicInteger COUNTER = new AtomicInteger();
     @XmlAttribute
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java
index e5e34da8081..c48fe079307 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java
@@ -461,10 +461,21 @@ public final class ProcessorDefinitionHelper {
         return null;
     }
 
-    public static List<ProcessorDefinition<?>> 
copyDefinitions(List<ProcessorDefinition<?>> outputs) {
-        var answer = new ArrayList<ProcessorDefinition<?>>();
-        for (var def : outputs) {
-            answer.add(def.copyDefinition());
+    /**
+     * Performs a depp copy of the list of model classes
+     *
+     * @param  models list of model classes
+     * @return        a new list containing a deep copy of the model classes
+     */
+    public static List deepCopyDefinitions(List models) {
+        var answer = new ArrayList();
+        if (models != null) {
+            for (var def : models) {
+                if (def instanceof CopyableDefinition<?> copy) {
+                    def = copy.copyDefinition();
+                }
+                answer.add(def);
+            }
         }
         return answer;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java
index 450a1845fdd..03618b3ea38 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java
@@ -418,7 +418,7 @@ public class RouteTemplateDefinition extends 
OptionalIdentifiedDefinition<RouteT
         copy.setLogMask(route.getLogMask());
         copy.setMessageHistory(route.getMessageHistory());
         copy.setOutputType(route.getOutputType());
-        
copy.setOutputs(ProcessorDefinitionHelper.copyDefinitions(route.getOutputs()));
+        
copy.setOutputs(ProcessorDefinitionHelper.deepCopyDefinitions(route.getOutputs()));
         copy.setRoutePolicies(shallowCopy(route.getRoutePolicies()));
         copy.setRoutePolicyRef(route.getRoutePolicyRef());
         copy.setRouteProperties(shallowCopy(route.getRouteProperties()));
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/SagaDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/SagaDefinition.java
index fc5119e8a72..bf97caa3797 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/SagaDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/SagaDefinition.java
@@ -79,7 +79,7 @@ public class SagaDefinition extends 
OutputDefinition<SagaDefinition> {
         this.timeout = source.timeout;
         this.compensation = source.compensation != null ? 
source.compensation.copyDefinition() : null;
         this.completion = source.completion != null ? 
source.completion.copyDefinition() : null;
-        this.options = copyOptions(source);
+        this.options = 
ProcessorDefinitionHelper.deepCopyDefinitions(source.options);
     }
 
     @Override
@@ -313,15 +313,4 @@ public class SagaDefinition extends 
OutputDefinition<SagaDefinition> {
         builder.append(key).append(':').append(value);
     }
 
-    private static List<PropertyExpressionDefinition> 
copyOptions(SagaDefinition source) {
-        if (source.options != null) {
-            var answer = new ArrayList<PropertyExpressionDefinition>();
-            for (var def : source.options) {
-                answer.add(def.copyDefinition());
-            }
-            return answer;
-        }
-        return null;
-    }
-
 }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/SetHeadersDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/SetHeadersDefinition.java
index a7ee80ba259..e86d1fa23a0 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/SetHeadersDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/SetHeadersDefinition.java
@@ -51,7 +51,7 @@ public class SetHeadersDefinition extends 
ProcessorDefinition<SetHeadersDefiniti
 
     protected SetHeadersDefinition(SetHeadersDefinition source) {
         super(source);
-        this.headers = copyHeaders(source);
+        this.headers = 
ProcessorDefinitionHelper.deepCopyDefinitions(source.headers);
     }
 
     @Override
@@ -126,14 +126,4 @@ public class SetHeadersDefinition extends 
ProcessorDefinition<SetHeadersDefiniti
         return Collections.emptyList();
     }
 
-    private static List<SetHeaderDefinition> copyHeaders(SetHeadersDefinition 
source) {
-        var answer = new ArrayList<SetHeaderDefinition>();
-        if (source.headers != null) {
-            for (var def : source.headers) {
-                answer.add(def.copyDefinition());
-            }
-        }
-        return answer;
-    }
-
 }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/SetVariablesDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/SetVariablesDefinition.java
index f609e2a9142..e52017c1924 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/SetVariablesDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/SetVariablesDefinition.java
@@ -49,7 +49,7 @@ public class SetVariablesDefinition extends 
ProcessorDefinition<SetVariablesDefi
 
     protected SetVariablesDefinition(SetVariablesDefinition source) {
         super(source);
-        this.variables = copyVariables(source);
+        this.variables = 
ProcessorDefinitionHelper.deepCopyDefinitions(source.variables);
     }
 
     @Override
@@ -124,14 +124,4 @@ public class SetVariablesDefinition extends 
ProcessorDefinition<SetVariablesDefi
         return Collections.emptyList();
     }
 
-    private static List<SetVariableDefinition> 
copyVariables(SetVariablesDefinition source) {
-        var answer = new ArrayList<SetVariableDefinition>();
-        if (source.variables != null) {
-            for (var def : source.variables) {
-                answer.add(def.copyDefinition());
-            }
-        }
-        return answer;
-    }
-
 }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/TryDefinition.java 
b/core/camel-core-model/src/main/java/org/apache/camel/model/TryDefinition.java
index 5701f436b7e..f39217f695c 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/TryDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/TryDefinition.java
@@ -58,7 +58,7 @@ public class TryDefinition extends 
OutputDefinition<TryDefinition> {
 
     protected TryDefinition(TryDefinition source) {
         super(source);
-        this.catchClauses = copyCatchClauses(source);
+        this.catchClauses = 
ProcessorDefinitionHelper.deepCopyDefinitions(source.catchClauses);
         this.finallyClause = source.finallyClause != null ? 
source.finallyClause.copyDefinition() : null;
     }
 
@@ -255,15 +255,4 @@ public class TryDefinition extends 
OutputDefinition<TryDefinition> {
         }
     }
 
-    private static List<CatchDefinition> copyCatchClauses(TryDefinition 
source) {
-        if (source.catchClauses != null) {
-            var answer = new ArrayList<CatchDefinition>();
-            for (var def : source.catchClauses) {
-                answer.add(def.copyDefinition());
-            }
-            return answer;
-        }
-        return null;
-    }
-
 }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ASN1DataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ASN1DataFormat.java
index 140470b401d..9f81a5d9313 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ASN1DataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ASN1DataFormat.java
@@ -47,6 +47,13 @@ public class ASN1DataFormat extends DataFormatDefinition {
         super("asn1");
     }
 
+    protected ASN1DataFormat(ASN1DataFormat source) {
+        super(source);
+        this.unmarshalType = source.unmarshalType;
+        this.unmarshalTypeName = source.unmarshalTypeName;
+        this.usingIterator = source.usingIterator;
+    }
+
     public ASN1DataFormat(Boolean usingIterator) {
         this();
         setUsingIterator(usingIterator != null ? usingIterator.toString() : 
null);
@@ -71,6 +78,11 @@ public class ASN1DataFormat extends DataFormatDefinition {
         this.unmarshalType = builder.unmarshalType;
     }
 
+    @Override
+    public ASN1DataFormat copyDefinition() {
+        return new ASN1DataFormat(this);
+    }
+
     public String getUsingIterator() {
         return usingIterator;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/AvroDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/AvroDataFormat.java
index 00463544127..7fb6c262509 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/AvroDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/AvroDataFormat.java
@@ -104,6 +104,34 @@ public class AvroDataFormat extends DataFormatDefinition {
         super("avro");
     }
 
+    protected AvroDataFormat(AvroDataFormat source) {
+        super(source);
+        this.unmarshalType = source.unmarshalType;
+        this.jsonView = source.jsonView;
+        this.collectionType = source.collectionType;
+        this.schema = source.schema;
+        this.instanceClassName = source.instanceClassName;
+        this.library = source.library;
+        this.objectMapper = source.objectMapper;
+        this.useDefaultObjectMapper = source.useDefaultObjectMapper;
+        this.unmarshalTypeName = source.unmarshalTypeName;
+        this.jsonViewTypeName = source.jsonViewTypeName;
+        this.include = source.include;
+        this.allowJmsType = source.allowJmsType;
+        this.collectionTypeName = source.collectionTypeName;
+        this.useList = source.useList;
+        this.moduleClassNames = source.moduleClassNames;
+        this.moduleRefs = source.moduleRefs;
+        this.enableFeatures = source.enableFeatures;
+        this.disableFeatures = source.disableFeatures;
+        this.allowUnmarshallType = source.allowUnmarshallType;
+        this.timezone = source.timezone;
+        this.autoDiscoverObjectMapper = source.autoDiscoverObjectMapper;
+        this.contentTypeHeader = source.contentTypeHeader;
+        this.schemaResolver = source.schemaResolver;
+        this.autoDiscoverSchemaResolver = source.autoDiscoverSchemaResolver;
+    }
+
     public AvroDataFormat(AvroLibrary library) {
         this();
         setLibrary(library);
@@ -142,6 +170,11 @@ public class AvroDataFormat extends DataFormatDefinition {
         this.autoDiscoverSchemaResolver = builder.autoDiscoverSchemaResolver;
     }
 
+    @Override
+    public AvroDataFormat copyDefinition() {
+        return new AvroDataFormat(this);
+    }
+
     public String getInstanceClassName() {
         return instanceClassName;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/BarcodeDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/BarcodeDataFormat.java
index 20bc655104e..288338d918b 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/BarcodeDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/BarcodeDataFormat.java
@@ -49,6 +49,14 @@ public class BarcodeDataFormat extends DataFormatDefinition {
         super("barcode");
     }
 
+    protected BarcodeDataFormat(BarcodeDataFormat source) {
+        super(source);
+        this.barcodeFormat = source.barcodeFormat;
+        this.imageType = source.imageType;
+        this.width = source.width;
+        this.height = source.height;
+    }
+
     private BarcodeDataFormat(Builder builder) {
         this();
         this.barcodeFormat = builder.barcodeFormat;
@@ -57,6 +65,11 @@ public class BarcodeDataFormat extends DataFormatDefinition {
         this.height = builder.height;
     }
 
+    @Override
+    public BarcodeDataFormat copyDefinition() {
+        return new BarcodeDataFormat(this);
+    }
+
     public String getWidth() {
         return width;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/Base64DataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/Base64DataFormat.java
index 2f994ba7f06..b7cc8572967 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/Base64DataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/Base64DataFormat.java
@@ -48,6 +48,13 @@ public class Base64DataFormat extends DataFormatDefinition {
         super("base64");
     }
 
+    protected Base64DataFormat(Base64DataFormat source) {
+        super(source);
+        this.lineLength = source.lineLength;
+        this.lineSeparator = source.lineSeparator;
+        this.urlSafe = source.urlSafe;
+    }
+
     private Base64DataFormat(Builder builder) {
         this();
         this.lineLength = builder.lineLength;
@@ -55,6 +62,11 @@ public class Base64DataFormat extends DataFormatDefinition {
         this.urlSafe = builder.urlSafe;
     }
 
+    @Override
+    public Base64DataFormat copyDefinition() {
+        return new Base64DataFormat(this);
+    }
+
     public String getLineLength() {
         return lineLength;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/BeanioDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/BeanioDataFormat.java
index 0b175a8b50f..d113ba00429 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/BeanioDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/BeanioDataFormat.java
@@ -61,6 +61,18 @@ public class BeanioDataFormat extends DataFormatDefinition {
         super("beanio");
     }
 
+    protected BeanioDataFormat(BeanioDataFormat source) {
+        super(source);
+        this.mapping = source.mapping;
+        this.streamName = source.streamName;
+        this.ignoreUnidentifiedRecords = source.ignoreUnidentifiedRecords;
+        this.ignoreUnexpectedRecords = source.ignoreUnexpectedRecords;
+        this.ignoreInvalidRecords = source.ignoreInvalidRecords;
+        this.encoding = source.encoding;
+        this.beanReaderErrorHandlerType = source.beanReaderErrorHandlerType;
+        this.unmarshalSingleObject = source.unmarshalSingleObject;
+    }
+
     private BeanioDataFormat(BeanioDataFormat.Builder builder) {
         this();
         this.mapping = builder.mapping;
@@ -73,6 +85,11 @@ public class BeanioDataFormat extends DataFormatDefinition {
         this.unmarshalSingleObject = builder.unmarshalSingleObject;
     }
 
+    @Override
+    public BeanioDataFormat copyDefinition() {
+        return new BeanioDataFormat(this);
+    }
+
     public String getMapping() {
         return mapping;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java
index 5d540686d69..daf486714c0 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java
@@ -58,6 +58,16 @@ public class BindyDataFormat extends DataFormatDefinition {
         super("bindy");
     }
 
+    protected BindyDataFormat(BindyDataFormat source) {
+        super(source);
+        this.classType = source.classType;
+        this.type = source.type;
+        this.classTypeAsString = source.classTypeAsString;
+        this.allowEmptyStream = source.allowEmptyStream;
+        this.unwrapSingleInstance = source.unwrapSingleInstance;
+        this.locale = source.locale;
+    }
+
     private BindyDataFormat(Builder builder) {
         this();
         this.classType = builder.classType;
@@ -68,6 +78,11 @@ public class BindyDataFormat extends DataFormatDefinition {
         this.locale = builder.locale;
     }
 
+    @Override
+    public BindyDataFormat copyDefinition() {
+        return new BindyDataFormat(this);
+    }
+
     public String getType() {
         return type;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CBORDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CBORDataFormat.java
index 0df047503f5..575ed2dcdc7 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CBORDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CBORDataFormat.java
@@ -71,6 +71,22 @@ public class CBORDataFormat extends DataFormatDefinition {
         super("cbor");
     }
 
+    protected CBORDataFormat(CBORDataFormat source) {
+        super(source);
+        this.collectionType = source.collectionType;
+        this.unmarshalType = source.unmarshalType;
+        this.objectMapper = source.objectMapper;
+        this.useDefaultObjectMapper = source.useDefaultObjectMapper;
+        this.unmarshalTypeName = source.unmarshalTypeName;
+        this.collectionTypeName = source.collectionTypeName;
+        this.useList = source.useList;
+        this.allowUnmarshallType = source.allowUnmarshallType;
+        this.prettyPrint = source.prettyPrint;
+        this.allowJmsType = source.allowJmsType;
+        this.enableFeatures = source.enableFeatures;
+        this.disableFeatures = source.disableFeatures;
+    }
+
     private CBORDataFormat(Builder builder) {
         this();
         this.collectionType = builder.collectionType;
@@ -87,6 +103,11 @@ public class CBORDataFormat extends DataFormatDefinition {
         this.disableFeatures = builder.disableFeatures;
     }
 
+    @Override
+    public CBORDataFormat copyDefinition() {
+        return new CBORDataFormat(this);
+    }
+
     public String getObjectMapper() {
         return objectMapper;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CryptoDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CryptoDataFormat.java
index fe645da8092..146222aa961 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CryptoDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CryptoDataFormat.java
@@ -64,6 +64,19 @@ public class CryptoDataFormat extends DataFormatDefinition {
         super("crypto");
     }
 
+    protected CryptoDataFormat(CryptoDataFormat source) {
+        super(source);
+        this.algorithm = source.algorithm;
+        this.keyRef = source.keyRef;
+        this.cryptoProvider = source.cryptoProvider;
+        this.initVectorRef = source.initVectorRef;
+        this.algorithmParameterRef = source.algorithmParameterRef;
+        this.bufferSize = source.bufferSize;
+        this.macAlgorithm = source.macAlgorithm;
+        this.shouldAppendHMAC = source.shouldAppendHMAC;
+        this.inline = source.inline;
+    }
+
     private CryptoDataFormat(Builder builder) {
         this();
         this.algorithm = builder.algorithm;
@@ -77,6 +90,11 @@ public class CryptoDataFormat extends DataFormatDefinition {
         this.inline = builder.inline;
     }
 
+    @Override
+    public CryptoDataFormat copyDefinition() {
+        return new CryptoDataFormat(this);
+    }
+
     public String getAlgorithm() {
         return algorithm;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CsvDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CsvDataFormat.java
index 5272b99201f..be77d1fe53f 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CsvDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CsvDataFormat.java
@@ -128,6 +128,39 @@ public class CsvDataFormat extends DataFormatDefinition {
         super("csv");
     }
 
+    protected CsvDataFormat(CsvDataFormat source) {
+        super(source);
+        this.formatRef = source.formatRef;
+        this.formatName = source.formatName;
+        this.commentMarkerDisabled = source.commentMarkerDisabled;
+        this.commentMarker = source.commentMarker;
+        this.delimiter = source.delimiter;
+        this.escapeDisabled = source.escapeDisabled;
+        this.escape = source.escape;
+        this.headerDisabled = source.headerDisabled;
+        this.header = source.header;
+        this.allowMissingColumnNames = source.allowMissingColumnNames;
+        this.ignoreEmptyLines = source.ignoreEmptyLines;
+        this.ignoreSurroundingSpaces = source.ignoreSurroundingSpaces;
+        this.nullStringDisabled = source.nullStringDisabled;
+        this.nullString = source.nullString;
+        this.quoteDisabled = source.quoteDisabled;
+        this.quote = source.quote;
+        this.recordSeparatorDisabled = source.recordSeparatorDisabled;
+        this.recordSeparator = source.recordSeparator;
+        this.skipHeaderRecord = source.skipHeaderRecord;
+        this.quoteMode = source.quoteMode;
+        this.ignoreHeaderCase = source.ignoreHeaderCase;
+        this.trim = source.trim;
+        this.trailingDelimiter = source.trailingDelimiter;
+        this.marshallerFactoryRef = source.marshallerFactoryRef;
+        this.lazyLoad = source.lazyLoad;
+        this.useMaps = source.useMaps;
+        this.useOrderedMaps = source.useOrderedMaps;
+        this.recordConverterRef = source.recordConverterRef;
+        this.captureHeaderRecord = source.captureHeaderRecord;
+    }
+
     public CsvDataFormat(String delimiter) {
         this();
         setDelimiter(delimiter);
@@ -171,6 +204,11 @@ public class CsvDataFormat extends DataFormatDefinition {
         this.captureHeaderRecord = builder.captureHeaderRecord;
     }
 
+    @Override
+    public CsvDataFormat copyDefinition() {
+        return new CsvDataFormat(this);
+    }
+
     /**
      * Sets the implementation of the CsvMarshallerFactory interface which is 
able to customize
      * marshalling/unmarshalling behavior by extending CsvMarshaller or 
creating it from scratch.
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CustomDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CustomDataFormat.java
index 093697a2616..933e409c957 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CustomDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/CustomDataFormat.java
@@ -40,6 +40,11 @@ public class CustomDataFormat extends DataFormatDefinition {
     public CustomDataFormat() {
     }
 
+    protected CustomDataFormat(CustomDataFormat source) {
+        super(source);
+        this.ref = source.ref;
+    }
+
     public CustomDataFormat(String ref) {
         this.ref = ref;
     }
@@ -49,6 +54,11 @@ public class CustomDataFormat extends DataFormatDefinition {
         this.ref = builder.ref;
     }
 
+    @Override
+    public CustomDataFormat copyDefinition() {
+        return new CustomDataFormat(this);
+    }
+
     /**
      * Reference to the custom {@link org.apache.camel.spi.DataFormat} to 
lookup from the Camel registry.
      */
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/DataFormatsDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/DataFormatsDefinition.java
index 5e3f91d2578..e129a74a6a9 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/DataFormatsDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/DataFormatsDefinition.java
@@ -26,7 +26,9 @@ import jakarta.xml.bind.annotation.XmlElement;
 import jakarta.xml.bind.annotation.XmlElements;
 import jakarta.xml.bind.annotation.XmlRootElement;
 
+import org.apache.camel.model.CopyableDefinition;
 import org.apache.camel.model.DataFormatDefinition;
+import org.apache.camel.model.ProcessorDefinitionHelper;
 import org.apache.camel.spi.Metadata;
 
 /**
@@ -35,7 +37,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "dataformat,transformation", title = "Data formats")
 @XmlRootElement(name = "dataFormats")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class DataFormatsDefinition {
+public class DataFormatsDefinition implements 
CopyableDefinition<DataFormatsDefinition> {
 
     // cannot use @XmlElementRef as it doesn't allow optional properties
     @XmlElements({
@@ -82,6 +84,18 @@ public class DataFormatsDefinition {
             @XmlElement(name = "zipFile", type = ZipFileDataFormat.class) })
     private List<DataFormatDefinition> dataFormats;
 
+    public DataFormatsDefinition() {
+    }
+
+    protected DataFormatsDefinition(DataFormatsDefinition source) {
+        this.dataFormats = 
ProcessorDefinitionHelper.deepCopyDefinitions(source.dataFormats);
+    }
+
+    @Override
+    public DataFormatsDefinition copyDefinition() {
+        return new DataFormatsDefinition(this);
+    }
+
     /**
      * A list holding the configured data formats
      */
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FhirDataformat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FhirDataformat.java
index 9e301d104fd..d1825c98333 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FhirDataformat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FhirDataformat.java
@@ -27,6 +27,7 @@ import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
 public abstract class FhirDataformat extends DataFormatDefinition implements 
ContentTypeHeaderAware {
+
     @XmlAttribute
     @Metadata(enums = "DSTU2,DSTU2_HL7ORG,DSTU2_1,DSTU3,R4,R5", defaultValue = 
"R4")
     private String fhirVersion;
@@ -88,6 +89,28 @@ public abstract class FhirDataformat extends 
DataFormatDefinition implements Con
         super(dataFormatName);
     }
 
+    protected FhirDataformat(FhirDataformat source) {
+        super(source);
+        this.fhirContext = source.fhirContext;
+        this.fhirVersion = source.fhirVersion;
+        this.prettyPrint = source.prettyPrint;
+        this.parserErrorHandler = source.parserErrorHandler;
+        this.parserOptions = source.parserOptions;
+        this.preferTypes = source.preferTypes;
+        this.forceResourceId = source.forceResourceId;
+        this.serverBaseUrl = source.serverBaseUrl;
+        this.omitResourceId = source.omitResourceId;
+        this.encodeElementsAppliesToChildResourcesOnly = 
source.encodeElementsAppliesToChildResourcesOnly;
+        this.encodeElements = source.encodeElements;
+        this.dontEncodeElements = source.dontEncodeElements;
+        this.stripVersionsFromReferences = source.stripVersionsFromReferences;
+        this.overrideResourceIdWithBundleEntryFullUrl = 
source.overrideResourceIdWithBundleEntryFullUrl;
+        this.summaryMode = source.summaryMode;
+        this.suppressNarratives = source.suppressNarratives;
+        this.dontStripVersionsFromReferencesAtPaths = 
source.dontStripVersionsFromReferencesAtPaths;
+        this.contentTypeHeader = source.contentTypeHeader;
+    }
+
     protected FhirDataformat() {
         // This constructor is needed by jaxb for schema generation
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FhirJsonDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FhirJsonDataFormat.java
index a28a74a5823..c9e72a32738 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FhirJsonDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FhirJsonDataFormat.java
@@ -35,6 +35,15 @@ public class FhirJsonDataFormat extends FhirDataformat {
         super("fhirJson");
     }
 
+    protected FhirJsonDataFormat(FhirJsonDataFormat source) {
+        super(source);
+    }
+
+    @Override
+    public FhirJsonDataFormat copyDefinition() {
+        return new FhirJsonDataFormat(this);
+    }
+
     private FhirJsonDataFormat(Builder builder) {
         super("fhirJson", builder);
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FhirXmlDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FhirXmlDataFormat.java
index 2caad688b51..d663522560a 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FhirXmlDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FhirXmlDataFormat.java
@@ -39,6 +39,15 @@ public class FhirXmlDataFormat extends FhirDataformat {
         super("fhirXml", builder);
     }
 
+    protected FhirXmlDataFormat(FhirXmlDataFormat source) {
+        super(source);
+    }
+
+    @Override
+    public FhirXmlDataFormat copyDefinition() {
+        return new FhirXmlDataFormat(this);
+    }
+
     /**
      * {@code Builder} is a specific builder for {@link FhirXmlDataFormat}.
      */
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FlatpackDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FlatpackDataFormat.java
index 16c77269866..9ce79bb95e2 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FlatpackDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/FlatpackDataFormat.java
@@ -63,6 +63,18 @@ public class FlatpackDataFormat extends DataFormatDefinition 
{
         super("flatpack");
     }
 
+    protected FlatpackDataFormat(FlatpackDataFormat source) {
+        super(source);
+        this.definition = source.definition;
+        this.fixed = source.fixed;
+        this.delimiter = source.delimiter;
+        this.ignoreFirstRecord = source.ignoreFirstRecord;
+        this.allowShortLines = source.allowShortLines;
+        this.ignoreExtraColumns = source.ignoreExtraColumns;
+        this.textQualifier = source.textQualifier;
+        this.parserFactoryRef = source.parserFactoryRef;
+    }
+
     private FlatpackDataFormat(Builder builder) {
         this();
         this.definition = builder.definition;
@@ -75,6 +87,11 @@ public class FlatpackDataFormat extends DataFormatDefinition 
{
         this.parserFactoryRef = builder.parserFactoryRef;
     }
 
+    @Override
+    public FlatpackDataFormat copyDefinition() {
+        return new FlatpackDataFormat(this);
+    }
+
     public String getDefinition() {
         return definition;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/GrokDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/GrokDataFormat.java
index b51f93b02b3..5c26891f483 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/GrokDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/GrokDataFormat.java
@@ -51,6 +51,14 @@ public class GrokDataFormat extends DataFormatDefinition {
         super("grok");
     }
 
+    protected GrokDataFormat(GrokDataFormat source) {
+        super(source);
+        this.pattern = source.pattern;
+        this.flattened = source.flattened;
+        this.allowMultipleMatchesPerLine = source.allowMultipleMatchesPerLine;
+        this.namedOnly = source.namedOnly;
+    }
+
     private GrokDataFormat(Builder builder) {
         this();
         this.pattern = builder.pattern;
@@ -59,6 +67,11 @@ public class GrokDataFormat extends DataFormatDefinition {
         this.namedOnly = builder.namedOnly;
     }
 
+    @Override
+    public GrokDataFormat copyDefinition() {
+        return new GrokDataFormat(this);
+    }
+
     public String getPattern() {
         return pattern;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/GzipDeflaterDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/GzipDeflaterDataFormat.java
index 0d71d772539..0d8b0ffe96b 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/GzipDeflaterDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/GzipDeflaterDataFormat.java
@@ -34,6 +34,15 @@ public class GzipDeflaterDataFormat extends 
DataFormatDefinition {
         super("gzipDeflater");
     }
 
+    protected GzipDeflaterDataFormat(GzipDeflaterDataFormat source) {
+        super(source);
+    }
+
+    @Override
+    public GzipDeflaterDataFormat copyDefinition() {
+        return new GzipDeflaterDataFormat(this);
+    }
+
     /**
      * {@code Builder} is a specific builder for {@link 
GzipDeflaterDataFormat}.
      */
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/HL7DataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/HL7DataFormat.java
index 70aa967189b..9a5e600a136 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/HL7DataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/HL7DataFormat.java
@@ -46,12 +46,23 @@ public class HL7DataFormat extends DataFormatDefinition {
         super("hl7");
     }
 
+    protected HL7DataFormat(HL7DataFormat source) {
+        super(source);
+        this.parser = source.parser;
+        this.validate = source.validate;
+    }
+
     private HL7DataFormat(Builder builder) {
         this();
         this.parser = builder.parser;
         this.validate = builder.validate;
     }
 
+    @Override
+    public HL7DataFormat copyDefinition() {
+        return new HL7DataFormat(this);
+    }
+
     public String getValidate() {
         return validate;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/IcalDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/IcalDataFormat.java
index 814717ae166..adca1379eb4 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/IcalDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/IcalDataFormat.java
@@ -42,11 +42,21 @@ public class IcalDataFormat extends DataFormatDefinition {
         super("ical");
     }
 
+    protected IcalDataFormat(IcalDataFormat source) {
+        super(source);
+        this.validating = source.validating;
+    }
+
     private IcalDataFormat(Builder builder) {
         this();
         this.validating = builder.validating;
     }
 
+    @Override
+    public IcalDataFormat copyDefinition() {
+        return new IcalDataFormat(this);
+    }
+
     public String getValidating() {
         return validating;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JacksonXMLDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JacksonXMLDataFormat.java
index b7479c4e6fc..429817b657a 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JacksonXMLDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JacksonXMLDataFormat.java
@@ -91,6 +91,29 @@ public class JacksonXMLDataFormat extends 
DataFormatDefinition implements Conten
         super("jacksonXml");
     }
 
+    protected JacksonXMLDataFormat(JacksonXMLDataFormat builder) {
+        super(builder);
+        this.unmarshalType = builder.unmarshalType;
+        this.jsonView = builder.jsonView;
+        this.collectionType = builder.collectionType;
+        this.xmlMapper = builder.xmlMapper;
+        this.prettyPrint = builder.prettyPrint;
+        this.unmarshalTypeName = builder.unmarshalTypeName;
+        this.allowUnmarshallType = builder.allowUnmarshallType;
+        this.jsonViewTypeName = builder.jsonViewTypeName;
+        this.include = builder.include;
+        this.allowJmsType = builder.allowJmsType;
+        this.collectionTypeName = builder.collectionTypeName;
+        this.useList = builder.useList;
+        this.timezone = builder.timezone;
+        this.enableJaxbAnnotationModule = builder.enableJaxbAnnotationModule;
+        this.moduleClassNames = builder.moduleClassNames;
+        this.moduleRefs = builder.moduleRefs;
+        this.enableFeatures = builder.enableFeatures;
+        this.disableFeatures = builder.disableFeatures;
+        this.contentTypeHeader = builder.contentTypeHeader;
+    }
+
     private JacksonXMLDataFormat(Builder builder) {
         this();
         this.unmarshalType = builder.unmarshalType;
@@ -114,6 +137,11 @@ public class JacksonXMLDataFormat extends 
DataFormatDefinition implements Conten
         this.contentTypeHeader = builder.contentTypeHeader;
     }
 
+    @Override
+    public JacksonXMLDataFormat copyDefinition() {
+        return new JacksonXMLDataFormat(this);
+    }
+
     public String getXmlMapper() {
         return xmlMapper;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JaxbDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JaxbDataFormat.java
index 21e8b14595c..d7181ce785f 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JaxbDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JaxbDataFormat.java
@@ -98,6 +98,30 @@ public class JaxbDataFormat extends DataFormatDefinition 
implements ContentTypeH
         super("jaxb");
     }
 
+    private JaxbDataFormat(JaxbDataFormat source) {
+        super(source);
+        this.contextPath = source.contextPath;
+        this.contextPathIsClassName = source.contextPathIsClassName;
+        this.schema = source.schema;
+        this.schemaSeverityLevel = source.schemaSeverityLevel;
+        this.prettyPrint = source.prettyPrint;
+        this.objectFactory = source.objectFactory;
+        this.ignoreJAXBElement = source.ignoreJAXBElement;
+        this.mustBeJAXBElement = source.mustBeJAXBElement;
+        this.filterNonXmlChars = source.filterNonXmlChars;
+        this.encoding = source.encoding;
+        this.fragment = source.fragment;
+        this.partClass = source.partClass;
+        this.partNamespace = source.partNamespace;
+        this.namespacePrefixRef = source.namespacePrefixRef;
+        this.xmlStreamWriterWrapper = source.xmlStreamWriterWrapper;
+        this.schemaLocation = source.schemaLocation;
+        this.noNamespaceSchemaLocation = source.noNamespaceSchemaLocation;
+        this.jaxbProviderProperties = source.jaxbProviderProperties;
+        this.contentTypeHeader = source.contentTypeHeader;
+        this.accessExternalSchemaProtocols = 
source.accessExternalSchemaProtocols;
+    }
+
     public JaxbDataFormat(boolean prettyPrint) {
         this();
         setPrettyPrint(Boolean.toString(prettyPrint));
@@ -127,6 +151,11 @@ public class JaxbDataFormat extends DataFormatDefinition 
implements ContentTypeH
         this.accessExternalSchemaProtocols = 
builder.accessExternalSchemaProtocols;
     }
 
+    @Override
+    public JaxbDataFormat copyDefinition() {
+        return new JaxbDataFormat(this);
+    }
+
     public String getContextPath() {
         return contextPath;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonApiDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonApiDataFormat.java
index b5f41718c18..05c03f59bc7 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonApiDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonApiDataFormat.java
@@ -48,6 +48,14 @@ public class JsonApiDataFormat extends DataFormatDefinition {
         super("jsonApi");
     }
 
+    protected JsonApiDataFormat(JsonApiDataFormat source) {
+        super(source);
+        this.dataFormatTypes = source.dataFormatTypes;
+        this.dataFormatTypeClasses = source.dataFormatTypeClasses;
+        this.mainFormatType = source.mainFormatType;
+        this.mainFormatTypeClass = source.mainFormatTypeClass;
+    }
+
     private JsonApiDataFormat(Builder builder) {
         this();
         this.dataFormatTypes = builder.dataFormatTypes;
@@ -56,6 +64,11 @@ public class JsonApiDataFormat extends DataFormatDefinition {
         this.mainFormatTypeClass = builder.mainFormatTypeClass;
     }
 
+    @Override
+    public JsonApiDataFormat copyDefinition() {
+        return new JsonApiDataFormat(this);
+    }
+
     public String getDataFormatTypes() {
         return dataFormatTypes;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
index 4811695bd0b..5f53443d2c3 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
@@ -33,6 +33,7 @@ import org.apache.camel.spi.Metadata;
 @XmlRootElement(name = "json")
 @XmlAccessorType(XmlAccessType.FIELD)
 public class JsonDataFormat extends DataFormatDefinition implements 
ContentTypeHeaderAware {
+
     @XmlAttribute
     private String objectMapper;
     @XmlAttribute
@@ -116,6 +117,35 @@ public class JsonDataFormat extends DataFormatDefinition 
implements ContentTypeH
         this.library = library;
     }
 
+    protected JsonDataFormat(JsonDataFormat source) {
+        super(source);
+        this.objectMapper = source.objectMapper;
+        this.useDefaultObjectMapper = source.useDefaultObjectMapper;
+        this.autoDiscoverObjectMapper = source.autoDiscoverObjectMapper;
+        this.prettyPrint = source.prettyPrint;
+        this.library = source.library;
+        this.unmarshalTypeName = source.unmarshalTypeName;
+        this.unmarshalType = source.unmarshalType;
+        this.jsonViewTypeName = source.jsonViewTypeName;
+        this.jsonView = source.jsonView;
+        this.include = source.include;
+        this.allowJmsType = source.allowJmsType;
+        this.collectionTypeName = source.collectionTypeName;
+        this.collectionType = source.collectionType;
+        this.useList = source.useList;
+        this.moduleClassNames = source.moduleClassNames;
+        this.moduleRefs = source.moduleRefs;
+        this.enableFeatures = source.enableFeatures;
+        this.disableFeatures = source.disableFeatures;
+        this.allowUnmarshallType = source.allowUnmarshallType;
+        this.timezone = source.timezone;
+        this.schemaResolver = source.schemaResolver;
+        this.autoDiscoverSchemaResolver = source.autoDiscoverSchemaResolver;
+        this.namingStrategy = source.namingStrategy;
+        this.contentTypeHeader = source.contentTypeHeader;
+        this.dateFormatPattern = source.dateFormatPattern;
+    }
+
     private JsonDataFormat(Builder builder) {
         this();
         this.objectMapper = builder.objectMapper;
@@ -145,6 +175,11 @@ public class JsonDataFormat extends DataFormatDefinition 
implements ContentTypeH
         this.dateFormatPattern = builder.dateFormatPattern;
     }
 
+    @Override
+    public JsonDataFormat copyDefinition() {
+        return new JsonDataFormat(this);
+    }
+
     @Override
     public String getDataFormatName() {
         // json data format is special as the name can be from different 
bundles
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/LZFDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/LZFDataFormat.java
index 2af0586275b..d6b69f28ab6 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/LZFDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/LZFDataFormat.java
@@ -42,11 +42,21 @@ public class LZFDataFormat extends DataFormatDefinition {
         super("lzf");
     }
 
+    protected LZFDataFormat(LZFDataFormat source) {
+        super(source);
+        this.usingParallelCompression = source.usingParallelCompression;
+    }
+
     private LZFDataFormat(Builder builder) {
         this();
         this.usingParallelCompression = builder.usingParallelCompression;
     }
 
+    @Override
+    public LZFDataFormat copyDefinition() {
+        return new LZFDataFormat(this);
+    }
+
     public String getUsingParallelCompression() {
         return usingParallelCompression;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/MimeMultipartDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/MimeMultipartDataFormat.java
index 2ddd1e448da..a9afa6b57a9 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/MimeMultipartDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/MimeMultipartDataFormat.java
@@ -53,6 +53,15 @@ public class MimeMultipartDataFormat extends 
DataFormatDefinition {
         super("mimeMultipart");
     }
 
+    protected MimeMultipartDataFormat(MimeMultipartDataFormat source) {
+        super(source);
+        this.multipartSubType = source.multipartSubType;
+        this.multipartWithoutAttachment = source.multipartWithoutAttachment;
+        this.headersInline = source.headersInline;
+        this.includeHeaders = source.includeHeaders;
+        this.binaryContent = source.binaryContent;
+    }
+
     private MimeMultipartDataFormat(Builder builder) {
         this();
         this.multipartSubType = builder.multipartSubType;
@@ -62,6 +71,11 @@ public class MimeMultipartDataFormat extends 
DataFormatDefinition {
         this.binaryContent = builder.binaryContent;
     }
 
+    @Override
+    public MimeMultipartDataFormat copyDefinition() {
+        return new MimeMultipartDataFormat(this);
+    }
+
     public String getMultipartSubType() {
         return multipartSubType;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/PGPDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/PGPDataFormat.java
index e138dbbdeec..9923cf7b06b 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/PGPDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/PGPDataFormat.java
@@ -33,6 +33,7 @@ import org.apache.camel.spi.Metadata;
 @XmlRootElement(name = "pgp")
 @XmlAccessorType(XmlAccessType.FIELD)
 public class PGPDataFormat extends DataFormatDefinition {
+
     @XmlAttribute
     private String keyUserid;
     @XmlAttribute
@@ -71,6 +72,24 @@ public class PGPDataFormat extends DataFormatDefinition {
         super("pgp");
     }
 
+    protected PGPDataFormat(PGPDataFormat source) {
+        super(source);
+        this.keyUserid = source.keyUserid;
+        this.signatureKeyUserid = source.signatureKeyUserid;
+        this.password = source.password;
+        this.signaturePassword = source.signaturePassword;
+        this.keyFileName = source.keyFileName;
+        this.signatureKeyFileName = source.signatureKeyFileName;
+        this.signatureKeyRing = source.signatureKeyRing;
+        this.armored = source.armored;
+        this.integrity = source.integrity;
+        this.provider = source.provider;
+        this.algorithm = source.algorithm;
+        this.compressionAlgorithm = source.compressionAlgorithm;
+        this.hashAlgorithm = source.hashAlgorithm;
+        this.signatureVerificationOption = source.signatureVerificationOption;
+    }
+
     private PGPDataFormat(Builder builder) {
         this();
         this.keyUserid = builder.keyUserid;
@@ -89,6 +108,11 @@ public class PGPDataFormat extends DataFormatDefinition {
         this.signatureVerificationOption = builder.signatureVerificationOption;
     }
 
+    @Override
+    public PGPDataFormat copyDefinition() {
+        return new PGPDataFormat(this);
+    }
+
     public String getSignatureKeyUserid() {
         return signatureKeyUserid;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ParquetAvroDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ParquetAvroDataFormat.java
index fce4152f027..034e332c76f 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ParquetAvroDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ParquetAvroDataFormat.java
@@ -49,6 +49,14 @@ public class ParquetAvroDataFormat extends 
DataFormatDefinition {
         super("parquetAvro");
     }
 
+    protected ParquetAvroDataFormat(ParquetAvroDataFormat source) {
+        super(source);
+        this.compressionCodecName = source.compressionCodecName;
+        this.unmarshalTypeName = source.unmarshalTypeName;
+        this.unmarshalType = source.unmarshalType;
+        this.lazyLoad = source.lazyLoad;
+    }
+
     public ParquetAvroDataFormat(String unmarshalTypeName) {
         this();
         setUnmarshalTypeName(unmarshalTypeName);
@@ -72,6 +80,11 @@ public class ParquetAvroDataFormat extends 
DataFormatDefinition {
         this.lazyLoad = builder.lazyLoad;
     }
 
+    @Override
+    public ParquetAvroDataFormat copyDefinition() {
+        return new ParquetAvroDataFormat(this);
+    }
+
     /**
      * Compression codec to use when marshalling.
      */
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ProtobufDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ProtobufDataFormat.java
index 4fbdb038be5..f325977e1f2 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ProtobufDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ProtobufDataFormat.java
@@ -122,6 +122,35 @@ public class ProtobufDataFormat extends 
DataFormatDefinition implements ContentT
         setContentTypeFormat(contentTypeFormat);
     }
 
+    protected ProtobufDataFormat(ProtobufDataFormat source) {
+        super(source);
+        this.defaultInstance = source.defaultInstance;
+        this.instanceClass = source.instanceClass;
+        this.objectMapper = source.objectMapper;
+        this.useDefaultObjectMapper = source.useDefaultObjectMapper;
+        this.autoDiscoverObjectMapper = source.autoDiscoverObjectMapper;
+        this.library = source.library;
+        this.unmarshalTypeName = source.unmarshalTypeName;
+        this.unmarshalType = source.unmarshalType;
+        this.jsonViewTypeName = source.jsonViewTypeName;
+        this.jsonView = source.jsonView;
+        this.include = source.include;
+        this.allowJmsType = source.allowJmsType;
+        this.collectionTypeName = source.collectionTypeName;
+        this.collectionType = source.collectionType;
+        this.useList = source.useList;
+        this.moduleClassNames = source.moduleClassNames;
+        this.moduleRefs = source.moduleRefs;
+        this.enableFeatures = source.enableFeatures;
+        this.disableFeatures = source.disableFeatures;
+        this.allowUnmarshallType = source.allowUnmarshallType;
+        this.timezone = source.timezone;
+        this.schemaResolver = source.schemaResolver;
+        this.autoDiscoverSchemaResolver = source.autoDiscoverSchemaResolver;
+        this.contentTypeFormat = source.contentTypeFormat;
+        this.contentTypeHeader = source.contentTypeHeader;
+    }
+
     private ProtobufDataFormat(Builder builder) {
         this();
         this.defaultInstance = builder.defaultInstance;
@@ -151,6 +180,11 @@ public class ProtobufDataFormat extends 
DataFormatDefinition implements ContentT
         this.contentTypeHeader = builder.contentTypeHeader;
     }
 
+    @Override
+    public ProtobufDataFormat copyDefinition() {
+        return new ProtobufDataFormat(this);
+    }
+
     @Override
     public String getDataFormatName() {
         // protobuf data format is special as the name can be from different 
bundles
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/RssDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/RssDataFormat.java
index d77d959e540..5a5975f34f4 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/RssDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/RssDataFormat.java
@@ -37,6 +37,15 @@ public class RssDataFormat extends DataFormatDefinition {
         super("rss");
     }
 
+    protected RssDataFormat(RssDataFormat source) {
+        super(source);
+    }
+
+    @Override
+    public RssDataFormat copyDefinition() {
+        return new RssDataFormat(this);
+    }
+
     /**
      * {@code Builder} is a specific builder for {@link RssDataFormat}.
      */
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SoapDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SoapDataFormat.java
index 2dfd3f54217..b6df4c864e3 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SoapDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SoapDataFormat.java
@@ -56,6 +56,17 @@ public class SoapDataFormat extends DataFormatDefinition {
         super("soap");
     }
 
+    protected SoapDataFormat(SoapDataFormat source) {
+        super(source);
+        this.contextPath = source.contextPath;
+        this.encoding = source.encoding;
+        this.elementNameStrategyRef = source.elementNameStrategyRef;
+        this.elementNameStrategy = source.elementNameStrategy;
+        this.version = source.version;
+        this.namespacePrefixRef = source.namespacePrefixRef;
+        this.schema = source.schema;
+    }
+
     public SoapDataFormat(String contextPath) {
         this();
         setContextPath(contextPath);
@@ -84,6 +95,11 @@ public class SoapDataFormat extends DataFormatDefinition {
         this.schema = builder.schema;
     }
 
+    @Override
+    public SoapDataFormat copyDefinition() {
+        return new SoapDataFormat(this);
+    }
+
     /**
      * Package name where your JAXB classes are located.
      */
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SwiftMtDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SwiftMtDataFormat.java
index ab2f8124da4..83f2d2e80e1 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SwiftMtDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SwiftMtDataFormat.java
@@ -42,6 +42,11 @@ public class SwiftMtDataFormat extends DataFormatDefinition {
         super("swiftMt");
     }
 
+    protected SwiftMtDataFormat(SwiftMtDataFormat source) {
+        super(source);
+        this.writeInJson = source.writeInJson;
+    }
+
     public SwiftMtDataFormat(String writeInJson) {
         this();
         this.writeInJson = writeInJson;
@@ -52,6 +57,11 @@ public class SwiftMtDataFormat extends DataFormatDefinition {
         this.writeInJson = builder.writeInJson;
     }
 
+    @Override
+    public SwiftMtDataFormat copyDefinition() {
+        return new SwiftMtDataFormat(this);
+    }
+
     public String getWriteInJson() {
         return writeInJson;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SwiftMxDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SwiftMxDataFormat.java
index 31e3087ab63..6414ea7a8c4 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SwiftMxDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SwiftMxDataFormat.java
@@ -55,6 +55,16 @@ public class SwiftMxDataFormat extends DataFormatDefinition {
         super("swiftMx");
     }
 
+    protected SwiftMxDataFormat(SwiftMxDataFormat source) {
+        super(source);
+        this.writeConfigRef = source.writeConfigRef;
+        this.writeConfig = source.writeConfig;
+        this.writeInJson = source.writeInJson;
+        this.readMessageId = source.readMessageId;
+        this.readConfigRef = source.readConfigRef;
+        this.readConfig = source.readConfig;
+    }
+
     public SwiftMxDataFormat(boolean writeInJson) {
         this();
         this.writeInJson = Boolean.toString(writeInJson);
@@ -96,6 +106,11 @@ public class SwiftMxDataFormat extends DataFormatDefinition 
{
         this.readConfig = builder.readConfig;
     }
 
+    @Override
+    public SwiftMxDataFormat copyDefinition() {
+        return new SwiftMxDataFormat(this);
+    }
+
     public Object getWriteConfig() {
         return writeConfig;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SyslogDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SyslogDataFormat.java
index 6a93508d3d4..2ce10bd88a6 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SyslogDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/SyslogDataFormat.java
@@ -37,6 +37,15 @@ public class SyslogDataFormat extends DataFormatDefinition {
         super("syslog");
     }
 
+    protected SyslogDataFormat(SyslogDataFormat source) {
+        super(source);
+    }
+
+    @Override
+    public SyslogDataFormat copyDefinition() {
+        return new SyslogDataFormat(this);
+    }
+
     /**
      * {@code Builder} is a specific builder for {@link SyslogDataFormat}.
      */
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/TarFileDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/TarFileDataFormat.java
index 4c222dc6e3c..de1d4bdb104 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/TarFileDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/TarFileDataFormat.java
@@ -51,6 +51,14 @@ public class TarFileDataFormat extends DataFormatDefinition {
         super("tarFile");
     }
 
+    protected TarFileDataFormat(TarFileDataFormat source) {
+        super(source);
+        this.usingIterator = source.usingIterator;
+        this.allowEmptyDirectory = source.allowEmptyDirectory;
+        this.preservePathElements = source.preservePathElements;
+        this.maxDecompressedSize = source.maxDecompressedSize;
+    }
+
     private TarFileDataFormat(Builder builder) {
         this.usingIterator = builder.usingIterator;
         this.allowEmptyDirectory = builder.allowEmptyDirectory;
@@ -58,6 +66,11 @@ public class TarFileDataFormat extends DataFormatDefinition {
         this.maxDecompressedSize = builder.maxDecompressedSize;
     }
 
+    @Override
+    public TarFileDataFormat copyDefinition() {
+        return new TarFileDataFormat(this);
+    }
+
     public String getUsingIterator() {
         return usingIterator;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ThriftDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ThriftDataFormat.java
index 9faa9fa33cd..6a8af5ddbf6 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ThriftDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ThriftDataFormat.java
@@ -52,6 +52,14 @@ public class ThriftDataFormat extends DataFormatDefinition 
implements ContentTyp
         super("thrift");
     }
 
+    protected ThriftDataFormat(ThriftDataFormat builder) {
+        super(builder);
+        this.defaultInstance = builder.defaultInstance;
+        this.instanceClass = builder.instanceClass;
+        this.contentTypeFormat = builder.contentTypeFormat;
+        this.contentTypeHeader = builder.contentTypeHeader;
+    }
+
     public ThriftDataFormat(String instanceClass) {
         this();
         setInstanceClass(instanceClass);
@@ -71,6 +79,11 @@ public class ThriftDataFormat extends DataFormatDefinition 
implements ContentTyp
         this.contentTypeHeader = builder.contentTypeHeader;
     }
 
+    @Override
+    public ThriftDataFormat copyDefinition() {
+        return new ThriftDataFormat(this);
+    }
+
     public String getInstanceClass() {
         return instanceClass;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/TidyMarkupDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/TidyMarkupDataFormat.java
index 0166bc6620f..6afeb78d198 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/TidyMarkupDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/TidyMarkupDataFormat.java
@@ -51,6 +51,18 @@ public class TidyMarkupDataFormat extends 
DataFormatDefinition {
         this.setDataObjectType(Node.class);
     }
 
+    protected TidyMarkupDataFormat(TidyMarkupDataFormat source) {
+        super(source);
+        this.dataObjectType = source.dataObjectType;
+        this.dataObjectTypeName = source.dataObjectTypeName;
+        this.omitXmlDeclaration = source.omitXmlDeclaration;
+    }
+
+    @Override
+    public TidyMarkupDataFormat copyDefinition() {
+        return new TidyMarkupDataFormat(this);
+    }
+
     public TidyMarkupDataFormat(Class<?> dataObjectType) {
         this();
         if (!dataObjectType.isAssignableFrom(String.class) && 
!dataObjectType.isAssignableFrom(Node.class)) {
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityAbstractDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityAbstractDataFormat.java
index 6fc5657164c..ca5cdbb703b 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityAbstractDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityAbstractDataFormat.java
@@ -81,6 +81,24 @@ public abstract class UniVocityAbstractDataFormat extends 
DataFormatDefinition {
         // This constructor is needed by jaxb for schema generation
     }
 
+    protected UniVocityAbstractDataFormat(UniVocityAbstractDataFormat source) {
+        super(source);
+        this.nullValue = source.nullValue;
+        this.skipEmptyLines = source.skipEmptyLines;
+        this.ignoreTrailingWhitespaces = source.ignoreTrailingWhitespaces;
+        this.ignoreLeadingWhitespaces = source.ignoreLeadingWhitespaces;
+        this.headersDisabled = source.headersDisabled;
+        this.headers = source.headers;
+        this.headerExtractionEnabled = source.headerExtractionEnabled;
+        this.numberOfRecordsToRead = source.numberOfRecordsToRead;
+        this.emptyValue = source.emptyValue;
+        this.lineSeparator = source.lineSeparator;
+        this.normalizedLineSeparator = source.normalizedLineSeparator;
+        this.comment = source.comment;
+        this.lazyLoad = source.lazyLoad;
+        this.asMap = source.asMap;
+    }
+
     protected UniVocityAbstractDataFormat(String dataFormatName) {
         super(dataFormatName);
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityCsvDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityCsvDataFormat.java
index d2724bb207d..ad841b829c3 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityCsvDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityCsvDataFormat.java
@@ -49,6 +49,14 @@ public class UniVocityCsvDataFormat extends 
UniVocityAbstractDataFormat {
         super("univocityCsv");
     }
 
+    protected UniVocityCsvDataFormat(UniVocityCsvDataFormat source) {
+        super(source);
+        this.delimiter = source.delimiter;
+        this.quoteAllFields = source.quoteAllFields;
+        this.quote = source.quote;
+        this.quoteEscape = source.quoteEscape;
+    }
+
     private UniVocityCsvDataFormat(Builder builder) {
         super("univocityCsv", builder);
         this.delimiter = builder.delimiter;
@@ -57,6 +65,11 @@ public class UniVocityCsvDataFormat extends 
UniVocityAbstractDataFormat {
         this.quoteEscape = builder.quoteEscape;
     }
 
+    @Override
+    public UniVocityCsvDataFormat copyDefinition() {
+        return new UniVocityCsvDataFormat(this);
+    }
+
     public String getQuoteAllFields() {
         return quoteAllFields;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityFixedDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityFixedDataFormat.java
index 138680e4bf9..feb834a46a1 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityFixedDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityFixedDataFormat.java
@@ -45,6 +45,13 @@ public class UniVocityFixedDataFormat extends 
UniVocityAbstractDataFormat {
         super("univocityFixed");
     }
 
+    protected UniVocityFixedDataFormat(UniVocityFixedDataFormat source) {
+        super(source);
+        this.padding = source.padding;
+        this.skipTrailingCharsUntilNewline = 
source.skipTrailingCharsUntilNewline;
+        this.recordEndsOnNewline = source.recordEndsOnNewline;
+    }
+
     private UniVocityFixedDataFormat(Builder builder) {
         super("univocityFixed", builder);
         this.padding = builder.padding;
@@ -52,6 +59,11 @@ public class UniVocityFixedDataFormat extends 
UniVocityAbstractDataFormat {
         this.recordEndsOnNewline = builder.recordEndsOnNewline;
     }
 
+    @Override
+    public UniVocityFixedDataFormat copyDefinition() {
+        return new UniVocityFixedDataFormat(this);
+    }
+
     public String getSkipTrailingCharsUntilNewline() {
         return skipTrailingCharsUntilNewline;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityHeader.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityHeader.java
index f758a9c9cfa..32240aefa75 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityHeader.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityHeader.java
@@ -22,6 +22,7 @@ import jakarta.xml.bind.annotation.XmlAttribute;
 import jakarta.xml.bind.annotation.XmlRootElement;
 import jakarta.xml.bind.annotation.XmlValue;
 
+import org.apache.camel.model.CopyableDefinition;
 import org.apache.camel.spi.Metadata;
 
 /**
@@ -30,13 +31,26 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "dataformat,transformation,csv", title = "uniVocity Header")
 @XmlRootElement(name = "univocityHeader")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class UniVocityHeader {
+public class UniVocityHeader implements CopyableDefinition<UniVocityHeader> {
 
     @XmlValue
     private String name;
     @XmlAttribute
     private String length;
 
+    public UniVocityHeader() {
+    }
+
+    protected UniVocityHeader(UniVocityHeader source) {
+        this.name = source.name;
+        this.length = source.length;
+    }
+
+    @Override
+    public UniVocityHeader copyDefinition() {
+        return new UniVocityHeader(this);
+    }
+
     public String getName() {
         return name;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityTsvDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityTsvDataFormat.java
index 8c10c0baa05..94285c24ec3 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityTsvDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/UniVocityTsvDataFormat.java
@@ -40,11 +40,21 @@ public class UniVocityTsvDataFormat extends 
UniVocityAbstractDataFormat {
         super("univocityTsv");
     }
 
+    protected UniVocityTsvDataFormat(UniVocityTsvDataFormat source) {
+        super(source);
+        this.escapeChar = source.escapeChar;
+    }
+
     private UniVocityTsvDataFormat(Builder builder) {
         super("univocityTsv", builder);
         this.escapeChar = builder.escapeChar;
     }
 
+    @Override
+    public UniVocityTsvDataFormat copyDefinition() {
+        return new UniVocityTsvDataFormat(this);
+    }
+
     public String getEscapeChar() {
         return escapeChar;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/XMLSecurityDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/XMLSecurityDataFormat.java
index 6c627df216f..5e135d40527 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/XMLSecurityDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/XMLSecurityDataFormat.java
@@ -17,6 +17,7 @@
 package org.apache.camel.model.dataformat;
 
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 import jakarta.xml.bind.annotation.XmlAccessType;
@@ -80,6 +81,24 @@ public class XMLSecurityDataFormat extends 
DataFormatDefinition implements Names
         super("xmlSecurity");
     }
 
+    protected XMLSecurityDataFormat(XMLSecurityDataFormat source) {
+        super(source);
+        this.xmlCipherAlgorithm = source.xmlCipherAlgorithm;
+        this.passPhrase = source.passPhrase;
+        this.passPhraseByte = source.passPhraseByte;
+        this.secureTag = source.secureTag;
+        this.secureTagContents = source.secureTagContents;
+        this.keyCipherAlgorithm = source.keyCipherAlgorithm;
+        this.recipientKeyAlias = source.recipientKeyAlias;
+        this.keyOrTrustStoreParametersRef = 
source.keyOrTrustStoreParametersRef;
+        this.keyPassword = source.keyPassword;
+        this.digestAlgorithm = source.digestAlgorithm;
+        this.mgfAlgorithm = source.mgfAlgorithm;
+        this.addKeyValueForEncryptedKey = source.addKeyValueForEncryptedKey;
+        this.keyOrTrustStoreParameters = source.keyOrTrustStoreParameters;
+        this.namespaces = source.namespaces != null ? new 
LinkedHashMap<>(source.namespaces) : null;
+    }
+
     private XMLSecurityDataFormat(Builder builder) {
         this();
         this.xmlCipherAlgorithm = builder.xmlCipherAlgorithm;
@@ -98,6 +117,11 @@ public class XMLSecurityDataFormat extends 
DataFormatDefinition implements Names
         this.namespaces = builder.namespaces;
     }
 
+    @Override
+    public XMLSecurityDataFormat copyDefinition() {
+        return new XMLSecurityDataFormat(this);
+    }
+
     public String getXmlCipherAlgorithm() {
         return xmlCipherAlgorithm;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/YAMLDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/YAMLDataFormat.java
index fa038e465dd..83b7cd954b0 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/YAMLDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/YAMLDataFormat.java
@@ -81,6 +81,24 @@ public class YAMLDataFormat extends DataFormatDefinition {
         this(YAMLLibrary.SnakeYAML);
     }
 
+    protected YAMLDataFormat(YAMLDataFormat source) {
+        super(source);
+        this.classLoader = source.classLoader;
+        this.unmarshalType = source.unmarshalType;
+        this.library = source.library;
+        this.unmarshalTypeName = source.unmarshalTypeName;
+        this.constructor = source.constructor;
+        this.representer = source.representer;
+        this.dumperOptions = source.dumperOptions;
+        this.resolver = source.resolver;
+        this.useApplicationContextClassLoader = 
source.useApplicationContextClassLoader;
+        this.prettyFlow = source.prettyFlow;
+        this.allowAnyType = source.allowAnyType;
+        this.typeFilters = source.typeFilters;
+        this.maxAliasesForCollections = source.maxAliasesForCollections;
+        this.allowRecursiveKeys = source.allowRecursiveKeys;
+    }
+
     public YAMLDataFormat(YAMLLibrary library) {
         super(library.getDataFormatName());
         this.library = library;
@@ -110,6 +128,11 @@ public class YAMLDataFormat extends DataFormatDefinition {
         this.allowRecursiveKeys = builder.allowRecursiveKeys;
     }
 
+    @Override
+    public YAMLDataFormat copyDefinition() {
+        return new YAMLDataFormat(this);
+    }
+
     @Override
     public String getDataFormatName() {
         // yaml data format is special as the name can be from different 
bundles
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/YAMLTypeFilterDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/YAMLTypeFilterDefinition.java
index ee61b427283..9792066ca5a 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/YAMLTypeFilterDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/YAMLTypeFilterDefinition.java
@@ -21,12 +21,13 @@ import jakarta.xml.bind.annotation.XmlAccessorType;
 import jakarta.xml.bind.annotation.XmlAttribute;
 import jakarta.xml.bind.annotation.XmlRootElement;
 
+import org.apache.camel.model.CopyableDefinition;
 import org.apache.camel.spi.Metadata;
 
 @Metadata(label = "dataformat,transformation,yaml", title = "YAML Type Filter")
 @XmlRootElement(name = "typeFilter")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class YAMLTypeFilterDefinition {
+public class YAMLTypeFilterDefinition implements 
CopyableDefinition<YAMLTypeFilterDefinition> {
 
     @XmlAttribute
     private String value;
@@ -34,6 +35,19 @@ public class YAMLTypeFilterDefinition {
     @Metadata(javaType = 
"org.apache.camel.model.dataformat.YAMLTypeFilterType")
     private String type;
 
+    public YAMLTypeFilterDefinition() {
+    }
+
+    protected YAMLTypeFilterDefinition(YAMLTypeFilterDefinition source) {
+        this.value = source.value;
+        this.type = source.type;
+    }
+
+    @Override
+    public YAMLTypeFilterDefinition copyDefinition() {
+        return new YAMLTypeFilterDefinition(this);
+    }
+
     public String getValue() {
         return value;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ZipDeflaterDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ZipDeflaterDataFormat.java
index 1a1141fd9b6..99588e1a4a1 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ZipDeflaterDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ZipDeflaterDataFormat.java
@@ -42,11 +42,21 @@ public class ZipDeflaterDataFormat extends 
DataFormatDefinition {
         super("zipDeflater");
     }
 
+    protected ZipDeflaterDataFormat(ZipDeflaterDataFormat source) {
+        super(source);
+        this.compressionLevel = source.compressionLevel;
+    }
+
     private ZipDeflaterDataFormat(Builder builder) {
         this();
         this.compressionLevel = builder.compressionLevel;
     }
 
+    @Override
+    public ZipDeflaterDataFormat copyDefinition() {
+        return new ZipDeflaterDataFormat(this);
+    }
+
     public String getCompressionLevel() {
         return compressionLevel;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ZipFileDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ZipFileDataFormat.java
index 3137fcaf1cc..87a7c94c5f7 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ZipFileDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ZipFileDataFormat.java
@@ -51,6 +51,14 @@ public class ZipFileDataFormat extends DataFormatDefinition {
         super("zipFile");
     }
 
+    protected ZipFileDataFormat(ZipFileDataFormat source) {
+        super(source);
+        this.usingIterator = source.usingIterator;
+        this.allowEmptyDirectory = source.allowEmptyDirectory;
+        this.preservePathElements = source.preservePathElements;
+        this.maxDecompressedSize = source.maxDecompressedSize;
+    }
+
     private ZipFileDataFormat(Builder builder) {
         this();
         this.usingIterator = builder.usingIterator;
@@ -59,6 +67,11 @@ public class ZipFileDataFormat extends DataFormatDefinition {
         this.maxDecompressedSize = builder.maxDecompressedSize;
     }
 
+    @Override
+    public ZipFileDataFormat copyDefinition() {
+        return new ZipFileDataFormat(this);
+    }
+
     public String getUsingIterator() {
         return usingIterator;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java
index 715c7a973f1..834158bb6ef 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java
@@ -16,7 +16,6 @@
  */
 package org.apache.camel.model.language;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -27,6 +26,7 @@ import jakarta.xml.bind.annotation.XmlAccessorType;
 import jakarta.xml.bind.annotation.XmlElement;
 import jakarta.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.model.ProcessorDefinitionHelper;
 import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.NamespaceAware;
@@ -50,7 +50,7 @@ public abstract class NamespaceAwareExpression extends 
SingleInputTypedExpressio
 
     protected NamespaceAwareExpression(NamespaceAwareExpression source) {
         super(source);
-        this.namespace = copyNamespace(source);
+        this.namespace = 
ProcessorDefinitionHelper.deepCopyDefinitions(source.namespace);
         this.namespaces = source.namespaces != null ? new 
LinkedHashMap<>(source.namespaces) : null;
     }
 
@@ -102,17 +102,6 @@ public abstract class NamespaceAwareExpression extends 
SingleInputTypedExpressio
         return namespaces;
     }
 
-    private static List<PropertyDefinition> 
copyNamespace(NamespaceAwareExpression source) {
-        if (source.namespace != null) {
-            var answer = new ArrayList<PropertyDefinition>();
-            for (var def : source.namespace) {
-                answer.add(def.copyDefinition());
-            }
-            return answer;
-        }
-        return null;
-    }
-
     /**
      * {@code NamespaceAwareBuilder} is the base namespace aware expression 
builder.
      */
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/CustomLoadBalancerDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/CustomLoadBalancerDefinition.java
index e47b3157eaa..5cf8dbfb134 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/CustomLoadBalancerDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/CustomLoadBalancerDefinition.java
@@ -53,6 +53,7 @@ public class CustomLoadBalancerDefinition extends 
LoadBalancerDefinition {
         this.ref = ref;
     }
 
+    @Override
     public CustomLoadBalancerDefinition copyDefinition() {
         return new CustomLoadBalancerDefinition(this);
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/FailoverLoadBalancerDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/FailoverLoadBalancerDefinition.java
index 09c98bc2a73..9c70e700f57 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/FailoverLoadBalancerDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/FailoverLoadBalancerDefinition.java
@@ -62,6 +62,7 @@ public class FailoverLoadBalancerDefinition extends 
LoadBalancerDefinition {
         this.maximumFailoverAttempts = source.maximumFailoverAttempts;
     }
 
+    @Override
     public FailoverLoadBalancerDefinition copyDefinition() {
         return new FailoverLoadBalancerDefinition(this);
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/RandomLoadBalancerDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/RandomLoadBalancerDefinition.java
index 26005c07785..cb71ee5fdc2 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/RandomLoadBalancerDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/RandomLoadBalancerDefinition.java
@@ -38,6 +38,7 @@ public class RandomLoadBalancerDefinition extends 
LoadBalancerDefinition {
         super(source);
     }
 
+    @Override
     public RandomLoadBalancerDefinition copyDefinition() {
         return new RandomLoadBalancerDefinition(this);
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/RoundRobinLoadBalancerDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/RoundRobinLoadBalancerDefinition.java
index f5bef1e0d0f..2fa4ec8cbf2 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/RoundRobinLoadBalancerDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/RoundRobinLoadBalancerDefinition.java
@@ -39,6 +39,7 @@ public class RoundRobinLoadBalancerDefinition extends 
LoadBalancerDefinition {
         super(source);
     }
 
+    @Override
     public RoundRobinLoadBalancerDefinition copyDefinition() {
         return new RoundRobinLoadBalancerDefinition(this);
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/StickyLoadBalancerDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/StickyLoadBalancerDefinition.java
index 39d07d4a93f..c4bb99e847e 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/StickyLoadBalancerDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/StickyLoadBalancerDefinition.java
@@ -48,6 +48,7 @@ public class StickyLoadBalancerDefinition extends 
LoadBalancerDefinition {
                 = source.correlationExpression != null ? 
source.correlationExpression.copyDefinition() : null;
     }
 
+    @Override
     public StickyLoadBalancerDefinition copyDefinition() {
         return new StickyLoadBalancerDefinition(this);
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/TopicLoadBalancerDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/TopicLoadBalancerDefinition.java
index f786818c7a3..197830b9db2 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/TopicLoadBalancerDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/TopicLoadBalancerDefinition.java
@@ -38,6 +38,7 @@ public class TopicLoadBalancerDefinition extends 
LoadBalancerDefinition {
         super(source);
     }
 
+    @Override
     public TopicLoadBalancerDefinition copyDefinition() {
         return new TopicLoadBalancerDefinition(this);
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/WeightedLoadBalancerDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/WeightedLoadBalancerDefinition.java
index 3610484d51d..b710f832156 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/WeightedLoadBalancerDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/loadbalancer/WeightedLoadBalancerDefinition.java
@@ -51,6 +51,7 @@ public class WeightedLoadBalancerDefinition extends 
LoadBalancerDefinition {
         this.roundRobin = source.roundRobin;
     }
 
+    @Override
     public WeightedLoadBalancerDefinition copyDefinition() {
         return new WeightedLoadBalancerDefinition(this);
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/CustomTransformerDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/CustomTransformerDefinition.java
index ddd52b37d76..04fca5ecd7b 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/CustomTransformerDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/CustomTransformerDefinition.java
@@ -38,6 +38,20 @@ public class CustomTransformerDefinition extends 
TransformerDefinition {
     @XmlAttribute
     private String className;
 
+    public CustomTransformerDefinition() {
+    }
+
+    protected CustomTransformerDefinition(CustomTransformerDefinition source) {
+        super(source);
+        this.ref = source.ref;
+        this.className = source.className;
+    }
+
+    @Override
+    public CustomTransformerDefinition copyDefinition() {
+        return new CustomTransformerDefinition(this);
+    }
+
     public String getRef() {
         return ref;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/DataFormatTransformerDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/DataFormatTransformerDefinition.java
index cdca86bca14..a9656a330c6 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/DataFormatTransformerDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/DataFormatTransformerDefinition.java
@@ -120,6 +120,19 @@ public class DataFormatTransformerDefinition extends 
TransformerDefinition {
             @XmlElement(name = "zipFile", type = ZipFileDataFormat.class) })
     private DataFormatDefinition dataFormatType;
 
+    public DataFormatTransformerDefinition() {
+    }
+
+    protected DataFormatTransformerDefinition(DataFormatTransformerDefinition 
source) {
+        super(source);
+        this.dataFormatType = source.dataFormatType != null ? 
source.dataFormatType.copyDefinition() : null;
+    }
+
+    @Override
+    public DataFormatTransformerDefinition copyDefinition() {
+        return new DataFormatTransformerDefinition(this);
+    }
+
     public DataFormatDefinition getDataFormatType() {
         return dataFormatType;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/EndpointTransformerDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/EndpointTransformerDefinition.java
index 905aceab917..7501cbc3f2e 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/EndpointTransformerDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/EndpointTransformerDefinition.java
@@ -40,6 +40,20 @@ public class EndpointTransformerDefinition extends 
TransformerDefinition {
     @XmlAttribute
     private String uri;
 
+    public EndpointTransformerDefinition() {
+    }
+
+    protected EndpointTransformerDefinition(EndpointTransformerDefinition 
source) {
+        super(source);
+        this.ref = source.ref;
+        this.uri = source.uri;
+    }
+
+    @Override
+    public EndpointTransformerDefinition copyDefinition() {
+        return new EndpointTransformerDefinition(this);
+    }
+
     public String getRef() {
         return ref;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/LoadTransformerDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/LoadTransformerDefinition.java
index 68a2630d392..3b93b4f0d76 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/LoadTransformerDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/LoadTransformerDefinition.java
@@ -34,11 +34,24 @@ public class LoadTransformerDefinition extends 
TransformerDefinition {
 
     @XmlAttribute
     private String packageScan;
-
     @XmlAttribute
     @Metadata(javaType = "java.lang.Boolean", defaultValue = "false")
     private String defaults;
 
+    public LoadTransformerDefinition() {
+    }
+
+    protected LoadTransformerDefinition(LoadTransformerDefinition source) {
+        super(source);
+        this.packageScan = source.packageScan;
+        this.defaults = source.defaults;
+    }
+
+    @Override
+    public LoadTransformerDefinition copyDefinition() {
+        return new LoadTransformerDefinition(this);
+    }
+
     public String getDefaults() {
         return defaults;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/TransformerDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/TransformerDefinition.java
index 8006181630a..d49cf958169 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/TransformerDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/TransformerDefinition.java
@@ -21,6 +21,7 @@ import jakarta.xml.bind.annotation.XmlAccessorType;
 import jakarta.xml.bind.annotation.XmlAttribute;
 import jakarta.xml.bind.annotation.XmlType;
 
+import org.apache.camel.model.CopyableDefinition;
 import org.apache.camel.model.InputTypeDefinition;
 import org.apache.camel.model.OutputTypeDefinition;
 import org.apache.camel.spi.DataType;
@@ -45,7 +46,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "transformation")
 @XmlType(name = "transformer")
 @XmlAccessorType(XmlAccessType.FIELD)
-public abstract class TransformerDefinition {
+public abstract class TransformerDefinition implements 
CopyableDefinition<TransformerDefinition> {
 
     @XmlAttribute
     private String scheme;
@@ -56,6 +57,16 @@ public abstract class TransformerDefinition {
     @XmlAttribute
     private String toType;
 
+    public TransformerDefinition() {
+    }
+
+    protected TransformerDefinition(TransformerDefinition source) {
+        this.scheme = source.scheme;
+        this.name = source.name;
+        this.fromType = source.fromType;
+        this.toType = source.toType;
+    }
+
     public String getScheme() {
         return scheme;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/TransformersDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/TransformersDefinition.java
index 907fc405db5..50ef874d2bf 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/TransformersDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/transformer/TransformersDefinition.java
@@ -24,6 +24,8 @@ import jakarta.xml.bind.annotation.XmlElement;
 import jakarta.xml.bind.annotation.XmlElements;
 import jakarta.xml.bind.annotation.XmlRootElement;
 
+import org.apache.camel.model.CopyableDefinition;
+import org.apache.camel.model.ProcessorDefinitionHelper;
 import org.apache.camel.spi.Metadata;
 
 /**
@@ -32,7 +34,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "transformation", title = "Transformations")
 @XmlRootElement(name = "transformers")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class TransformersDefinition {
+public class TransformersDefinition implements 
CopyableDefinition<TransformersDefinition> {
 
     @XmlElements({
             @XmlElement(name = "dataFormatTransformer", type = 
DataFormatTransformerDefinition.class),
@@ -41,6 +43,18 @@ public class TransformersDefinition {
             @XmlElement(name = "customTransformer", type = 
CustomTransformerDefinition.class) })
     private List<TransformerDefinition> transformers;
 
+    public TransformersDefinition() {
+    }
+
+    protected TransformersDefinition(TransformersDefinition source) {
+        this.transformers = 
ProcessorDefinitionHelper.deepCopyDefinitions(source.transformers);
+    }
+
+    @Override
+    public TransformersDefinition copyDefinition() {
+        return new TransformersDefinition(this);
+    }
+
     /**
      * The configured transformers
      */
@@ -51,5 +65,4 @@ public class TransformersDefinition {
     public List<TransformerDefinition> getTransformers() {
         return transformers;
     }
-
 }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/validator/CustomValidatorDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/validator/CustomValidatorDefinition.java
index bd2b6736f64..5bccfc5d307 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/validator/CustomValidatorDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/validator/CustomValidatorDefinition.java
@@ -42,6 +42,20 @@ public class CustomValidatorDefinition extends 
ValidatorDefinition {
         return ref;
     }
 
+    public CustomValidatorDefinition() {
+    }
+
+    protected CustomValidatorDefinition(CustomValidatorDefinition source) {
+        super(source);
+        this.ref = source.ref;
+        this.className = source.className;
+    }
+
+    @Override
+    public CustomValidatorDefinition copyDefinition() {
+        return null;
+    }
+
     /**
      * Set a bean reference of the {@link Validator}
      */
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/validator/EndpointValidatorDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/validator/EndpointValidatorDefinition.java
index 458b54d828a..c8eab4cd60b 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/validator/EndpointValidatorDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/validator/EndpointValidatorDefinition.java
@@ -42,6 +42,20 @@ public class EndpointValidatorDefinition extends 
ValidatorDefinition {
     @XmlAttribute
     private String uri;
 
+    public EndpointValidatorDefinition() {
+    }
+
+    public EndpointValidatorDefinition(EndpointValidatorDefinition source) {
+        super(source);
+        this.ref = source.ref;
+        this.uri = source.ref;
+    }
+
+    @Override
+    public EndpointValidatorDefinition copyDefinition() {
+        return new EndpointValidatorDefinition(this);
+    }
+
     public String getRef() {
         return ref;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/validator/PredicateValidatorDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/validator/PredicateValidatorDefinition.java
index 5fc20ce06bb..d191827f0bc 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/validator/PredicateValidatorDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/validator/PredicateValidatorDefinition.java
@@ -41,6 +41,19 @@ public class PredicateValidatorDefinition extends 
ValidatorDefinition {
     @XmlElementRef
     private ExpressionDefinition expression;
 
+    public PredicateValidatorDefinition() {
+    }
+
+    protected PredicateValidatorDefinition(PredicateValidatorDefinition 
source) {
+        super(source);
+        this.expression = source.expression != null ? 
source.expression.copyDefinition() : null;
+    }
+
+    @Override
+    public ValidatorDefinition copyDefinition() {
+        return new PredicateValidatorDefinition(this);
+    }
+
     public ExpressionDefinition getExpression() {
         return expression;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/validator/ValidatorDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/validator/ValidatorDefinition.java
index 8e81a61bc77..f16b3b920dd 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/validator/ValidatorDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/validator/ValidatorDefinition.java
@@ -21,6 +21,7 @@ import jakarta.xml.bind.annotation.XmlAccessorType;
 import jakarta.xml.bind.annotation.XmlAttribute;
 import jakarta.xml.bind.annotation.XmlType;
 
+import org.apache.camel.model.CopyableDefinition;
 import org.apache.camel.model.InputTypeDefinition;
 import org.apache.camel.model.OutputTypeDefinition;
 import org.apache.camel.spi.DataType;
@@ -40,7 +41,7 @@ import org.apache.camel.spi.Validator;
 @Metadata(label = "validation")
 @XmlType(name = "validator")
 @XmlAccessorType(XmlAccessType.FIELD)
-public abstract class ValidatorDefinition {
+public abstract class ValidatorDefinition implements 
CopyableDefinition<ValidatorDefinition> {
 
     @XmlAttribute
     private String type;
@@ -49,6 +50,13 @@ public abstract class ValidatorDefinition {
         return type;
     }
 
+    public ValidatorDefinition() {
+    }
+
+    protected ValidatorDefinition(ValidatorDefinition source) {
+        this.type = source.type;
+    }
+
     /**
      * Set the data type name. If you specify 'xml:XYZ', the validator will be 
picked up if message type is 'xml:XYZ'.
      * If you specify just 'xml', the validator matches with all of 'xml' 
message type like 'xml:ABC' or 'xml:DEF'.
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/validator/ValidatorsDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/validator/ValidatorsDefinition.java
index be66537eb0a..1831b119333 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/validator/ValidatorsDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/validator/ValidatorsDefinition.java
@@ -24,6 +24,7 @@ import jakarta.xml.bind.annotation.XmlElement;
 import jakarta.xml.bind.annotation.XmlElements;
 import jakarta.xml.bind.annotation.XmlRootElement;
 
+import org.apache.camel.model.ProcessorDefinitionHelper;
 import org.apache.camel.spi.Metadata;
 
 /**
@@ -40,6 +41,13 @@ public class ValidatorsDefinition {
             @XmlElement(name = "customValidator", type = 
CustomValidatorDefinition.class) })
     private List<ValidatorDefinition> validators;
 
+    public ValidatorsDefinition() {
+    }
+
+    protected ValidatorsDefinition(ValidatorsDefinition source) {
+        this.validators = 
ProcessorDefinitionHelper.deepCopyDefinitions(source.validators);
+    }
+
     /**
      * The configured transformers
      */
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/model/RouteTemplateDefinitionTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/model/RouteTemplateDefinitionTest.java
index 0b8d0130f89..20beee2cd94 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/model/RouteTemplateDefinitionTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/model/RouteTemplateDefinitionTest.java
@@ -62,8 +62,7 @@ class RouteTemplateDefinitionTest {
     }
 
     private static final class CopyableDefinitionProcessDefinition
-            extends ProcessorDefinition<CopyableDefinitionProcessDefinition>
-            implements CopyableDefinition {
+            extends ProcessorDefinition<CopyableDefinitionProcessDefinition> {
 
         public CopyableDefinitionProcessDefinition() {
             setId(randomUUID().toString());

Reply via email to