You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2022/10/26 10:16:29 UTC

[camel] branch CAMEL-17505/data-format-dsl updated (37019a301bf -> e2e8b2536de)

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

nfilotto pushed a change to branch CAMEL-17505/data-format-dsl
in repository https://gitbox.apache.org/repos/asf/camel.git


 discard 37019a301bf CAMEL-17505: camel-core - Propose a DSL for data formats
     new e2e8b2536de CAMEL-17505: camel-core - Propose a DSL for data formats

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

 * -- * -- B -- O -- O -- O   (37019a301bf)
            \
             N -- N -- N   refs/heads/CAMEL-17505/data-format-dsl (e2e8b2536de)

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

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

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


Summary of changes:
 .../camel/model/dataformat/CryptoDataFormat.java       | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)


[camel] 01/01: CAMEL-17505: camel-core - Propose a DSL for data formats

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

nfilotto pushed a commit to branch CAMEL-17505/data-format-dsl
in repository https://gitbox.apache.org/repos/asf/camel.git

commit e2e8b2536deabf1aaf0a09b8bebe2ee0c60cbca3
Author: Nicolas Filotto <nf...@talend.com>
AuthorDate: Wed Oct 26 11:49:56 2022 +0200

    CAMEL-17505: camel-core - Propose a DSL for data formats
---
 .../camel/catalog/dataformats/univocityCsv.json    |   2 +-
 .../camel/catalog/dataformats/univocityFixed.json  |   2 +-
 .../camel/catalog/dataformats/univocityTsv.json    |   2 +-
 .../apache/camel/catalog/models/univocityCsv.json  |   2 +-
 .../camel/catalog/models/univocityFixed.json       |   2 +-
 .../apache/camel/catalog/models/univocityTsv.json  |   2 +-
 .../apache/camel/catalog/schemas/camel-spring.xsd  |   2 +-
 .../camel/dataformat/univocity/univocityCsv.json   |   2 +-
 .../camel/dataformat/univocity/univocityFixed.json |   2 +-
 .../camel/dataformat/univocity/univocityTsv.json   |   2 +-
 .../camel/model/dataformat/univocityCsv.json       |   2 +-
 .../camel/model/dataformat/univocityFixed.json     |   2 +-
 .../camel/model/dataformat/univocityTsv.json       |   2 +-
 .../DataFormatBuilder.java}                        |  21 +-
 .../camel/builder/DataFormatBuilderFactory.java    | 349 +++++++++++++++++++++
 .../org/apache/camel/builder/RouteBuilder.java     |  21 ++
 .../camel/model/dataformat/ASN1DataFormat.java     |  50 +++
 .../camel/model/dataformat/Any23DataFormat.java    |  75 +++++
 .../camel/model/dataformat/AvroDataFormat.java     | 274 ++++++++++++++++
 .../camel/model/dataformat/BarcodeDataFormat.java  |  58 ++++
 .../camel/model/dataformat/Base64DataFormat.java   |  54 ++++
 .../camel/model/dataformat/BindyDataFormat.java    |  85 +++++
 .../camel/model/dataformat/CBORDataFormat.java     | 155 +++++++++
 .../camel/model/dataformat/CryptoDataFormat.java   | 113 +++++++
 .../camel/model/dataformat/CsvDataFormat.java      | 314 ++++++++++++++++++
 .../camel/model/dataformat/CustomDataFormat.java   |  29 ++
 .../camel/model/dataformat/FhirDataformat.java     | 279 ++++++++++++++++
 .../camel/model/dataformat/FhirJsonDataFormat.java |  16 +
 .../camel/model/dataformat/FhirXmlDataFormat.java  |  16 +
 .../camel/model/dataformat/FlatpackDataFormat.java | 103 ++++++
 .../camel/model/dataformat/GrokDataFormat.java     |  61 ++++
 .../model/dataformat/GzipDeflaterDataFormat.java   |  12 +
 .../camel/model/dataformat/HL7DataFormat.java      |  39 +++
 .../camel/model/dataformat/IcalDataFormat.java     |  28 ++
 .../model/dataformat/JacksonXMLDataFormat.java     | 229 ++++++++++++++
 .../camel/model/dataformat/JaxbDataFormat.java     | 224 +++++++++++++
 .../camel/model/dataformat/JsonApiDataFormat.java  |  38 +++
 .../camel/model/dataformat/JsonDataFormat.java     | 328 ++++++++++++++++++-
 .../camel/model/dataformat/LZFDataFormat.java      |  29 ++
 .../model/dataformat/MimeMultipartDataFormat.java  |  82 +++++
 .../camel/model/dataformat/PGPDataFormat.java      | 184 +++++++++++
 .../camel/model/dataformat/ProtobufDataFormat.java | 284 +++++++++++++++++
 .../camel/model/dataformat/RssDataFormat.java      |  12 +
 .../camel/model/dataformat/SoapDataFormat.java     | 124 ++++++++
 .../camel/model/dataformat/SwiftMtDataFormat.java  |  40 +++
 .../camel/model/dataformat/SwiftMxDataFormat.java  |  91 ++++++
 .../camel/model/dataformat/SyslogDataFormat.java   |  13 +
 .../camel/model/dataformat/TarFileDataFormat.java  |  64 ++++
 .../camel/model/dataformat/ThriftDataFormat.java   |  53 ++++
 .../model/dataformat/TidyMarkupDataFormat.java     |  51 +++
 .../dataformat/UniVocityAbstractDataFormat.java    | 182 ++++++++++-
 .../model/dataformat/UniVocityCsvDataFormat.java   |  57 ++++
 .../model/dataformat/UniVocityFixedDataFormat.java |  53 ++++
 .../model/dataformat/UniVocityTsvDataFormat.java   |  27 ++
 .../model/dataformat/XMLSecurityDataFormat.java    | 202 ++++++++++++
 .../camel/model/dataformat/XStreamDataFormat.java  | 175 ++++++++++-
 .../camel/model/dataformat/YAMLDataFormat.java     | 162 ++++++++++
 .../model/dataformat/ZipDeflaterDataFormat.java    |  30 ++
 .../camel/model/dataformat/ZipFileDataFormat.java  |  66 ++++
 .../camel/impl/DataFormatFluentSyntaxTest.java}    |  32 +-
 60 files changed, 4962 insertions(+), 48 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/univocityCsv.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/univocityCsv.json
index 9c05e32d54d..cafa1b6ef8a 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/univocityCsv.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/univocityCsv.json
@@ -22,7 +22,7 @@
     "quoteEscape": { "kind": "attribute", "displayName": "Quote Escape", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "\"", "description": "The quote escape symbol" },
     "nullValue": { "kind": "attribute", "displayName": "Null Value", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The string representation of a null value. The default value is null" },
     "skipEmptyLines": { "kind": "attribute", "displayName": "Skip Empty Lines", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the empty lines must be ignored. The default value is true" },
-    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must ignored. The default value is true" },
+    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must be ignored. The default value is true" },
     "ignoreLeadingWhitespaces": { "kind": "attribute", "displayName": "Ignore Leading Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the leading white spaces must be ignored. The default value is true" },
     "headersDisabled": { "kind": "attribute", "displayName": "Headers Disabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false" },
     "headerExtractionEnabled": { "kind": "attribute", "displayName": "Header Extraction Enabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the header must be read in the first line of the test document The default value is false" },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/univocityFixed.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/univocityFixed.json
index 0f060ba3059..55b60d5afaf 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/univocityFixed.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/univocityFixed.json
@@ -21,7 +21,7 @@
     "recordEndsOnNewline": { "kind": "attribute", "displayName": "Record Ends On Newline", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the record ends on new line. The default value is false" },
     "nullValue": { "kind": "attribute", "displayName": "Null Value", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The string representation of a null value. The default value is null" },
     "skipEmptyLines": { "kind": "attribute", "displayName": "Skip Empty Lines", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the empty lines must be ignored. The default value is true" },
-    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must ignored. The default value is true" },
+    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must be ignored. The default value is true" },
     "ignoreLeadingWhitespaces": { "kind": "attribute", "displayName": "Ignore Leading Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the leading white spaces must be ignored. The default value is true" },
     "headersDisabled": { "kind": "attribute", "displayName": "Headers Disabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false" },
     "headerExtractionEnabled": { "kind": "attribute", "displayName": "Header Extraction Enabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the header must be read in the first line of the test document The default value is false" },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/univocityTsv.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/univocityTsv.json
index 39c90738dfb..07bb5bba9b1 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/univocityTsv.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/univocityTsv.json
@@ -19,7 +19,7 @@
     "escapeChar": { "kind": "attribute", "displayName": "Escape Char", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "\\", "description": "The escape character." },
     "nullValue": { "kind": "attribute", "displayName": "Null Value", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The string representation of a null value. The default value is null" },
     "skipEmptyLines": { "kind": "attribute", "displayName": "Skip Empty Lines", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the empty lines must be ignored. The default value is true" },
-    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must ignored. The default value is true" },
+    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must be ignored. The default value is true" },
     "ignoreLeadingWhitespaces": { "kind": "attribute", "displayName": "Ignore Leading Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the leading white spaces must be ignored. The default value is true" },
     "headersDisabled": { "kind": "attribute", "displayName": "Headers Disabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false" },
     "headerExtractionEnabled": { "kind": "attribute", "displayName": "Header Extraction Enabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the header must be read in the first line of the test document The default value is false" },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/univocityCsv.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/univocityCsv.json
index e0047cac1bc..09ff79144ad 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/univocityCsv.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/univocityCsv.json
@@ -19,7 +19,7 @@
     "quoteEscape": { "kind": "attribute", "displayName": "Quote Escape", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "\"", "description": "The quote escape symbol" },
     "nullValue": { "kind": "attribute", "displayName": "Null Value", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The string representation of a null value. The default value is null" },
     "skipEmptyLines": { "kind": "attribute", "displayName": "Skip Empty Lines", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the empty lines must be ignored. The default value is true" },
-    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must ignored. The default value is true" },
+    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must be ignored. The default value is true" },
     "ignoreLeadingWhitespaces": { "kind": "attribute", "displayName": "Ignore Leading Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the leading white spaces must be ignored. The default value is true" },
     "headersDisabled": { "kind": "attribute", "displayName": "Headers Disabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false" },
     "headerExtractionEnabled": { "kind": "attribute", "displayName": "Header Extraction Enabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the header must be read in the first line of the test document The default value is false" },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/univocityFixed.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/univocityFixed.json
index 9fe2a46e659..9d1e322b9ae 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/univocityFixed.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/univocityFixed.json
@@ -18,7 +18,7 @@
     "recordEndsOnNewline": { "kind": "attribute", "displayName": "Record Ends On Newline", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the record ends on new line. The default value is false" },
     "nullValue": { "kind": "attribute", "displayName": "Null Value", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The string representation of a null value. The default value is null" },
     "skipEmptyLines": { "kind": "attribute", "displayName": "Skip Empty Lines", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the empty lines must be ignored. The default value is true" },
-    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must ignored. The default value is true" },
+    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must be ignored. The default value is true" },
     "ignoreLeadingWhitespaces": { "kind": "attribute", "displayName": "Ignore Leading Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the leading white spaces must be ignored. The default value is true" },
     "headersDisabled": { "kind": "attribute", "displayName": "Headers Disabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false" },
     "headerExtractionEnabled": { "kind": "attribute", "displayName": "Header Extraction Enabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the header must be read in the first line of the test document The default value is false" },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/univocityTsv.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/univocityTsv.json
index 8819ce92c9b..0a1e87d208b 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/univocityTsv.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/univocityTsv.json
@@ -16,7 +16,7 @@
     "escapeChar": { "kind": "attribute", "displayName": "Escape Char", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "\\", "description": "The escape character." },
     "nullValue": { "kind": "attribute", "displayName": "Null Value", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The string representation of a null value. The default value is null" },
     "skipEmptyLines": { "kind": "attribute", "displayName": "Skip Empty Lines", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the empty lines must be ignored. The default value is true" },
-    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must ignored. The default value is true" },
+    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must be ignored. The default value is true" },
     "ignoreLeadingWhitespaces": { "kind": "attribute", "displayName": "Ignore Leading Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the leading white spaces must be ignored. The default value is true" },
     "headersDisabled": { "kind": "attribute", "displayName": "Headers Disabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false" },
     "headerExtractionEnabled": { "kind": "attribute", "displayName": "Header Extraction Enabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the header must be read in the first line of the test document The default value is false" },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
index 25db02dca09..9a333cd58c8 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
@@ -12321,7 +12321,7 @@ Default value: true
           <xs:annotation>
             <xs:documentation xml:lang="en">
               <![CDATA[
-Whether or not the trailing white spaces must ignored. The default value is
+Whether or not the trailing white spaces must be ignored. The default value is
 true. Default value: true
             ]]>
             </xs:documentation>
diff --git a/components/camel-univocity-parsers/src/generated/resources/org/apache/camel/dataformat/univocity/univocityCsv.json b/components/camel-univocity-parsers/src/generated/resources/org/apache/camel/dataformat/univocity/univocityCsv.json
index 9c05e32d54d..cafa1b6ef8a 100644
--- a/components/camel-univocity-parsers/src/generated/resources/org/apache/camel/dataformat/univocity/univocityCsv.json
+++ b/components/camel-univocity-parsers/src/generated/resources/org/apache/camel/dataformat/univocity/univocityCsv.json
@@ -22,7 +22,7 @@
     "quoteEscape": { "kind": "attribute", "displayName": "Quote Escape", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "\"", "description": "The quote escape symbol" },
     "nullValue": { "kind": "attribute", "displayName": "Null Value", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The string representation of a null value. The default value is null" },
     "skipEmptyLines": { "kind": "attribute", "displayName": "Skip Empty Lines", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the empty lines must be ignored. The default value is true" },
-    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must ignored. The default value is true" },
+    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must be ignored. The default value is true" },
     "ignoreLeadingWhitespaces": { "kind": "attribute", "displayName": "Ignore Leading Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the leading white spaces must be ignored. The default value is true" },
     "headersDisabled": { "kind": "attribute", "displayName": "Headers Disabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false" },
     "headerExtractionEnabled": { "kind": "attribute", "displayName": "Header Extraction Enabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the header must be read in the first line of the test document The default value is false" },
diff --git a/components/camel-univocity-parsers/src/generated/resources/org/apache/camel/dataformat/univocity/univocityFixed.json b/components/camel-univocity-parsers/src/generated/resources/org/apache/camel/dataformat/univocity/univocityFixed.json
index 0f060ba3059..55b60d5afaf 100644
--- a/components/camel-univocity-parsers/src/generated/resources/org/apache/camel/dataformat/univocity/univocityFixed.json
+++ b/components/camel-univocity-parsers/src/generated/resources/org/apache/camel/dataformat/univocity/univocityFixed.json
@@ -21,7 +21,7 @@
     "recordEndsOnNewline": { "kind": "attribute", "displayName": "Record Ends On Newline", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the record ends on new line. The default value is false" },
     "nullValue": { "kind": "attribute", "displayName": "Null Value", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The string representation of a null value. The default value is null" },
     "skipEmptyLines": { "kind": "attribute", "displayName": "Skip Empty Lines", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the empty lines must be ignored. The default value is true" },
-    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must ignored. The default value is true" },
+    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must be ignored. The default value is true" },
     "ignoreLeadingWhitespaces": { "kind": "attribute", "displayName": "Ignore Leading Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the leading white spaces must be ignored. The default value is true" },
     "headersDisabled": { "kind": "attribute", "displayName": "Headers Disabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false" },
     "headerExtractionEnabled": { "kind": "attribute", "displayName": "Header Extraction Enabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the header must be read in the first line of the test document The default value is false" },
diff --git a/components/camel-univocity-parsers/src/generated/resources/org/apache/camel/dataformat/univocity/univocityTsv.json b/components/camel-univocity-parsers/src/generated/resources/org/apache/camel/dataformat/univocity/univocityTsv.json
index 39c90738dfb..07bb5bba9b1 100644
--- a/components/camel-univocity-parsers/src/generated/resources/org/apache/camel/dataformat/univocity/univocityTsv.json
+++ b/components/camel-univocity-parsers/src/generated/resources/org/apache/camel/dataformat/univocity/univocityTsv.json
@@ -19,7 +19,7 @@
     "escapeChar": { "kind": "attribute", "displayName": "Escape Char", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "\\", "description": "The escape character." },
     "nullValue": { "kind": "attribute", "displayName": "Null Value", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The string representation of a null value. The default value is null" },
     "skipEmptyLines": { "kind": "attribute", "displayName": "Skip Empty Lines", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the empty lines must be ignored. The default value is true" },
-    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must ignored. The default value is true" },
+    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must be ignored. The default value is true" },
     "ignoreLeadingWhitespaces": { "kind": "attribute", "displayName": "Ignore Leading Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the leading white spaces must be ignored. The default value is true" },
     "headersDisabled": { "kind": "attribute", "displayName": "Headers Disabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false" },
     "headerExtractionEnabled": { "kind": "attribute", "displayName": "Header Extraction Enabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the header must be read in the first line of the test document The default value is false" },
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/univocityCsv.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/univocityCsv.json
index e0047cac1bc..09ff79144ad 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/univocityCsv.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/univocityCsv.json
@@ -19,7 +19,7 @@
     "quoteEscape": { "kind": "attribute", "displayName": "Quote Escape", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "\"", "description": "The quote escape symbol" },
     "nullValue": { "kind": "attribute", "displayName": "Null Value", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The string representation of a null value. The default value is null" },
     "skipEmptyLines": { "kind": "attribute", "displayName": "Skip Empty Lines", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the empty lines must be ignored. The default value is true" },
-    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must ignored. The default value is true" },
+    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must be ignored. The default value is true" },
     "ignoreLeadingWhitespaces": { "kind": "attribute", "displayName": "Ignore Leading Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the leading white spaces must be ignored. The default value is true" },
     "headersDisabled": { "kind": "attribute", "displayName": "Headers Disabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false" },
     "headerExtractionEnabled": { "kind": "attribute", "displayName": "Header Extraction Enabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the header must be read in the first line of the test document The default value is false" },
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/univocityFixed.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/univocityFixed.json
index 9fe2a46e659..9d1e322b9ae 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/univocityFixed.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/univocityFixed.json
@@ -18,7 +18,7 @@
     "recordEndsOnNewline": { "kind": "attribute", "displayName": "Record Ends On Newline", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the record ends on new line. The default value is false" },
     "nullValue": { "kind": "attribute", "displayName": "Null Value", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The string representation of a null value. The default value is null" },
     "skipEmptyLines": { "kind": "attribute", "displayName": "Skip Empty Lines", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the empty lines must be ignored. The default value is true" },
-    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must ignored. The default value is true" },
+    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must be ignored. The default value is true" },
     "ignoreLeadingWhitespaces": { "kind": "attribute", "displayName": "Ignore Leading Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the leading white spaces must be ignored. The default value is true" },
     "headersDisabled": { "kind": "attribute", "displayName": "Headers Disabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false" },
     "headerExtractionEnabled": { "kind": "attribute", "displayName": "Header Extraction Enabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the header must be read in the first line of the test document The default value is false" },
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/univocityTsv.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/univocityTsv.json
index 8819ce92c9b..0a1e87d208b 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/univocityTsv.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/univocityTsv.json
@@ -16,7 +16,7 @@
     "escapeChar": { "kind": "attribute", "displayName": "Escape Char", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "\\", "description": "The escape character." },
     "nullValue": { "kind": "attribute", "displayName": "Null Value", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The string representation of a null value. The default value is null" },
     "skipEmptyLines": { "kind": "attribute", "displayName": "Skip Empty Lines", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the empty lines must be ignored. The default value is true" },
-    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must ignored. The default value is true" },
+    "ignoreTrailingWhitespaces": { "kind": "attribute", "displayName": "Ignore Trailing Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the trailing white spaces must be ignored. The default value is true" },
     "ignoreLeadingWhitespaces": { "kind": "attribute", "displayName": "Ignore Leading Whitespaces", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the leading white spaces must be ignored. The default value is true" },
     "headersDisabled": { "kind": "attribute", "displayName": "Headers Disabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false" },
     "headerExtractionEnabled": { "kind": "attribute", "displayName": "Header Extraction Enabled", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether or not the header must be read in the first line of the test document The default value is false" },
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/builder/DataFormatBuilder.java
similarity index 63%
copy from core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/GzipDeflaterDataFormat.java
copy to core/camel-core-model/src/main/java/org/apache/camel/builder/DataFormatBuilder.java
index 0aab050323a..ca0a6493f22 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/builder/DataFormatBuilder.java
@@ -14,22 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.model.dataformat;
-
-import javax.xml.bind.annotation.XmlRootElement;
+package org.apache.camel.builder;
 
 import org.apache.camel.model.DataFormatDefinition;
-import org.apache.camel.spi.Metadata;
 
 /**
- * Compress and decompress messages using <code>java.util.zip.GZIP*Stream</code>.
+ * {@code DataFormatBuilder} defines the contract of a data format builder.
  */
-@Metadata(firstVersion = "2.0.0", label = "dataformat,transformation", title = "GZip Deflater")
-@XmlRootElement(name = "gzipDeflater")
-public class GzipDeflaterDataFormat extends DataFormatDefinition {
-
-    public GzipDeflaterDataFormat() {
-        super("gzipDeflater");
-    }
+public interface DataFormatBuilder<T extends DataFormatDefinition> {
 
+    /**
+     * Ends the build of the data format.
+     *
+     * @return the data format fully built.
+     */
+    T end();
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/DataFormatBuilderFactory.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/DataFormatBuilderFactory.java
new file mode 100644
index 00000000000..3c65086f271
--- /dev/null
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/DataFormatBuilderFactory.java
@@ -0,0 +1,349 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder;
+
+import org.apache.camel.model.dataformat.ASN1DataFormat;
+import org.apache.camel.model.dataformat.Any23DataFormat;
+import org.apache.camel.model.dataformat.AvroDataFormat;
+import org.apache.camel.model.dataformat.BarcodeDataFormat;
+import org.apache.camel.model.dataformat.Base64DataFormat;
+import org.apache.camel.model.dataformat.BindyDataFormat;
+import org.apache.camel.model.dataformat.CBORDataFormat;
+import org.apache.camel.model.dataformat.CryptoDataFormat;
+import org.apache.camel.model.dataformat.CsvDataFormat;
+import org.apache.camel.model.dataformat.CustomDataFormat;
+import org.apache.camel.model.dataformat.FhirJsonDataFormat;
+import org.apache.camel.model.dataformat.FhirXmlDataFormat;
+import org.apache.camel.model.dataformat.FlatpackDataFormat;
+import org.apache.camel.model.dataformat.GrokDataFormat;
+import org.apache.camel.model.dataformat.GzipDeflaterDataFormat;
+import org.apache.camel.model.dataformat.HL7DataFormat;
+import org.apache.camel.model.dataformat.IcalDataFormat;
+import org.apache.camel.model.dataformat.JacksonXMLDataFormat;
+import org.apache.camel.model.dataformat.JaxbDataFormat;
+import org.apache.camel.model.dataformat.JsonApiDataFormat;
+import org.apache.camel.model.dataformat.JsonDataFormat;
+import org.apache.camel.model.dataformat.LZFDataFormat;
+import org.apache.camel.model.dataformat.MimeMultipartDataFormat;
+import org.apache.camel.model.dataformat.PGPDataFormat;
+import org.apache.camel.model.dataformat.ProtobufDataFormat;
+import org.apache.camel.model.dataformat.RssDataFormat;
+import org.apache.camel.model.dataformat.SoapDataFormat;
+import org.apache.camel.model.dataformat.SwiftMtDataFormat;
+import org.apache.camel.model.dataformat.SwiftMxDataFormat;
+import org.apache.camel.model.dataformat.SyslogDataFormat;
+import org.apache.camel.model.dataformat.TarFileDataFormat;
+import org.apache.camel.model.dataformat.ThriftDataFormat;
+import org.apache.camel.model.dataformat.TidyMarkupDataFormat;
+import org.apache.camel.model.dataformat.UniVocityCsvDataFormat;
+import org.apache.camel.model.dataformat.UniVocityFixedDataFormat;
+import org.apache.camel.model.dataformat.UniVocityTsvDataFormat;
+import org.apache.camel.model.dataformat.XMLSecurityDataFormat;
+import org.apache.camel.model.dataformat.XStreamDataFormat;
+import org.apache.camel.model.dataformat.YAMLDataFormat;
+import org.apache.camel.model.dataformat.ZipDeflaterDataFormat;
+import org.apache.camel.model.dataformat.ZipFileDataFormat;
+
+/**
+ * {@code DataFormatBuilderFactory} is a factory class of builder of all supported data formats.
+ */
+final class DataFormatBuilderFactory {
+
+    /**
+     * Uses the Any23 data format
+     */
+    public Any23DataFormat.Builder any23() {
+        return new Any23DataFormat.Builder();
+    }
+
+    /**
+     * Uses the ASN.1 file data format
+     */
+    public ASN1DataFormat.Builder asn1() {
+        return new ASN1DataFormat.Builder();
+    }
+
+    /**
+     * Uses the Avro data format
+     */
+    public AvroDataFormat.Builder avro() {
+        return new AvroDataFormat.Builder();
+    }
+
+    /**
+     * Uses the Barcode data format
+     */
+    public BarcodeDataFormat.Builder barcode() {
+        return new BarcodeDataFormat.Builder();
+    }
+
+    /**
+     * Uses the base64 data format
+     */
+    public Base64DataFormat.Builder base64() {
+        return new Base64DataFormat.Builder();
+    }
+
+    /**
+     * Uses the Bindy data format
+     */
+    public BindyDataFormat.Builder bindy() {
+        return new BindyDataFormat.Builder();
+    }
+
+    /**
+     * Uses the CBOR data format
+     */
+    public CBORDataFormat.Builder cbor() {
+        return new CBORDataFormat.Builder();
+    }
+
+    /**
+     * Uses the Crypto data format
+     */
+    public CryptoDataFormat.Builder crypto() {
+        return new CryptoDataFormat.Builder();
+    }
+
+    /**
+     * Uses the CSV data format
+     */
+    public CsvDataFormat.Builder csv() {
+        return new CsvDataFormat.Builder();
+    }
+
+    /**
+     * Uses the custom data format
+     */
+    public CustomDataFormat.Builder custom() {
+        return new CustomDataFormat.Builder();
+    }
+
+    /**
+     * Uses the FHIR JSON data format
+     */
+    public FhirJsonDataFormat.Builder fhirJson() {
+        return new FhirJsonDataFormat.Builder();
+    }
+
+    /**
+     * Uses the FHIR XML data format
+     */
+    public FhirXmlDataFormat.Builder fhirXml() {
+        return new FhirXmlDataFormat.Builder();
+    }
+
+    /**
+     * Uses the Flatpack data format
+     */
+    public FlatpackDataFormat.Builder flatpack() {
+        return new FlatpackDataFormat.Builder();
+    }
+
+    /**
+     * Uses the Grok data format
+     */
+    public GrokDataFormat.Builder grok() {
+        return new GrokDataFormat.Builder();
+    }
+
+    /**
+     * Uses the GZIP deflater data format
+     */
+    public GzipDeflaterDataFormat.Builder gzipDeflater() {
+        return new GzipDeflaterDataFormat.Builder();
+    }
+
+    /**
+     * Uses the HL7 data format
+     */
+    public HL7DataFormat.Builder hl7() {
+        return new HL7DataFormat.Builder();
+    }
+
+    /**
+     * Uses the iCal data format
+     */
+    public IcalDataFormat.Builder ical() {
+        return new IcalDataFormat.Builder();
+    }
+
+    /**
+     * Uses the Jackson XML data format
+     */
+    public JacksonXMLDataFormat.Builder jacksonXml() {
+        return new JacksonXMLDataFormat.Builder();
+    }
+
+    /**
+     * Uses the JAXB data format
+     */
+    public JaxbDataFormat.Builder jaxb() {
+        return new JaxbDataFormat.Builder();
+    }
+
+    /**
+     * Uses the JSON API data format
+     */
+    public JsonApiDataFormat.Builder jsonApi() {
+        return new JsonApiDataFormat.Builder();
+    }
+
+    /**
+     * Uses the JSON data format using the Jackson library
+     */
+    public JsonDataFormat.Builder json() {
+        return new JsonDataFormat.Builder();
+    }
+
+    /**
+     * Uses the LZF deflater data format
+     */
+    public LZFDataFormat.Builder lzf() {
+        return new LZFDataFormat.Builder();
+    }
+
+    /**
+     * Uses the MIME Multipart data format
+     */
+    public MimeMultipartDataFormat.Builder mimeMultipart() {
+        return new MimeMultipartDataFormat.Builder();
+    }
+
+    /**
+     * Uses the PGP data format
+     */
+    public PGPDataFormat.Builder pgp() {
+        return new PGPDataFormat.Builder();
+    }
+
+    /**
+     * Uses the protobuf data format
+     */
+    public ProtobufDataFormat.Builder protobuf() {
+        return new ProtobufDataFormat.Builder();
+    }
+
+    /**
+     * Uses the RSS data format
+     */
+    public RssDataFormat.Builder rss() {
+        return new RssDataFormat.Builder();
+    }
+
+    /**
+     * Uses the Soap v1.1 data format
+     */
+    public SoapDataFormat.Builder soap() {
+        return new SoapDataFormat.Builder();
+    }
+
+    /**
+     * Uses the SWIFT MX data format
+     */
+    public SwiftMxDataFormat.Builder swiftMx() {
+        return new SwiftMxDataFormat.Builder();
+    }
+
+    /**
+     * Uses the SWIFT MT data format
+     */
+    public SwiftMtDataFormat.Builder swiftMt() {
+        return new SwiftMtDataFormat.Builder();
+    }
+
+    /**
+     * Uses the Syslog data format
+     */
+    public SyslogDataFormat.Builder syslog() {
+        return new SyslogDataFormat.Builder();
+    }
+
+    /**
+     * Uses the Tar file data format
+     */
+    public TarFileDataFormat.Builder tarFile() {
+        return new TarFileDataFormat.Builder();
+    }
+
+    /**
+     * Uses the Thrift data format
+     */
+    public ThriftDataFormat.Builder thrift() {
+        return new ThriftDataFormat.Builder();
+    }
+
+    /**
+     * Return TidyMarkup in the default format as {@link org.w3c.dom.Node}
+     */
+    public TidyMarkupDataFormat.Builder tidyMarkup() {
+        return new TidyMarkupDataFormat.Builder();
+    }
+
+    /**
+     * Uses the UniVosity CSV data format
+     */
+    public UniVocityCsvDataFormat.Builder univocityCsv() {
+        return new UniVocityCsvDataFormat.Builder();
+    }
+
+    /**
+     * Uses the UniVosity Fixed data format
+     */
+    public UniVocityFixedDataFormat.Builder univocityFixed() {
+        return new UniVocityFixedDataFormat.Builder();
+    }
+
+    public UniVocityTsvDataFormat.Builder univocityTsv() {
+        return new UniVocityTsvDataFormat.Builder();
+    }
+
+    /**
+     * Uses the XML Security data format
+     */
+    public XMLSecurityDataFormat.Builder xmlSecurity() {
+        return new XMLSecurityDataFormat.Builder();
+    }
+
+    /**
+     * Uses the XStream data format.
+     */
+    public XStreamDataFormat.Builder xstream() {
+        return new XStreamDataFormat.Builder();
+    }
+
+    /**
+     * Uses the YAML data format
+     */
+    public YAMLDataFormat.Builder yaml() {
+        return new YAMLDataFormat.Builder();
+    }
+
+    /**
+     * Uses the ZIP deflater data format
+     */
+    public ZipDeflaterDataFormat.Builder zipDeflater() {
+        return new ZipDeflaterDataFormat.Builder();
+    }
+
+    /**
+     * Uses the ZIP file data format
+     */
+    public ZipFileDataFormat.Builder zipFile() {
+        return new ZipFileDataFormat.Builder();
+    }
+}
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
index 359bad8d584..7883924c46b 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
@@ -220,6 +220,27 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
      */
     public void bindToRegistry(String id, Class<?> type, Object bean) {
         getContext().getRegistry().bind(id, type, bean);
+
+    }
+
+    /**
+     * A utility method allowing to build any data format using a fluent syntax, as shown in the next example:
+     *
+     * <pre>
+     * {@code
+     * from("jms:queue:orders)
+     *     .marshal(
+     *         dataFormat()
+     *             .swiftMt()
+     *                 .writeInJson(true)
+     *             .end()
+     *     )
+     *     .to("file:data"");
+     *
+     * @return an entry point to the builder of all supported data formats.
+     */
+    public DataFormatBuilderFactory dataFormat() {
+        return new DataFormatBuilderFactory();
     }
 
     /**
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 265cc952bab..cc4db1f2839 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
@@ -22,6 +22,7 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -58,10 +59,18 @@ public class ASN1DataFormat extends DataFormatDefinition {
     }
 
     public ASN1DataFormat(Class<?> unmarshalType) {
+        this();
         setUsingIterator(Boolean.toString(true));
         this.unmarshalType = unmarshalType;
     }
 
+    private ASN1DataFormat(Builder builder) {
+        this();
+        this.usingIterator = builder.usingIterator;
+        this.unmarshalTypeName = builder.unmarshalTypeName;
+        this.unmarshalType = builder.unmarshalType;
+    }
+
     public String getUsingIterator() {
         return usingIterator;
     }
@@ -95,4 +104,45 @@ public class ASN1DataFormat extends DataFormatDefinition {
     public void setUnmarshalType(Class<?> unmarshalType) {
         this.unmarshalType = unmarshalType;
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link ASN1DataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<ASN1DataFormat> {
+
+        private Class<?> unmarshalType;
+        private String unmarshalTypeName;
+        private String usingIterator;
+
+        /**
+         * If the asn1 file has more than one entry, the setting this option to true, allows working with the splitter
+         * EIP, to split the data using an iterator in a streaming mode.
+         */
+        public Builder usingIterator(String usingIterator) {
+            this.usingIterator = usingIterator;
+            return this;
+        }
+
+        /**
+         * Class to use when unmarshalling.
+         */
+        public Builder unmarshalTypeName(String unmarshalTypeName) {
+            this.unmarshalTypeName = unmarshalTypeName;
+            return this;
+        }
+
+        /**
+         * Class to use when unmarshalling.
+         */
+        public Builder unmarshalType(Class<?> unmarshalType) {
+            this.unmarshalType = unmarshalType;
+            return this;
+        }
+
+        @Override
+        public ASN1DataFormat end() {
+            return new ASN1DataFormat(this);
+        }
+    }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/Any23DataFormat.java b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/Any23DataFormat.java
index aadb5c46784..9c7914f060a 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/Any23DataFormat.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/Any23DataFormat.java
@@ -28,6 +28,7 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.spi.Metadata;
@@ -81,6 +82,14 @@ public class Any23DataFormat extends DataFormatDefinition {
         this.extractors = extractors;
     }
 
+    private Any23DataFormat(Builder builder) {
+        this(builder.baseUri);
+        this.outputFormat = builder.outputFormat;
+        this.configuration = builder.configuration;
+        this.configurations = builder.configurations;
+        this.extractors = builder.extractors;
+    }
+
     public String getOutputFormat() {
         return outputFormat;
     }
@@ -154,4 +163,70 @@ public class Any23DataFormat extends DataFormatDefinition {
         this.baseUri = baseUri;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link Any23DataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<Any23DataFormat> {
+
+        private String outputFormat = "RDF4JMODEL";
+        private String baseUri;
+        private List<PropertyDefinition> configuration;
+        private Map<String, String> configurations;
+        private List<String> extractors;
+
+        /**
+         * What RDF syntax to unmarshal as, can be: NTRIPLES, TURTLE, NQUADS, RDFXML, JSONLD, RDFJSON, RDF4JMODEL. It is
+         * by default: RDF4JMODEL.
+         */
+        public Builder outputFormat(String outputFormat) {
+            this.outputFormat = outputFormat;
+            return this;
+        }
+
+        /**
+         * Configurations for Apache Any23 as key-value pairs in order to customize the extraction process. The list of
+         * supported parameters can be found <a href=
+         * "https://github.com/apache/any23/blob/master/api/src/main/resources/default-configuration.properties">here</a>.
+         * If not provided, a default configuration is used.
+         */
+        public Builder configuration(List<PropertyDefinition> configuration) {
+            this.configuration = configuration;
+            return this;
+        }
+
+        /**
+         * Configurations for Apache Any23 as key-value pairs in order to customize the extraction process. The list of
+         * supported parameters can be found <a href=
+         * "https://github.com/apache/any23/blob/master/api/src/main/resources/default-configuration.properties">here</a>.
+         * If not provided, a default configuration is used.
+         */
+        public Builder configuration(Map<String, String> configurations) {
+            this.configurations = configurations;
+            return this;
+        }
+
+        /**
+         * The URI to use as base for building RDF entities if only relative paths are provided.
+         */
+        public Builder baseUri(String baseUri) {
+            this.baseUri = baseUri;
+            return this;
+        }
+
+        /**
+         * List of Any23 extractors to be used in the unmarshal operation. A list of the available extractors can be
+         * found here <a href="https://any23.apache.org/getting-started.html">here</a>. If not provided, all the
+         * available extractors are used.
+         */
+        public Builder extractors(List<String> extractors) {
+            this.extractors = extractors;
+            return this;
+        }
+
+        @Override
+        public Any23DataFormat end() {
+            return new Any23DataFormat(this);
+        }
+    }
 }
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 ea505f5c244..4ffe779bf1b 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
@@ -22,6 +22,7 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -113,6 +114,34 @@ public class AvroDataFormat extends DataFormatDefinition {
         setInstanceClassName(instanceClassName);
     }
 
+    private AvroDataFormat(Builder builder) {
+        this();
+        this.unmarshalType = builder.unmarshalType;
+        this.jsonView = builder.jsonView;
+        this.collectionType = builder.collectionType;
+        this.schema = builder.schema;
+        this.instanceClassName = builder.instanceClassName;
+        this.library = builder.library;
+        this.objectMapper = builder.objectMapper;
+        this.useDefaultObjectMapper = builder.useDefaultObjectMapper;
+        this.unmarshalTypeName = builder.unmarshalTypeName;
+        this.jsonViewTypeName = builder.jsonViewTypeName;
+        this.include = builder.include;
+        this.allowJmsType = builder.allowJmsType;
+        this.collectionTypeName = builder.collectionTypeName;
+        this.useList = builder.useList;
+        this.moduleClassNames = builder.moduleClassNames;
+        this.moduleRefs = builder.moduleRefs;
+        this.enableFeatures = builder.enableFeatures;
+        this.disableFeatures = builder.disableFeatures;
+        this.allowUnmarshallType = builder.allowUnmarshallType;
+        this.timezone = builder.timezone;
+        this.autoDiscoverObjectMapper = builder.autoDiscoverObjectMapper;
+        this.contentTypeHeader = builder.contentTypeHeader;
+        this.schemaResolver = builder.schemaResolver;
+        this.autoDiscoverSchemaResolver = builder.autoDiscoverSchemaResolver;
+    }
+
     public String getInstanceClassName() {
         return instanceClassName;
     }
@@ -491,4 +520,249 @@ public class AvroDataFormat extends DataFormatDefinition {
         this.autoDiscoverObjectMapper = autoDiscoverObjectMapper;
         return this;
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link AvroDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<AvroDataFormat> {
+
+        private Class<?> unmarshalType;
+        private Class<?> jsonView;
+        private Class<?> collectionType;
+        private Object schema;
+        private String instanceClassName;
+        private AvroLibrary library = AvroLibrary.ApacheAvro;
+        private String objectMapper;
+        private String useDefaultObjectMapper = "true";
+        private String unmarshalTypeName;
+        private String jsonViewTypeName;
+        private String include;
+        private String allowJmsType;
+        private String collectionTypeName;
+        private String useList;
+        private String moduleClassNames;
+        private String moduleRefs;
+        private String enableFeatures;
+        private String disableFeatures;
+        private String allowUnmarshallType;
+        private String timezone;
+        private String autoDiscoverObjectMapper;
+        private String contentTypeHeader = "true";
+        private String schemaResolver;
+        private String autoDiscoverSchemaResolver = "true";
+
+        /**
+         * Class name to use for marshal and unmarshalling
+         */
+        public Builder instanceClassName(String instanceClassName) {
+            this.instanceClassName = instanceClassName;
+            return this;
+        }
+
+        public Builder schema(Object schema) {
+            this.schema = schema;
+            return this;
+        }
+
+        /**
+         * Which Avro library to use.
+         */
+        public Builder library(AvroLibrary library) {
+            this.library = library;
+            return this;
+        }
+
+        public Builder contentTypeHeader(String contentTypeHeader) {
+            this.contentTypeHeader = contentTypeHeader;
+            return this;
+        }
+
+        /**
+         * Lookup and use the existing ObjectMapper with the given id when using Jackson.
+         */
+        public Builder objectMapper(String objectMapper) {
+            this.objectMapper = objectMapper;
+            return this;
+        }
+
+        /**
+         * Whether to lookup and use default Jackson ObjectMapper from the registry.
+         */
+        public Builder useDefaultObjectMapper(String useDefaultObjectMapper) {
+            this.useDefaultObjectMapper = useDefaultObjectMapper;
+            return this;
+        }
+
+        /**
+         * Class name of the java type to use when unmarshalling
+         */
+        public Builder unmarshalTypeName(String unmarshalTypeName) {
+            this.unmarshalTypeName = unmarshalTypeName;
+            return this;
+        }
+
+        /**
+         * Class of the java type to use when unmarshalling
+         */
+        public Builder unmarshalType(Class<?> unmarshalType) {
+            this.unmarshalType = unmarshalType;
+            return this;
+        }
+
+        /**
+         * When marshalling a POJO to JSON you might want to exclude certain fields from the JSON output. With Jackson
+         * you can use JSON views to accomplish this. This option is to refer to the class which has @JsonView
+         * annotations
+         */
+        public Builder jsonViewTypeName(String jsonViewTypeName) {
+            this.jsonViewTypeName = jsonViewTypeName;
+            return this;
+        }
+
+        /**
+         * When marshalling a POJO to JSON you might want to exclude certain fields from the JSON output. With Jackson
+         * you can use JSON views to accomplish this. This option is to refer to the class which has @JsonView
+         * annotations
+         */
+        public Builder jsonView(Class<?> jsonView) {
+            this.jsonView = jsonView;
+            return this;
+        }
+
+        /**
+         * If you want to marshal a pojo to JSON, and the pojo has some fields with null values. And you want to skip
+         * these null values, you can set this option to <tt>NON_NULL</tt>
+         */
+        public Builder include(String include) {
+            this.include = include;
+            return this;
+        }
+
+        /**
+         * Used for JMS users to allow the JMSType header from the JMS spec to specify a FQN classname to use to
+         * unmarshal to.
+         */
+        public Builder allowJmsType(String allowJmsType) {
+            this.allowJmsType = allowJmsType;
+            return this;
+        }
+
+        /**
+         * Refers to a custom collection type to lookup in the registry to use. This option should rarely be used, but
+         * allows to use different collection types than java.util.Collection based as default.
+         */
+        public Builder collectionTypeName(String collectionTypeName) {
+            this.collectionTypeName = collectionTypeName;
+            return this;
+        }
+
+        public Builder collectionType(Class<?> collectionType) {
+            this.collectionType = collectionType;
+            return this;
+        }
+
+        /**
+         * To unmarshal to a List of Map or a List of Pojo.
+         */
+        public Builder useList(String useList) {
+            this.useList = useList;
+            return this;
+        }
+
+        /**
+         * To use custom Jackson modules com.fasterxml.jackson.databind.Module specified as a String with FQN class
+         * names. Multiple classes can be separated by comma.
+         */
+        public Builder moduleClassNames(String moduleClassNames) {
+            this.moduleClassNames = moduleClassNames;
+            return this;
+        }
+
+        /**
+         * To use custom Jackson modules referred from the Camel registry. Multiple modules can be separated by comma.
+         */
+        public Builder moduleRefs(String moduleRefs) {
+            this.moduleRefs = moduleRefs;
+            return this;
+        }
+
+        /**
+         * Set of features to enable on the Jackson <tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
+         * <p/>
+         * The features should be a name that matches a enum from
+         * <tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
+         * <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or
+         * <tt>com.fasterxml.jackson.databind.MapperFeature</tt>
+         * <p/>
+         * Multiple features can be separated by comma
+         */
+        public Builder enableFeatures(String enableFeatures) {
+            this.enableFeatures = enableFeatures;
+            return this;
+        }
+
+        /**
+         * Set of features to disable on the Jackson <tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
+         * <p/>
+         * The features should be a name that matches a enum from
+         * <tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
+         * <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or
+         * <tt>com.fasterxml.jackson.databind.MapperFeature</tt>
+         * <p/>
+         * Multiple features can be separated by comma
+         */
+        public Builder disableFeatures(String disableFeatures) {
+            this.disableFeatures = disableFeatures;
+            return this;
+        }
+
+        /**
+         * If enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header during the
+         * unmarshalling.
+         * <p/>
+         * This should only be enabled when desired to be used.
+         */
+        public Builder allowUnmarshallType(String allowUnmarshallType) {
+            this.allowUnmarshallType = allowUnmarshallType;
+            return this;
+        }
+
+        /**
+         * If set then Jackson will use the Timezone when marshalling/unmarshalling.
+         */
+        public Builder timezone(String timezone) {
+            this.timezone = timezone;
+            return this;
+        }
+
+        /**
+         * If set to true then Jackson will lookup for an objectMapper into the registry
+         */
+        public Builder autoDiscoverObjectMapper(String autoDiscoverObjectMapper) {
+            this.autoDiscoverObjectMapper = autoDiscoverObjectMapper;
+            return this;
+        }
+
+        /**
+         * Optional schema resolver used to lookup schemas for the data in transit.
+         */
+        public Builder schemaResolver(String schemaResolver) {
+            this.schemaResolver = schemaResolver;
+            return this;
+        }
+
+        /**
+         * When not disabled, the SchemaResolver will be looked up into the registry
+         */
+        public Builder autoDiscoverSchemaResolver(String autoDiscoverSchemaResolver) {
+            this.autoDiscoverSchemaResolver = autoDiscoverSchemaResolver;
+            return this;
+        }
+
+        @Override
+        public AvroDataFormat end() {
+            return new AvroDataFormat(this);
+        }
+    }
 }
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 4fc0bad57df..c6365593517 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -47,6 +49,14 @@ public class BarcodeDataFormat extends DataFormatDefinition {
         super("barcode");
     }
 
+    private BarcodeDataFormat(Builder builder) {
+        this();
+        this.barcodeFormat = builder.barcodeFormat;
+        this.imageType = builder.imageType;
+        this.width = builder.width;
+        this.height = builder.height;
+    }
+
     public String getWidth() {
         return width;
     }
@@ -91,4 +101,52 @@ public class BarcodeDataFormat extends DataFormatDefinition {
         this.barcodeFormat = barcodeFormat;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link BarcodeDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<BarcodeDataFormat> {
+
+        private String barcodeFormat;
+        private String imageType;
+        private String width;
+        private String height;
+
+        /**
+         * Width of the barcode
+         */
+        public Builder width(String width) {
+            this.width = width;
+            return this;
+        }
+
+        /**
+         * Height of the barcode
+         */
+        public Builder height(String height) {
+            this.height = height;
+            return this;
+        }
+
+        /**
+         * Image type of the barcode such as png
+         */
+        public Builder imageType(String imageType) {
+            this.imageType = imageType;
+            return this;
+        }
+
+        /**
+         * Barcode format such as QR-Code
+         */
+        public Builder barcodeFormat(String barcodeFormat) {
+            this.barcodeFormat = barcodeFormat;
+            return this;
+        }
+
+        @Override
+        public BarcodeDataFormat end() {
+            return new BarcodeDataFormat(this);
+        }
+    }
 }
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 ca92777ef5e..e34a2ecac92 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -46,6 +48,13 @@ public class Base64DataFormat extends DataFormatDefinition {
         super("base64");
     }
 
+    private Base64DataFormat(Builder builder) {
+        this();
+        this.lineLength = builder.lineLength;
+        this.lineSeparator = builder.lineSeparator;
+        this.urlSafe = builder.urlSafe;
+    }
+
     public String getLineLength() {
         return lineLength;
     }
@@ -83,4 +92,49 @@ public class Base64DataFormat extends DataFormatDefinition {
     public void setUrlSafe(String urlSafe) {
         this.urlSafe = urlSafe;
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link Base64DataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<Base64DataFormat> {
+
+        private String lineLength = "76";
+        private String lineSeparator;
+        private String urlSafe;
+
+        /**
+         * To specific a maximum line length for the encoded data.
+         * <p/>
+         * By default 76 is used.
+         */
+        public Builder lineLength(String lineLength) {
+            this.lineLength = lineLength;
+            return this;
+        }
+
+        /**
+         * The line separators to use.
+         * <p/>
+         * Uses new line characters (CRLF) by default.
+         */
+        public Builder lineSeparator(String lineSeparator) {
+            this.lineSeparator = lineSeparator;
+            return this;
+        }
+
+        /**
+         * Instead of emitting '+' and '/' we emit '-' and '_' respectively. urlSafe is only applied to encode
+         * operations. Decoding seamlessly handles both modes. Is by default false.
+         */
+        public Builder urlSafe(String urlSafe) {
+            this.urlSafe = urlSafe;
+            return this;
+        }
+
+        @Override
+        public Base64DataFormat end() {
+            return new Base64DataFormat(this);
+        }
+    }
 }
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 9080e8581f1..7c4f7d55dcc 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
@@ -24,6 +24,7 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -58,6 +59,16 @@ public class BindyDataFormat extends DataFormatDefinition {
         super("bindy");
     }
 
+    private BindyDataFormat(Builder builder) {
+        this();
+        this.clazz = builder.clazz;
+        this.type = builder.type;
+        this.classType = builder.classType;
+        this.allowEmptyStream = builder.allowEmptyStream;
+        this.unwrapSingleInstance = builder.unwrapSingleInstance;
+        this.locale = builder.locale;
+    }
+
     public String getType() {
         return type;
     }
@@ -209,4 +220,78 @@ public class BindyDataFormat extends DataFormatDefinition {
         return this;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link BindyDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<BindyDataFormat> {
+
+        private Class<?> clazz;
+        private String type;
+        private String classType;
+        private String allowEmptyStream = "false";
+        private String unwrapSingleInstance = "true";
+        private String locale;
+
+        /**
+         * Whether to use Csv, Fixed, or KeyValue.
+         */
+        public Builder type(String type) {
+            this.type = type;
+            return this;
+        }
+
+        public Builder type(BindyType type) {
+            return type(type.name());
+        }
+
+        /**
+         * Name of model class to use.
+         */
+        public Builder classType(String classType) {
+            this.classType = classType;
+            return this;
+        }
+
+        /**
+         * Name of model class to use.
+         */
+        public Builder classType(Class<?> classType) {
+            this.clazz = classType;
+            return this;
+        }
+
+        /**
+         * To configure a default locale to use, such as <tt>us</tt> for united states.
+         * <p/>
+         * To use the JVM platform default locale then use the name <tt>default</tt>
+         */
+        public Builder locale(String locale) {
+            this.locale = locale;
+            return this;
+        }
+
+        /**
+         * When unmarshalling should a single instance be unwrapped and returned instead of wrapped in a
+         * <tt>java.util.List</tt>.
+         */
+        public Builder unwrapSingleInstance(String unwrapSingleInstance) {
+            this.unwrapSingleInstance = unwrapSingleInstance;
+            return this;
+        }
+
+        /**
+         * Whether to allow empty streams in the unmarshal process. If true, no exception will be thrown when a body
+         * without records is provided.
+         */
+        public Builder allowEmptyStream(String allowEmptyStream) {
+            this.allowEmptyStream = allowEmptyStream;
+            return this;
+        }
+
+        @Override
+        public BindyDataFormat end() {
+            return new BindyDataFormat(this);
+        }
+    }
 }
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 f91533d4a3b..1525019da99 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
@@ -22,6 +22,7 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -70,6 +71,22 @@ public class CBORDataFormat extends DataFormatDefinition {
         super("cbor");
     }
 
+    private CBORDataFormat(Builder builder) {
+        this();
+        this.collectionType = builder.collectionType;
+        this.unmarshalType = builder.unmarshalType;
+        this.objectMapper = builder.objectMapper;
+        this.useDefaultObjectMapper = builder.useDefaultObjectMapper;
+        this.unmarshalTypeName = builder.unmarshalTypeName;
+        this.collectionTypeName = builder.collectionTypeName;
+        this.useList = builder.useList;
+        this.allowUnmarshallType = builder.allowUnmarshallType;
+        this.prettyPrint = builder.prettyPrint;
+        this.allowJmsType = builder.allowJmsType;
+        this.enableFeatures = builder.enableFeatures;
+        this.disableFeatures = builder.disableFeatures;
+    }
+
     public String getObjectMapper() {
         return objectMapper;
     }
@@ -220,4 +237,142 @@ public class CBORDataFormat extends DataFormatDefinition {
         this.disableFeatures = disableFeatures;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link CBORDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<CBORDataFormat> {
+
+        private Class<?> collectionType;
+        private Class<?> unmarshalType;
+        private String objectMapper;
+        private String useDefaultObjectMapper = "true";
+        private String unmarshalTypeName;
+        private String collectionTypeName;
+        private String useList = "false";
+        private String allowUnmarshallType = "false";
+        private String prettyPrint = "false";
+        private String allowJmsType = "false";
+        private String enableFeatures;
+        private String disableFeatures;
+
+        /**
+         * Lookup and use the existing CBOR ObjectMapper with the given id when using Jackson.
+         */
+        public Builder objectMapper(String objectMapper) {
+            this.objectMapper = objectMapper;
+            return this;
+        }
+
+        /**
+         * Whether to lookup and use default Jackson CBOR ObjectMapper from the registry.
+         */
+        public Builder useDefaultObjectMapper(String useDefaultObjectMapper) {
+            this.useDefaultObjectMapper = useDefaultObjectMapper;
+            return this;
+        }
+
+        /**
+         * Class name of the java type to use when unmarshalling
+         */
+        public Builder unmarshalTypeName(String unmarshalTypeName) {
+            this.unmarshalTypeName = unmarshalTypeName;
+            return this;
+        }
+
+        /**
+         * To enable pretty printing output nicely formatted.
+         * <p/>
+         * Is by default false.
+         */
+        public Builder prettyPrint(String prettyPrint) {
+            this.prettyPrint = prettyPrint;
+            return this;
+        }
+
+        /**
+         * Used for JMS users to allow the JMSType header from the JMS spec to specify a FQN classname to use to
+         * unmarshal to.
+         */
+        public Builder allowJmsType(String allowJmsType) {
+            this.allowJmsType = allowJmsType;
+            return this;
+        }
+
+        /**
+         * Class of the java type to use when unmarshalling
+         */
+        public Builder unmarshalType(Class<?> unmarshalType) {
+            this.unmarshalType = unmarshalType;
+            return this;
+        }
+
+        /**
+         * Refers to a custom collection type to lookup in the registry to use. This option should rarely be used, but
+         * allows to use different collection types than java.util.Collection based as default.
+         */
+        public Builder collectionTypeName(String collectionTypeName) {
+            this.collectionTypeName = collectionTypeName;
+            return this;
+        }
+
+        public Builder collectionType(Class<?> collectionType) {
+            this.collectionType = collectionType;
+            return this;
+        }
+
+        /**
+         * To unmarshal to a List of Map or a List of Pojo.
+         */
+        public Builder useList(String useList) {
+            this.useList = useList;
+            return this;
+        }
+
+        /**
+         * If enabled then Jackson CBOR is allowed to attempt to use the CamelCBORUnmarshalType header during the
+         * unmarshalling.
+         * <p/>
+         * This should only be enabled when desired to be used.
+         */
+        public Builder allowUnmarshallType(String allowUnmarshallType) {
+            this.allowUnmarshallType = allowUnmarshallType;
+            return this;
+        }
+
+        /**
+         * Set of features to enable on the Jackson <tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
+         * <p/>
+         * The features should be a name that matches a enum from
+         * <tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
+         * <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or
+         * <tt>com.fasterxml.jackson.databind.MapperFeature</tt>
+         * <p/>
+         * Multiple features can be separated by comma
+         */
+        public Builder enableFeatures(String enableFeatures) {
+            this.enableFeatures = enableFeatures;
+            return this;
+        }
+
+        /**
+         * Set of features to disable on the Jackson <tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
+         * <p/>
+         * The features should be a name that matches a enum from
+         * <tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
+         * <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or
+         * <tt>com.fasterxml.jackson.databind.MapperFeature</tt>
+         * <p/>
+         * Multiple features can be separated by comma
+         */
+        public Builder disableFeatures(String disableFeatures) {
+            this.disableFeatures = disableFeatures;
+            return this;
+        }
+
+        @Override
+        public CBORDataFormat end() {
+            return new CBORDataFormat(this);
+        }
+    }
 }
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 4a5423414c1..0cfdf8149a5 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -62,6 +64,19 @@ public class CryptoDataFormat extends DataFormatDefinition {
         super("crypto");
     }
 
+    private CryptoDataFormat(Builder builder) {
+        this();
+        this.algorithm = builder.algorithm;
+        this.keyRef = builder.keyRef;
+        this.cryptoProvider = builder.cryptoProvider;
+        this.initVectorRef = builder.initVectorRef;
+        this.algorithmParameterRef = builder.algorithmParameterRef;
+        this.bufferSize = builder.bufferSize;
+        this.macAlgorithm = builder.macAlgorithm;
+        this.shouldAppendHMAC = builder.shouldAppendHMAC;
+        this.inline = builder.inline;
+    }
+
     public String getAlgorithm() {
         return algorithm;
     }
@@ -164,4 +179,102 @@ public class CryptoDataFormat extends DataFormatDefinition {
     public void setInline(String inline) {
         this.inline = inline;
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link CryptoDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<CryptoDataFormat> {
+
+        private String algorithm;
+        private String keyRef;
+        private String cryptoProvider;
+        private String initVectorRef;
+        private String algorithmParameterRef;
+        private String bufferSize = "4096";
+        private String macAlgorithm = "HmacSHA1";
+        private String shouldAppendHMAC = "true";
+        private String inline = "false";
+
+        /**
+         * The JCE algorithm name indicating the cryptographic algorithm that will be used.
+         */
+        public Builder algorithm(String algorithm) {
+            this.algorithm = algorithm;
+            return this;
+        }
+
+        /**
+         * The name of the JCE Security Provider that should be used.
+         */
+        public Builder cryptoProvider(String cryptoProvider) {
+            this.cryptoProvider = cryptoProvider;
+            return this;
+        }
+
+        /**
+         * Refers to the secret key to lookup from the register to use.
+         */
+        public Builder keyRef(String keyRef) {
+            this.keyRef = keyRef;
+            return this;
+        }
+
+        /**
+         * Refers to a byte array containing the Initialization Vector that will be used to initialize the Cipher.
+         */
+        public Builder initVectorRef(String initVectorRef) {
+            this.initVectorRef = initVectorRef;
+            return this;
+        }
+
+        /**
+         * A JCE AlgorithmParameterSpec used to initialize the Cipher.
+         * <p/>
+         * Will lookup the type using the given name as a {@link java.security.spec.AlgorithmParameterSpec} type.
+         */
+        public Builder algorithmParameterRef(String algorithmParameterRef) {
+            this.algorithmParameterRef = algorithmParameterRef;
+            return this;
+        }
+
+        /**
+         * The size of the buffer used in the signature process.
+         */
+        public Builder bufferSize(String bufferSize) {
+            this.bufferSize = bufferSize;
+            return this;
+        }
+
+        /**
+         * The JCE algorithm name indicating the Message Authentication algorithm.
+         */
+        public Builder macAlgorithm(String macAlgorithm) {
+            this.macAlgorithm = macAlgorithm;
+            return this;
+        }
+
+        /**
+         * Flag indicating that a Message Authentication Code should be calculated and appended to the encrypted data.
+         */
+        public Builder shouldAppendHMAC(String shouldAppendHMAC) {
+            this.shouldAppendHMAC = shouldAppendHMAC;
+            return this;
+        }
+
+        /**
+         * Flag indicating that the configured IV should be inlined into the encrypted data stream.
+         * <p/>
+         * Is by default false.
+         */
+        public Builder inline(String inline) {
+            this.inline = inline;
+            return this;
+        }
+
+        @Override
+        public CryptoDataFormat end() {
+            return new CryptoDataFormat(this);
+        }
+    }
 }
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 a881a58662d..86e3aa92073 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
@@ -23,7 +23,9 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -136,6 +138,39 @@ public class CsvDataFormat extends DataFormatDefinition {
         setLazyLoad(Boolean.toString(lazyLoad));
     }
 
+    private CsvDataFormat(Builder builder) {
+        this();
+        this.formatRef = builder.formatRef;
+        this.formatName = builder.formatName;
+        this.commentMarkerDisabled = builder.commentMarkerDisabled;
+        this.commentMarker = builder.commentMarker;
+        this.delimiter = builder.delimiter;
+        this.escapeDisabled = builder.escapeDisabled;
+        this.escape = builder.escape;
+        this.headerDisabled = builder.headerDisabled;
+        this.header = builder.header;
+        this.allowMissingColumnNames = builder.allowMissingColumnNames;
+        this.ignoreEmptyLines = builder.ignoreEmptyLines;
+        this.ignoreSurroundingSpaces = builder.ignoreSurroundingSpaces;
+        this.nullStringDisabled = builder.nullStringDisabled;
+        this.nullString = builder.nullString;
+        this.quoteDisabled = builder.quoteDisabled;
+        this.quote = builder.quote;
+        this.recordSeparatorDisabled = builder.recordSeparatorDisabled;
+        this.recordSeparator = builder.recordSeparator;
+        this.skipHeaderRecord = builder.skipHeaderRecord;
+        this.quoteMode = builder.quoteMode;
+        this.ignoreHeaderCase = builder.ignoreHeaderCase;
+        this.trim = builder.trim;
+        this.trailingDelimiter = builder.trailingDelimiter;
+        this.marshallerFactoryRef = builder.marshallerFactoryRef;
+        this.lazyLoad = builder.lazyLoad;
+        this.useMaps = builder.useMaps;
+        this.useOrderedMaps = builder.useOrderedMaps;
+        this.recordConverterRef = builder.recordConverterRef;
+        this.captureHeaderRecord = builder.captureHeaderRecord;
+    }
+
     /**
      * Sets the implementation of the CsvMarshallerFactory interface which is able to customize
      * marshalling/unmarshalling behavior by extending CsvMarshaller or creating it from scratch.
@@ -468,4 +503,283 @@ public class CsvDataFormat extends DataFormatDefinition {
     public void setCaptureHeaderRecord(String captureHeaderRecord) {
         this.captureHeaderRecord = captureHeaderRecord;
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link CsvDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<CsvDataFormat> {
+        private String formatRef;
+        private String formatName = "DEFAULT";
+        private String commentMarkerDisabled;
+        private String commentMarker;
+        private String delimiter;
+        private String escapeDisabled;
+        private String escape;
+        private String headerDisabled;
+        private List<String> header;
+        private String allowMissingColumnNames;
+        private String ignoreEmptyLines;
+        private String ignoreSurroundingSpaces;
+        private String nullStringDisabled;
+        private String nullString;
+        private String quoteDisabled;
+        private String quote;
+        private String recordSeparatorDisabled;
+        private String recordSeparator;
+        private String skipHeaderRecord;
+        private String quoteMode;
+        private String ignoreHeaderCase;
+        private String trim;
+        private String trailingDelimiter;
+        private String marshallerFactoryRef;
+        private String lazyLoad;
+        private String useMaps;
+        private String useOrderedMaps;
+        private String recordConverterRef;
+        private String captureHeaderRecord;
+
+        /**
+         * Sets the implementation of the CsvMarshallerFactory interface which is able to customize
+         * marshalling/unmarshalling behavior by extending CsvMarshaller or creating it from scratch.
+         *
+         * @param marshallerFactoryRef the <code>CsvMarshallerFactory</code> reference.
+         */
+        public Builder marshallerFactoryRef(String marshallerFactoryRef) {
+            this.marshallerFactoryRef = marshallerFactoryRef;
+            return this;
+        }
+
+        /**
+         * The reference format to use, it will be updated with the other format options, the default value is
+         * CSVFormat.DEFAULT
+         */
+        public Builder formatRef(String formatRef) {
+            this.formatRef = formatRef;
+            return this;
+        }
+
+        /**
+         * The name of the format to use, the default value is CSVFormat.DEFAULT
+         */
+        public Builder formatName(String formatName) {
+            this.formatName = formatName;
+            return this;
+        }
+
+        /**
+         * Disables the comment marker of the reference format.
+         */
+        public Builder commentMarkerDisabled(String commentMarkerDisabled) {
+            this.commentMarkerDisabled = commentMarkerDisabled;
+            return this;
+        }
+
+        /**
+         * Sets the comment marker of the reference format.
+         */
+        public Builder commentMarker(String commentMarker) {
+            this.commentMarker = commentMarker;
+            return this;
+        }
+
+        /**
+         * Sets the delimiter to use.
+         * <p/>
+         * The default value is , (comma)
+         */
+        public Builder delimiter(String delimiter) {
+            this.delimiter = delimiter;
+            return this;
+        }
+
+        /**
+         * Use for disabling using escape character
+         */
+        public Builder escapeDisabled(String escapeDisabled) {
+            this.escapeDisabled = escapeDisabled;
+            return this;
+        }
+
+        /**
+         * Sets the escape character to use
+         */
+        public Builder escape(String escape) {
+            this.escape = escape;
+            return this;
+        }
+
+        public Builder headerDisabled(String headerDisabled) {
+            this.headerDisabled = headerDisabled;
+            return this;
+        }
+
+        /**
+         * To configure the CSV headers
+         */
+        public Builder header(List<String> header) {
+            this.header = header;
+            return this;
+        }
+
+        /**
+         * Whether to allow missing column names.
+         */
+        public Builder allowMissingColumnNames(String allowMissingColumnNames) {
+            this.allowMissingColumnNames = allowMissingColumnNames;
+            return this;
+        }
+
+        /**
+         * Whether to ignore empty lines.
+         */
+        public Builder ignoreEmptyLines(String ignoreEmptyLines) {
+            this.ignoreEmptyLines = ignoreEmptyLines;
+            return this;
+        }
+
+        /**
+         * Whether to ignore surrounding spaces
+         */
+        public Builder ignoreSurroundingSpaces(String ignoreSurroundingSpaces) {
+            this.ignoreSurroundingSpaces = ignoreSurroundingSpaces;
+            return this;
+        }
+
+        /**
+         * Used to disable null strings
+         */
+        public Builder nullStringDisabled(String nullStringDisabled) {
+            this.nullStringDisabled = nullStringDisabled;
+            return this;
+        }
+
+        /**
+         * Sets the null string
+         */
+        public Builder nullString(String nullString) {
+            this.nullString = nullString;
+            return this;
+        }
+
+        /**
+         * Used to disable quotes
+         */
+        public Builder quoteDisabled(String quoteDisabled) {
+            this.quoteDisabled = quoteDisabled;
+            return this;
+        }
+
+        /**
+         * Sets the quote which by default is "
+         */
+        public Builder quote(String quote) {
+            this.quote = quote;
+            return this;
+        }
+
+        /**
+         * Used for disabling record separator
+         */
+        public Builder recordSeparatorDisabled(String recordSeparatorDisabled) {
+            this.recordSeparatorDisabled = recordSeparatorDisabled;
+            return this;
+        }
+
+        /**
+         * Sets the record separator (aka new line) which by default is new line characters (CRLF)
+         */
+        public Builder recordSeparator(String recordSeparator) {
+            this.recordSeparator = recordSeparator;
+            return this;
+        }
+
+        /**
+         * Whether to skip the header record in the output
+         */
+        public Builder skipHeaderRecord(String skipHeaderRecord) {
+            this.skipHeaderRecord = skipHeaderRecord;
+            return this;
+        }
+
+        /**
+         * Sets the quote mode
+         */
+        public Builder quoteMode(String quoteMode) {
+            this.quoteMode = quoteMode;
+            return this;
+        }
+
+        /**
+         * Whether the unmarshalling should produce an iterator that reads the lines on the fly or if all the lines must
+         * be read at one.
+         */
+        public Builder lazyLoad(String lazyLoad) {
+            this.lazyLoad = lazyLoad;
+            return this;
+        }
+
+        /**
+         * Whether the unmarshalling should produce maps (HashMap)for the lines values instead of lists. It requires to
+         * have header (either defined or collected).
+         */
+        public Builder useMaps(String useMaps) {
+            this.useMaps = useMaps;
+            return this;
+        }
+
+        /**
+         * Whether the unmarshalling should produce ordered maps (LinkedHashMap) for the lines values instead of lists.
+         * It requires to have header (either defined or collected).
+         */
+        public Builder useOrderedMaps(String useOrderedMaps) {
+            this.useOrderedMaps = useOrderedMaps;
+            return this;
+        }
+
+        /**
+         * Refers to a custom <tt>CsvRecordConverter</tt> to lookup from the registry to use.
+         */
+        public Builder recordConverterRef(String recordConverterRef) {
+            this.recordConverterRef = recordConverterRef;
+            return this;
+        }
+
+        /**
+         * Sets whether or not to trim leading and trailing blanks.
+         */
+        public Builder trim(String trim) {
+            this.trim = trim;
+            return this;
+        }
+
+        /**
+         * Sets whether or not to ignore case when accessing header names.
+         */
+        public Builder ignoreHeaderCase(String ignoreHeaderCase) {
+            this.ignoreHeaderCase = ignoreHeaderCase;
+            return this;
+        }
+
+        /**
+         * Sets whether or not to add a trailing delimiter.
+         */
+        public Builder trailingDelimiter(String trailingDelimiter) {
+            this.trailingDelimiter = trailingDelimiter;
+            return this;
+        }
+
+        /**
+         * Whether the unmarshalling should capture the header record and store it in the message header
+         */
+        public Builder captureHeaderRecord(String captureHeaderRecord) {
+            this.captureHeaderRecord = captureHeaderRecord;
+            return this;
+        }
+
+        @Override
+        public CsvDataFormat end() {
+            return new CsvDataFormat(this);
+        }
+    }
 }
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 6b0a4ebd92f..16eee49556d 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -42,6 +44,11 @@ public class CustomDataFormat extends DataFormatDefinition {
         this.ref = ref;
     }
 
+    private CustomDataFormat(Builder builder) {
+        this();
+        this.ref = builder.ref;
+    }
+
     /**
      * Reference to the custom {@link org.apache.camel.spi.DataFormat} to lookup from the Camel registry.
      */
@@ -60,4 +67,26 @@ public class CustomDataFormat extends DataFormatDefinition {
     public String toString() {
         return "CustomDataFormat[" + ref + "]";
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link CustomDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<CustomDataFormat> {
+
+        private String ref;
+
+        /**
+         * Reference to the custom {@link org.apache.camel.spi.DataFormat} to lookup from the Camel registry.
+         */
+        public Builder ref(String ref) {
+            this.ref = ref;
+            return this;
+        }
+
+        @Override
+        public CustomDataFormat end() {
+            return new CustomDataFormat(this);
+        }
+    }
 }
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 49a04f86a08..065078b9e39 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
@@ -22,6 +22,7 @@ import java.util.Set;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -91,6 +92,28 @@ public abstract class FhirDataformat extends DataFormatDefinition implements Con
         // This constructor is needed by jaxb for schema generation
     }
 
+    protected FhirDataformat(String dataFormatName, AbstractBuilder<?, ?> builder) {
+        this(dataFormatName);
+        this.fhirContext = builder.fhirContext;
+        this.fhirVersion = builder.fhirVersion;
+        this.prettyPrint = builder.prettyPrint;
+        this.parserErrorHandler = builder.parserErrorHandler;
+        this.parserOptions = builder.parserOptions;
+        this.preferTypes = builder.preferTypes;
+        this.forceResourceId = builder.forceResourceId;
+        this.serverBaseUrl = builder.serverBaseUrl;
+        this.omitResourceId = builder.omitResourceId;
+        this.encodeElementsAppliesToChildResourcesOnly = builder.encodeElementsAppliesToChildResourcesOnly;
+        this.encodeElements = builder.encodeElements;
+        this.dontEncodeElements = builder.dontEncodeElements;
+        this.stripVersionsFromReferences = builder.stripVersionsFromReferences;
+        this.overrideResourceIdWithBundleEntryFullUrl = builder.overrideResourceIdWithBundleEntryFullUrl;
+        this.summaryMode = builder.summaryMode;
+        this.suppressNarratives = builder.suppressNarratives;
+        this.dontStripVersionsFromReferencesAtPaths = builder.dontStripVersionsFromReferencesAtPaths;
+        this.contentTypeHeader = builder.contentTypeHeader;
+    }
+
     public Object getFhirContext() {
         return fhirContext;
     }
@@ -371,4 +394,260 @@ public abstract class FhirDataformat extends DataFormatDefinition implements Con
         this.contentTypeHeader = contentTypeHeader;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link FhirDataformat}.
+     */
+    @XmlTransient
+    @SuppressWarnings("unchecked")
+    abstract static class AbstractBuilder<T extends AbstractBuilder<T, F>, F extends FhirDataformat>
+            implements DataFormatBuilder<F> {
+
+        private Object fhirContext;
+        private String fhirVersion = "R4";
+        private String prettyPrint;
+        private Object parserErrorHandler;
+        private Object parserOptions;
+        private Object preferTypes;
+        private Object forceResourceId;
+        private String serverBaseUrl;
+        private String omitResourceId;
+        private String encodeElementsAppliesToChildResourcesOnly;
+        private Set<String> encodeElements;
+        private Set<String> dontEncodeElements;
+        private String stripVersionsFromReferences;
+        private String overrideResourceIdWithBundleEntryFullUrl;
+        private String summaryMode;
+        private String suppressNarratives;
+        private List<String> dontStripVersionsFromReferencesAtPaths;
+        private String contentTypeHeader = "true";
+
+        public T fhirContext(Object fhirContext) {
+            this.fhirContext = fhirContext;
+            return (T) this;
+        }
+
+        /**
+         * The version of FHIR to use. Possible values are: DSTU2,DSTU2_HL7ORG,DSTU2_1,DSTU3,R4,R5
+         */
+        public T fhirVersion(String fhirVersion) {
+            this.fhirVersion = fhirVersion;
+            return (T) this;
+        }
+
+        /**
+         * Sets the "pretty print" flag, meaning that the parser will encode resources with human-readable spacing and
+         * newlines between elements instead of condensing output as much as possible.
+         *
+         * @param prettyPrint The flag
+         */
+        public T prettyPrint(String prettyPrint) {
+            this.prettyPrint = prettyPrint;
+            return (T) this;
+        }
+
+        /**
+         * Registers an error handler which will be invoked when any parse errors are found
+         *
+         * @param parserErrorHandler The error handler to set. Must not be null.
+         */
+        public T parserErrorHandler(Object parserErrorHandler) {
+            this.parserErrorHandler = parserErrorHandler;
+            return (T) this;
+        }
+
+        /**
+         * Sets the parser options object which will be used to supply default options to newly created parsers.
+         *
+         * @param parserOptions The parser options object
+         */
+        public T parserOptions(Object parserOptions) {
+            this.parserOptions = parserOptions;
+            return (T) this;
+        }
+
+        /**
+         * If set, when parsing resources the parser will try to use the given types when possible, in the order that
+         * they are provided (from highest to lowest priority). For example, if a custom type which declares to
+         * implement the Patient resource is passed in here, and the parser is parsing a Bundle containing a Patient
+         * resource, the parser will use the given custom type.
+         *
+         * @param preferTypes The preferred types, or <code>null</code>
+         */
+        public T preferTypes(Object preferTypes) {
+            this.preferTypes = preferTypes;
+            return (T) this;
+        }
+
+        /**
+         * When encoding, force this resource ID to be encoded as the resource ID
+         */
+        public T forceResourceId(Object forceResourceId) {
+            this.forceResourceId = forceResourceId;
+            return (T) this;
+        }
+
+        /**
+         * Sets the server's base URL used by this parser. If a value is set, resource references will be turned into
+         * relative references if they are provided as absolute URLs but have a base matching the given base.
+         *
+         * @param serverBaseUrl The base URL, e.g. "http://example.com/base"
+         */
+        public T serverBaseUrl(String serverBaseUrl) {
+            this.serverBaseUrl = serverBaseUrl;
+            return (T) this;
+        }
+
+        /**
+         * If set to <code>true</code> (default is <code>false</code>) the ID of any resources being encoded will not be
+         * included in the output. Note that this does not apply to contained resources, only to root resources. In
+         * other words, if this is set to <code>true</code>, contained resources will still have local IDs but the
+         * outer/containing ID will not have an ID.
+         *
+         * @param omitResourceId Should resource IDs be omitted
+         */
+        public T omitResourceId(String omitResourceId) {
+            this.omitResourceId = omitResourceId;
+            return (T) this;
+        }
+
+        /**
+         * If set to <code>true</code> (default is false), the values supplied to {@link #setEncodeElements(Set)} will
+         * not be applied to the root resource (typically a Bundle), but will be applied to any sub-resources contained
+         * within it (i.e. search result resources in that bundle)
+         */
+        public T encodeElementsAppliesToChildResourcesOnly(String encodeElementsAppliesToChildResourcesOnly) {
+            this.encodeElementsAppliesToChildResourcesOnly = encodeElementsAppliesToChildResourcesOnly;
+            return (T) this;
+        }
+
+        /**
+         * If provided, specifies the elements which should be encoded, to the exclusion of all others. Valid values for
+         * this field would include:
+         * <ul>
+         * <li><b>Patient</b> - Encode patient and all its children</li>
+         * <li><b>Patient.name</b> - Encode only the patient's name</li>
+         * <li><b>Patient.name.family</b> - Encode only the patient's family name</li>
+         * <li><b>*.text</b> - Encode the text element on any resource (only the very first position may contain a
+         * wildcard)</li>
+         * <li><b>*.(mandatory)</b> - This is a special case which causes any mandatory fields (min > 0) to be
+         * encoded</li>
+         * </ul>
+         *
+         * @param encodeElements The elements to encode
+         * @see                  #setDontEncodeElements(Set)
+         */
+        public T encodeElements(Set<String> encodeElements) {
+            this.encodeElements = encodeElements;
+            return (T) this;
+        }
+
+        /**
+         * If provided, specifies the elements which should NOT be encoded. Valid values for this field would include:
+         * <ul>
+         * <li><b>Patient</b> - Don't encode patient and all its children</li>
+         * <li><b>Patient.name</b> - Don't encode the patient's name</li>
+         * <li><b>Patient.name.family</b> - Don't encode the patient's family name</li>
+         * <li><b>*.text</b> - Don't encode the text element on any resource (only the very first position may contain a
+         * wildcard)</li>
+         * </ul>
+         * <p>
+         * DSTU2 note: Note that values including meta, such as <code>Patient.meta</code> will work for DSTU2 parsers,
+         * but values with subelements on meta such as <code>Patient.meta.lastUpdated</code> will only work in DSTU3+
+         * mode.
+         * </p>
+         *
+         * @param dontEncodeElements The elements to encode
+         * @see                      #setEncodeElements(Set)
+         */
+        public T dontEncodeElements(Set<String> dontEncodeElements) {
+            this.dontEncodeElements = dontEncodeElements;
+            return (T) this;
+        }
+
+        /**
+         * If set to <code>true<code> (which is the default), resource references containing a version
+         * will have the version removed when the resource is encoded. This is generally good behaviour because
+         * in most situations, references from one resource to another should be to the resource by ID, not
+         * by ID and version. In some cases though, it may be desirable to preserve the version in resource
+         * links. In that case, this value should be set to <code>false</code>.
+         * <p>
+         * This method provides the ability to globally disable reference encoding. If finer-grained control is needed,
+         * use {@link #setDontStripVersionsFromReferencesAtPaths(List)}
+         * </p>
+         *
+         * @param stripVersionsFromReferences Set this to
+         *                                    <code>false<code> to prevent the parser from removing resource versions
+         *                                    from references (or <code>null</code> to apply the default setting from
+         *                                    the {@link #setParserOptions(Object)}
+         * @see                               #setDontStripVersionsFromReferencesAtPaths(List)
+         */
+        public T stripVersionsFromReferences(String stripVersionsFromReferences) {
+            this.stripVersionsFromReferences = stripVersionsFromReferences;
+            return (T) this;
+        }
+
+        /**
+         * If set to <code>true</code> (which is the default), the Bundle.entry.fullUrl will override the
+         * Bundle.entry.resource's resource id if the fullUrl is defined. This behavior happens when parsing the source
+         * data into a Bundle object. Set this to <code>false</code> if this is not the desired behavior (e.g. the
+         * client code wishes to perform additional validation checks between the fullUrl and the resource id).
+         *
+         * @param overrideResourceIdWithBundleEntryFullUrl Set this to <code>false</code> to prevent the parser from
+         *                                                 overriding resource ids with the Bundle.entry.fullUrl (or
+         *                                                 <code>null</code> to apply the default setting from the
+         *                                                 {@link #setParserOptions(Object)})
+         */
+        public T overrideResourceIdWithBundleEntryFullUrl(String overrideResourceIdWithBundleEntryFullUrl) {
+            this.overrideResourceIdWithBundleEntryFullUrl = overrideResourceIdWithBundleEntryFullUrl;
+            return (T) this;
+        }
+
+        /**
+         * If set to <code>true</code> (default is <code>false</code>) only elements marked by the FHIR specification as
+         * being "summary elements" will be included.
+         */
+        public T summaryMode(String summaryMode) {
+            this.summaryMode = summaryMode;
+            return (T) this;
+        }
+
+        /**
+         * If set to <code>true</code> (default is <code>false</code>), narratives will not be included in the encoded
+         * values.
+         */
+        public T suppressNarratives(String suppressNarratives) {
+            this.suppressNarratives = suppressNarratives;
+            return (T) this;
+        }
+
+        /**
+         * If supplied value(s), any resource references at the specified paths will have their resource versions
+         * encoded instead of being automatically stripped during the encoding process. This setting has no effect on
+         * the parsing process.
+         * <p>
+         * This method provides a finer-grained level of control than {@link #setStripVersionsFromReferences(String)}
+         * and any paths specified by this method will be encoded even if
+         * {@link #setStripVersionsFromReferences(String)} has been set to <code>true</code> (which is the default)
+         * </p>
+         *
+         * @param dontStripVersionsFromReferencesAtPaths A collection of paths for which the resource versions will not
+         *                                               be removed automatically when serializing, e.g.
+         *                                               "Patient.managingOrganization" or
+         *                                               "AuditEvent.object.reference". Note that only resource name and
+         *                                               field names with dots separating is allowed here (no repetition
+         *                                               indicators, FluentPath expressions, etc.). Set to
+         *                                               <code>null</code> to use the value set in the
+         *                                               {@link #setParserOptions(Object)}
+         * @see                                          #setStripVersionsFromReferences(String)
+         */
+        public T dontStripVersionsFromReferencesAtPaths(List<String> dontStripVersionsFromReferencesAtPaths) {
+            this.dontStripVersionsFromReferencesAtPaths = dontStripVersionsFromReferencesAtPaths;
+            return (T) this;
+        }
+
+        public T contentTypeHeader(String contentTypeHeader) {
+            this.contentTypeHeader = contentTypeHeader;
+            return (T) this;
+        }
+    }
 }
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 08e6d9d41dd..38beaf260ec 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
@@ -19,6 +19,7 @@ package org.apache.camel.model.dataformat;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.spi.Metadata;
 
@@ -34,4 +35,19 @@ public class FhirJsonDataFormat extends FhirDataformat {
         super("fhirJson");
     }
 
+    private FhirJsonDataFormat(Builder builder) {
+        super("fhirJson", builder);
+    }
+
+    /**
+     * {@code Builder} is a specific builder for {@link FhirJsonDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder extends AbstractBuilder<Builder, FhirJsonDataFormat> {
+
+        @Override
+        public FhirJsonDataFormat end() {
+            return new FhirJsonDataFormat(this);
+        }
+    }
 }
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 f1cad180d61..e2611a3a58d 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
@@ -19,6 +19,7 @@ package org.apache.camel.model.dataformat;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.spi.Metadata;
 
@@ -34,4 +35,19 @@ public class FhirXmlDataFormat extends FhirDataformat {
         super("fhirXml");
     }
 
+    private FhirXmlDataFormat(Builder builder) {
+        super("fhirXml", builder);
+    }
+
+    /**
+     * {@code Builder} is a specific builder for {@link FhirXmlDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder extends AbstractBuilder<Builder, FhirXmlDataFormat> {
+
+        @Override
+        public FhirXmlDataFormat end() {
+            return new FhirXmlDataFormat(this);
+        }
+    }
 }
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 9436353a1f6..df28a29699c 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -61,6 +63,18 @@ public class FlatpackDataFormat extends DataFormatDefinition {
         super("flatpack");
     }
 
+    private FlatpackDataFormat(Builder builder) {
+        this();
+        this.definition = builder.definition;
+        this.fixed = builder.fixed;
+        this.delimiter = builder.delimiter;
+        this.ignoreFirstRecord = builder.ignoreFirstRecord;
+        this.allowShortLines = builder.allowShortLines;
+        this.ignoreExtraColumns = builder.ignoreExtraColumns;
+        this.textQualifier = builder.textQualifier;
+        this.parserFactoryRef = builder.parserFactoryRef;
+    }
+
     public String getDefinition() {
         return definition;
     }
@@ -153,4 +167,93 @@ public class FlatpackDataFormat extends DataFormatDefinition {
         this.parserFactoryRef = parserFactoryRef;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link FlatpackDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<FlatpackDataFormat> {
+
+        private String definition;
+        private String fixed;
+        private String delimiter = ",";
+        private String ignoreFirstRecord = "true";
+        private String allowShortLines;
+        private String ignoreExtraColumns;
+        private String textQualifier;
+        private String parserFactoryRef;
+
+        /**
+         * The flatpack pzmap configuration file. Can be omitted in simpler situations, but its preferred to use the
+         * pzmap.
+         */
+        public Builder definition(String definition) {
+            this.definition = definition;
+            return this;
+        }
+
+        /**
+         * Delimited or fixed. Is by default false = delimited
+         */
+        public Builder fixed(String fixed) {
+            this.fixed = fixed;
+            return this;
+        }
+
+        /**
+         * Whether the first line is ignored for delimited files (for the column headers).
+         * <p/>
+         * Is by default true.
+         */
+        public Builder ignoreFirstRecord(String ignoreFirstRecord) {
+            this.ignoreFirstRecord = ignoreFirstRecord;
+            return this;
+        }
+
+        /**
+         * If the text is qualified with a character.
+         * <p/>
+         * Uses quote character by default.
+         */
+        public Builder textQualifier(String textQualifier) {
+            this.textQualifier = textQualifier;
+            return this;
+        }
+
+        /**
+         * The delimiter char (could be ; , or similar)
+         */
+        public Builder delimiter(String delimiter) {
+            this.delimiter = delimiter;
+            return this;
+        }
+
+        /**
+         * Allows for lines to be shorter than expected and ignores the extra characters
+         */
+        public Builder allowShortLines(String allowShortLines) {
+            this.allowShortLines = allowShortLines;
+            return this;
+        }
+
+        /**
+         * Allows for lines to be longer than expected and ignores the extra characters.
+         */
+        public Builder ignoreExtraColumns(String ignoreExtraColumns) {
+            this.ignoreExtraColumns = ignoreExtraColumns;
+            return this;
+        }
+
+        /**
+         * References to a custom parser factory to lookup in the registry
+         */
+        public Builder parserFactoryRef(String parserFactoryRef) {
+            this.parserFactoryRef = parserFactoryRef;
+            return this;
+        }
+
+        @Override
+        public FlatpackDataFormat end() {
+            return new FlatpackDataFormat(this);
+        }
+    }
 }
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 3c176450648..ebd242d8d9e 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -49,6 +51,14 @@ public class GrokDataFormat extends DataFormatDefinition {
         super("grok");
     }
 
+    private GrokDataFormat(Builder builder) {
+        this();
+        this.pattern = builder.pattern;
+        this.flattened = builder.flattened;
+        this.allowMultipleMatchesPerLine = builder.allowMultipleMatchesPerLine;
+        this.namedOnly = builder.namedOnly;
+    }
+
     public String getPattern() {
         return pattern;
     }
@@ -99,4 +109,55 @@ public class GrokDataFormat extends DataFormatDefinition {
     public String toString() {
         return "GrokDataFormat[" + pattern + ']';
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link GrokDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<GrokDataFormat> {
+
+        private String pattern;
+        private String flattened;
+        private String allowMultipleMatchesPerLine = "true";
+        private String namedOnly;
+
+        /**
+         * The grok pattern to match lines of input
+         */
+        public Builder pattern(String pattern) {
+            this.pattern = pattern;
+            return this;
+        }
+
+        /**
+         * Turns on flattened mode. In flattened mode the exception is thrown when there are multiple pattern matches
+         * with same key.
+         */
+        public Builder flattened(String flattened) {
+            this.flattened = flattened;
+            return this;
+        }
+
+        /**
+         * If false, every line of input is matched for pattern only once. Otherwise the line can be scanned multiple
+         * times when non-terminal pattern is used.
+         */
+        public Builder allowMultipleMatchesPerLine(String allowMultipleMatchesPerLine) {
+            this.allowMultipleMatchesPerLine = allowMultipleMatchesPerLine;
+            return this;
+        }
+
+        /**
+         * Whether to capture named expressions only or not (i.e. %{IP:ip} but not ${IP})
+         */
+        public Builder namedOnly(String namedOnly) {
+            this.namedOnly = namedOnly;
+            return this;
+        }
+
+        @Override
+        public GrokDataFormat end() {
+            return new GrokDataFormat(this);
+        }
+    }
 }
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 0aab050323a..e3690745500 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
@@ -17,7 +17,9 @@
 package org.apache.camel.model.dataformat;
 
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -32,4 +34,14 @@ public class GzipDeflaterDataFormat extends DataFormatDefinition {
         super("gzipDeflater");
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link GzipDeflaterDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<GzipDeflaterDataFormat> {
+        @Override
+        public GzipDeflaterDataFormat end() {
+            return new 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 04d58e16a01..7f63be878b0 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
@@ -22,6 +22,7 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -45,6 +46,12 @@ public class HL7DataFormat extends DataFormatDefinition {
         super("hl7");
     }
 
+    private HL7DataFormat(Builder builder) {
+        this();
+        this.parser = builder.parser;
+        this.validate = builder.validate;
+    }
+
     public String getValidate() {
         return validate;
     }
@@ -69,4 +76,36 @@ public class HL7DataFormat extends DataFormatDefinition {
         this.parser = parser;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link HL7DataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<HL7DataFormat> {
+
+        private Object parser;
+        private String validate = "true";
+
+        /**
+         * Whether to validate the HL7 message
+         * <p/>
+         * Is by default true.
+         */
+        public Builder validate(String validate) {
+            this.validate = validate;
+            return this;
+        }
+
+        /**
+         * To use a custom HL7 parser
+         */
+        public Builder parser(Object parser) {
+            this.parser = parser;
+            return this;
+        }
+
+        @Override
+        public HL7DataFormat end() {
+            return new HL7DataFormat(this);
+        }
+    }
 }
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 29fd9b0f64a..bee04c10459 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -40,6 +42,11 @@ public class IcalDataFormat extends DataFormatDefinition {
         super("ical");
     }
 
+    private IcalDataFormat(Builder builder) {
+        this();
+        this.validating = builder.validating;
+    }
+
     public String getValidating() {
         return validating;
     }
@@ -51,4 +58,25 @@ public class IcalDataFormat extends DataFormatDefinition {
         this.validating = validating;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link IcalDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<IcalDataFormat> {
+
+        private String validating;
+
+        /**
+         * Whether to validate.
+         */
+        public Builder validating(String validating) {
+            this.validating = validating;
+            return this;
+        }
+
+        @Override
+        public IcalDataFormat end() {
+            return new IcalDataFormat(this);
+        }
+    }
 }
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 888d3a74fe9..a9baa562819 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
@@ -22,6 +22,7 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -90,6 +91,29 @@ public class JacksonXMLDataFormat extends DataFormatDefinition implements Conten
         super("jacksonXml");
     }
 
+    private JacksonXMLDataFormat(Builder builder) {
+        this();
+        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;
+    }
+
     public String getXmlMapper() {
         return xmlMapper;
     }
@@ -319,4 +343,209 @@ public class JacksonXMLDataFormat extends DataFormatDefinition implements Conten
         this.timezone = timezone;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link JacksonXMLDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<JacksonXMLDataFormat> {
+
+        private Class<?> unmarshalType;
+        private Class<?> jsonView;
+        private Class<?> collectionType;
+        private String xmlMapper;
+        private String prettyPrint;
+        private String unmarshalTypeName;
+        private String allowUnmarshallType;
+        private String jsonViewTypeName;
+        private String include;
+        private String allowJmsType;
+        private String collectionTypeName;
+        private String useList;
+        private String timezone;
+        private String enableJaxbAnnotationModule;
+        private String moduleClassNames;
+        private String moduleRefs;
+        private String enableFeatures;
+        private String disableFeatures;
+        private String contentTypeHeader = "true";
+
+        /**
+         * Lookup and use the existing XmlMapper with the given id.
+         */
+        public Builder xmlMapper(String xmlMapper) {
+            this.xmlMapper = xmlMapper;
+            return this;
+        }
+
+        /**
+         * To enable pretty printing output nicely formatted.
+         * <p/>
+         * Is by default false.
+         */
+        public Builder prettyPrint(String prettyPrint) {
+            this.prettyPrint = prettyPrint;
+            return this;
+        }
+
+        /**
+         * Class name of the java type to use when unmarshalling
+         */
+        public Builder unmarshalTypeName(String unmarshalTypeName) {
+            this.unmarshalTypeName = unmarshalTypeName;
+            return this;
+        }
+
+        /**
+         * Class of the java type to use when unmarshalling
+         */
+        public Builder unmarshalType(Class<?> unmarshalType) {
+            this.unmarshalType = unmarshalType;
+            return this;
+        }
+
+        /**
+         * When marshalling a POJO to JSON you might want to exclude certain fields from the JSON output. With Jackson
+         * you can use JSON views to accomplish this. This option is to refer to the class which has @JsonView
+         * annotations
+         */
+        public Builder jsonViewTypeName(String jsonViewTypeName) {
+            this.jsonViewTypeName = jsonViewTypeName;
+            return this;
+        }
+
+        /**
+         * When marshalling a POJO to JSON you might want to exclude certain fields from the JSON output. With Jackson
+         * you can use JSON views to accomplish this. This option is to refer to the class which has @JsonView
+         * annotations
+         */
+        public Builder jsonView(Class<?> jsonView) {
+            this.jsonView = jsonView;
+            return this;
+        }
+
+        /**
+         * If you want to marshal a pojo to JSON, and the pojo has some fields with null values. And you want to skip
+         * these null values, you can set this option to <tt>NON_NULL</tt>
+         */
+        public Builder include(String include) {
+            this.include = include;
+            return this;
+        }
+
+        /**
+         * Used for JMS users to allow the JMSType header from the JMS spec to specify a FQN classname to use to
+         * unmarshal to.
+         */
+        public Builder allowJmsType(String allowJmsType) {
+            this.allowJmsType = allowJmsType;
+            return this;
+        }
+
+        /**
+         * Refers to a custom collection type to lookup in the registry to use. This option should rarely be used, but
+         * allows to use different collection types than java.util.Collection based as default.
+         */
+        public Builder collectionTypeName(String collectionTypeName) {
+            this.collectionTypeName = collectionTypeName;
+            return this;
+        }
+
+        public Builder collectionType(Class<?> collectionType) {
+            this.collectionType = collectionType;
+            return this;
+        }
+
+        /**
+         * To unmarshal to a List of Map or a List of Pojo.
+         */
+        public Builder useList(String useList) {
+            this.useList = useList;
+            return this;
+        }
+
+        /**
+         * Whether to enable the JAXB annotations module when using jackson. When enabled then JAXB annotations can be
+         * used by Jackson.
+         */
+        public Builder enableJaxbAnnotationModule(String enableJaxbAnnotationModule) {
+            this.enableJaxbAnnotationModule = enableJaxbAnnotationModule;
+            return this;
+        }
+
+        /**
+         * To use custom Jackson modules com.fasterxml.jackson.databind.Module specified as a String with FQN class
+         * names. Multiple classes can be separated by comma.
+         */
+        public Builder moduleClassNames(String moduleClassNames) {
+            this.moduleClassNames = moduleClassNames;
+            return this;
+        }
+
+        /**
+         * To use custom Jackson modules referred from the Camel registry. Multiple modules can be separated by comma.
+         */
+        public Builder moduleRefs(String moduleRefs) {
+            this.moduleRefs = moduleRefs;
+            return this;
+        }
+
+        /**
+         * Set of features to enable on the Jackson <tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
+         * <p/>
+         * The features should be a name that matches a enum from
+         * <tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
+         * <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or
+         * <tt>com.fasterxml.jackson.databind.MapperFeature</tt>
+         * <p/>
+         * Multiple features can be separated by comma
+         */
+        public Builder enableFeatures(String enableFeatures) {
+            this.enableFeatures = enableFeatures;
+            return this;
+        }
+
+        /**
+         * Set of features to disable on the Jackson <tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
+         * <p/>
+         * The features should be a name that matches a enum from
+         * <tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
+         * <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or
+         * <tt>com.fasterxml.jackson.databind.MapperFeature</tt>
+         * <p/>
+         * Multiple features can be separated by comma
+         */
+        public Builder disableFeatures(String disableFeatures) {
+            this.disableFeatures = disableFeatures;
+            return this;
+        }
+
+        /**
+         * If enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header during the
+         * unmarshalling.
+         * <p/>
+         * This should only be enabled when desired to be used.
+         */
+        public Builder allowUnmarshallType(String allowUnmarshallType) {
+            this.allowUnmarshallType = allowUnmarshallType;
+            return this;
+        }
+
+        public Builder contentTypeHeader(String contentTypeHeader) {
+            this.contentTypeHeader = contentTypeHeader;
+            return this;
+        }
+
+        /**
+         * If set then Jackson will use the Timezone when marshalling/unmarshalling.
+         */
+        public Builder timezone(String timezone) {
+            this.timezone = timezone;
+            return this;
+        }
+
+        @Override
+        public JacksonXMLDataFormat end() {
+            return new JacksonXMLDataFormat(this);
+        }
+    }
 }
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 d113010b98f..6508d6b97e0 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -98,6 +100,29 @@ public class JaxbDataFormat extends DataFormatDefinition implements ContentTypeH
         setPrettyPrint(Boolean.toString(prettyPrint));
     }
 
+    private JaxbDataFormat(Builder builder) {
+        this();
+        this.contextPath = builder.contextPath;
+        this.contextPathIsClassName = builder.contextPathIsClassName;
+        this.schema = builder.schema;
+        this.schemaSeverityLevel = builder.schemaSeverityLevel;
+        this.prettyPrint = builder.prettyPrint;
+        this.objectFactory = builder.objectFactory;
+        this.ignoreJAXBElement = builder.ignoreJAXBElement;
+        this.mustBeJAXBElement = builder.mustBeJAXBElement;
+        this.filterNonXmlChars = builder.filterNonXmlChars;
+        this.encoding = builder.encoding;
+        this.fragment = builder.fragment;
+        this.partClass = builder.partClass;
+        this.partNamespace = builder.partNamespace;
+        this.namespacePrefixRef = builder.namespacePrefixRef;
+        this.xmlStreamWriterWrapper = builder.xmlStreamWriterWrapper;
+        this.schemaLocation = builder.schemaLocation;
+        this.noNamespaceSchemaLocation = builder.noNamespaceSchemaLocation;
+        this.jaxbProviderProperties = builder.jaxbProviderProperties;
+        this.contentTypeHeader = builder.contentTypeHeader;
+    }
+
     public String getContextPath() {
         return contextPath;
     }
@@ -322,4 +347,203 @@ public class JaxbDataFormat extends DataFormatDefinition implements ContentTypeH
         this.contentTypeHeader = contentTypeHeader;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link JaxbDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<JaxbDataFormat> {
+
+        private String contextPath;
+        private String contextPathIsClassName;
+        private String schema;
+        private String schemaSeverityLevel = "0";
+        private String prettyPrint;
+        private String objectFactory;
+        private String ignoreJAXBElement;
+        private String mustBeJAXBElement;
+        private String filterNonXmlChars;
+        private String encoding;
+        private String fragment;
+        private String partClass;
+        private String partNamespace;
+        private String namespacePrefixRef;
+        private String xmlStreamWriterWrapper;
+        private String schemaLocation;
+        private String noNamespaceSchemaLocation;
+        private String jaxbProviderProperties;
+        private String contentTypeHeader = "true";
+
+        /**
+         * Package name where your JAXB classes are located.
+         */
+        public Builder contextPath(String contextPath) {
+            this.contextPath = contextPath;
+            return this;
+        }
+
+        /**
+         * This can be set to true to mark that the contextPath is referring to a classname and not a package name.
+         */
+        public Builder contextPathIsClassName(String contextPathIsClassName) {
+            this.contextPathIsClassName = contextPathIsClassName;
+            return this;
+        }
+
+        /**
+         * To validate against an existing schema. Your can use the prefix classpath:, file:* or *http: to specify how
+         * the resource should be resolved. You can separate multiple schema files by using the ',' character.
+         */
+        public Builder schema(String schema) {
+            this.schema = schema;
+            return this;
+        }
+
+        /**
+         * Sets the schema severity level to use when validating against a schema. This level determines the minimum
+         * severity error that triggers JAXB to stop continue parsing. The default value of 0 (warning) means that any
+         * error (warning, error or fatal error) will trigger JAXB to stop. There are the following three levels:
+         * 0=warning, 1=error, 2=fatal error.
+         */
+        public Builder schemaSeverityLevel(String schemaSeverityLevel) {
+            this.schemaSeverityLevel = schemaSeverityLevel;
+            return this;
+        }
+
+        /**
+         * To enable pretty printing output nicely formatted.
+         * <p/>
+         * Is by default false.
+         */
+        public Builder prettyPrint(String prettyPrint) {
+            this.prettyPrint = prettyPrint;
+            return this;
+        }
+
+        /**
+         * Whether to allow using ObjectFactory classes to create the POJO classes during marshalling. This only applies
+         * to POJO classes that has not been annotated with JAXB and providing jaxb.index descriptor files.
+         */
+        public Builder objectFactory(String objectFactory) {
+            this.objectFactory = objectFactory;
+            return this;
+        }
+
+        /**
+         * Whether to ignore JAXBElement elements - only needed to be set to false in very special use-cases.
+         */
+        public Builder ignoreJAXBElement(String ignoreJAXBElement) {
+            this.ignoreJAXBElement = ignoreJAXBElement;
+            return this;
+        }
+
+        /**
+         * Whether marhsalling must be java objects with JAXB annotations. And if not then it fails. This option can be
+         * set to false to relax that, such as when the data is already in XML format.
+         */
+        public Builder mustBeJAXBElement(String mustBeJAXBElement) {
+            this.mustBeJAXBElement = mustBeJAXBElement;
+            return this;
+        }
+
+        /**
+         * To turn on marshalling XML fragment trees. By default JAXB looks for @XmlRootElement annotation on given
+         * class to operate on whole XML tree. This is useful but not always - sometimes generated code does not
+         * have @XmlRootElement annotation, sometimes you need unmarshall only part of tree. In that case you can use
+         * partial unmarshalling. To enable this behaviours you need set property partClass. Camel will pass this class
+         * to JAXB's unmarshaler.
+         */
+        public Builder fragment(String fragment) {
+            this.fragment = fragment;
+            return this;
+        }
+
+        /**
+         * To ignore non xml characters and replace them with an empty space.
+         */
+        public Builder filterNonXmlChars(String filterNonXmlChars) {
+            this.filterNonXmlChars = filterNonXmlChars;
+            return this;
+        }
+
+        /**
+         * To overrule and use a specific encoding
+         */
+        public Builder encoding(String encoding) {
+            this.encoding = encoding;
+            return this;
+        }
+
+        /**
+         * Name of class used for fragment parsing.
+         * <p/>
+         * See more details at the fragment option.
+         */
+        public Builder partClass(String partClass) {
+            this.partClass = partClass;
+            return this;
+        }
+
+        /**
+         * XML namespace to use for fragment parsing.
+         * <p/>
+         * See more details at the fragment option.
+         */
+        public Builder partNamespace(String partNamespace) {
+            this.partNamespace = partNamespace;
+            return this;
+        }
+
+        /**
+         * When marshalling using JAXB or SOAP then the JAXB implementation will automatically assign namespace
+         * prefixes, such as ns2, ns3, ns4 etc. To control this mapping, Camel allows you to refer to a map which
+         * contains the desired mapping.
+         */
+        public Builder namespacePrefixRef(String namespacePrefixRef) {
+            this.namespacePrefixRef = namespacePrefixRef;
+            return this;
+        }
+
+        /**
+         * To use a custom xml stream writer.
+         */
+        public Builder xmlStreamWriterWrapper(String xmlStreamWriterWrapperRef) {
+            this.xmlStreamWriterWrapper = xmlStreamWriterWrapperRef;
+            return this;
+        }
+
+        /**
+         * To define the location of the schema
+         */
+        public Builder schemaLocation(String schemaLocation) {
+            this.schemaLocation = schemaLocation;
+            return this;
+        }
+
+        /**
+         * To define the location of the namespaceless schema
+         */
+        public Builder noNamespaceSchemaLocation(String schemaLocation) {
+            this.noNamespaceSchemaLocation = schemaLocation;
+            return this;
+        }
+
+        /**
+         * Refers to a custom java.util.Map to lookup in the registry containing custom JAXB provider properties to be
+         * used with the JAXB marshaller.
+         */
+        public Builder jaxbProviderProperties(String jaxbProviderProperties) {
+            this.jaxbProviderProperties = jaxbProviderProperties;
+            return this;
+        }
+
+        public Builder contentTypeHeader(String contentTypeHeader) {
+            this.contentTypeHeader = contentTypeHeader;
+            return this;
+        }
+
+        @Override
+        public JaxbDataFormat end() {
+            return new JaxbDataFormat(this);
+        }
+    }
 }
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 faf85c49439..5337c692943 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -42,6 +44,12 @@ public class JsonApiDataFormat extends DataFormatDefinition {
         super("jsonApi");
     }
 
+    private JsonApiDataFormat(Builder builder) {
+        this();
+        this.dataFormatTypes = builder.dataFormatTypes;
+        this.mainFormatType = builder.mainFormatType;
+    }
+
     public Class<?>[] getDataFormatTypes() {
         return dataFormatTypes;
     }
@@ -64,4 +72,34 @@ public class JsonApiDataFormat extends DataFormatDefinition {
         this.mainFormatType = mainFormatType;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link JsonApiDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<JsonApiDataFormat> {
+
+        private Class<?>[] dataFormatTypes;
+        private Class<?> mainFormatType;
+
+        /**
+         * The classes to take into account for the marshalling
+         */
+        public Builder dataFormatTypes(Class<?>[] dataFormatTypes) {
+            this.dataFormatTypes = dataFormatTypes;
+            return this;
+        }
+
+        /**
+         * The classes to take into account while unmarshalling
+         */
+        public Builder mainFormatType(Class<?> mainFormatType) {
+            this.mainFormatType = mainFormatType;
+            return this;
+        }
+
+        @Override
+        public JsonApiDataFormat end() {
+            return new JsonApiDataFormat(this);
+        }
+    }
 }
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 b96a288823e..e210c1da6c1 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
@@ -24,6 +24,7 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -116,9 +117,40 @@ public class JsonDataFormat extends DataFormatDefinition implements ContentTypeH
     }
 
     public JsonDataFormat(JsonLibrary library) {
+        this();
         this.library = library;
     }
 
+    private JsonDataFormat(Builder builder) {
+        this();
+        this.objectMapper = builder.objectMapper;
+        this.useDefaultObjectMapper = builder.useDefaultObjectMapper;
+        this.autoDiscoverObjectMapper = builder.autoDiscoverObjectMapper;
+        this.prettyPrint = builder.prettyPrint;
+        this.library = builder.library;
+        this.unmarshalTypeName = builder.unmarshalTypeName;
+        this.unmarshalType = builder.unmarshalType;
+        this.jsonViewTypeName = builder.jsonViewTypeName;
+        this.jsonView = builder.jsonView;
+        this.include = builder.include;
+        this.allowJmsType = builder.allowJmsType;
+        this.collectionTypeName = builder.collectionTypeName;
+        this.collectionType = builder.collectionType;
+        this.useList = builder.useList;
+        this.moduleClassNames = builder.moduleClassNames;
+        this.moduleRefs = builder.moduleRefs;
+        this.enableFeatures = builder.enableFeatures;
+        this.disableFeatures = builder.disableFeatures;
+        this.permissions = builder.permissions;
+        this.allowUnmarshallType = builder.allowUnmarshallType;
+        this.timezone = builder.timezone;
+        this.dropRootNode = builder.dropRootNode;
+        this.schemaResolver = builder.schemaResolver;
+        this.autoDiscoverSchemaResolver = builder.autoDiscoverSchemaResolver;
+        this.namingStrategy = builder.namingStrategy;
+        this.contentTypeHeader = builder.contentTypeHeader;
+    }
+
     @Override
     public String getDataFormatName() {
         // json data format is special as the name can be from different bundles
@@ -366,12 +398,16 @@ public class JsonDataFormat extends DataFormatDefinition implements ContentTypeH
      * @see        #setPermissions(String)
      */
     public void setPermissions(Class<?>... type) {
+        setPermissions(toString(type));
+    }
+
+    private static String toString(Class<?>[] type) {
         StringJoiner permissionsBuilder = new StringJoiner(",");
         for (Class<?> clazz : type) {
             permissionsBuilder.add("+");
             permissionsBuilder.add(clazz.getName());
         }
-        setPermissions(permissionsBuilder.toString());
+        return permissionsBuilder.toString();
     }
 
     public String getAllowUnmarshallType() {
@@ -600,4 +636,294 @@ public class JsonDataFormat extends DataFormatDefinition implements ContentTypeH
         return this;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link JsonDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<JsonDataFormat> {
+
+        private String objectMapper;
+        private String useDefaultObjectMapper = "true";
+        private String autoDiscoverObjectMapper = "false";
+        private String prettyPrint;
+        private JsonLibrary library = JsonLibrary.Jackson;
+        private String unmarshalTypeName;
+        private Class<?> unmarshalType;
+        private String jsonViewTypeName;
+        private Class<?> jsonView;
+        private String include;
+        private String allowJmsType;
+        private String collectionTypeName;
+        private Class<?> collectionType;
+        private String useList;
+        private String moduleClassNames;
+        private String moduleRefs;
+        private String enableFeatures;
+        private String disableFeatures;
+        private String permissions;
+        private String allowUnmarshallType;
+        private String timezone;
+        private String dropRootNode = "false";
+        private String schemaResolver;
+        private String autoDiscoverSchemaResolver = "true";
+        private String namingStrategy;
+        private String contentTypeHeader = "true";
+
+        public Builder contentTypeHeader(String contentTypeHeader) {
+            this.contentTypeHeader = contentTypeHeader;
+            return this;
+        }
+
+        /**
+         * Lookup and use the existing ObjectMapper with the given id when using Jackson.
+         */
+        public Builder objectMapper(String objectMapper) {
+            this.objectMapper = objectMapper;
+            return this;
+        }
+
+        /**
+         * Whether to lookup and use default Jackson ObjectMapper from the registry.
+         */
+        public Builder useDefaultObjectMapper(String useDefaultObjectMapper) {
+            this.useDefaultObjectMapper = useDefaultObjectMapper;
+            return this;
+        }
+
+        /**
+         * To enable pretty printing output nicely formatted.
+         * <p/>
+         * Is by default false.
+         */
+        public Builder prettyPrint(String prettyPrint) {
+            this.prettyPrint = prettyPrint;
+            return this;
+        }
+
+        /**
+         * Class name of the java type to use when unmarshalling
+         */
+        public Builder unmarshalTypeName(String unmarshalTypeName) {
+            this.unmarshalTypeName = unmarshalTypeName;
+            return this;
+        }
+
+        /**
+         * Class of the java type to use when unmarshalling
+         */
+        public Builder unmarshalType(Class<?> unmarshalType) {
+            this.unmarshalType = unmarshalType;
+            return this;
+        }
+
+        /**
+         * Which json library to use.
+         */
+        public Builder library(JsonLibrary library) {
+            this.library = library;
+            return this;
+        }
+
+        /**
+         * When marshalling a POJO to JSON you might want to exclude certain fields from the JSON output. With Jackson
+         * you can use JSON views to accomplish this. This option is to refer to the class which has @JsonView
+         * annotations
+         */
+        public Builder jsonViewTypeName(String jsonViewTypeName) {
+            this.jsonViewTypeName = jsonViewTypeName;
+            return this;
+        }
+
+        /**
+         * When marshalling a POJO to JSON you might want to exclude certain fields from the JSON output. With Jackson
+         * you can use JSON views to accomplish this. This option is to refer to the class which has @JsonView
+         * annotations
+         */
+        public Builder jsonView(Class<?> jsonView) {
+            this.jsonView = jsonView;
+            return this;
+        }
+
+        /**
+         * If you want to marshal a pojo to JSON, and the pojo has some fields with null values. And you want to skip
+         * these null values, you can set this option to <tt>NON_NULL</tt>
+         */
+        public Builder include(String include) {
+            this.include = include;
+            return this;
+        }
+
+        /**
+         * Used for JMS users to allow the JMSType header from the JMS spec to specify a FQN classname to use to
+         * unmarshal to.
+         */
+        public Builder allowJmsType(String allowJmsType) {
+            this.allowJmsType = allowJmsType;
+            return this;
+        }
+
+        /**
+         * Refers to a custom collection type to lookup in the registry to use. This option should rarely be used, but
+         * allows using different collection types than java.util.Collection based as default.
+         */
+        public Builder collectionTypeName(String collectionTypeName) {
+            this.collectionTypeName = collectionTypeName;
+            return this;
+        }
+
+        public Builder collectionType(Class<?> collectionType) {
+            this.collectionType = collectionType;
+            return this;
+        }
+
+        /**
+         * To unmarshal to a List of Map or a List of Pojo.
+         */
+        public Builder useList(String useList) {
+            this.useList = useList;
+            return this;
+        }
+
+        /**
+         * To use custom Jackson modules com.fasterxml.jackson.databind.Module specified as a String with FQN class
+         * names. Multiple classes can be separated by comma.
+         */
+        public Builder moduleClassNames(String moduleClassNames) {
+            this.moduleClassNames = moduleClassNames;
+            return this;
+        }
+
+        /**
+         * To use custom Jackson modules referred from the Camel registry. Multiple modules can be separated by comma.
+         */
+        public Builder moduleRefs(String moduleRefs) {
+            this.moduleRefs = moduleRefs;
+            return this;
+        }
+
+        /**
+         * Set of features to enable on the Jackson <tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
+         * <p/>
+         * The features should be a name that matches a enum from
+         * <tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
+         * <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or
+         * <tt>com.fasterxml.jackson.databind.MapperFeature</tt>
+         * <p/>
+         * Multiple features can be separated by comma
+         */
+        public Builder enableFeatures(String enableFeatures) {
+            this.enableFeatures = enableFeatures;
+            return this;
+        }
+
+        /**
+         * Set of features to disable on the Jackson <tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
+         * <p/>
+         * The features should be a name that matches a enum from
+         * <tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
+         * <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or
+         * <tt>com.fasterxml.jackson.databind.MapperFeature</tt>
+         * <p/>
+         * Multiple features can be separated by comma
+         */
+        public Builder disableFeatures(String disableFeatures) {
+            this.disableFeatures = disableFeatures;
+            return this;
+        }
+
+        /**
+         * Adds permissions that controls which Java packages and classes XStream is allowed to use during unmarshal
+         * from xml/json to Java beans.
+         * <p/>
+         * A permission must be configured either here or globally using a JVM system property. The permission can be
+         * specified in a syntax where a plus sign is allow, and minus sign is deny. <br/>
+         * Wildcards is supported by using <tt>.*</tt> as prefix. For example to allow <tt>com.foo</tt> and all
+         * subpackages then specfy <tt>+com.foo.*</tt>. Multiple permissions can be configured separated by comma, such
+         * as <tt>+com.foo.*,-com.foo.bar.MySecretBean</tt>. <br/>
+         * The following default permission is always included: <tt>"-*,java.lang.*,java.util.*"</tt> unless its
+         * overridden by specifying a JVM system property with they key <tt>org.apache.camel.xstream.permissions</tt>.
+         */
+        public Builder permissions(String permissions) {
+            this.permissions = permissions;
+            return this;
+        }
+
+        /**
+         * To add permission for the given pojo classes.
+         *
+         * @param type the pojo class(es) xstream should use as allowed permission
+         * @see        #setPermissions(String)
+         */
+        public Builder permissions(Class<?>... type) {
+            return permissions(JsonDataFormat.toString(type));
+        }
+
+        /**
+         * If enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header during the
+         * unmarshalling.
+         * <p/>
+         * This should only be enabled when desired to be used.
+         */
+        public Builder allowUnmarshallType(String allowUnmarshallType) {
+            this.allowUnmarshallType = allowUnmarshallType;
+            return this;
+        }
+
+        /**
+         * If set then Jackson will use the Timezone when marshalling/unmarshalling. This option will have no effect on
+         * the others Json DataFormat, like gson, fastjson and xstream.
+         */
+        public Builder timezone(String timezone) {
+            this.timezone = timezone;
+            return this;
+        }
+
+        /**
+         * If set to true then Jackson will look for an objectMapper to use from the registry
+         */
+        public Builder autoDiscoverObjectMapper(String autoDiscoverObjectMapper) {
+            this.autoDiscoverObjectMapper = autoDiscoverObjectMapper;
+            return this;
+        }
+
+        /**
+         * Whether XStream will drop the root node in the generated JSon. You may want to enable this when using POJOs;
+         * as then the written object will include the class name as root node, which is often not intended to be
+         * written in the JSON output.
+         */
+        public Builder dropRootNode(String dropRootNode) {
+            this.dropRootNode = dropRootNode;
+            return this;
+        }
+
+        /**
+         * Optional schema resolver used to lookup schemas for the data in transit.
+         */
+        public Builder schemaResolver(String schemaResolver) {
+            this.schemaResolver = schemaResolver;
+            return this;
+        }
+
+        /**
+         * When not disabled, the SchemaResolver will be looked up into the registry
+         */
+        public Builder autoDiscoverSchemaResolver(String autoDiscoverSchemaResolver) {
+            this.autoDiscoverSchemaResolver = autoDiscoverSchemaResolver;
+            return this;
+        }
+
+        /**
+         * If set then Jackson will use the the defined Property Naming Strategy. Possible values are: LOWER_CAMEL_CASE,
+         * LOWER_DOT_CASE, LOWER_CASE, KEBAB_CASE, SNAKE_CASE and UPPER_CAMEL_CASE
+         */
+        public Builder namingStrategy(String namingStrategy) {
+            this.namingStrategy = namingStrategy;
+            return this;
+        }
+
+        @Override
+        public JsonDataFormat end() {
+            return new JsonDataFormat(this);
+        }
+    }
 }
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 50a31dad490..8e950bf1391 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -40,6 +42,11 @@ public class LZFDataFormat extends DataFormatDefinition {
         super("lzf");
     }
 
+    private LZFDataFormat(Builder builder) {
+        this();
+        this.usingParallelCompression = builder.usingParallelCompression;
+    }
+
     public String getUsingParallelCompression() {
         return usingParallelCompression;
     }
@@ -50,4 +57,26 @@ public class LZFDataFormat extends DataFormatDefinition {
     public void setUsingParallelCompression(String usingParallelCompression) {
         this.usingParallelCompression = usingParallelCompression;
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link LZFDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<LZFDataFormat> {
+
+        private String usingParallelCompression;
+
+        /**
+         * Enable encoding (compress) using multiple processing cores.
+         */
+        public Builder usingParallelCompression(String usingParallelCompression) {
+            this.usingParallelCompression = usingParallelCompression;
+            return this;
+        }
+
+        @Override
+        public LZFDataFormat end() {
+            return new LZFDataFormat(this);
+        }
+    }
 }
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 892be960a9c..292e0cd579a 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -51,6 +53,15 @@ public class MimeMultipartDataFormat extends DataFormatDefinition {
         super("mimeMultipart");
     }
 
+    private MimeMultipartDataFormat(Builder builder) {
+        this();
+        this.multipartSubType = builder.multipartSubType;
+        this.multipartWithoutAttachment = builder.multipartWithoutAttachment;
+        this.headersInline = builder.headersInline;
+        this.includeHeaders = builder.includeHeaders;
+        this.binaryContent = builder.binaryContent;
+    }
+
     public String getMultipartSubType() {
         return multipartSubType;
     }
@@ -117,4 +128,75 @@ public class MimeMultipartDataFormat extends DataFormatDefinition {
     public void setBinaryContent(String binaryContent) {
         this.binaryContent = binaryContent;
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link MimeMultipartDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<MimeMultipartDataFormat> {
+
+        private String multipartSubType = "mixed";
+        private String multipartWithoutAttachment;
+        private String headersInline;
+        private String includeHeaders;
+        private String binaryContent;
+
+        /**
+         * Specify the subtype of the MIME Multipart.
+         * <p>
+         * Default is mixed.
+         */
+        public Builder multipartSubType(String multipartSubType) {
+            this.multipartSubType = multipartSubType;
+            return this;
+        }
+
+        /**
+         * Defines whether a message without attachment is also marshaled into a MIME Multipart (with only one body
+         * part).
+         * <p>
+         * Default is false.
+         */
+        public Builder multipartWithoutAttachment(String multipartWithoutAttachment) {
+            this.multipartWithoutAttachment = multipartWithoutAttachment;
+            return this;
+        }
+
+        /**
+         * Defines whether the MIME-Multipart headers are part of the message body (true) or are set as Camel headers
+         * (false).
+         * <p>
+         * Default is false.
+         */
+        public Builder headersInline(String headersInline) {
+            this.headersInline = headersInline;
+            return this;
+        }
+
+        /**
+         * A regex that defines which Camel headers are also included as MIME headers into the MIME multipart. This will
+         * only work if headersInline is set to true.
+         * <p>
+         * Default is to include no headers
+         */
+        public Builder includeHeaders(String includeHeaders) {
+            this.includeHeaders = includeHeaders;
+            return this;
+        }
+
+        /**
+         * Defines whether the content of binary parts in the MIME multipart is binary (true) or Base-64 encoded (false)
+         * <p>
+         * Default is false.
+         */
+        public Builder binaryContent(String binaryContent) {
+            this.binaryContent = binaryContent;
+            return this;
+        }
+
+        @Override
+        public MimeMultipartDataFormat end() {
+            return new MimeMultipartDataFormat(this);
+        }
+    }
 }
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 20eb384f356..6600be9fa4d 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -69,6 +71,24 @@ public class PGPDataFormat extends DataFormatDefinition {
         super("pgp");
     }
 
+    private PGPDataFormat(Builder builder) {
+        this();
+        this.keyUserid = builder.keyUserid;
+        this.signatureKeyUserid = builder.signatureKeyUserid;
+        this.password = builder.password;
+        this.signaturePassword = builder.signaturePassword;
+        this.keyFileName = builder.keyFileName;
+        this.signatureKeyFileName = builder.signatureKeyFileName;
+        this.signatureKeyRing = builder.signatureKeyRing;
+        this.armored = builder.armored;
+        this.integrity = builder.integrity;
+        this.provider = builder.provider;
+        this.algorithm = builder.algorithm;
+        this.compressionAlgorithm = builder.compressionAlgorithm;
+        this.hashAlgorithm = builder.hashAlgorithm;
+        this.signatureVerificationOption = builder.signatureVerificationOption;
+    }
+
     public String getSignatureKeyUserid() {
         return signatureKeyUserid;
     }
@@ -246,4 +266,168 @@ public class PGPDataFormat extends DataFormatDefinition {
     public void setSignatureVerificationOption(String signatureVerificationOption) {
         this.signatureVerificationOption = signatureVerificationOption;
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link PGPDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<PGPDataFormat> {
+
+        private String keyUserid;
+        private String signatureKeyUserid;
+        private String password;
+        private String signaturePassword;
+        private String keyFileName;
+        private String signatureKeyFileName;
+        private String signatureKeyRing;
+        private String armored = "false";
+        private String integrity = "true";
+        private String provider;
+        private String algorithm;
+        private String compressionAlgorithm;
+        private String hashAlgorithm;
+        private String signatureVerificationOption;
+
+        /**
+         * User ID of the key in the PGP keyring used for signing (during encryption) or signature verification (during
+         * decryption). During the signature verification process the specified User ID restricts the public keys from
+         * the public keyring which can be used for the verification. If no User ID is specified for the signature
+         * verficiation then any public key in the public keyring can be used for the verification. Can also be only a
+         * part of a user ID. For example, if the user ID is "Test User <te...@camel.com>" then you can use the part
+         * "Test User" or "<te...@camel.com>" to address the User ID.
+         */
+        public Builder signatureKeyUserid(String signatureKeyUserid) {
+            this.signatureKeyUserid = signatureKeyUserid;
+            return this;
+        }
+
+        /**
+         * Password used when opening the private key used for signing (during encryption).
+         */
+        public Builder signaturePassword(String signaturePassword) {
+            this.signaturePassword = signaturePassword;
+            return this;
+        }
+
+        /**
+         * Filename of the keyring to use for signing (during encryption) or for signature verification (during
+         * decryption); must be accessible as a classpath resource (but you can specify a location in the file system by
+         * using the "file:" prefix).
+         */
+        public Builder signatureKeyFileName(String signatureKeyFileName) {
+            this.signatureKeyFileName = signatureKeyFileName;
+            return this;
+        }
+
+        /**
+         * Keyring used for signing/verifying as byte array. You can not set the signatureKeyFileName and
+         * signatureKeyRing at the same time.
+         */
+        public Builder signatureKeyRing(String signatureKeyRing) {
+            this.signatureKeyRing = signatureKeyRing;
+            return this;
+        }
+
+        /**
+         * Signature hash algorithm; possible values are defined in org.bouncycastle.bcpg.HashAlgorithmTags; for example
+         * 2 (= SHA1), 8 (= SHA256), 9 (= SHA384), 10 (= SHA512), 11 (=SHA224). Only relevant for signing.
+         */
+        public Builder hashAlgorithm(String hashAlgorithm) {
+            this.hashAlgorithm = hashAlgorithm;
+            return this;
+        }
+
+        /**
+         * This option will cause PGP to base64 encode the encrypted text, making it available for copy/paste, etc.
+         */
+        public Builder armored(String armored) {
+            this.armored = armored;
+            return this;
+        }
+
+        /**
+         * Adds an integrity check/sign into the encryption file.
+         * <p/>
+         * The default value is true.
+         */
+        public Builder integrity(String integrity) {
+            this.integrity = integrity;
+            return this;
+        }
+
+        /**
+         * Filename of the keyring; must be accessible as a classpath resource (but you can specify a location in the
+         * file system by using the "file:" prefix).
+         */
+        public Builder keyFileName(String keyFileName) {
+            this.keyFileName = keyFileName;
+            return this;
+        }
+
+        /**
+         * The user ID of the key in the PGP keyring used during encryption. Can also be only a part of a user ID. For
+         * example, if the user ID is "Test User <te...@camel.com>" then you can use the part "Test User" or
+         * "<te...@camel.com>" to address the user ID.
+         */
+        public Builder keyUserid(String keyUserid) {
+            this.keyUserid = keyUserid;
+            return this;
+        }
+
+        /**
+         * Symmetric key encryption algorithm; possible values are defined in
+         * org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags; for example 2 (= TRIPLE DES), 3 (= CAST5), 4 (= BLOWFISH), 6
+         * (= DES), 7 (= AES_128). Only relevant for encrypting.
+         */
+        public Builder algorithm(String algorithm) {
+            this.algorithm = algorithm;
+            return this;
+        }
+
+        /**
+         * Compression algorithm; possible values are defined in org.bouncycastle.bcpg.CompressionAlgorithmTags; for
+         * example 0 (= UNCOMPRESSED), 1 (= ZIP), 2 (= ZLIB), 3 (= BZIP2). Only relevant for encrypting.
+         */
+        public Builder compressionAlgorithm(String compressionAlgorithm) {
+            this.compressionAlgorithm = compressionAlgorithm;
+            return this;
+        }
+
+        /**
+         * Password used when opening the private key (not used for encryption).
+         */
+        public Builder password(String password) {
+            this.password = password;
+            return this;
+        }
+
+        /**
+         * Java Cryptography Extension (JCE) provider, default is Bouncy Castle ("BC"). Alternatively you can use, for
+         * example, the IAIK JCE provider; in this case the provider must be registered beforehand and the Bouncy Castle
+         * provider must not be registered beforehand. The Sun JCE provider does not work.
+         */
+        public Builder provider(String provider) {
+            this.provider = provider;
+            return this;
+        }
+
+        /**
+         * Controls the behavior for verifying the signature during unmarshaling. There are 4 values possible:
+         * "optional": The PGP message may or may not contain signatures; if it does contain signatures, then a
+         * signature verification is executed. "required": The PGP message must contain at least one signature; if this
+         * is not the case an exception (PGPException) is thrown. A signature verification is executed. "ignore":
+         * Contained signatures in the PGP message are ignored; no signature verification is executed.
+         * "no_signature_allowed": The PGP message must not contain a signature; otherwise an exception (PGPException)
+         * is thrown.
+         */
+        public Builder signatureVerificationOption(String signatureVerificationOption) {
+            this.signatureVerificationOption = signatureVerificationOption;
+            return this;
+        }
+
+        @Override
+        public PGPDataFormat end() {
+            return new PGPDataFormat(this);
+        }
+    }
 }
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 7380e8d457c..47b2107a23d 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
@@ -22,6 +22,7 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -121,6 +122,35 @@ public class ProtobufDataFormat extends DataFormatDefinition implements ContentT
         setContentTypeFormat(contentTypeFormat);
     }
 
+    private ProtobufDataFormat(Builder builder) {
+        this();
+        this.defaultInstance = builder.defaultInstance;
+        this.instanceClass = builder.instanceClass;
+        this.objectMapper = builder.objectMapper;
+        this.useDefaultObjectMapper = builder.useDefaultObjectMapper;
+        this.autoDiscoverObjectMapper = builder.autoDiscoverObjectMapper;
+        this.library = builder.library;
+        this.unmarshalTypeName = builder.unmarshalTypeName;
+        this.unmarshalType = builder.unmarshalType;
+        this.jsonViewTypeName = builder.jsonViewTypeName;
+        this.jsonView = builder.jsonView;
+        this.include = builder.include;
+        this.allowJmsType = builder.allowJmsType;
+        this.collectionTypeName = builder.collectionTypeName;
+        this.collectionType = builder.collectionType;
+        this.useList = builder.useList;
+        this.moduleClassNames = builder.moduleClassNames;
+        this.moduleRefs = builder.moduleRefs;
+        this.enableFeatures = builder.enableFeatures;
+        this.disableFeatures = builder.disableFeatures;
+        this.allowUnmarshallType = builder.allowUnmarshallType;
+        this.timezone = builder.timezone;
+        this.schemaResolver = builder.schemaResolver;
+        this.autoDiscoverSchemaResolver = builder.autoDiscoverSchemaResolver;
+        this.contentTypeFormat = builder.contentTypeFormat;
+        this.contentTypeHeader = builder.contentTypeHeader;
+    }
+
     @Override
     public String getDataFormatName() {
         // protobuf data format is special as the name can be from different bundles
@@ -513,4 +543,258 @@ public class ProtobufDataFormat extends DataFormatDefinition implements ContentT
         return this;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link ProtobufDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<ProtobufDataFormat> {
+        private Object defaultInstance;
+        private String instanceClass;
+        private String objectMapper;
+        private String useDefaultObjectMapper = "true";
+        private String autoDiscoverObjectMapper = "false";
+        private ProtobufLibrary library = ProtobufLibrary.GoogleProtobuf;
+        private String unmarshalTypeName;
+        private Class<?> unmarshalType;
+        private String jsonViewTypeName;
+        private Class<?> jsonView;
+        private String include;
+        private String allowJmsType;
+        private String collectionTypeName;
+        private Class<?> collectionType;
+        private String useList;
+        private String moduleClassNames;
+        private String moduleRefs;
+        private String enableFeatures;
+        private String disableFeatures;
+        private String allowUnmarshallType;
+        private String timezone;
+        private String schemaResolver;
+        private String autoDiscoverSchemaResolver = "true";
+        private String contentTypeFormat = "native";
+        private String contentTypeHeader = "true";
+
+        /**
+         * Name of class to use when unmarshalling
+         */
+        public Builder instanceClass(String instanceClass) {
+            this.instanceClass = instanceClass;
+            return this;
+        }
+
+        /**
+         * Defines a content type format in which protobuf message will be serialized/deserialized from(to) the Java
+         * been. The format can either be native or json for either native protobuf or json fields representation. The
+         * default value is native.
+         */
+        public Builder contentTypeFormat(String contentTypeFormat) {
+            this.contentTypeFormat = contentTypeFormat;
+            return this;
+        }
+
+        public Builder contentTypeHeader(String contentTypeHeader) {
+            this.contentTypeHeader = contentTypeHeader;
+            return this;
+        }
+
+        public Builder defaultInstance(Object defaultInstance) {
+            this.defaultInstance = defaultInstance;
+            return this;
+        }
+
+        /**
+         * Which Protobuf library to use.
+         */
+        public Builder library(ProtobufLibrary library) {
+            this.library = library;
+            return this;
+        }
+
+        /**
+         * Lookup and use the existing ObjectMapper with the given id when using Jackson.
+         */
+        public Builder objectMapper(String objectMapper) {
+            this.objectMapper = objectMapper;
+            return this;
+        }
+
+        /**
+         * Whether to lookup and use default Jackson ObjectMapper from the registry.
+         */
+        public Builder useDefaultObjectMapper(String useDefaultObjectMapper) {
+            this.useDefaultObjectMapper = useDefaultObjectMapper;
+            return this;
+        }
+
+        /**
+         * Class name of the java type to use when unmarshalling
+         */
+        public Builder unmarshalTypeName(String unmarshalTypeName) {
+            this.unmarshalTypeName = unmarshalTypeName;
+            return this;
+        }
+
+        /**
+         * Class of the java type to use when unmarshalling
+         */
+        public Builder unmarshalType(Class<?> unmarshalType) {
+            this.unmarshalType = unmarshalType;
+            return this;
+        }
+
+        /**
+         * When marshalling a POJO to JSON you might want to exclude certain fields from the JSON output. With Jackson
+         * you can use JSON views to accomplish this. This option is to refer to the class which has @JsonView
+         * annotations
+         */
+        public Builder jsonViewTypeName(String jsonViewTypeName) {
+            this.jsonViewTypeName = jsonViewTypeName;
+            return this;
+        }
+
+        /**
+         * When marshalling a POJO to JSON you might want to exclude certain fields from the JSON output. With Jackson
+         * you can use JSON views to accomplish this. This option is to refer to the class which has @JsonView
+         * annotations
+         */
+        public Builder jsonView(Class<?> jsonView) {
+            this.jsonView = jsonView;
+            return this;
+        }
+
+        /**
+         * If you want to marshal a pojo to JSON, and the pojo has some fields with null values. And you want to skip
+         * these null values, you can set this option to <tt>NON_NULL</tt>
+         */
+        public Builder include(String include) {
+            this.include = include;
+            return this;
+        }
+
+        /**
+         * Used for JMS users to allow the JMSType header from the JMS spec to specify a FQN classname to use to
+         * unmarshal to.
+         */
+        public Builder allowJmsType(String allowJmsType) {
+            this.allowJmsType = allowJmsType;
+            return this;
+        }
+
+        /**
+         * Refers to a custom collection type to lookup in the registry to use. This option should rarely be used, but
+         * allows to use different collection types than java.util.Collection based as default.
+         */
+        public Builder collectionTypeName(String collectionTypeName) {
+            this.collectionTypeName = collectionTypeName;
+            return this;
+        }
+
+        public Builder collectionType(Class<?> collectionType) {
+            this.collectionType = collectionType;
+            return this;
+        }
+
+        /**
+         * To unmarshal to a List of Map or a List of Pojo.
+         */
+        public Builder useList(String useList) {
+            this.useList = useList;
+            return this;
+        }
+
+        /**
+         * To use custom Jackson modules com.fasterxml.jackson.databind.Module specified as a String with FQN class
+         * names. Multiple classes can be separated by comma.
+         */
+        public Builder moduleClassNames(String moduleClassNames) {
+            this.moduleClassNames = moduleClassNames;
+            return this;
+        }
+
+        /**
+         * To use custom Jackson modules referred from the Camel registry. Multiple modules can be separated by comma.
+         */
+        public Builder moduleRefs(String moduleRefs) {
+            this.moduleRefs = moduleRefs;
+            return this;
+        }
+
+        /**
+         * Set of features to enable on the Jackson <tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
+         * <p/>
+         * The features should be a name that matches a enum from
+         * <tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
+         * <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or
+         * <tt>com.fasterxml.jackson.databind.MapperFeature</tt>
+         * <p/>
+         * Multiple features can be separated by comma
+         */
+        public Builder enableFeatures(String enableFeatures) {
+            this.enableFeatures = enableFeatures;
+            return this;
+        }
+
+        /**
+         * Set of features to disable on the Jackson <tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
+         * <p/>
+         * The features should be a name that matches a enum from
+         * <tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
+         * <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or
+         * <tt>com.fasterxml.jackson.databind.MapperFeature</tt>
+         * <p/>
+         * Multiple features can be separated by comma
+         */
+        public Builder disableFeatures(String disableFeatures) {
+            this.disableFeatures = disableFeatures;
+            return this;
+        }
+
+        /**
+         * If enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header during the
+         * unmarshalling.
+         * <p/>
+         * This should only be enabled when desired to be used.
+         */
+        public Builder allowUnmarshallType(String allowUnmarshallType) {
+            this.allowUnmarshallType = allowUnmarshallType;
+            return this;
+        }
+
+        /**
+         * If set then Jackson will use the Timezone when marshalling/unmarshalling.
+         */
+        public Builder timezone(String timezone) {
+            this.timezone = timezone;
+            return this;
+        }
+
+        /**
+         * If set to true then Jackson will lookup for an objectMapper into the registry
+         */
+        public Builder autoDiscoverObjectMapper(String autoDiscoverObjectMapper) {
+            this.autoDiscoverObjectMapper = autoDiscoverObjectMapper;
+            return this;
+        }
+
+        /**
+         * Optional schema resolver used to lookup schemas for the data in transit.
+         */
+        public Builder schemaResolver(String schemaResolver) {
+            this.schemaResolver = schemaResolver;
+            return this;
+        }
+
+        /**
+         * When not disabled, the SchemaResolver will be looked up into the registry
+         */
+        public Builder autoDiscoverSchemaResolver(String autoDiscoverSchemaResolver) {
+            this.autoDiscoverSchemaResolver = autoDiscoverSchemaResolver;
+            return this;
+        }
+
+        @Override
+        public ProtobufDataFormat end() {
+            return new ProtobufDataFormat(this);
+        }
+    }
 }
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 7081df94353..7b41fc60126 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
@@ -19,7 +19,9 @@ package org.apache.camel.model.dataformat;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -35,4 +37,14 @@ public class RssDataFormat extends DataFormatDefinition {
         super("rss");
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link RssDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<RssDataFormat> {
+        @Override
+        public RssDataFormat end() {
+            return new 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 11c16f00ac5..aad760a6f7c 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
@@ -22,6 +22,7 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -72,6 +73,17 @@ public class SoapDataFormat extends DataFormatDefinition {
         setElementNameStrategy(elementNameStrategy);
     }
 
+    private SoapDataFormat(Builder builder) {
+        this();
+        this.contextPath = builder.contextPath;
+        this.encoding = builder.encoding;
+        this.elementNameStrategyRef = builder.elementNameStrategyRef;
+        this.elementNameStrategy = builder.elementNameStrategy;
+        this.version = builder.version;
+        this.namespacePrefixRef = builder.namespacePrefixRef;
+        this.schema = builder.schema;
+    }
+
     /**
      * Package name where your JAXB classes are located.
      */
@@ -186,4 +198,116 @@ public class SoapDataFormat extends DataFormatDefinition {
         this.schema = schema;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link SoapDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<SoapDataFormat> {
+
+        private String contextPath;
+        private String encoding;
+        private String elementNameStrategyRef;
+        private Object elementNameStrategy;
+        private String version = "1.1";
+        private String namespacePrefixRef;
+        private String schema;
+
+        /**
+         * Package name where your JAXB classes are located.
+         */
+        public Builder contextPath(String contextPath) {
+            this.contextPath = contextPath;
+            return this;
+        }
+
+        /**
+         * To overrule and use a specific encoding
+         */
+        public Builder encoding(String encoding) {
+            this.encoding = encoding;
+            return this;
+        }
+
+        /**
+         * Refers to an element strategy to lookup from the registry.
+         * <p/>
+         * An element name strategy is used for two purposes. The first is to find a xml element name for a given object
+         * and soap action when marshaling the object into a SOAP message. The second is to find an Exception class for
+         * a given soap fault name.
+         * <p/>
+         * The following three element strategy class name is provided out of the box. QNameStrategy - Uses a fixed
+         * qName that is configured on instantiation. Exception lookup is not supported TypeNameStrategy - Uses the name
+         * and namespace from the @XMLType annotation of the given type. If no namespace is set then package-info is
+         * used. Exception lookup is not supported ServiceInterfaceStrategy - Uses information from a webservice
+         * interface to determine the type name and to find the exception class for a SOAP fault
+         * <p/>
+         * All three classes is located in the package name org.apache.camel.dataformat.soap.name
+         * <p/>
+         * If you have generated the web service stub code with cxf-codegen or a similar tool then you probably will
+         * want to use the ServiceInterfaceStrategy. In the case you have no annotated service interface you should use
+         * QNameStrategy or TypeNameStrategy.
+         */
+        public Builder elementNameStrategyRef(String elementNameStrategyRef) {
+            this.elementNameStrategyRef = elementNameStrategyRef;
+            return this;
+        }
+
+        /**
+         * SOAP version should either be 1.1 or 1.2.
+         * <p/>
+         * Is by default 1.1
+         */
+        public Builder version(String version) {
+            this.version = version;
+            return this;
+        }
+
+        /**
+         * Sets an element strategy instance to use.
+         * <p/>
+         * An element name strategy is used for two purposes. The first is to find a xml element name for a given object
+         * and soap action when marshaling the object into a SOAP message. The second is to find an Exception class for
+         * a given soap fault name.
+         * <p/>
+         * The following three element strategy class name is provided out of the box. QNameStrategy - Uses a fixed
+         * qName that is configured on instantiation. Exception lookup is not supported TypeNameStrategy - Uses the name
+         * and namespace from the @XMLType annotation of the given type. If no namespace is set then package-info is
+         * used. Exception lookup is not supported ServiceInterfaceStrategy - Uses information from a webservice
+         * interface to determine the type name and to find the exception class for a SOAP fault
+         * <p/>
+         * All three classes is located in the package name org.apache.camel.dataformat.soap.name
+         * <p/>
+         * If you have generated the web service stub code with cxf-codegen or a similar tool then you probably will
+         * want to use the ServiceInterfaceStrategy. In the case you have no annotated service interface you should use
+         * QNameStrategy or TypeNameStrategy.
+         */
+        public Builder elementNameStrategy(Object elementNameStrategy) {
+            this.elementNameStrategy = elementNameStrategy;
+            return this;
+        }
+
+        /**
+         * When marshalling using JAXB or SOAP then the JAXB implementation will automatic assign namespace prefixes,
+         * such as ns2, ns3, ns4 etc. To control this mapping, Camel allows you to refer to a map which contains the
+         * desired mapping.
+         */
+        public Builder namespacePrefixRef(String namespacePrefixRef) {
+            this.namespacePrefixRef = namespacePrefixRef;
+            return this;
+        }
+
+        /**
+         * To validate against an existing schema. Your can use the prefix classpath:, file:* or *http: to specify how
+         * the resource should be resolved. You can separate multiple schema files by using the ',' character.
+         */
+        public Builder schema(String schema) {
+            this.schema = schema;
+            return this;
+        }
+
+        @Override
+        public SoapDataFormat end() {
+            return new SoapDataFormat(this);
+        }
+    }
 }
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 163cb85e40e..02452d6123a 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -45,6 +47,11 @@ public class SwiftMtDataFormat extends DataFormatDefinition {
         this.writeInJson = writeInJson;
     }
 
+    private SwiftMtDataFormat(Builder builder) {
+        this();
+        this.writeInJson = builder.writeInJson;
+    }
+
     public String getWriteInJson() {
         return writeInJson;
     }
@@ -58,4 +65,37 @@ public class SwiftMtDataFormat extends DataFormatDefinition {
         this.writeInJson = writeInJson;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link SwiftMtDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<SwiftMtDataFormat> {
+
+        private String writeInJson;
+
+        /**
+         * The flag indicating that messages must be marshalled in a JSON format.
+         *
+         * @param writeInJson {@code true} if messages must be marshalled in a JSON format, {@code false} otherwise.
+         */
+        public Builder writeInJson(String writeInJson) {
+            this.writeInJson = writeInJson;
+            return this;
+        }
+
+        /**
+         * The flag indicating that messages must be marshalled in a JSON format.
+         *
+         * @param writeInJson {@code true} if messages must be marshalled in a JSON format, {@code false} otherwise.
+         */
+        public Builder writeInJson(boolean writeInJson) {
+            this.writeInJson = Boolean.toString(writeInJson);
+            return this;
+        }
+
+        @Override
+        public SwiftMtDataFormat end() {
+            return new SwiftMtDataFormat(this);
+        }
+    }
 }
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 63d06f30a13..133eb0113f8 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
@@ -22,6 +22,7 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -85,6 +86,16 @@ public class SwiftMxDataFormat extends DataFormatDefinition {
         this.readConfigRef = readConfigRef;
     }
 
+    private SwiftMxDataFormat(Builder builder) {
+        this();
+        this.writeConfigRef = builder.writeConfigRef;
+        this.writeConfig = builder.writeConfig;
+        this.writeInJson = builder.writeInJson;
+        this.readMessageId = builder.readMessageId;
+        this.readConfigRef = builder.readConfigRef;
+        this.readConfig = builder.readConfig;
+    }
+
     public Object getWriteConfig() {
         return writeConfig;
     }
@@ -153,4 +164,84 @@ public class SwiftMxDataFormat extends DataFormatDefinition {
     public void setReadConfigRef(String readConfigRef) {
         this.readConfigRef = readConfigRef;
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link SwiftMxDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<SwiftMxDataFormat> {
+
+        private String writeConfigRef;
+        private Object writeConfig;
+        private String writeInJson;
+        private String readMessageId;
+        private String readConfigRef;
+        private Object readConfig;
+
+        /**
+         * The specific configuration to use when marshalling a message.
+         */
+        public Builder writeConfig(Object writeConfig) {
+            this.writeConfig = writeConfig;
+            return this;
+        }
+
+        /**
+         * The flag indicating that messages must be marshalled in a JSON format.
+         *
+         * @param writeInJson {@code true} if messages must be marshalled in a JSON format, {@code false} otherwise.
+         */
+        public Builder writeInJson(String writeInJson) {
+            this.writeInJson = writeInJson;
+            return this;
+        }
+
+        /**
+         * The flag indicating that messages must be marshalled in a JSON format.
+         *
+         * @param writeInJson {@code true} if messages must be marshalled in a JSON format, {@code false} otherwise.
+         */
+        public Builder writeInJson(boolean writeInJson) {
+            this.writeInJson = Boolean.toString(writeInJson);
+            return this;
+        }
+
+        /**
+         * The type of MX message to produce when unmarshalling an input stream. If not set, it will be automatically
+         * detected from the namespace used.
+         */
+        public Builder readMessageId(String readMessageId) {
+            this.readMessageId = readMessageId;
+            return this;
+        }
+
+        /**
+         * The specific configuration to use when unmarshalling an input stream.
+         */
+        public Builder readConfig(Object readConfig) {
+            this.readConfig = readConfig;
+            return this;
+        }
+
+        /**
+         * Refers to a specific configuration to use when marshalling a message to lookup from the registry.
+         */
+        public Builder writeConfigRef(String writeConfigRef) {
+            this.writeConfigRef = writeConfigRef;
+            return this;
+        }
+
+        /**
+         * Refers to a specific configuration to use when unmarshalling an input stream to lookup from the registry.
+         */
+        public Builder readConfigRef(String readConfigRef) {
+            this.readConfigRef = readConfigRef;
+            return this;
+        }
+
+        @Override
+        public SwiftMxDataFormat end() {
+            return new SwiftMxDataFormat(this);
+        }
+    }
 }
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 0127ce2bd25..5928cbca907 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
@@ -19,7 +19,9 @@ package org.apache.camel.model.dataformat;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -34,4 +36,15 @@ public class SyslogDataFormat extends DataFormatDefinition {
     public SyslogDataFormat() {
         super("syslog");
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link SyslogDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<SyslogDataFormat> {
+        @Override
+        public SyslogDataFormat end() {
+            return new 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 92de50f94e9..76279d5e21a 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -49,6 +51,13 @@ public class TarFileDataFormat extends DataFormatDefinition {
         super("tarFile");
     }
 
+    private TarFileDataFormat(Builder builder) {
+        this.usingIterator = builder.usingIterator;
+        this.allowEmptyDirectory = builder.allowEmptyDirectory;
+        this.preservePathElements = builder.preservePathElements;
+        this.maxDecompressedSize = builder.maxDecompressedSize;
+    }
+
     public String getUsingIterator() {
         return usingIterator;
     }
@@ -100,4 +109,59 @@ public class TarFileDataFormat extends DataFormatDefinition {
         this.maxDecompressedSize = maxDecompressedSize;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link TarFileDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<TarFileDataFormat> {
+
+        private String usingIterator;
+        private String allowEmptyDirectory;
+        private String preservePathElements;
+        private String maxDecompressedSize = "1073741824";
+
+        /**
+         * If the tar file has more than one entry, the setting this option to true, allows working with the splitter
+         * EIP, to split the data using an iterator in a streaming mode.
+         */
+        public Builder usingIterator(String usingIterator) {
+            this.usingIterator = usingIterator;
+            return this;
+        }
+
+        /**
+         * If the tar file has more than one entry, setting this option to true, allows to get the iterator even if the
+         * directory is empty
+         */
+        public Builder allowEmptyDirectory(String allowEmptyDirectory) {
+            this.allowEmptyDirectory = allowEmptyDirectory;
+            return this;
+        }
+
+        /**
+         * If the file name contains path elements, setting this option to true, allows the path to be maintained in the
+         * tar file.
+         */
+        public Builder preservePathElements(String preservePathElements) {
+            this.preservePathElements = preservePathElements;
+            return this;
+        }
+
+        /**
+         * Set the maximum decompressed size of a tar file (in bytes). The default value if not specified corresponds to
+         * 1 gigabyte. An IOException will be thrown if the decompressed size exceeds this amount. Set to -1 to disable
+         * setting a maximum decompressed size.
+         *
+         * @param maxDecompressedSize the maximum decompressed size of a tar file (in bytes)
+         */
+        public Builder maxDecompressedSize(String maxDecompressedSize) {
+            this.maxDecompressedSize = maxDecompressedSize;
+            return this;
+        }
+
+        @Override
+        public TarFileDataFormat end() {
+            return new TarFileDataFormat(this);
+        }
+    }
 }
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 bf5c5c26cec..f65d14a4140 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
@@ -22,6 +22,7 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -62,6 +63,14 @@ public class ThriftDataFormat extends DataFormatDefinition implements ContentTyp
         setContentTypeFormat(contentTypeFormat);
     }
 
+    private ThriftDataFormat(Builder builder) {
+        this();
+        this.defaultInstance = builder.defaultInstance;
+        this.instanceClass = builder.instanceClass;
+        this.contentTypeFormat = builder.contentTypeFormat;
+        this.contentTypeHeader = builder.contentTypeHeader;
+    }
+
     public String getInstanceClass() {
         return instanceClass;
     }
@@ -102,4 +111,48 @@ public class ThriftDataFormat extends DataFormatDefinition implements ContentTyp
         this.defaultInstance = defaultInstance;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link ThriftDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<ThriftDataFormat> {
+
+        private Object defaultInstance;
+        private String instanceClass;
+        private String contentTypeFormat = "binary";
+        private String contentTypeHeader = "true";
+
+        /**
+         * Name of class to use when unmarshalling
+         */
+        public Builder instanceClass(String instanceClass) {
+            this.instanceClass = instanceClass;
+            return this;
+        }
+
+        /**
+         * Defines a content type format in which thrift message will be serialized/deserialized from(to) the Java been.
+         * The format can either be native or json for either native binary thrift, json or simple json fields
+         * representation. The default value is binary.
+         */
+        public Builder contentTypeFormat(String contentTypeFormat) {
+            this.contentTypeFormat = contentTypeFormat;
+            return this;
+        }
+
+        public Builder contentTypeHeader(String contentTypeHeader) {
+            this.contentTypeHeader = contentTypeHeader;
+            return this;
+        }
+
+        public Builder defaultInstance(Object defaultInstance) {
+            this.defaultInstance = defaultInstance;
+            return this;
+        }
+
+        @Override
+        public ThriftDataFormat end() {
+            return new ThriftDataFormat(this);
+        }
+    }
 }
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 0d0334e03a5..fdf2e21d3f6 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
@@ -24,6 +24,7 @@ import javax.xml.bind.annotation.XmlTransient;
 
 import org.w3c.dom.Node;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -59,6 +60,13 @@ public class TidyMarkupDataFormat extends DataFormatDefinition {
         this.setDataObjectType(dataObjectType);
     }
 
+    private TidyMarkupDataFormat(Builder builder) {
+        this();
+        this.dataObjectType = builder.dataObjectType;
+        this.dataObjectTypeName = builder.dataObjectTypeName;
+        this.omitXmlDeclaration = builder.omitXmlDeclaration;
+    }
+
     /**
      * What data type to unmarshal as, can either be org.w3c.dom.Node or java.lang.String.
      * <p/>
@@ -96,4 +104,47 @@ public class TidyMarkupDataFormat extends DataFormatDefinition {
         this.omitXmlDeclaration = omitXmlDeclaration;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link TidyMarkupDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<TidyMarkupDataFormat> {
+
+        private Class<?> dataObjectType;
+        private String dataObjectTypeName = "org.w3c.dom.Node";
+        private String omitXmlDeclaration;
+
+        /**
+         * What data type to unmarshal as, can either be org.w3c.dom.Node or java.lang.String.
+         * <p/>
+         * Is by default org.w3c.dom.Node
+         */
+        public Builder dataObjectType(Class<?> dataObjectType) {
+            this.dataObjectType = dataObjectType;
+            return this;
+        }
+
+        /**
+         * What data type to unmarshal as, can either be org.w3c.dom.Node or java.lang.String.
+         * <p/>
+         * Is by default org.w3c.dom.Node
+         */
+        public Builder dataObjectTypeName(String dataObjectTypeName) {
+            this.dataObjectTypeName = dataObjectTypeName;
+            return this;
+        }
+
+        /**
+         * When returning a String, do we omit the XML declaration in the top.
+         */
+        public Builder omitXmlDeclaration(String omitXmlDeclaration) {
+            this.omitXmlDeclaration = omitXmlDeclaration;
+            return this;
+        }
+
+        @Override
+        public TidyMarkupDataFormat end() {
+            return new TidyMarkupDataFormat(this);
+        }
+    }
 }
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 6ee3d37d351..5a9ce8df80b 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
@@ -22,7 +22,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -83,6 +85,24 @@ public abstract class UniVocityAbstractDataFormat extends DataFormatDefinition {
         super(dataFormatName);
     }
 
+    protected UniVocityAbstractDataFormat(String dataFormatName, AbstractBuilder<?, ?> builder) {
+        this(dataFormatName);
+        this.nullValue = builder.nullValue;
+        this.skipEmptyLines = builder.skipEmptyLines;
+        this.ignoreTrailingWhitespaces = builder.ignoreTrailingWhitespaces;
+        this.ignoreLeadingWhitespaces = builder.ignoreLeadingWhitespaces;
+        this.headersDisabled = builder.headersDisabled;
+        this.headers = builder.headers;
+        this.headerExtractionEnabled = builder.headerExtractionEnabled;
+        this.numberOfRecordsToRead = builder.numberOfRecordsToRead;
+        this.emptyValue = builder.emptyValue;
+        this.lineSeparator = builder.lineSeparator;
+        this.normalizedLineSeparator = builder.normalizedLineSeparator;
+        this.comment = builder.comment;
+        this.lazyLoad = builder.lazyLoad;
+        this.asMap = builder.asMap;
+    }
+
     public String getNullValue() {
         return nullValue;
     }
@@ -114,7 +134,7 @@ public abstract class UniVocityAbstractDataFormat extends DataFormatDefinition {
     }
 
     /**
-     * Whether or not the trailing white spaces must ignored.
+     * Whether or not the trailing white spaces must be ignored.
      * <p/>
      * The default value is true
      */
@@ -262,4 +282,164 @@ public abstract class UniVocityAbstractDataFormat extends DataFormatDefinition {
         this.asMap = asMap;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link UniVocityAbstractDataFormat}.
+     */
+    @XmlTransient
+    @SuppressWarnings("unchecked")
+    abstract static class AbstractBuilder<T extends AbstractBuilder<T, F>, F extends UniVocityAbstractDataFormat>
+            implements DataFormatBuilder<F> {
+
+        private String nullValue;
+        private String skipEmptyLines = "true";
+        private String ignoreTrailingWhitespaces = "true";
+        private String ignoreLeadingWhitespaces = "true";
+        private String headersDisabled;
+        private List<UniVocityHeader> headers;
+        private String headerExtractionEnabled;
+        private String numberOfRecordsToRead;
+        private String emptyValue;
+        private String lineSeparator;
+        private String normalizedLineSeparator = "\\n";
+        private String comment = "#";
+        private String lazyLoad;
+        private String asMap;
+
+        /**
+         * The string representation of a null value.
+         * <p/>
+         * The default value is null
+         */
+        public T nullValue(String nullValue) {
+            this.nullValue = nullValue;
+            return (T) this;
+        }
+
+        /**
+         * Whether or not the empty lines must be ignored.
+         * <p/>
+         * The default value is true
+         */
+        public T skipEmptyLines(String skipEmptyLines) {
+            this.skipEmptyLines = skipEmptyLines;
+            return (T) this;
+        }
+
+        /**
+         * Whether or not the trailing white spaces must be ignored.
+         * <p/>
+         * The default value is true
+         */
+        public T ignoreTrailingWhitespaces(String ignoreTrailingWhitespaces) {
+            this.ignoreTrailingWhitespaces = ignoreTrailingWhitespaces;
+            return (T) this;
+        }
+
+        /**
+         * Whether or not the leading white spaces must be ignored.
+         * <p/>
+         * The default value is true
+         */
+        public T ignoreLeadingWhitespaces(String ignoreLeadingWhitespaces) {
+            this.ignoreLeadingWhitespaces = ignoreLeadingWhitespaces;
+            return (T) this;
+        }
+
+        /**
+         * Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which
+         * indicates that there is no header.
+         * <p/>
+         * The default value is false
+         */
+        public T headersDisabled(String headersDisabled) {
+            this.headersDisabled = headersDisabled;
+            return (T) this;
+        }
+
+        /**
+         * The headers to use.
+         */
+        public T headers(List<UniVocityHeader> headers) {
+            this.headers = headers;
+            return (T) this;
+        }
+
+        /**
+         * Whether or not the header must be read in the first line of the test document
+         * <p/>
+         * The default value is false
+         */
+        public T headerExtractionEnabled(String headerExtractionEnabled) {
+            this.headerExtractionEnabled = headerExtractionEnabled;
+            return (T) this;
+        }
+
+        /**
+         * The maximum number of record to read.
+         */
+        public T numberOfRecordsToRead(String numberOfRecordsToRead) {
+            this.numberOfRecordsToRead = numberOfRecordsToRead;
+            return (T) this;
+        }
+
+        /**
+         * The String representation of an empty value
+         */
+        public T emptyValue(String emptyValue) {
+            this.emptyValue = emptyValue;
+            return (T) this;
+        }
+
+        /**
+         * The line separator of the files
+         * <p/>
+         * The default value is to use the JVM platform line separator
+         */
+        public T lineSeparator(String lineSeparator) {
+            this.lineSeparator = lineSeparator;
+            return (T) this;
+        }
+
+        /**
+         * The normalized line separator of the files
+         * <p/>
+         * The default value is a new line character.
+         */
+        public T normalizedLineSeparator(String normalizedLineSeparator) {
+            this.normalizedLineSeparator = normalizedLineSeparator;
+            return (T) this;
+        }
+
+        /**
+         * The comment symbol.
+         * <p/>
+         * The default value is #
+         */
+        public T comment(String comment) {
+            this.comment = comment;
+            return (T) this;
+        }
+
+        /**
+         * Whether the unmarshalling should produce an iterator that reads the lines on the fly or if all the lines must
+         * be read at one.
+         * <p/>
+         * The default value is false
+         */
+        public T lazyLoad(String lazyLoad) {
+            this.lazyLoad = lazyLoad;
+            return (T) this;
+        }
+
+        /**
+         * Whether the unmarshalling should produce maps for the lines values instead of lists. It requires to have
+         * header (either defined or collected).
+         * <p/>
+         * The default value is false
+         */
+        public T asMap(String asMap) {
+            this.asMap = asMap;
+            return (T) this;
+        }
+    }
 }
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 55263878eed..14bc3d9f864 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
@@ -20,6 +20,7 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.spi.Metadata;
 
@@ -48,6 +49,14 @@ public class UniVocityCsvDataFormat extends UniVocityAbstractDataFormat {
         super("univocityCsv");
     }
 
+    private UniVocityCsvDataFormat(Builder builder) {
+        super("univocityCsv", builder);
+        this.delimiter = builder.delimiter;
+        this.quoteAllFields = builder.quoteAllFields;
+        this.quote = builder.quote;
+        this.quoteEscape = builder.quoteEscape;
+    }
+
     public String getQuoteAllFields() {
         return quoteAllFields;
     }
@@ -92,4 +101,52 @@ public class UniVocityCsvDataFormat extends UniVocityAbstractDataFormat {
         this.delimiter = delimiter;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link UniVocityCsvDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder extends AbstractBuilder<Builder, UniVocityCsvDataFormat> {
+
+        private String delimiter = ",";
+        private String quoteAllFields;
+        private String quote = "\"";
+        private String quoteEscape = "\"";
+
+        /**
+         * Whether or not all values must be quoted when writing them.
+         */
+        public Builder quoteAllFields(String quoteAllFields) {
+            this.quoteAllFields = quoteAllFields;
+            return this;
+        }
+
+        /**
+         * The quote symbol.
+         */
+        public Builder quote(String quote) {
+            this.quote = quote;
+            return this;
+        }
+
+        /**
+         * The quote escape symbol
+         */
+        public Builder quoteEscape(String quoteEscape) {
+            this.quoteEscape = quoteEscape;
+            return this;
+        }
+
+        /**
+         * The delimiter of values
+         */
+        public Builder delimiter(String delimiter) {
+            this.delimiter = delimiter;
+            return this;
+        }
+
+        @Override
+        public UniVocityCsvDataFormat end() {
+            return new UniVocityCsvDataFormat(this);
+        }
+    }
 }
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 86812bfe6b0..c2ccd5d5e72 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
@@ -20,6 +20,7 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.spi.Metadata;
 
@@ -44,6 +45,13 @@ public class UniVocityFixedDataFormat extends UniVocityAbstractDataFormat {
         super("univocityFixed");
     }
 
+    private UniVocityFixedDataFormat(Builder builder) {
+        super("univocityFixed", builder);
+        this.padding = builder.padding;
+        this.skipTrailingCharsUntilNewline = builder.skipTrailingCharsUntilNewline;
+        this.recordEndsOnNewline = builder.recordEndsOnNewline;
+    }
+
     public String getSkipTrailingCharsUntilNewline() {
         return skipTrailingCharsUntilNewline;
     }
@@ -83,4 +91,49 @@ public class UniVocityFixedDataFormat extends UniVocityAbstractDataFormat {
         this.padding = padding;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link UniVocityFixedDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder extends AbstractBuilder<Builder, UniVocityFixedDataFormat> {
+
+        private String padding;
+        private String skipTrailingCharsUntilNewline;
+        private String recordEndsOnNewline;
+
+        /**
+         * Whether or not the trailing characters until new line must be ignored.
+         * <p/>
+         * The default value is false
+         */
+        public Builder skipTrailingCharsUntilNewline(String skipTrailingCharsUntilNewline) {
+            this.skipTrailingCharsUntilNewline = skipTrailingCharsUntilNewline;
+            return this;
+        }
+
+        /**
+         * Whether or not the record ends on new line.
+         * <p/>
+         * The default value is false
+         */
+        public Builder recordEndsOnNewline(String recordEndsOnNewline) {
+            this.recordEndsOnNewline = recordEndsOnNewline;
+            return this;
+        }
+
+        /**
+         * The padding character.
+         * <p/>
+         * The default value is a space
+         */
+        public Builder padding(String padding) {
+            this.padding = padding;
+            return this;
+        }
+
+        @Override
+        public UniVocityFixedDataFormat end() {
+            return new UniVocityFixedDataFormat(this);
+        }
+    }
 }
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 19582dec26a..c9419c412a1 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
@@ -20,6 +20,7 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.spi.Metadata;
 
@@ -39,6 +40,11 @@ public class UniVocityTsvDataFormat extends UniVocityAbstractDataFormat {
         super("univocityTsv");
     }
 
+    private UniVocityTsvDataFormat(Builder builder) {
+        super("univocityTsv", builder);
+        this.escapeChar = builder.escapeChar;
+    }
+
     public String getEscapeChar() {
         return escapeChar;
     }
@@ -50,4 +56,25 @@ public class UniVocityTsvDataFormat extends UniVocityAbstractDataFormat {
         this.escapeChar = escapeChar;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link UniVocityTsvDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder extends AbstractBuilder<Builder, UniVocityTsvDataFormat> {
+
+        private String escapeChar = "\\";
+
+        /**
+         * The escape character.
+         */
+        public Builder escapeChar(String escapeChar) {
+            this.escapeChar = escapeChar;
+            return this;
+        }
+
+        @Override
+        public UniVocityTsvDataFormat end() {
+            return new UniVocityTsvDataFormat(this);
+        }
+    }
 }
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 bff45667bb3..75d3c85d018 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
@@ -25,6 +25,7 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.NamespaceAware;
@@ -79,6 +80,24 @@ public class XMLSecurityDataFormat extends DataFormatDefinition implements Names
         super("xmlSecurity");
     }
 
+    private XMLSecurityDataFormat(Builder builder) {
+        this();
+        this.xmlCipherAlgorithm = builder.xmlCipherAlgorithm;
+        this.passPhrase = builder.passPhrase;
+        this.passPhraseByte = builder.passPhraseByte;
+        this.secureTag = builder.secureTag;
+        this.secureTagContents = builder.secureTagContents;
+        this.keyCipherAlgorithm = builder.keyCipherAlgorithm;
+        this.recipientKeyAlias = builder.recipientKeyAlias;
+        this.keyOrTrustStoreParametersRef = builder.keyOrTrustStoreParametersRef;
+        this.keyPassword = builder.keyPassword;
+        this.digestAlgorithm = builder.digestAlgorithm;
+        this.mgfAlgorithm = builder.mgfAlgorithm;
+        this.addKeyValueForEncryptedKey = builder.addKeyValueForEncryptedKey;
+        this.keyOrTrustStoreParameters = builder.keyOrTrustStoreParameters;
+        this.namespaces = builder.namespaces;
+    }
+
     public String getXmlCipherAlgorithm() {
         return xmlCipherAlgorithm;
     }
@@ -276,4 +295,187 @@ public class XMLSecurityDataFormat extends DataFormatDefinition implements Names
     public Map<String, String> getNamespaces() {
         return namespaces;
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link XMLSecurityDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<XMLSecurityDataFormat> {
+
+        private String xmlCipherAlgorithm = "AES-256-GCM";
+        private String passPhrase;
+        private byte[] passPhraseByte;
+        private String secureTag;
+        private String secureTagContents;
+        private String keyCipherAlgorithm = "RSA_OAEP";
+        private String recipientKeyAlias;
+        private String keyOrTrustStoreParametersRef;
+        private String keyPassword;
+        private String digestAlgorithm = "SHA1";
+        private String mgfAlgorithm = "MGF1_SHA1";
+        private String addKeyValueForEncryptedKey = "true";
+        private KeyStoreParameters keyOrTrustStoreParameters;
+        private Map<String, String> namespaces;
+
+        /**
+         * The cipher algorithm to be used for encryption/decryption of the XML message content. The available choices
+         * are:
+         * <ul>
+         * <li>XMLCipher.TRIPLEDES</li>
+         * <li>XMLCipher.AES_128</li>
+         * <li>XMLCipher.AES_128_GCM</li>
+         * <li>XMLCipher.AES_192</li>
+         * <li>XMLCipher.AES_192_GCM</li>
+         * <li>XMLCipher.AES_256</li>
+         * <li>XMLCipher.AES_256_GCM</li>
+         * <li>XMLCipher.SEED_128</li>
+         * <li>XMLCipher.CAMELLIA_128</li>
+         * <li>XMLCipher.CAMELLIA_192</li>
+         * <li>XMLCipher.CAMELLIA_256</li>
+         * </ul>
+         * The default value is XMLCipher.AES_256_GCM
+         */
+        public Builder xmlCipherAlgorithm(String xmlCipherAlgorithm) {
+            this.xmlCipherAlgorithm = xmlCipherAlgorithm;
+            return this;
+        }
+
+        /**
+         * A String used as passPhrase to encrypt/decrypt content. The passPhrase has to be provided. The passPhrase
+         * needs to be put together in conjunction with the appropriate encryption algorithm. For example using
+         * TRIPLEDES the passPhase can be a "Only another 24 Byte key"
+         */
+        public Builder passPhrase(String passPhrase) {
+            this.passPhrase = passPhrase;
+            return this;
+        }
+
+        /**
+         * A byte[] used as passPhrase to encrypt/decrypt content. The passPhrase has to be provided. The passPhrase
+         * needs to be put together in conjunction with the appropriate encryption algorithm. For example using
+         * TRIPLEDES the passPhase can be a "Only another 24 Byte key"
+         */
+        public Builder passPhraseByte(byte[] passPhraseByte) {
+            this.passPhraseByte = passPhraseByte;
+            return this;
+        }
+
+        /**
+         * The XPath reference to the XML Element selected for encryption/decryption. If no tag is specified, the entire
+         * payload is encrypted/decrypted.
+         */
+        public Builder secureTag(String secureTag) {
+            this.secureTag = secureTag;
+            return this;
+        }
+
+        /**
+         * A boolean value to specify whether the XML Element is to be encrypted or the contents of the XML Element.
+         * false = Element Level. true = Element Content Level.
+         */
+        public Builder secureTagContents(String secureTagContents) {
+            this.secureTagContents = secureTagContents;
+            return this;
+        }
+
+        /**
+         * The cipher algorithm to be used for encryption/decryption of the asymmetric key. The available choices are:
+         * <ul>
+         * <li>XMLCipher.RSA_v1dot5</li>
+         * <li>XMLCipher.RSA_OAEP</li>
+         * <li>XMLCipher.RSA_OAEP_11</li>
+         * </ul>
+         * The default value is XMLCipher.RSA_OAEP
+         */
+        public Builder keyCipherAlgorithm(String keyCipherAlgorithm) {
+            this.keyCipherAlgorithm = keyCipherAlgorithm;
+            return this;
+        }
+
+        /**
+         * The key alias to be used when retrieving the recipient's public or private key from a KeyStore when
+         * performing asymmetric key encryption or decryption.
+         */
+        public Builder recipientKeyAlias(String recipientKeyAlias) {
+            this.recipientKeyAlias = recipientKeyAlias;
+            return this;
+        }
+
+        /**
+         * Refers to a KeyStore instance to lookup in the registry, which is used for configuration options for creating
+         * and loading a KeyStore instance that represents the sender's trustStore or recipient's keyStore.
+         */
+        public Builder keyOrTrustStoreParametersRef(String keyOrTrustStoreParametersRef) {
+            this.keyOrTrustStoreParametersRef = keyOrTrustStoreParametersRef;
+            return this;
+        }
+
+        /**
+         * Configuration options for creating and loading a KeyStore instance that represents the sender's trustStore or
+         * recipient's keyStore.
+         */
+        public Builder keyOrTrustStoreParameters(KeyStoreParameters keyOrTrustStoreParameters) {
+            this.keyOrTrustStoreParameters = keyOrTrustStoreParameters;
+            return this;
+        }
+
+        /**
+         * The password to be used for retrieving the private key from the KeyStore. This key is used for asymmetric
+         * decryption.
+         */
+        public Builder keyPassword(String keyPassword) {
+            this.keyPassword = keyPassword;
+            return this;
+        }
+
+        /**
+         * The digest algorithm to use with the RSA OAEP algorithm. The available choices are:
+         * <ul>
+         * <li>XMLCipher.SHA1</li>
+         * <li>XMLCipher.SHA256</li>
+         * <li>XMLCipher.SHA512</li>
+         * </ul>
+         * The default value is XMLCipher.SHA1
+         */
+        public Builder digestAlgorithm(String digestAlgorithm) {
+            this.digestAlgorithm = digestAlgorithm;
+            return this;
+        }
+
+        /**
+         * The MGF Algorithm to use with the RSA OAEP algorithm. The available choices are:
+         * <ul>
+         * <li>EncryptionConstants.MGF1_SHA1</li>
+         * <li>EncryptionConstants.MGF1_SHA256</li>
+         * <li>EncryptionConstants.MGF1_SHA512</li>
+         * </ul>
+         * The default value is EncryptionConstants.MGF1_SHA1
+         */
+        public Builder mgfAlgorithm(String mgfAlgorithm) {
+            this.mgfAlgorithm = mgfAlgorithm;
+            return this;
+        }
+
+        /**
+         * Whether to add the public key used to encrypt the session key as a KeyValue in the EncryptedKey structure or
+         * not.
+         */
+        public Builder addKeyValueForEncryptedKey(String addKeyValueForEncryptedKey) {
+            this.addKeyValueForEncryptedKey = addKeyValueForEncryptedKey;
+            return this;
+        }
+
+        public Builder setNamespaces(Map<String, String> nspaces) {
+            if (this.namespaces == null) {
+                this.namespaces = new HashMap<>();
+            }
+            this.namespaces.putAll(nspaces);
+            return this;
+        }
+
+        @Override
+        public XMLSecurityDataFormat end() {
+            return new XMLSecurityDataFormat(this);
+        }
+    }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/XStreamDataFormat.java b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/XStreamDataFormat.java
index c376408fc32..9bc97483a3c 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/XStreamDataFormat.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/XStreamDataFormat.java
@@ -27,7 +27,9 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.spi.Metadata;
@@ -77,6 +79,20 @@ public class XStreamDataFormat extends DataFormatDefinition implements ContentTy
         setEncoding(encoding);
     }
 
+    private XStreamDataFormat(Builder builder) {
+        this();
+        this.permissions = builder.permissions;
+        this.encoding = builder.encoding;
+        this.driver = builder.driver;
+        this.driverRef = builder.driverRef;
+        this.mode = builder.mode;
+        this.contentTypeHeader = builder.contentTypeHeader;
+        this.converters = builder.converters;
+        this.aliases = builder.aliases;
+        this.omitFields = builder.omitFields;
+        this.implicitCollections = builder.implicitCollections;
+    }
+
     @Override
     public String getDataFormatName() {
         return "json".equals(driver) ? "xstreamJson" : "xstream";
@@ -159,8 +175,13 @@ public class XStreamDataFormat extends DataFormatDefinition implements ContentTy
     }
 
     public void setConverters(Map<String, String> converters) {
-        this.converters = new ArrayList<>();
-        converters.forEach((k, v) -> this.converters.add(new PropertyDefinition(k, v)));
+        setConverters(toList(converters));
+    }
+
+    private static List<PropertyDefinition> toList(Map<String, String> map) {
+        List<PropertyDefinition> result = new ArrayList<>(map.size());
+        map.forEach((k, v) -> result.add(new PropertyDefinition(k, v)));
+        return result;
     }
 
     public List<PropertyDefinition> getAliases() {
@@ -186,8 +207,7 @@ public class XStreamDataFormat extends DataFormatDefinition implements ContentTy
     }
 
     public void setAliases(Map<String, String> aliases) {
-        this.aliases = new ArrayList<>();
-        aliases.forEach((k, v) -> this.aliases.add(new PropertyDefinition(k, v)));
+        setAliases(toList(aliases));
     }
 
     public List<PropertyDefinition> getOmitFields() {
@@ -203,8 +223,7 @@ public class XStreamDataFormat extends DataFormatDefinition implements ContentTy
     }
 
     public void setOmitFields(Map<String, String> aliases) {
-        this.omitFields = new ArrayList<>();
-        aliases.forEach((k, v) -> this.omitFields.add(new PropertyDefinition(k, v)));
+        setOmitFields(toList(aliases));
     }
 
     public Map<String, String> getOmitFieldsAsMap() {
@@ -231,8 +250,7 @@ public class XStreamDataFormat extends DataFormatDefinition implements ContentTy
     }
 
     public void setImplicitCollections(Map<String, String> implicitCollections) {
-        this.implicitCollections = new ArrayList<>();
-        implicitCollections.forEach((k, v) -> this.implicitCollections.add(new PropertyDefinition(k, v)));
+        setImplicitCollections(toList(implicitCollections));
     }
 
     public Map<String, String> getImplicitCollectionsAsMap() {
@@ -273,12 +291,16 @@ public class XStreamDataFormat extends DataFormatDefinition implements ContentTy
      * @see        #setPermissions(String)
      */
     public void setPermissions(Class<?>... type) {
+        setPermissions(toString(type));
+    }
+
+    private static String toString(Class<?>[] type) {
         StringJoiner permissionsBuilder = new StringJoiner(",");
         for (Class<?> clazz : type) {
             permissionsBuilder.add("+");
             permissionsBuilder.add(clazz.getName());
         }
-        setPermissions(permissionsBuilder.toString());
+        return permissionsBuilder.toString();
     }
 
     public String getContentTypeHeader() {
@@ -289,4 +311,139 @@ public class XStreamDataFormat extends DataFormatDefinition implements ContentTy
         this.contentTypeHeader = contentTypeHeader;
     }
 
+    /**
+     * {@code Builder} is a specific builder for {@link XStreamDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<XStreamDataFormat> {
+
+        private String permissions;
+        private String encoding;
+        private String driver;
+        private String driverRef;
+        private String mode;
+        private String contentTypeHeader = "true";
+        private List<PropertyDefinition> converters;
+        private List<PropertyDefinition> aliases;
+        private List<PropertyDefinition> omitFields;
+        private List<PropertyDefinition> implicitCollections;
+
+        /**
+         * Sets the encoding to use
+         */
+        public Builder encoding(String encoding) {
+            this.encoding = encoding;
+            return this;
+        }
+
+        /**
+         * To use a custom XStream driver. The instance must be of type
+         * com.thoughtworks.xstream.io.HierarchicalStreamDriver
+         */
+        public Builder driver(String driver) {
+            this.driver = driver;
+            return this;
+        }
+
+        /**
+         * To refer to a custom XStream driver to lookup in the registry. The instance must be of type
+         * com.thoughtworks.xstream.io.HierarchicalStreamDriver
+         */
+        public Builder driverRef(String driverRef) {
+            this.driverRef = driverRef;
+            return this;
+        }
+
+        /**
+         * Mode for dealing with duplicate references The possible values are:
+         * <ul>
+         * <li>NO_REFERENCES</li>
+         * <li>ID_REFERENCES</li>
+         * <li>XPATH_RELATIVE_REFERENCES</li>
+         * <li>XPATH_ABSOLUTE_REFERENCES</li>
+         * <li>SINGLE_NODE_XPATH_RELATIVE_REFERENCES</li>
+         * <li>SINGLE_NODE_XPATH_ABSOLUTE_REFERENCES</li>
+         * </ul>
+         */
+        public Builder mode(String mode) {
+            this.mode = mode;
+            return this;
+        }
+
+        /**
+         * List of class names for using custom XStream converters. The classes must be of type
+         * com.thoughtworks.xstream.converters.Converter
+         */
+        public Builder converters(List<PropertyDefinition> converters) {
+            this.converters = converters;
+            return this;
+        }
+
+        public Builder converters(Map<String, String> converters) {
+            return converters(XStreamDataFormat.toList(converters));
+        }
+
+        /**
+         * Prevents a field from being serialized. To omit a field you must always provide the declaring type and not
+         * necessarily the type that is converted. Multiple values can be separated by comma.
+         */
+        public Builder omitFields(List<PropertyDefinition> omitFields) {
+            this.omitFields = omitFields;
+            return this;
+        }
+
+        public Builder omitFields(Map<String, String> aliases) {
+            return omitFields(XStreamDataFormat.toList(aliases));
+        }
+
+        /**
+         * Adds a default implicit collection which is used for any unmapped XML tag. Multiple values can be separated
+         * by comma.
+         */
+        public Builder implicitCollections(List<PropertyDefinition> implicitCollections) {
+            this.implicitCollections = implicitCollections;
+            return this;
+        }
+
+        public Builder implicitCollections(Map<String, String> implicitCollections) {
+            return implicitCollections(XStreamDataFormat.toList(implicitCollections));
+        }
+
+        /**
+         * Adds permissions that controls which Java packages and classes XStream is allowed to use during unmarshal
+         * from xml/json to Java beans.
+         * <p/>
+         * A permission must be configured either here or globally using a JVM system property. The permission can be
+         * specified in a syntax where a plus sign is allow, and minus sign is deny. <br/>
+         * Wildcards is supported by using <tt>.*</tt> as prefix. For example to allow <tt>com.foo</tt> and all
+         * subpackages then specify <tt>+com.foo.*</tt>. Multiple permissions can be configured separated by comma, such
+         * as <tt>+com.foo.*,-com.foo.bar.MySecretBean</tt>. <br/>
+         * The following default permission is always included: <tt>"-*,java.lang.*,java.util.*"</tt> unless its
+         * overridden by specifying a JVM system property with they key <tt>org.apache.camel.xstream.permissions</tt>.
+         */
+        public Builder permissions(String permissions) {
+            this.permissions = permissions;
+            return this;
+        }
+
+        /**
+         * To add permission for the given pojo classes.
+         *
+         * @param type the pojo class(es) xstream should use as allowed permission
+         * @see        #setPermissions(String)
+         */
+        public Builder permissions(Class<?>... type) {
+            return permissions(XStreamDataFormat.toString(type));
+        }
+
+        public Builder contentTypeHeader(String contentTypeHeader) {
+            this.contentTypeHeader = contentTypeHeader;
+            return this;
+        }
+
+        @Override
+        public XStreamDataFormat end() {
+            return new XStreamDataFormat(this);
+        }
+    }
 }
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 21ee1facfc7..8b5915cb9ca 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
@@ -25,6 +25,7 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -91,6 +92,24 @@ public class YAMLDataFormat extends DataFormatDefinition {
         this.unmarshalType = unmarshalType;
     }
 
+    private YAMLDataFormat(Builder builder) {
+        super(builder.dataFormatName == null ? YAMLLibrary.SnakeYAML.getDataFormatName() : builder.dataFormatName);
+        this.classLoader = builder.classLoader;
+        this.unmarshalType = builder.unmarshalType;
+        this.library = builder.library;
+        this.unmarshalTypeName = builder.unmarshalTypeName;
+        this.constructor = builder.constructor;
+        this.representer = builder.representer;
+        this.dumperOptions = builder.dumperOptions;
+        this.resolver = builder.resolver;
+        this.useApplicationContextClassLoader = builder.useApplicationContextClassLoader;
+        this.prettyFlow = builder.prettyFlow;
+        this.allowAnyType = builder.allowAnyType;
+        this.typeFilters = builder.typeFilters;
+        this.maxAliasesForCollections = builder.maxAliasesForCollections;
+        this.allowRecursiveKeys = builder.allowRecursiveKeys;
+    }
+
     @Override
     public String getDataFormatName() {
         // yaml data format is special as the name can be from different bundles
@@ -253,4 +272,147 @@ public class YAMLDataFormat extends DataFormatDefinition {
     public void setAllowRecursiveKeys(String allowRecursiveKeys) {
         this.allowRecursiveKeys = allowRecursiveKeys;
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link YAMLDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<YAMLDataFormat> {
+
+        private String dataFormatName;
+        private ClassLoader classLoader;
+        private Class<?> unmarshalType;
+        private YAMLLibrary library = YAMLLibrary.SnakeYAML;
+        private String unmarshalTypeName;
+        private String constructor;
+        private String representer;
+        private String dumperOptions;
+        private String resolver;
+        private String useApplicationContextClassLoader = "true";
+        private String prettyFlow;
+        private String allowAnyType;
+        private List<YAMLTypeFilterDefinition> typeFilters;
+        private String maxAliasesForCollections = "50";
+        private String allowRecursiveKeys;
+
+        /**
+         * Which yaml library to use.
+         * <p/>
+         * By default it is SnakeYAML
+         */
+        public Builder library(YAMLLibrary library) {
+            this.library = library;
+            this.dataFormatName = "yaml-" + library.name().toLowerCase();
+            return this;
+        }
+
+        /**
+         * Class of the object to be created
+         */
+        public Builder unmarshalType(Class<?> unmarshalType) {
+            this.unmarshalType = unmarshalType;
+            return this;
+        }
+
+        /**
+         * Class name of the java type to use when unmarshalling
+         */
+        public Builder unmarshalTypeName(String unmarshalTypeName) {
+            this.unmarshalTypeName = unmarshalTypeName;
+            return this;
+        }
+
+        /**
+         * Set a custom classloader
+         */
+        public Builder classLoader(ClassLoader classLoader) {
+            this.classLoader = classLoader;
+            return this;
+        }
+
+        /**
+         * BaseConstructor to construct incoming documents.
+         */
+        public Builder constructor(String constructor) {
+            this.constructor = constructor;
+            return this;
+        }
+
+        /**
+         * Representer to emit outgoing objects.
+         */
+        public Builder representer(String representer) {
+            this.representer = representer;
+            return this;
+        }
+
+        /**
+         * DumperOptions to configure outgoing objects.
+         */
+        public Builder dumperOptions(String dumperOptions) {
+            this.dumperOptions = dumperOptions;
+            return this;
+        }
+
+        /**
+         * Resolver to detect implicit type
+         */
+        public Builder resolver(String resolver) {
+            this.resolver = resolver;
+            return this;
+        }
+
+        /**
+         * Use ApplicationContextClassLoader as custom ClassLoader
+         */
+        public Builder useApplicationContextClassLoader(String useApplicationContextClassLoader) {
+            this.useApplicationContextClassLoader = useApplicationContextClassLoader;
+            return this;
+        }
+
+        /**
+         * Force the emitter to produce a pretty YAML document when using the flow style.
+         */
+        public Builder prettyFlow(String prettyFlow) {
+            this.prettyFlow = prettyFlow;
+            return this;
+        }
+
+        /**
+         * Allow any class to be un-marshaled
+         */
+        public Builder allowAnyType(String allowAnyType) {
+            this.allowAnyType = allowAnyType;
+            return this;
+        }
+
+        /**
+         * Set the types SnakeYAML is allowed to un-marshall
+         */
+        public Builder typeFilters(List<YAMLTypeFilterDefinition> typeFilters) {
+            this.typeFilters = typeFilters;
+            return this;
+        }
+
+        /**
+         * Set the maximum amount of aliases allowed for collections.
+         */
+        public Builder maxAliasesForCollections(String maxAliasesForCollections) {
+            this.maxAliasesForCollections = maxAliasesForCollections;
+            return this;
+        }
+
+        /**
+         * Set whether recursive keys are allowed.
+         */
+        public Builder allowRecursiveKeys(String allowRecursiveKeys) {
+            this.allowRecursiveKeys = allowRecursiveKeys;
+            return this;
+        }
+
+        @Override
+        public YAMLDataFormat end() {
+            return new YAMLDataFormat(this);
+        }
+    }
 }
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 91af9010e63..681ef750265 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -40,6 +42,11 @@ public class ZipDeflaterDataFormat extends DataFormatDefinition {
         super("zipDeflater");
     }
 
+    private ZipDeflaterDataFormat(Builder builder) {
+        this();
+        this.compressionLevel = builder.compressionLevel;
+    }
+
     public String getCompressionLevel() {
         return compressionLevel;
     }
@@ -51,4 +58,27 @@ public class ZipDeflaterDataFormat extends DataFormatDefinition {
     public void setCompressionLevel(String compressionLevel) {
         this.compressionLevel = compressionLevel;
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link ZipDeflaterDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<ZipDeflaterDataFormat> {
+
+        private String compressionLevel = "-1";
+
+        /**
+         * To specify a specific compression between 0-9. -1 is default compression, 0 is no compression, and 9 is the
+         * best compression.
+         */
+        public Builder compressionLevel(String compressionLevel) {
+            this.compressionLevel = compressionLevel;
+            return this;
+        }
+
+        @Override
+        public ZipDeflaterDataFormat end() {
+            return new ZipDeflaterDataFormat(this);
+        }
+    }
 }
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 41675a31a7b..74e72ea4d6a 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
@@ -20,7 +20,9 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.builder.DataFormatBuilder;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.spi.Metadata;
 
@@ -49,6 +51,14 @@ public class ZipFileDataFormat extends DataFormatDefinition {
         super("zipFile");
     }
 
+    private ZipFileDataFormat(Builder builder) {
+        this();
+        this.usingIterator = builder.usingIterator;
+        this.allowEmptyDirectory = builder.allowEmptyDirectory;
+        this.preservePathElements = builder.preservePathElements;
+        this.maxDecompressedSize = builder.maxDecompressedSize;
+    }
+
     public String getUsingIterator() {
         return usingIterator;
     }
@@ -99,4 +109,60 @@ public class ZipFileDataFormat extends DataFormatDefinition {
     public void setMaxDecompressedSize(String maxDecompressedSize) {
         this.maxDecompressedSize = maxDecompressedSize;
     }
+
+    /**
+     * {@code Builder} is a specific builder for {@link ZipFileDataFormat}.
+     */
+    @XmlTransient
+    public static class Builder implements DataFormatBuilder<ZipFileDataFormat> {
+
+        private String usingIterator;
+        private String allowEmptyDirectory;
+        private String preservePathElements;
+        private String maxDecompressedSize = "1073741824";
+
+        /**
+         * If the zip file has more than one entry, the setting this option to true, allows working with the splitter
+         * EIP, to split the data using an iterator in a streaming mode.
+         */
+        public Builder usingIterator(String usingIterator) {
+            this.usingIterator = usingIterator;
+            return this;
+        }
+
+        /**
+         * If the zip file has more than one entry, setting this option to true, allows to get the iterator even if the
+         * directory is empty
+         */
+        public Builder allowEmptyDirectory(String allowEmptyDirectory) {
+            this.allowEmptyDirectory = allowEmptyDirectory;
+            return this;
+        }
+
+        /**
+         * If the file name contains path elements, setting this option to true, allows the path to be maintained in the
+         * zip file.
+         */
+        public Builder preservePathElements(String preservePathElements) {
+            this.preservePathElements = preservePathElements;
+            return this;
+        }
+
+        /**
+         * Set the maximum decompressed size of a zip file (in bytes). The default value if not specified corresponds to
+         * 1 gigabyte. An IOException will be thrown if the decompressed size exceeds this amount. Set to -1 to disable
+         * setting a maximum decompressed size.
+         *
+         * @param maxDecompressedSize the maximum decompressed size of a zip file (in bytes)
+         */
+        public Builder maxDecompressedSize(String maxDecompressedSize) {
+            this.maxDecompressedSize = maxDecompressedSize;
+            return this;
+        }
+
+        @Override
+        public ZipFileDataFormat end() {
+            return new ZipFileDataFormat(this);
+        }
+    }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/GzipDeflaterDataFormat.java b/core/camel-core/src/test/java/org/apache/camel/impl/DataFormatFluentSyntaxTest.java
similarity index 51%
copy from core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/GzipDeflaterDataFormat.java
copy to core/camel-core/src/test/java/org/apache/camel/impl/DataFormatFluentSyntaxTest.java
index 0aab050323a..28adfc4046d 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/GzipDeflaterDataFormat.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/DataFormatFluentSyntaxTest.java
@@ -14,22 +14,30 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.model.dataformat;
+package org.apache.camel.impl;
 
-import javax.xml.bind.annotation.XmlRootElement;
-
-import org.apache.camel.model.DataFormatDefinition;
-import org.apache.camel.spi.Metadata;
+import org.apache.camel.builder.RouteBuilder;
 
 /**
- * Compress and decompress messages using <code>java.util.zip.GZIP*Stream</code>.
+ * A unit test class ensuring that the fluent syntax to create data format works as expected.
  */
-@Metadata(firstVersion = "2.0.0", label = "dataformat,transformation", title = "GZip Deflater")
-@XmlRootElement(name = "gzipDeflater")
-public class GzipDeflaterDataFormat extends DataFormatDefinition {
+public class DataFormatFluentSyntaxTest extends RefDataFormatTest {
 
-    public GzipDeflaterDataFormat() {
-        super("gzipDeflater");
-    }
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                // START SNIPPET: e1
+                from("direct:a").marshal(
+                    dataFormat().custom().ref("reverse").end()
+                ).to("mock:a");
 
+                from("direct:b").unmarshal(
+                    dataFormat().custom().ref("reverse").end()
+                ).to("mock:b");
+                // END SNIPPET: e1
+            }
+        };
+    }
 }