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/11/25 11:14:51 UTC

[camel] branch CAMEL-18731/result-type-from-header created (now 9dd28e13203)

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

nfilotto pushed a change to branch CAMEL-18731/result-type-from-header
in repository https://gitbox.apache.org/repos/asf/camel.git


      at 9dd28e13203 CAMEL-18731: camel-core - Add result type and different sources of input data to languages

This branch includes the following new commits:

     new 9dd28e13203 CAMEL-18731: camel-core - Add result type and different sources of input data to languages

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.



[camel] 01/01: CAMEL-18731: camel-core - Add result type and different sources of input data to languages

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

nfilotto pushed a commit to branch CAMEL-18731/result-type-from-header
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 9dd28e13203cc9b7d90bcd3f036d4248c5419063
Author: Nicolas Filotto <nf...@talend.com>
AuthorDate: Fri Nov 25 12:14:07 2022 +0100

    CAMEL-18731: camel-core - Add result type and different sources of input data to languages
---
 .../apache/camel/catalog/components/xquery.json    |   1 +
 .../org/apache/camel/catalog/languages/bean.json   |   1 +
 .../apache/camel/catalog/languages/constant.json   |   2 +-
 .../apache/camel/catalog/languages/csimple.json    |   2 +-
 .../apache/camel/catalog/languages/datasonnet.json |   2 +-
 .../org/apache/camel/catalog/languages/file.json   |   2 +-
 .../org/apache/camel/catalog/languages/groovy.json |   1 +
 .../apache/camel/catalog/languages/hl7terser.json  |   3 +
 .../org/apache/camel/catalog/languages/joor.json   |   2 +-
 .../org/apache/camel/catalog/languages/jq.json     |   3 +-
 .../org/apache/camel/catalog/languages/js.json     |   1 -
 .../apache/camel/catalog/languages/jsonpath.json   |   5 +-
 .../org/apache/camel/catalog/languages/mvel.json   |   1 +
 .../org/apache/camel/catalog/languages/ognl.json   |   1 +
 .../org/apache/camel/catalog/languages/python.json |   1 -
 .../org/apache/camel/catalog/languages/ref.json    |   1 +
 .../org/apache/camel/catalog/languages/simple.json |   2 +-
 .../org/apache/camel/catalog/languages/spel.json   |   1 +
 .../apache/camel/catalog/languages/tokenize.json   |   3 +-
 .../org/apache/camel/catalog/languages/xpath.json  |   3 +-
 .../org/apache/camel/catalog/languages/xquery.json |   4 +-
 .../apache/camel/catalog/languages/xtokenize.json  |   3 +-
 .../org/apache/camel/catalog/models/constant.json  |   2 +-
 .../org/apache/camel/catalog/models/csimple.json   |   2 +-
 .../apache/camel/catalog/models/datasonnet.json    |   2 +-
 .../org/apache/camel/catalog/models/groovy.json    |   1 +
 .../org/apache/camel/catalog/models/hl7terser.json |   3 +
 .../org/apache/camel/catalog/models/joor.json      |   2 +-
 .../org/apache/camel/catalog/models/jq.json        |   3 +-
 .../org/apache/camel/catalog/models/js.json        |   1 -
 .../org/apache/camel/catalog/models/jsonpath.json  |   5 +-
 .../org/apache/camel/catalog/models/method.json    |   1 +
 .../org/apache/camel/catalog/models/mvel.json      |   1 +
 .../org/apache/camel/catalog/models/ognl.json      |   1 +
 .../org/apache/camel/catalog/models/python.json    |   1 -
 .../org/apache/camel/catalog/models/ref.json       |   1 +
 .../org/apache/camel/catalog/models/simple.json    |   2 +-
 .../org/apache/camel/catalog/models/spel.json      |   1 +
 .../org/apache/camel/catalog/models/tokenize.json  |   3 +-
 .../org/apache/camel/catalog/models/xpath.json     |   3 +-
 .../org/apache/camel/catalog/models/xquery.json    |   4 +-
 .../org/apache/camel/catalog/models/xtokenize.json |   3 +-
 .../apache/camel/catalog/schemas/camel-spring.xsd  | 236 +++++++--------------
 .../org/apache/camel/language/bean/bean.json       |   1 +
 .../apache/camel/language/bean/BeanExpression.java |  13 +-
 .../apache/camel/language/bean/BeanLanguage.java   |   9 +-
 components/camel-csimple-joor/pom.xml              |  11 +
 .../apache/camel/language/CSimpleLanguageTest.java |  30 +++
 components/camel-datasonnet/pom.xml                |  11 +
 .../camel/language/datasonnet/datasonnet.json      |   2 +-
 .../language/datasonnet/DatasonnetLanguage.java    |  11 +-
 .../camel/language/DatasonnetLanguageTest.java     |  36 ++++
 components/camel-groovy/pom.xml                    |  11 +
 .../org/apache/camel/language/groovy/groovy.json   |   1 +
 .../camel/language/groovy/GroovyLanguage.java      |   4 +-
 .../apache/camel/language/GroovyLanguageTest.java  |  30 +++
 components/camel-hl7/pom.xml                       |  11 +
 .../org/apache/camel/component/hl7/hl7terser.json  |   3 +
 .../camel/component/hl7/Hl7TerserLanguage.java     |  21 +-
 .../camel/language/Hl7TerserLanguageTest.java      |  57 +++++
 components/camel-javascript/pom.xml                |  11 +
 .../resources/org/apache/camel/language/js/js.json |   1 -
 .../camel/language/js/JavaScriptExpression.java    |   8 +-
 .../camel/language/js/JavaScriptLanguage.java      |  19 +-
 .../camel/language/JavaScriptLanguageTest.java     |  30 +++
 components/camel-joor/pom.xml                      |  11 +
 .../org/apache/camel/language/joor/joor.json       |   2 +-
 .../java/org/apache/camel/language/joor/Joor.java  |   4 +
 .../joor/JoorAnnotationExpressionFactory.java      |   9 +-
 .../apache/camel/language/joor/JoorLanguage.java   |  17 +-
 .../apache/camel/language/JoorLanguageTest.java    |  30 +++
 components/camel-jq/pom.xml                        |  11 +
 .../resources/org/apache/camel/language/jq/jq.json |   3 +-
 .../org/apache/camel/language/jq/JqLanguage.java   |  44 +---
 .../org/apache/camel/language/JqLanguageTest.java  |  57 +++++
 components/camel-jsonpath/pom.xml                  |  11 +
 .../org/apache/camel/jsonpath/jsonpath.json        |   5 +-
 .../java/org/apache/camel/jsonpath/JsonPath.java   |  17 ++
 .../JsonPathAnnotationExpressionFactory.java       |  19 +-
 .../org/apache/camel/jsonpath/JsonPathEngine.java  |  23 +-
 .../apache/camel/jsonpath/JsonPathExpression.java  |  17 +-
 .../apache/camel/jsonpath/JsonPathLanguage.java    |  39 ++--
 .../camel/language/JsonPathLanguageTest.java       |  35 +++
 components/camel-mvel/pom.xml                      |  11 +
 .../org/apache/camel/language/mvel/mvel.json       |   1 +
 .../apache/camel/language/mvel/MvelLanguage.java   |  14 +-
 .../apache/camel/language/MvelLanguageTest.java    |  30 +++
 components/camel-ognl/pom.xml                      |  11 +
 .../org/apache/camel/language/ognl/ognl.json       |   1 +
 .../apache/camel/language/ognl/OgnlLanguage.java   |  14 +-
 .../apache/camel/language/OgnlLanguageTest.java    |  30 +++
 components/camel-python/pom.xml                    |  11 +
 .../org/apache/camel/language/python/python.json   |   1 -
 .../camel/language/python/PythonLanguage.java      |  14 +-
 .../apache/camel/language/PythonLanguageTest.java  |  30 +++
 components/camel-saxon/pom.xml                     |  11 +
 .../component/xquery/XQueryEndpointConfigurer.java |   6 +
 .../component/xquery/XQueryEndpointUriFactory.java |   3 +-
 .../org/apache/camel/component/xquery/xquery.json  |   1 +
 .../org/apache/camel/language/xquery/xquery.json   |   4 +-
 .../org/apache/camel/component/xquery/XQuery.java  |  15 +-
 .../xquery/XQueryAnnotationExpressionFactory.java  |  18 +-
 .../camel/component/xquery/XQueryBuilder.java      |  30 ++-
 .../camel/component/xquery/XQueryEndpoint.java     |  16 ++
 .../camel/language/xquery/XQueryLanguage.java      |  34 ++-
 .../apache/camel/language/XQueryLanguageTest.java  |  34 +++
 components/camel-spring-xml/pom.xml                |  11 +
 .../apache/camel/language/SpelLanguageTest.java    |  30 +++
 .../org/apache/camel/language/spel/spel.json       |   1 +
 .../apache/camel/language/spel/SpelLanguage.java   |  16 +-
 components/camel-stax/pom.xml                      |  11 +
 .../camel/language/xtokenizer/xtokenize.json       |   3 +-
 .../xtokenizer/XMLTokenExpressionIterator.java     |  17 +-
 .../language/xtokenizer/XMLTokenizeLanguage.java   |  22 +-
 .../camel/language/XMLTokenizeLanguageTest.java    |  41 ++++
 .../org/apache/camel/language/xpath/xpath.json     |   3 +-
 .../org/apache/camel/language/xpath/XPath.java     |  10 +-
 .../xpath/XPathAnnotationExpressionFactory.java    |  23 +-
 .../apache/camel/language/xpath/XPathBuilder.java  |  43 +++-
 .../apache/camel/language/xpath/XPathLanguage.java |  34 ++-
 .../apache/camel/language/constant/constant.json   |   2 +-
 .../org/apache/camel/language/csimple/csimple.json |   2 +-
 .../org/apache/camel/language/ref/ref.json         |   1 +
 .../org/apache/camel/language/simple/file.json     |   2 +-
 .../org/apache/camel/language/simple/simple.json   |   2 +-
 .../apache/camel/language/tokenizer/tokenize.json  |   3 +-
 .../camel/language/csimple/CSimpleLanguage.java    |  16 +-
 .../org/apache/camel/language/ref/RefLanguage.java |   4 +-
 .../simple/ast/SimpleFunctionExpression.java       |   2 +-
 .../camel/language/tokenizer/TokenizeLanguage.java |  29 ++-
 .../org/apache/camel/model/language/constant.json  |   2 +-
 .../org/apache/camel/model/language/csimple.json   |   2 +-
 .../apache/camel/model/language/datasonnet.json    |   2 +-
 .../org/apache/camel/model/language/groovy.json    |   1 +
 .../org/apache/camel/model/language/hl7terser.json |   3 +
 .../org/apache/camel/model/language/joor.json      |   2 +-
 .../org/apache/camel/model/language/jq.json        |   3 +-
 .../org/apache/camel/model/language/js.json        |   1 -
 .../org/apache/camel/model/language/jsonpath.json  |   5 +-
 .../org/apache/camel/model/language/method.json    |   1 +
 .../org/apache/camel/model/language/mvel.json      |   1 +
 .../org/apache/camel/model/language/ognl.json      |   1 +
 .../org/apache/camel/model/language/python.json    |   1 -
 .../org/apache/camel/model/language/ref.json       |   1 +
 .../org/apache/camel/model/language/simple.json    |   2 +-
 .../org/apache/camel/model/language/spel.json      |   1 +
 .../org/apache/camel/model/language/tokenize.json  |   3 +-
 .../org/apache/camel/model/language/xpath.json     |   3 +-
 .../org/apache/camel/model/language/xquery.json    |   4 +-
 .../org/apache/camel/model/language/xtokenize.json |   3 +-
 .../camel/builder/ExpressionClauseSupport.java     |  10 +-
 .../camel/model/language/CSimpleExpression.java    |  51 +----
 .../camel/model/language/ConstantExpression.java   |  51 +----
 .../camel/model/language/DatasonnetExpression.java |  56 +----
 .../camel/model/language/GroovyExpression.java     |   2 +-
 .../camel/model/language/Hl7TerserExpression.java  |   2 +-
 .../camel/model/language/JavaScriptExpression.java | 110 +---------
 .../camel/model/language/JoorExpression.java       |  48 +----
 .../apache/camel/model/language/JqExpression.java  | 105 +--------
 .../camel/model/language/JsonPathExpression.java   |  72 +------
 .../camel/model/language/MethodCallExpression.java |   2 +-
 .../camel/model/language/MvelExpression.java       |   2 +-
 .../model/language/NamespaceAwareExpression.java   |  19 +-
 .../camel/model/language/OgnlExpression.java       |   2 +-
 .../camel/model/language/PythonExpression.java     | 110 +---------
 .../apache/camel/model/language/RefExpression.java |   2 +-
 .../camel/model/language/SimpleExpression.java     |  51 +----
 ...n.java => SingleInputExpressionDefinition.java} |  94 ++------
 ...a => SingleInputTypedExpressionDefinition.java} |  94 ++------
 .../camel/model/language/SpELExpression.java       |   2 +-
 .../camel/model/language/TokenizerExpression.java  |  36 +---
 ...ression.java => TypedExpressionDefinition.java} |  66 +++---
 .../model/language/XMLTokenizerExpression.java     |  24 ---
 .../camel/model/language/XPathExpression.java      |  30 +--
 .../camel/model/language/XQueryExpression.java     |  35 ++-
 .../reifier/language/CSimpleExpressionReifier.java |  36 +---
 .../language/DatasonnetExpressionReifier.java      |  31 +--
 .../camel/reifier/language/ExpressionReifier.java  |  46 +---
 .../language/JavaScriptExpressionReifier.java      |  63 ------
 .../reifier/language/JoorExpressionReifier.java    |  31 +--
 .../reifier/language/JqExpressionReifier.java      |  38 +---
 .../language/JsonPathExpressionReifier.java        |  34 +--
 .../language/MethodCallExpressionReifier.java      |  21 +-
 .../reifier/language/PythonExpressionReifier.java  |  63 ------
 .../reifier/language/SimpleExpressionReifier.java  |  32 +--
 .../SingleInputTypedExpressionReifier.java         |  44 ++++
 .../language/TokenizerExpressionReifier.java       |   7 +-
 ...ionReifier.java => TypedExpressionReifier.java} |  17 +-
 .../language/XMLTokenizerExpressionReifier.java    |   3 +-
 .../reifier/language/XPathExpressionReifier.java   |  11 +-
 .../reifier/language/XQueryExpressionReifier.java  |  11 +-
 .../language/AbstractSingleInputLanguageTest.java  | 190 +++++++++++++++++
 .../AbstractSingleInputTypedLanguageTest.java      | 192 +++++++++++++++++
 .../camel/language/AbstractTypedLanguageTest.java  | 160 ++++++++++++++
 .../apache/camel/language/BeanLanguageTest.java    |  43 ++++
 .../camel/language/ConstantLanguageTest.java       |  30 +++
 .../org/apache/camel/language/RefLanguageTest.java |  39 ++++
 .../apache/camel/language/SimpleLanguageTest.java  |  30 +++
 .../camel/language/TokenizeLanguageTest.java       |  34 +++
 .../apache/camel/language/XPathLanguageTest.java   |  34 +++
 .../org/apache/camel/support/LanguageSupport.java  |   2 +-
 .../camel/support/SingleInputLanguageSupport.java  |  60 ++++++
 .../support/SingleInputTypedLanguageSupport.java   |  86 ++++++++
 .../apache/camel/support/TypedLanguageSupport.java |  46 ++++
 .../camel/support/builder/ExpressionBuilder.java   |  18 ++
 .../java/org/apache/camel/xml/in/ModelParser.java  | 125 +++++------
 .../endpoint/dsl/XQueryEndpointBuilderFactory.java |  48 +++++
 .../dsl/yaml/deserializers/ModelDeserializers.java | 108 ++++++++--
 .../generated/resources/schema/camel-yaml-dsl.json |  54 ++++-
 .../generated/resources/schema/camelYamlDsl.json   |  54 ++++-
 210 files changed, 2773 insertions(+), 1862 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xquery.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xquery.json
index 63736e3eb4e..1de5d5a2e74 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xquery.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xquery.json
@@ -34,6 +34,7 @@
     "allowStAX": { "kind": "parameter", "displayName": "Allow St AX", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to allow using StAX mode" },
     "headerName": { "kind": "parameter", "displayName": "Header Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To use a Camel Message header as the input source instead of Message body." },
     "namespacePrefixes": { "kind": "parameter", "displayName": "Namespace Prefixes", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to control which namespace prefixes to use for a set of namespace mappings" },
+    "propertyName": { "kind": "parameter", "displayName": "Property Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To use a Camel Exchange property as the input source instead of Message body. It has a lower precedent than the name of header if both are set." },
     "resultsFormat": { "kind": "parameter", "displayName": "Results Format", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.xquery.ResultFormat", "enum": [ "Bytes", "BytesSource", "DOM", "DOMSource", "List", "String", "StringSource" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "DOM", "description": "What output result to use" },
     "resultType": { "kind": "parameter", "displayName": "Result Type", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.Class<java.lang.Object>", "deprecated": false, "autowired": false, "secret": false, "description": "What output result to use defined as a class" },
     "stripsAllWhiteSpace": { "kind": "parameter", "displayName": "Strips All White Space", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to strip all whitespaces" },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/bean.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/bean.json
index 60faf8955e4..7824135b146 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/bean.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/bean.json
@@ -20,6 +20,7 @@
     "method": { "kind": "attribute", "displayName": "Method", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of method to call" },
     "beanType": { "kind": "attribute", "displayName": "Bean Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Class name (fully qualified) of the bean to use Will lookup in registry and if there is a single instance of the same type, then the existing bean is used, otherwise a new bean is created (requires a default no-arg constructor)." },
     "scope": { "kind": "attribute", "displayName": "Scope", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "Singleton", "Request", "Prototype" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "Singleton", "description": "Scope of bean. When using singleton scope (default) the bean is created or looked up only once and reused for the lifetime of the endpoint. The bean should be thread-safe in case concurrent th [...]
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/constant.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/constant.json
index 8905dbbe253..05a3f15472e 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/constant.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/constant.json
@@ -17,7 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the constant type" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/csimple.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/csimple.json
index d8b28d3d14c..670544fe1ba 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/csimple.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/csimple.json
@@ -17,7 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/datasonnet.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/datasonnet.json
index 68a5661d799..f8265569dc2 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/datasonnet.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/datasonnet.json
@@ -19,7 +19,7 @@
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "bodyMediaType": { "kind": "attribute", "displayName": "Body Media Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The String representation of the message's body MediaType" },
     "outputMediaType": { "kind": "attribute", "displayName": "Output Media Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The String representation of the MediaType to output" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output) The default result type is com.datasonnet.document.Document" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/file.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/file.json
index 82246ab226d..03ec90d88f8 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/file.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/file.json
@@ -17,7 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/groovy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/groovy.json
index 3702f6d4b51..5681e2bb910 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/groovy.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/groovy.json
@@ -17,6 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/hl7terser.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/hl7terser.json
index de8b095888f..9dca6cfdf54 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/hl7terser.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/hl7terser.json
@@ -17,6 +17,9 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/joor.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/joor.json
index 43928b6aba6..53a784187b0 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/joor.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/joor.json
@@ -19,7 +19,7 @@
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "preCompile": { "kind": "attribute", "displayName": "Pre Compile", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the expression should be pre compiled once during initialization phase. If this is turned off, then the expression is reloaded and compiled on each evaluation." },
     "singleQuotes": { "kind": "attribute", "displayName": "Single Quotes", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether single quotes can be used as replacement for double quotes. This is convenient when you need to work with strings inside strings." },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/jq.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/jq.json
index cf40589d3c4..e303c17c7e2 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/jq.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/jq.json
@@ -17,8 +17,9 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/js.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/js.json
index 77dffcaccc7..07ee11fd74a 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/js.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/js.json
@@ -18,7 +18,6 @@
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/jsonpath.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/jsonpath.json
index 5c29847023b..294055727ad 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/jsonpath.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/jsonpath.json
@@ -17,14 +17,15 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
     "suppressExceptions": { "kind": "attribute", "displayName": "Suppress Exceptions", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to suppress exceptions such as PathNotFoundException." },
     "allowSimple": { "kind": "attribute", "displayName": "Allow Simple", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to allow in inlined Simple exceptions in the JSONPath expression" },
     "allowEasyPredicate": { "kind": "attribute", "displayName": "Allow Easy Predicate", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to allow using the easy predicate parser to pre-parse predicates." },
     "writeAsString": { "kind": "attribute", "displayName": "Write As String", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to write the output of each row\/element as a JSON String value instead of a Map\/POJO value." },
     "unpackArray": { "kind": "attribute", "displayName": "Unpack Array", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to unpack a single element json-array into an object." },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body" },
     "option": { "kind": "attribute", "displayName": "Option", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "DEFAULT_PATH_LEAF_TO_NULL", "ALWAYS_RETURN_LIST", "AS_PATH_LIST", "SUPPRESS_EXCEPTIONS", "REQUIRE_PROPERTIES" ], "deprecated": false, "autowired": false, "secret": false, "description": "To configure additional options on JSONPath. Multiple values can be separated by comma." },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/mvel.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/mvel.json
index be7cd361860..5e7e9b3c7dd 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/mvel.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/mvel.json
@@ -17,6 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/ognl.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/ognl.json
index ef9df77f818..ff3928f6706 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/ognl.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/ognl.json
@@ -17,6 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/python.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/python.json
index 9679ec2462a..59848f8a877 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/python.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/python.json
@@ -18,7 +18,6 @@
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/ref.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/ref.json
index 9e8c3d9f212..f64dbf6cc6a 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/ref.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/ref.json
@@ -17,6 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/simple.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/simple.json
index a2dc80f3b8f..d50872d4bbb 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/simple.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/simple.json
@@ -17,7 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/spel.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/spel.json
index 0dfa61eae49..0b24c3a9c89 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/spel.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/spel.json
@@ -17,6 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/tokenize.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/tokenize.json
index 3fd68ba3887..db8ecd8327d 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/tokenize.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/tokenize.json
@@ -19,13 +19,14 @@
     "token": { "kind": "attribute", "displayName": "Token", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The (start) token to use as tokenizer, for example you can use the new line token. You can use simple language as the token to support dynamic tokens." },
     "endToken": { "kind": "attribute", "displayName": "End Token", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The end token to use as tokenizer if using start\/end token pairs. You can use simple language as the token to support dynamic tokens." },
     "inheritNamespaceTagName": { "kind": "attribute", "displayName": "Inherit Namespace Tag Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To inherit namespaces from a root\/parent tag name when using XML You can use simple language as the tag name to support dynamic names." },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to tokenize instead of using the message body." },
     "regex": { "kind": "attribute", "displayName": "Regex", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the token is a regular expression pattern. The default value is false" },
     "xml": { "kind": "attribute", "displayName": "Xml", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the input is XML messages. This option must be set to true if working with XML payloads." },
     "includeTokens": { "kind": "attribute", "displayName": "Include Tokens", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to include the tokens in the parts when using pairs The default value is false" },
     "group": { "kind": "attribute", "displayName": "Group", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together, for example to split big files into chunks of 1000 lines. You can use simple language as the group to support dynamic group sizes." },
     "groupDelimiter": { "kind": "attribute", "displayName": "Group Delimiter", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the delimiter to use when grouping. If this has not been set then token will be used as the delimiter." },
     "skipFirst": { "kind": "attribute", "displayName": "Skip First", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "To skip the very first element" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xpath.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xpath.json
index 691b469b0ab..b838176c688 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xpath.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xpath.json
@@ -23,10 +23,11 @@
     "factoryRef": { "kind": "attribute", "displayName": "Factory Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a custom XPathFactory to lookup in the registry" },
     "objectModel": { "kind": "attribute", "displayName": "Object Model", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The XPath object model to use" },
     "logNamespaces": { "kind": "attribute", "displayName": "Log Namespaces", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to log namespaces which can assist during troubleshooting" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body" },
     "threadSafety": { "kind": "attribute", "displayName": "Thread Safety", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable thread-safety for the returned result of the xpath expression. This applies to when using NODESET as the result type, and the returned set has multiple elements. In this situation there can be thread-safety iss [...]
     "preCompile": { "kind": "attribute", "displayName": "Pre Compile", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to enable pre-compiling the xpath expression during initialization phase. pre-compile is enabled by default. This can be used to turn off, for example in cases the compilation phase is desired at the starting phase, such as i [...]
     "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xquery.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xquery.json
index 31f16aab599..55fa7afd886 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xquery.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xquery.json
@@ -17,10 +17,12 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "type": { "kind": "attribute", "displayName": "Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output) The default result type is NodeSet" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body" },
     "configurationRef": { "kind": "attribute", "displayName": "Configuration Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Reference to a saxon configuration instance in the registry to use for xquery (requires camel-saxon). This may be needed to add custom functions to a saxon configuration, so these custom functions can be used in xquery expressions." },
     "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xtokenize.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xtokenize.json
index 2f931f4d78d..a0dade2fac7 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xtokenize.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/xtokenize.json
@@ -16,10 +16,11 @@
     "modelJavaType": "org.apache.camel.model.language.XMLTokenizerExpression"
   },
   "properties": {
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to tokenize instead of using the message body." },
     "mode": { "kind": "attribute", "displayName": "Mode", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "i", "w", "u", "t" ], "deprecated": false, "autowired": false, "secret": false, "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its c [...]
     "group": { "kind": "attribute", "displayName": "Group", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together" },
     "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/constant.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/constant.json
index a278b369ea5..71230852b52 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/constant.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/constant.json
@@ -14,7 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the constant type" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/csimple.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/csimple.json
index 7fddf1b0686..625cf16ede3 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/csimple.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/csimple.json
@@ -14,7 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/datasonnet.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/datasonnet.json
index adfe20ad2ac..2960dffb9ae 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/datasonnet.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/datasonnet.json
@@ -16,7 +16,7 @@
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "bodyMediaType": { "kind": "attribute", "displayName": "Body Media Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The String representation of the message's body MediaType" },
     "outputMediaType": { "kind": "attribute", "displayName": "Output Media Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The String representation of the MediaType to output" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output) The default result type is com.datasonnet.document.Document" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/groovy.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/groovy.json
index 77c92e989bd..e051cb61ca7 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/groovy.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/groovy.json
@@ -14,6 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/hl7terser.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/hl7terser.json
index 7369115647a..a841dd839ad 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/hl7terser.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/hl7terser.json
@@ -14,6 +14,9 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/joor.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/joor.json
index 4c710ce53a3..10bbf095efa 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/joor.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/joor.json
@@ -16,7 +16,7 @@
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "preCompile": { "kind": "attribute", "displayName": "Pre Compile", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the expression should be pre compiled once during initialization phase. If this is turned off, then the expression is reloaded and compiled on each evaluation." },
     "singleQuotes": { "kind": "attribute", "displayName": "Single Quotes", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether single quotes can be used as replacement for double quotes. This is convenient when you need to work with strings inside strings." },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/jq.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/jq.json
index 4d69c75867a..fcafe7d45fd 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/jq.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/jq.json
@@ -14,8 +14,9 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/js.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/js.json
index 7a3f1324f03..84536020c35 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/js.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/js.json
@@ -15,7 +15,6 @@
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/jsonpath.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/jsonpath.json
index a20f08e33cc..a07dcf4d677 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/jsonpath.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/jsonpath.json
@@ -14,14 +14,15 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
     "suppressExceptions": { "kind": "attribute", "displayName": "Suppress Exceptions", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to suppress exceptions such as PathNotFoundException." },
     "allowSimple": { "kind": "attribute", "displayName": "Allow Simple", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to allow in inlined Simple exceptions in the JSONPath expression" },
     "allowEasyPredicate": { "kind": "attribute", "displayName": "Allow Easy Predicate", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to allow using the easy predicate parser to pre-parse predicates." },
     "writeAsString": { "kind": "attribute", "displayName": "Write As String", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to write the output of each row\/element as a JSON String value instead of a Map\/POJO value." },
     "unpackArray": { "kind": "attribute", "displayName": "Unpack Array", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to unpack a single element json-array into an object." },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body" },
     "option": { "kind": "attribute", "displayName": "Option", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "DEFAULT_PATH_LEAF_TO_NULL", "ALWAYS_RETURN_LIST", "AS_PATH_LIST", "SUPPRESS_EXCEPTIONS", "REQUIRE_PROPERTIES" ], "deprecated": false, "autowired": false, "secret": false, "description": "To configure additional options on JSONPath. Multiple values can be separated by comma." },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/method.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/method.json
index 0596578e62c..9d5d97d2f02 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/method.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/method.json
@@ -17,6 +17,7 @@
     "method": { "kind": "attribute", "displayName": "Method", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of method to call" },
     "beanType": { "kind": "attribute", "displayName": "Bean Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Class name (fully qualified) of the bean to use Will lookup in registry and if there is a single instance of the same type, then the existing bean is used, otherwise a new bean is created (requires a default no-arg constructor)." },
     "scope": { "kind": "attribute", "displayName": "Scope", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "Singleton", "Request", "Prototype" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "Singleton", "description": "Scope of bean. When using singleton scope (default) the bean is created or looked up only once and reused for the lifetime of the endpoint. The bean should be thread-safe in case concurrent th [...]
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/mvel.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/mvel.json
index 88afff8f89e..eda586fae34 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/mvel.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/mvel.json
@@ -14,6 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/ognl.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/ognl.json
index f5af40bcfbf..04159b670ff 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/ognl.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/ognl.json
@@ -14,6 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/python.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/python.json
index 051b931520a..7ce9963ddf7 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/python.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/python.json
@@ -15,7 +15,6 @@
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/ref.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/ref.json
index f2cf694e0c7..7b6db096791 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/ref.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/ref.json
@@ -14,6 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/simple.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/simple.json
index 16b3220d23d..496a452373c 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/simple.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/simple.json
@@ -14,7 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/spel.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/spel.json
index ec1362c3e79..07bf4b24910 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/spel.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/spel.json
@@ -14,6 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/tokenize.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/tokenize.json
index 8a3af1b3f66..4c8379a9151 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/tokenize.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/tokenize.json
@@ -16,13 +16,14 @@
     "token": { "kind": "attribute", "displayName": "Token", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The (start) token to use as tokenizer, for example you can use the new line token. You can use simple language as the token to support dynamic tokens." },
     "endToken": { "kind": "attribute", "displayName": "End Token", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The end token to use as tokenizer if using start\/end token pairs. You can use simple language as the token to support dynamic tokens." },
     "inheritNamespaceTagName": { "kind": "attribute", "displayName": "Inherit Namespace Tag Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To inherit namespaces from a root\/parent tag name when using XML You can use simple language as the tag name to support dynamic names." },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to tokenize instead of using the message body." },
     "regex": { "kind": "attribute", "displayName": "Regex", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the token is a regular expression pattern. The default value is false" },
     "xml": { "kind": "attribute", "displayName": "Xml", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the input is XML messages. This option must be set to true if working with XML payloads." },
     "includeTokens": { "kind": "attribute", "displayName": "Include Tokens", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to include the tokens in the parts when using pairs The default value is false" },
     "group": { "kind": "attribute", "displayName": "Group", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together, for example to split big files into chunks of 1000 lines. You can use simple language as the group to support dynamic group sizes." },
     "groupDelimiter": { "kind": "attribute", "displayName": "Group Delimiter", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the delimiter to use when grouping. If this has not been set then token will be used as the delimiter." },
     "skipFirst": { "kind": "attribute", "displayName": "Skip First", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "To skip the very first element" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xpath.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xpath.json
index c39cc1016ef..3faab8a68ef 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xpath.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xpath.json
@@ -20,10 +20,11 @@
     "factoryRef": { "kind": "attribute", "displayName": "Factory Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a custom XPathFactory to lookup in the registry" },
     "objectModel": { "kind": "attribute", "displayName": "Object Model", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The XPath object model to use" },
     "logNamespaces": { "kind": "attribute", "displayName": "Log Namespaces", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to log namespaces which can assist during troubleshooting" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body" },
     "threadSafety": { "kind": "attribute", "displayName": "Thread Safety", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable thread-safety for the returned result of the xpath expression. This applies to when using NODESET as the result type, and the returned set has multiple elements. In this situation there can be thread-safety iss [...]
     "preCompile": { "kind": "attribute", "displayName": "Pre Compile", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to enable pre-compiling the xpath expression during initialization phase. pre-compile is enabled by default. This can be used to turn off, for example in cases the compilation phase is desired at the starting phase, such as i [...]
     "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xquery.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xquery.json
index aa108ec71e5..940fa878d77 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xquery.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xquery.json
@@ -14,10 +14,12 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "type": { "kind": "attribute", "displayName": "Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output) The default result type is NodeSet" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body" },
     "configurationRef": { "kind": "attribute", "displayName": "Configuration Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Reference to a saxon configuration instance in the registry to use for xquery (requires camel-saxon). This may be needed to add custom functions to a saxon configuration, so these custom functions can be used in xquery expressions." },
     "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xtokenize.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xtokenize.json
index 7b7ecd858f4..61172988455 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xtokenize.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/xtokenize.json
@@ -13,10 +13,11 @@
     "output": false
   },
   "properties": {
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to tokenize instead of using the message body." },
     "mode": { "kind": "attribute", "displayName": "Mode", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "i", "w", "u", "t" ], "deprecated": false, "autowired": false, "secret": false, "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its c [...]
     "group": { "kind": "attribute", "displayName": "Group", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together" },
     "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
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 d50e518ee0d..de64274293e 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
@@ -20244,6 +20244,16 @@ References to an existing or custom error handler.
     
   <xs:complexType name="cSimpleExpression">
         
+    <xs:simpleContent>
+            
+      <xs:extension base="tns:typedExpressionDefinition"/>
+          
+    </xs:simpleContent>
+      
+  </xs:complexType>
+    
+  <xs:complexType abstract="true" name="typedExpressionDefinition">
+        
     <xs:simpleContent>
             
       <xs:extension base="tns:expression">
@@ -20252,7 +20262,7 @@ References to an existing or custom error handler.
           <xs:annotation>
             <xs:documentation xml:lang="en">
               <![CDATA[
-Sets the class name of the result type (type from output).
+Sets the class of the result type (type from output).
             ]]>
             </xs:documentation>
           </xs:annotation>
@@ -20268,19 +20278,7 @@ Sets the class name of the result type (type from output).
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression">
-                
-        <xs:attribute name="resultType" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en">
-              <![CDATA[
-Sets the class name of the constant type.
-            ]]>
-            </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-              
-      </xs:extension>
+      <xs:extension base="tns:typedExpressionDefinition"/>
           
     </xs:simpleContent>
       
@@ -20290,7 +20288,7 @@ Sets the class name of the constant type.
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression">
+      <xs:extension base="tns:typedExpressionDefinition">
                 
         <xs:attribute name="bodyMediaType" type="xs:string">
           <xs:annotation>
@@ -20311,17 +20309,6 @@ The String representation of the MediaType to output.
             </xs:documentation>
           </xs:annotation>
         </xs:attribute>
-                
-        <xs:attribute name="resultType" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en">
-              <![CDATA[
-Sets the class name of the result type (type from output) The default result
-type is com.datasonnet.document.Document.
-            ]]>
-            </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
               
       </xs:extension>
           
@@ -20343,7 +20330,7 @@ type is com.datasonnet.document.Document.
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression"/>
+      <xs:extension base="tns:typedExpressionDefinition"/>
           
     </xs:simpleContent>
       
@@ -20363,34 +20350,35 @@ type is com.datasonnet.document.Document.
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression"/>
+      <xs:extension base="tns:singleInputTypedExpressionDefinition"/>
           
     </xs:simpleContent>
       
   </xs:complexType>
     
-  <xs:complexType name="javaScriptExpression">
+  <xs:complexType abstract="true" name="singleInputTypedExpressionDefinition">
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression">
+      <xs:extension base="tns:typedExpressionDefinition">
                 
-        <xs:attribute name="resultType" type="xs:string">
+        <xs:attribute name="headerName" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en">
               <![CDATA[
-Sets the class of the result type (type from output).
+Name of header to use as input, instead of the message body It has as higher
+precedent than the propertyName if both are set.
             ]]>
             </xs:documentation>
           </xs:annotation>
         </xs:attribute>
                 
-        <xs:attribute name="headerName" type="xs:string">
+        <xs:attribute name="propertyName" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en">
               <![CDATA[
-Name of header to use as input, instead of the message body It has as higher
-precedent than the propertyName if both are set.
+Name of property to use as input, instead of the message body. It has a lower
+precedent than the headerName if both are set.
             ]]>
             </xs:documentation>
           </xs:annotation>
@@ -20402,11 +20390,21 @@ precedent than the propertyName if both are set.
       
   </xs:complexType>
     
+  <xs:complexType name="javaScriptExpression">
+        
+    <xs:simpleContent>
+            
+      <xs:extension base="tns:typedExpressionDefinition"/>
+          
+    </xs:simpleContent>
+      
+  </xs:complexType>
+    
   <xs:complexType name="joorExpression">
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression">
+      <xs:extension base="tns:typedExpressionDefinition">
                 
         <xs:attribute name="preCompile" type="xs:string">
           <xs:annotation>
@@ -20431,16 +20429,6 @@ true
             </xs:documentation>
           </xs:annotation>
         </xs:attribute>
-                
-        <xs:attribute name="resultType" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en">
-              <![CDATA[
-Sets the class name of the result type (type from output).
-            ]]>
-            </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
               
       </xs:extension>
           
@@ -20452,30 +20440,7 @@ Sets the class name of the result type (type from output).
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression">
-                
-        <xs:attribute name="resultType" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en">
-              <![CDATA[
-Sets the class of the result type (type from output).
-            ]]>
-            </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-                
-        <xs:attribute name="headerName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en">
-              <![CDATA[
-Name of header to use as input, instead of the message body It has as higher
-precedent than the propertyName if both are set.
-            ]]>
-            </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-              
-      </xs:extension>
+      <xs:extension base="tns:singleInputTypedExpressionDefinition"/>
           
     </xs:simpleContent>
       
@@ -20485,17 +20450,7 @@ precedent than the propertyName if both are set.
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression">
-                
-        <xs:attribute name="resultType" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en">
-              <![CDATA[
-Sets the class name of the result type (type from output).
-            ]]>
-            </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
+      <xs:extension base="tns:singleInputTypedExpressionDefinition">
                 
         <xs:attribute name="suppressExceptions" type="xs:string">
           <xs:annotation>
@@ -20552,16 +20507,6 @@ false
           </xs:annotation>
         </xs:attribute>
                 
-        <xs:attribute name="headerName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en">
-              <![CDATA[
-Name of header to use as input, instead of the message body.
-            ]]>
-            </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-                
         <xs:attribute name="option" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en">
@@ -20605,7 +20550,7 @@ The name of the language to use.
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression">
+      <xs:extension base="tns:typedExpressionDefinition">
                 
         <xs:attribute name="ref" type="xs:string">
           <xs:annotation>
@@ -20671,7 +20616,7 @@ implementation. Default value: Singleton
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression"/>
+      <xs:extension base="tns:typedExpressionDefinition"/>
           
     </xs:simpleContent>
       
@@ -20681,44 +20626,35 @@ implementation. Default value: Singleton
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression"/>
+      <xs:extension base="tns:singleInputExpressionDefinition"/>
           
     </xs:simpleContent>
       
   </xs:complexType>
     
-  <xs:complexType name="ognlExpression">
-        
-    <xs:simpleContent>
-            
-      <xs:extension base="tns:expression"/>
-          
-    </xs:simpleContent>
-      
-  </xs:complexType>
-    
-  <xs:complexType name="pythonExpression">
+  <xs:complexType abstract="true" name="singleInputExpressionDefinition">
         
     <xs:simpleContent>
             
       <xs:extension base="tns:expression">
                 
-        <xs:attribute name="resultType" type="xs:string">
+        <xs:attribute name="headerName" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en">
               <![CDATA[
-Sets the class of the result type (type from output).
+Name of header to use as input, instead of the message body It has as higher
+precedent than the propertyName if both are set.
             ]]>
             </xs:documentation>
           </xs:annotation>
         </xs:attribute>
                 
-        <xs:attribute name="headerName" type="xs:string">
+        <xs:attribute name="propertyName" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en">
               <![CDATA[
-Name of header to use as input, instead of the message body It has as higher
-precedent than the propertyName if both are set.
+Name of property to use as input, instead of the message body. It has a lower
+precedent than the headerName if both are set.
             ]]>
             </xs:documentation>
           </xs:annotation>
@@ -20730,11 +20666,31 @@ precedent than the propertyName if both are set.
       
   </xs:complexType>
     
+  <xs:complexType name="ognlExpression">
+        
+    <xs:simpleContent>
+            
+      <xs:extension base="tns:typedExpressionDefinition"/>
+          
+    </xs:simpleContent>
+      
+  </xs:complexType>
+    
+  <xs:complexType name="pythonExpression">
+        
+    <xs:simpleContent>
+            
+      <xs:extension base="tns:typedExpressionDefinition"/>
+          
+    </xs:simpleContent>
+      
+  </xs:complexType>
+    
   <xs:complexType name="refExpression">
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression"/>
+      <xs:extension base="tns:typedExpressionDefinition"/>
           
     </xs:simpleContent>
       
@@ -20744,19 +20700,7 @@ precedent than the propertyName if both are set.
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression">
-                
-        <xs:attribute name="resultType" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en">
-              <![CDATA[
-Sets the class name of the result type (type from output).
-            ]]>
-            </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-              
-      </xs:extension>
+      <xs:extension base="tns:typedExpressionDefinition"/>
           
     </xs:simpleContent>
       
@@ -20766,7 +20710,7 @@ Sets the class name of the result type (type from output).
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression"/>
+      <xs:extension base="tns:typedExpressionDefinition"/>
           
     </xs:simpleContent>
       
@@ -20776,7 +20720,7 @@ Sets the class name of the result type (type from output).
         
     <xs:simpleContent>
             
-      <xs:extension base="tns:expression">
+      <xs:extension base="tns:singleInputExpressionDefinition">
                 
         <xs:attribute name="token" type="xs:string" use="required">
           <xs:annotation>
@@ -20811,16 +20755,6 @@ simple language as the tag name to support dynamic names.
           </xs:annotation>
         </xs:attribute>
                 
-        <xs:attribute name="headerName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en">
-              <![CDATA[
-Name of header to tokenize instead of using the message body.
-            ]]>
-            </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-                
         <xs:attribute name="regex" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en">
@@ -20898,16 +20832,6 @@ To skip the very first element. Default value: false
             
       <xs:extension base="tns:namespaceAwareExpression">
                 
-        <xs:attribute name="headerName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en">
-              <![CDATA[
-Name of header to tokenize instead of using the message body.
-            ]]>
-            </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-                
         <xs:attribute name="mode" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en">
@@ -21005,16 +20929,6 @@ value: false
           </xs:annotation>
         </xs:attribute>
                 
-        <xs:attribute name="headerName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation xml:lang="en">
-              <![CDATA[
-Name of header to use as input, instead of the message body.
-            ]]>
-            </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-                
         <xs:attribute name="threadSafety" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en">
@@ -21059,22 +20973,22 @@ JVM runtime. Default value: true
             
       <xs:extension base="tns:namespaceAwareExpression">
                 
-        <xs:attribute name="type" type="xs:string">
+        <xs:attribute name="resultType" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en">
               <![CDATA[
-Sets the class name of the result type (type from output) The default result
-type is NodeSet.
+Sets the class of the result type (type from output).
             ]]>
             </xs:documentation>
           </xs:annotation>
         </xs:attribute>
                 
-        <xs:attribute name="headerName" type="xs:string">
+        <xs:attribute name="type" type="xs:string">
           <xs:annotation>
             <xs:documentation xml:lang="en">
               <![CDATA[
-Name of header to use as input, instead of the message body.
+Sets the class name of the result type (type from output) The default result
+type is NodeSet.
             ]]>
             </xs:documentation>
           </xs:annotation>
diff --git a/components/camel-bean/src/generated/resources/org/apache/camel/language/bean/bean.json b/components/camel-bean/src/generated/resources/org/apache/camel/language/bean/bean.json
index 60faf8955e4..7824135b146 100644
--- a/components/camel-bean/src/generated/resources/org/apache/camel/language/bean/bean.json
+++ b/components/camel-bean/src/generated/resources/org/apache/camel/language/bean/bean.json
@@ -20,6 +20,7 @@
     "method": { "kind": "attribute", "displayName": "Method", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of method to call" },
     "beanType": { "kind": "attribute", "displayName": "Bean Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Class name (fully qualified) of the bean to use Will lookup in registry and if there is a single instance of the same type, then the existing bean is used, otherwise a new bean is created (requires a default no-arg constructor)." },
     "scope": { "kind": "attribute", "displayName": "Scope", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "Singleton", "Request", "Prototype" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "Singleton", "description": "Scope of bean. When using singleton scope (default) the bean is created or looked up only once and reused for the lifetime of the endpoint. The bean should be thread-safe in case concurrent th [...]
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java
index 4ed09b828d7..9c6c7ac6504 100644
--- a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java
+++ b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java
@@ -58,7 +58,7 @@ public class BeanExpression implements Expression, Predicate {
     private ParameterMappingStrategy parameterMappingStrategy;
     private BeanComponent beanComponent;
     private Language simple;
-
+    private Class<?> resultType;
     private Object bean;
     private String beanName;
     private Class<?> type;
@@ -136,6 +136,14 @@ public class BeanExpression implements Expression, Predicate {
         this.simple = simple;
     }
 
+    public Class<?> getResultType() {
+        return resultType;
+    }
+
+    public void setResultType(Class<?> resultType) {
+        this.resultType = resultType;
+    }
+
     @Override
     public void init(CamelContext context) {
         if (parameterMappingStrategy == null) {
@@ -213,7 +221,8 @@ public class BeanExpression implements Expression, Predicate {
         Object result = evaluate(exchange);
         if (Object.class == type) {
             // do not use type converter if type is Object (optimize)
-            return (T) result;
+            return (T) (resultType == null
+                    ? result : exchange.getContext().getTypeConverter().convertTo(resultType, exchange, result));
         } else {
             return exchange.getContext().getTypeConverter().convertTo(type, exchange, result);
         }
diff --git a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
index cf510813aaa..2532472688a 100644
--- a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
+++ b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanLanguage.java
@@ -39,8 +39,8 @@ import org.apache.camel.spi.Language;
 import org.apache.camel.spi.PropertyConfigurer;
 import org.apache.camel.spi.ScriptingLanguage;
 import org.apache.camel.support.ExpressionToPredicateAdapter;
-import org.apache.camel.support.LanguageSupport;
 import org.apache.camel.support.ObjectHelper;
+import org.apache.camel.support.TypedLanguageSupport;
 import org.apache.camel.support.component.PropertyConfigurerSupport;
 import org.apache.camel.util.StringHelper;
 import org.apache.camel.util.URISupport;
@@ -57,7 +57,7 @@ import org.apache.camel.util.URISupport;
  * As of Camel 1.5 the bean language also supports invoking a provided bean by its classname or the bean itself.
  */
 @org.apache.camel.spi.annotations.Language("bean")
-public class BeanLanguage extends LanguageSupport implements ScriptingLanguage, PropertyConfigurer, StaticService {
+public class BeanLanguage extends TypedLanguageSupport implements ScriptingLanguage, PropertyConfigurer, StaticService {
     public static final String LANGUAGE = "bean";
 
     private volatile BeanComponent beanComponent;
@@ -135,6 +135,10 @@ public class BeanLanguage extends LanguageSupport implements ScriptingLanguage,
             case "scope":
                 setScope(PropertyConfigurerSupport.property(camelContext, BeanScope.class, value));
                 return true;
+            case "resultType":
+            case "resulttype":
+                setResultType(PropertyConfigurerSupport.property(camelContext, Class.class, value));
+                return true;
             default:
                 return false;
         }
@@ -182,6 +186,7 @@ public class BeanLanguage extends LanguageSupport implements ScriptingLanguage,
                 answer.setScope(BeanScope.valueOf(scope.toString()));
             }
         }
+        answer.setResultType(property(Class.class, properties, 5, getResultType()));
         answer.setBeanComponent(beanComponent);
         answer.setParameterMappingStrategy(parameterMappingStrategy);
         answer.setSimple(simple);
diff --git a/components/camel-csimple-joor/pom.xml b/components/camel-csimple-joor/pom.xml
index 70eb7fc630e..de034b38624 100644
--- a/components/camel-csimple-joor/pom.xml
+++ b/components/camel-csimple-joor/pom.xml
@@ -62,6 +62,17 @@
             <artifactId>log4j-slf4j-impl</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/components/camel-csimple-joor/src/test/java/org/apache/camel/language/CSimpleLanguageTest.java b/components/camel-csimple-joor/src/test/java/org/apache/camel/language/CSimpleLanguageTest.java
new file mode 100644
index 00000000000..2d113961454
--- /dev/null
+++ b/components/camel-csimple-joor/src/test/java/org/apache/camel/language/CSimpleLanguageTest.java
@@ -0,0 +1,30 @@
+/*
+ * 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.language;
+
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.model.language.CSimpleExpression;
+
+/**
+ * Ensures that the "csimple" language is compliant with the typed language expectations.
+ */
+class CSimpleLanguageTest extends AbstractTypedLanguageTest<CSimpleExpression.Builder, CSimpleExpression> {
+
+    CSimpleLanguageTest() {
+        super("${body}", LanguageBuilderFactory::csimple);
+    }
+}
diff --git a/components/camel-datasonnet/pom.xml b/components/camel-datasonnet/pom.xml
index d1ac8a5f335..e5df2894769 100644
--- a/components/camel-datasonnet/pom.xml
+++ b/components/camel-datasonnet/pom.xml
@@ -93,6 +93,17 @@
             <version>${jsonassert-version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/components/camel-datasonnet/src/generated/resources/org/apache/camel/language/datasonnet/datasonnet.json b/components/camel-datasonnet/src/generated/resources/org/apache/camel/language/datasonnet/datasonnet.json
index 68a5661d799..f8265569dc2 100644
--- a/components/camel-datasonnet/src/generated/resources/org/apache/camel/language/datasonnet/datasonnet.json
+++ b/components/camel-datasonnet/src/generated/resources/org/apache/camel/language/datasonnet/datasonnet.json
@@ -19,7 +19,7 @@
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "bodyMediaType": { "kind": "attribute", "displayName": "Body Media Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The String representation of the message's body MediaType" },
     "outputMediaType": { "kind": "attribute", "displayName": "Output Media Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The String representation of the MediaType to output" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output) The default result type is com.datasonnet.document.Document" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java b/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
index b42be46b5fe..1249e5018a9 100644
--- a/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
+++ b/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
@@ -34,13 +34,13 @@ import org.apache.camel.Predicate;
 import org.apache.camel.spi.PropertyConfigurer;
 import org.apache.camel.spi.annotations.Language;
 import org.apache.camel.support.LRUCacheFactory;
-import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.support.TypedLanguageSupport;
 import org.apache.camel.support.component.PropertyConfigurerSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Language("datasonnet")
-public class DatasonnetLanguage extends LanguageSupport implements PropertyConfigurer {
+public class DatasonnetLanguage extends TypedLanguageSupport implements PropertyConfigurer {
     private static final Logger LOG = LoggerFactory.getLogger(DatasonnetLanguage.class);
 
     private static final Map<String, String> CLASSPATH_IMPORTS = new HashMap<>();
@@ -67,7 +67,6 @@ public class DatasonnetLanguage extends LanguageSupport implements PropertyConfi
 
     private MediaType bodyMediaType;
     private MediaType outputMediaType;
-    private Class<?> resultType;
     private Collection<String> libraryPaths;
 
     @Override
@@ -90,7 +89,7 @@ public class DatasonnetLanguage extends LanguageSupport implements PropertyConfi
         expression = loadResource(expression);
 
         DatasonnetExpression answer = new DatasonnetExpression(expression);
-        answer.setResultType(property(Class.class, properties, 0, resultType));
+        answer.setResultType(property(Class.class, properties, 0, getResultType()));
 
         String stringBodyMediaType = property(String.class, properties, 1, null);
         answer.setBodyMediaType(stringBodyMediaType != null ? MediaType.valueOf(stringBodyMediaType) : bodyMediaType);
@@ -170,8 +169,4 @@ public class DatasonnetLanguage extends LanguageSupport implements PropertyConfi
     public void setLibraryPaths(Collection<String> libraryPaths) {
         this.libraryPaths = libraryPaths;
     }
-
-    public void setResultType(Class<?> targetType) {
-        this.resultType = targetType;
-    }
 }
diff --git a/components/camel-datasonnet/src/test/java/org/apache/camel/language/DatasonnetLanguageTest.java b/components/camel-datasonnet/src/test/java/org/apache/camel/language/DatasonnetLanguageTest.java
new file mode 100644
index 00000000000..6d7f0c562b2
--- /dev/null
+++ b/components/camel-datasonnet/src/test/java/org/apache/camel/language/DatasonnetLanguageTest.java
@@ -0,0 +1,36 @@
+/*
+ * 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.language;
+
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.model.language.DatasonnetExpression;
+import org.junit.jupiter.api.Disabled;
+
+/**
+ * Ensures that the "datasonnet" language is compliant with the typed language expectations.
+ */
+class DatasonnetLanguageTest extends AbstractTypedLanguageTest<DatasonnetExpression.Builder, DatasonnetExpression> {
+
+    DatasonnetLanguageTest() {
+        super("body", LanguageBuilderFactory::datasonnet);
+    }
+
+    @Disabled("In this case a DefaultDocument is received and this type has no equal method implemented")
+    @Override
+    void testExpressionOnly() {
+    }
+}
diff --git a/components/camel-groovy/pom.xml b/components/camel-groovy/pom.xml
index dd5fd831bba..f447a5b487f 100644
--- a/components/camel-groovy/pom.xml
+++ b/components/camel-groovy/pom.xml
@@ -73,5 +73,16 @@
             <artifactId>junit-jupiter</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/components/camel-groovy/src/generated/resources/org/apache/camel/language/groovy/groovy.json b/components/camel-groovy/src/generated/resources/org/apache/camel/language/groovy/groovy.json
index 3702f6d4b51..5681e2bb910 100644
--- a/components/camel-groovy/src/generated/resources/org/apache/camel/language/groovy/groovy.json
+++ b/components/camel-groovy/src/generated/resources/org/apache/camel/language/groovy/groovy.json
@@ -17,6 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-groovy/src/main/java/org/apache/camel/language/groovy/GroovyLanguage.java b/components/camel-groovy/src/main/java/org/apache/camel/language/groovy/GroovyLanguage.java
index 6d2563737ed..145a752147f 100644
--- a/components/camel-groovy/src/main/java/org/apache/camel/language/groovy/GroovyLanguage.java
+++ b/components/camel-groovy/src/main/java/org/apache/camel/language/groovy/GroovyLanguage.java
@@ -25,12 +25,12 @@ import org.apache.camel.Service;
 import org.apache.camel.spi.ScriptingLanguage;
 import org.apache.camel.spi.annotations.Language;
 import org.apache.camel.support.LRUCacheFactory;
-import org.apache.camel.support.LanguageSupport;
 import org.apache.camel.support.ObjectHelper;
+import org.apache.camel.support.TypedLanguageSupport;
 import org.codehaus.groovy.runtime.InvokerHelper;
 
 @Language("groovy")
-public class GroovyLanguage extends LanguageSupport implements ScriptingLanguage {
+public class GroovyLanguage extends TypedLanguageSupport implements ScriptingLanguage {
 
     // Cache used to stores the compiled scripts (aka their classes)
     private final Map<String, GroovyClassService> scriptCache = LRUCacheFactory.newLRUSoftCache(16, 1000, true);
diff --git a/components/camel-groovy/src/test/java/org/apache/camel/language/GroovyLanguageTest.java b/components/camel-groovy/src/test/java/org/apache/camel/language/GroovyLanguageTest.java
new file mode 100644
index 00000000000..76a73bf0524
--- /dev/null
+++ b/components/camel-groovy/src/test/java/org/apache/camel/language/GroovyLanguageTest.java
@@ -0,0 +1,30 @@
+/*
+ * 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.language;
+
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.model.language.GroovyExpression;
+
+/**
+ * Ensures that the "groovy" language is compliant with the typed language expectations.
+ */
+class GroovyLanguageTest extends AbstractTypedLanguageTest<GroovyExpression.Builder, GroovyExpression> {
+
+    GroovyLanguageTest() {
+        super("body", LanguageBuilderFactory::groovy);
+    }
+}
diff --git a/components/camel-hl7/pom.xml b/components/camel-hl7/pom.xml
index ac5f28acd7c..adbbe0bb727 100644
--- a/components/camel-hl7/pom.xml
+++ b/components/camel-hl7/pom.xml
@@ -132,5 +132,16 @@
             <artifactId>log4j-slf4j-impl</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/components/camel-hl7/src/generated/resources/org/apache/camel/component/hl7/hl7terser.json b/components/camel-hl7/src/generated/resources/org/apache/camel/component/hl7/hl7terser.json
index de8b095888f..9dca6cfdf54 100644
--- a/components/camel-hl7/src/generated/resources/org/apache/camel/component/hl7/hl7terser.json
+++ b/components/camel-hl7/src/generated/resources/org/apache/camel/component/hl7/hl7terser.json
@@ -17,6 +17,9 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/Hl7TerserLanguage.java b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/Hl7TerserLanguage.java
index 9839237cc75..bf8048169c3 100644
--- a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/Hl7TerserLanguage.java
+++ b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/Hl7TerserLanguage.java
@@ -19,25 +19,31 @@ package org.apache.camel.component.hl7;
 import ca.uhn.hl7v2.HL7Exception;
 import ca.uhn.hl7v2.model.Message;
 import ca.uhn.hl7v2.util.Terser;
+import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
 import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.spi.Language;
 import org.apache.camel.support.ExpressionAdapter;
 import org.apache.camel.support.ExpressionToPredicateAdapter;
+import org.apache.camel.support.SingleInputTypedLanguageSupport;
+import org.apache.camel.support.builder.ExpressionBuilder;
 import org.apache.camel.util.ObjectHelper;
 
 @org.apache.camel.spi.annotations.Language("hl7terser")
-public class Hl7TerserLanguage implements Language {
+public class Hl7TerserLanguage extends SingleInputTypedLanguageSupport {
 
     public static Expression terser(final String expression) {
+        return terser(ExpressionBuilder.bodyExpression(), expression);
+    }
+
+    private static Expression terser(final Expression source, final String expression) {
         ObjectHelper.notNull(expression, "expression");
         return new ExpressionAdapter() {
 
             @Override
             public Object evaluate(Exchange exchange) {
-                Message message = exchange.getIn().getBody(Message.class);
+                Message message = source.evaluate(exchange, Message.class);
                 try {
                     return new Terser(message).get(expression.trim());
                 } catch (HL7Exception e) {
@@ -45,6 +51,11 @@ public class Hl7TerserLanguage implements Language {
                 }
             }
 
+            @Override
+            public void init(CamelContext context) {
+                source.init(context);
+            }
+
             @Override
             public String toString() {
                 return "hl7terser(" + expression + ")";
@@ -63,4 +74,8 @@ public class Hl7TerserLanguage implements Language {
         return terser(expression);
     }
 
+    @Override
+    protected Expression createExpression(Expression source, String expression, Object[] properties) {
+        return terser(source, expression);
+    }
 }
diff --git a/components/camel-hl7/src/test/java/org/apache/camel/language/Hl7TerserLanguageTest.java b/components/camel-hl7/src/test/java/org/apache/camel/language/Hl7TerserLanguageTest.java
new file mode 100644
index 00000000000..809fd956e6f
--- /dev/null
+++ b/components/camel-hl7/src/test/java/org/apache/camel/language/Hl7TerserLanguageTest.java
@@ -0,0 +1,57 @@
+/*
+ * 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.language;
+
+import ca.uhn.hl7v2.model.Message;
+import ca.uhn.hl7v2.model.v24.message.ADT_A01;
+import ca.uhn.hl7v2.model.v24.segment.PID;
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.model.language.Hl7TerserExpression;
+
+/**
+ * Ensures that the "hl7terser" language is compliant with the single input / typed language expectations.
+ */
+class Hl7TerserLanguageTest extends AbstractSingleInputTypedLanguageTest<Hl7TerserExpression.Builder, Hl7TerserExpression> {
+
+    private static final String PATIENT_ID = "1";
+
+    Hl7TerserLanguageTest() {
+        super("PID-3-1", LanguageBuilderFactory::hl7terser);
+    }
+
+    @Override
+    protected Object defaultContentToSend() {
+        try {
+            return createADT01Message();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static Message createADT01Message() throws Exception {
+        ADT_A01 adt = new ADT_A01();
+        adt.initQuickstart("ADT", "A01", "P");
+
+        // Populate the PID Segment
+        PID pid = adt.getPID();
+        pid.getPatientName(0).getFamilyName().getSurname().setValue("Smith");
+        pid.getPatientName(0).getGivenName().setValue("John");
+        pid.getPatientIdentifierList(0).getID().setValue(PATIENT_ID);
+
+        return adt;
+    }
+}
diff --git a/components/camel-javascript/pom.xml b/components/camel-javascript/pom.xml
index 4d70b901ccb..21f500b5ce9 100644
--- a/components/camel-javascript/pom.xml
+++ b/components/camel-javascript/pom.xml
@@ -59,6 +59,17 @@
             <artifactId>junit-jupiter</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/components/camel-javascript/src/generated/resources/org/apache/camel/language/js/js.json b/components/camel-javascript/src/generated/resources/org/apache/camel/language/js/js.json
index 77dffcaccc7..07ee11fd74a 100644
--- a/components/camel-javascript/src/generated/resources/org/apache/camel/language/js/js.json
+++ b/components/camel-javascript/src/generated/resources/org/apache/camel/language/js/js.json
@@ -18,7 +18,6 @@
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-javascript/src/main/java/org/apache/camel/language/js/JavaScriptExpression.java b/components/camel-javascript/src/main/java/org/apache/camel/language/js/JavaScriptExpression.java
index 4c0850c2e84..8d6258c161a 100644
--- a/components/camel-javascript/src/main/java/org/apache/camel/language/js/JavaScriptExpression.java
+++ b/components/camel-javascript/src/main/java/org/apache/camel/language/js/JavaScriptExpression.java
@@ -40,6 +40,7 @@ public class JavaScriptExpression extends ExpressionSupport {
         return expressionString;
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public <T> T evaluate(Exchange exchange, Class<T> type) {
         try (Context cx = JavaScriptHelper.newContext()) {
@@ -54,8 +55,11 @@ public class JavaScriptExpression extends ExpressionSupport {
             b.putMember("body", exchange.getMessage().getBody());
 
             Value o = cx.eval("js", expressionString);
-            Object answer = o != null ? o.as(type) : null;
-            return type.cast(answer);
+            Object answer = o != null ? o.as(Object.class) : null;
+            if (type == Object.class) {
+                return (T) answer;
+            }
+            return exchange.getContext().getTypeConverter().convertTo(type, exchange, answer);
         }
     }
 
diff --git a/components/camel-javascript/src/main/java/org/apache/camel/language/js/JavaScriptLanguage.java b/components/camel-javascript/src/main/java/org/apache/camel/language/js/JavaScriptLanguage.java
index 0a125359144..430bd99b947 100644
--- a/components/camel-javascript/src/main/java/org/apache/camel/language/js/JavaScriptLanguage.java
+++ b/components/camel-javascript/src/main/java/org/apache/camel/language/js/JavaScriptLanguage.java
@@ -22,23 +22,21 @@ import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
 import org.apache.camel.spi.ScriptingLanguage;
 import org.apache.camel.spi.annotations.Language;
-import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.support.TypedLanguageSupport;
 import org.graalvm.polyglot.Context;
 import org.graalvm.polyglot.Value;
 
 @Language("js")
-public class JavaScriptLanguage extends LanguageSupport implements ScriptingLanguage {
+public class JavaScriptLanguage extends TypedLanguageSupport implements ScriptingLanguage {
 
     @Override
     public Predicate createPredicate(String expression) {
-        expression = loadResource(expression);
-        return new JavaScriptExpression(expression, Boolean.class);
+        return createJavaScriptExpression(expression, Boolean.class);
     }
 
     @Override
     public Expression createExpression(String expression) {
-        expression = loadResource(expression);
-        return new JavaScriptExpression(expression, Object.class);
+        return createJavaScriptExpression(expression, Object.class);
     }
 
     @Override
@@ -52,4 +50,13 @@ public class JavaScriptLanguage extends LanguageSupport implements ScriptingLang
             return resultType.cast(answer);
         }
     }
+
+    /**
+     * @param  expression the expression to evaluate
+     * @param  type       the type of the result
+     * @return            the corresponding {@code JavaScriptExpression}
+     */
+    private JavaScriptExpression createJavaScriptExpression(String expression, Class<?> type) {
+        return new JavaScriptExpression(loadResource(expression), type);
+    }
 }
diff --git a/components/camel-javascript/src/test/java/org/apache/camel/language/JavaScriptLanguageTest.java b/components/camel-javascript/src/test/java/org/apache/camel/language/JavaScriptLanguageTest.java
new file mode 100644
index 00000000000..e35d6f01060
--- /dev/null
+++ b/components/camel-javascript/src/test/java/org/apache/camel/language/JavaScriptLanguageTest.java
@@ -0,0 +1,30 @@
+/*
+ * 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.language;
+
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.model.language.JavaScriptExpression;
+
+/**
+ * Ensures that the "js" language is compliant with the typed language expectations.
+ */
+class JavaScriptLanguageTest extends AbstractTypedLanguageTest<JavaScriptExpression.Builder, JavaScriptExpression> {
+
+    JavaScriptLanguageTest() {
+        super("body", LanguageBuilderFactory::js);
+    }
+}
diff --git a/components/camel-joor/pom.xml b/components/camel-joor/pom.xml
index bf8fee21714..11517d75f3b 100644
--- a/components/camel-joor/pom.xml
+++ b/components/camel-joor/pom.xml
@@ -71,6 +71,17 @@
             <artifactId>log4j-slf4j-impl</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/components/camel-joor/src/generated/resources/org/apache/camel/language/joor/joor.json b/components/camel-joor/src/generated/resources/org/apache/camel/language/joor/joor.json
index 43928b6aba6..53a784187b0 100644
--- a/components/camel-joor/src/generated/resources/org/apache/camel/language/joor/joor.json
+++ b/components/camel-joor/src/generated/resources/org/apache/camel/language/joor/joor.json
@@ -19,7 +19,7 @@
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "preCompile": { "kind": "attribute", "displayName": "Pre Compile", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the expression should be pre compiled once during initialization phase. If this is turned off, then the expression is reloaded and compiled on each evaluation." },
     "singleQuotes": { "kind": "attribute", "displayName": "Single Quotes", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether single quotes can be used as replacement for double quotes. This is convenient when you need to work with strings inside strings." },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-joor/src/main/java/org/apache/camel/language/joor/Joor.java b/components/camel-joor/src/main/java/org/apache/camel/language/joor/Joor.java
index e8533f5d517..599d31d4a46 100644
--- a/components/camel-joor/src/main/java/org/apache/camel/language/joor/Joor.java
+++ b/components/camel-joor/src/main/java/org/apache/camel/language/joor/Joor.java
@@ -47,4 +47,8 @@ public @interface Joor {
      */
     boolean singleQuotes() default true;
 
+    /**
+     * The desired return type.
+     */
+    Class<?> resultType() default Object.class;
 }
diff --git a/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorAnnotationExpressionFactory.java b/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorAnnotationExpressionFactory.java
index 0d3e62378f2..f93574d7431 100644
--- a/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorAnnotationExpressionFactory.java
+++ b/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorAnnotationExpressionFactory.java
@@ -31,7 +31,11 @@ public class JoorAnnotationExpressionFactory extends DefaultAnnotationExpression
             LanguageAnnotation languageAnnotation, Class<?> expressionReturnType) {
 
         Object[] params = new Object[3];
-        params[1] = expressionReturnType;
+        Class<?> resultType = getResultType(annotation);
+        if (resultType.equals(Object.class)) {
+            resultType = expressionReturnType;
+        }
+        params[1] = resultType;
         if (annotation instanceof Joor) {
             Joor joorAnnotation = (Joor) annotation;
             params[0] = joorAnnotation.preCompile();
@@ -41,4 +45,7 @@ public class JoorAnnotationExpressionFactory extends DefaultAnnotationExpression
         return camelContext.resolveLanguage("joor").createExpression(expression, params);
     }
 
+    private Class<?> getResultType(Annotation annotation) {
+        return (Class<?>) getAnnotationObjectValue(annotation, "resultType");
+    }
 }
diff --git a/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorLanguage.java b/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorLanguage.java
index c72d19b7293..6093c4a1e57 100644
--- a/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorLanguage.java
+++ b/components/camel-joor/src/main/java/org/apache/camel/language/joor/JoorLanguage.java
@@ -28,15 +28,15 @@ import org.apache.camel.StaticService;
 import org.apache.camel.spi.ScriptingLanguage;
 import org.apache.camel.spi.annotations.Language;
 import org.apache.camel.support.ExpressionToPredicateAdapter;
-import org.apache.camel.support.LanguageSupport;
 import org.apache.camel.support.ScriptHelper;
+import org.apache.camel.support.TypedLanguageSupport;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.util.StringHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Language("joor")
-public class JoorLanguage extends LanguageSupport implements ScriptingLanguage, StaticService {
+public class JoorLanguage extends TypedLanguageSupport implements ScriptingLanguage, StaticService {
 
     private static final Logger LOG = LoggerFactory.getLogger(JoorLanguage.class);
 
@@ -48,7 +48,6 @@ public class JoorLanguage extends LanguageSupport implements ScriptingLanguage,
 
     private String configResource = "classpath:camel-joor.properties?optional=true";
     private boolean preCompile = true;
-    private Class<?> resultType;
     private boolean singleQuotes = true;
 
     public String getConfigResource() {
@@ -69,14 +68,6 @@ public class JoorLanguage extends LanguageSupport implements ScriptingLanguage,
         this.preCompile = preCompile;
     }
 
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
     public boolean isSingleQuotes() {
         return singleQuotes;
     }
@@ -111,7 +102,7 @@ public class JoorLanguage extends LanguageSupport implements ScriptingLanguage,
     public Expression createExpression(String expression) {
         JoorExpression exp = new JoorExpression(expression);
         exp.setCompiler(compiler);
-        exp.setResultType(resultType);
+        exp.setResultType(getResultType());
         exp.setSingleQuotes(singleQuotes);
         exp.init(getCamelContext());
         return exp;
@@ -127,7 +118,7 @@ public class JoorLanguage extends LanguageSupport implements ScriptingLanguage,
         JoorExpression exp = new JoorExpression(expression);
         exp.setCompiler(compiler);
         exp.setPreCompile(property(boolean.class, properties, 0, preCompile));
-        exp.setResultType(property(Class.class, properties, 1, resultType));
+        exp.setResultType(property(Class.class, properties, 1, getResultType()));
         exp.setSingleQuotes(property(boolean.class, properties, 2, singleQuotes));
         exp.init(getCamelContext());
         return exp;
diff --git a/components/camel-joor/src/test/java/org/apache/camel/language/JoorLanguageTest.java b/components/camel-joor/src/test/java/org/apache/camel/language/JoorLanguageTest.java
new file mode 100644
index 00000000000..7fb8733bbcc
--- /dev/null
+++ b/components/camel-joor/src/test/java/org/apache/camel/language/JoorLanguageTest.java
@@ -0,0 +1,30 @@
+/*
+ * 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.language;
+
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.model.language.JoorExpression;
+
+/**
+ * Ensures that the "joor" language is compliant with the typed language expectations.
+ */
+class JoorLanguageTest extends AbstractTypedLanguageTest<JoorExpression.Builder, JoorExpression> {
+
+    JoorLanguageTest() {
+        super("return exchange.getIn().getBody();", LanguageBuilderFactory::joor);
+    }
+}
diff --git a/components/camel-jq/pom.xml b/components/camel-jq/pom.xml
index bfe0c699398..03b5dc42741 100644
--- a/components/camel-jq/pom.xml
+++ b/components/camel-jq/pom.xml
@@ -80,6 +80,17 @@
             <artifactId>log4j-slf4j-impl</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/components/camel-jq/src/generated/resources/org/apache/camel/language/jq/jq.json b/components/camel-jq/src/generated/resources/org/apache/camel/language/jq/jq.json
index cf40589d3c4..e303c17c7e2 100644
--- a/components/camel-jq/src/generated/resources/org/apache/camel/language/jq/jq.json
+++ b/components/camel-jq/src/generated/resources/org/apache/camel/language/jq/jq.json
@@ -17,8 +17,9 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqLanguage.java b/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqLanguage.java
index 4803da6ad4a..273adf78734 100644
--- a/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqLanguage.java
+++ b/components/camel-jq/src/main/java/org/apache/camel/language/jq/JqLanguage.java
@@ -21,38 +21,10 @@ import org.apache.camel.Predicate;
 import org.apache.camel.StaticService;
 import org.apache.camel.spi.annotations.Language;
 import org.apache.camel.support.ExpressionToPredicateAdapter;
-import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.support.SingleInputTypedLanguageSupport;
 
 @Language("jq")
-public class JqLanguage extends LanguageSupport implements StaticService {
-
-    private Class<?> resultType;
-    private String headerName;
-    private String propertyName;
-
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
-    public String getHeaderName() {
-        return headerName;
-    }
-
-    public void setHeaderName(String headerName) {
-        this.headerName = headerName;
-    }
-
-    public String getPropertyName() {
-        return propertyName;
-    }
-
-    public void setPropertyName(String propertyName) {
-        this.propertyName = propertyName;
-    }
+public class JqLanguage extends SingleInputTypedLanguageSupport implements StaticService {
 
     @Override
     public void start() {
@@ -77,9 +49,9 @@ public class JqLanguage extends LanguageSupport implements StaticService {
     @Override
     public Expression createExpression(String expression) {
         JqExpression answer = new JqExpression(expression);
-        answer.setResultType(resultType);
-        answer.setHeaderName(headerName);
-        answer.setPropertyName(propertyName);
+        answer.setResultType(getResultType());
+        answer.setHeaderName(getHeaderName());
+        answer.setPropertyName(getPropertyName());
         answer.init(getCamelContext());
         return answer;
     }
@@ -87,9 +59,9 @@ public class JqLanguage extends LanguageSupport implements StaticService {
     @Override
     public Expression createExpression(String expression, Object[] properties) {
         JqExpression answer = new JqExpression(expression);
-        answer.setResultType(property(Class.class, properties, 0, resultType));
-        answer.setHeaderName(property(String.class, properties, 1, headerName));
-        answer.setPropertyName(property(String.class, properties, 2, propertyName));
+        answer.setResultType(property(Class.class, properties, 0, getResultType()));
+        answer.setHeaderName(property(String.class, properties, 1, getHeaderName()));
+        answer.setPropertyName(property(String.class, properties, 2, getPropertyName()));
         answer.init(getCamelContext());
         return answer;
     }
diff --git a/components/camel-jq/src/test/java/org/apache/camel/language/JqLanguageTest.java b/components/camel-jq/src/test/java/org/apache/camel/language/JqLanguageTest.java
new file mode 100644
index 00000000000..682fe430b78
--- /dev/null
+++ b/components/camel-jq/src/test/java/org/apache/camel/language/JqLanguageTest.java
@@ -0,0 +1,57 @@
+/*
+ * 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.language;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.databind.node.TextNode;
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.component.jackson.JacksonConstants;
+import org.apache.camel.model.language.JqExpression;
+
+/**
+ * Ensures that the "jq" language is compliant with the single input / typed language expectations.
+ */
+class JqLanguageTest extends AbstractSingleInputTypedLanguageTest<JqExpression.Builder, JqExpression> {
+
+    public static final ObjectMapper MAPPER = new ObjectMapper();
+
+    JqLanguageTest() {
+        super(".foo", LanguageBuilderFactory::jq);
+    }
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext answer = super.createCamelContext();
+        answer.getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER, "true");
+        answer.getGlobalOptions().put(JacksonConstants.TYPE_CONVERTER_TO_POJO, "true");
+        return answer;
+    }
+
+    @Override
+    protected Object defaultContentToSend() {
+        ObjectNode node = MAPPER.createObjectNode();
+        node.put("foo", "1");
+        return node;
+    }
+
+    @Override
+    protected TestContext testWithoutTypeContext() {
+        return new TestContext(defaultContentToSend(), new TextNode("1"), TextNode.class);
+    }
+}
diff --git a/components/camel-jsonpath/pom.xml b/components/camel-jsonpath/pom.xml
index 000661cde8d..0f4fb427712 100644
--- a/components/camel-jsonpath/pom.xml
+++ b/components/camel-jsonpath/pom.xml
@@ -94,6 +94,17 @@
             <version>${rest-assured-version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/components/camel-jsonpath/src/generated/resources/org/apache/camel/jsonpath/jsonpath.json b/components/camel-jsonpath/src/generated/resources/org/apache/camel/jsonpath/jsonpath.json
index 5c29847023b..294055727ad 100644
--- a/components/camel-jsonpath/src/generated/resources/org/apache/camel/jsonpath/jsonpath.json
+++ b/components/camel-jsonpath/src/generated/resources/org/apache/camel/jsonpath/jsonpath.json
@@ -17,14 +17,15 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
     "suppressExceptions": { "kind": "attribute", "displayName": "Suppress Exceptions", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to suppress exceptions such as PathNotFoundException." },
     "allowSimple": { "kind": "attribute", "displayName": "Allow Simple", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to allow in inlined Simple exceptions in the JSONPath expression" },
     "allowEasyPredicate": { "kind": "attribute", "displayName": "Allow Easy Predicate", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to allow using the easy predicate parser to pre-parse predicates." },
     "writeAsString": { "kind": "attribute", "displayName": "Write As String", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to write the output of each row\/element as a JSON String value instead of a Map\/POJO value." },
     "unpackArray": { "kind": "attribute", "displayName": "Unpack Array", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to unpack a single element json-array into an object." },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body" },
     "option": { "kind": "attribute", "displayName": "Option", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "DEFAULT_PATH_LEAF_TO_NULL", "ALWAYS_RETURN_LIST", "AS_PATH_LIST", "SUPPRESS_EXCEPTIONS", "REQUIRE_PROPERTIES" ], "deprecated": false, "autowired": false, "secret": false, "description": "To configure additional options on JSONPath. Multiple values can be separated by comma." },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPath.java b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPath.java
index 21a95bab21d..118f3995d9b 100644
--- a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPath.java
+++ b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPath.java
@@ -51,4 +51,21 @@ public @interface JsonPath {
      * To configure the JsonPath options to use
      */
     Option[] options() default {};
+
+    /**
+     * The desired return type.
+     */
+    Class<?> resultType() default Object.class;
+
+    /**
+     * @return The name of the header we want to apply the expression to. If this is empty then the expression will be
+     *         applied to the value of the exchange property or the body instead.
+     */
+    String headerName() default "";
+
+    /**
+     * @return The name of the property we want to apply the expression to. If this is empty then the expression will be
+     *         applied to the body instead.
+     */
+    String propertyName() default "";
 }
diff --git a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathAnnotationExpressionFactory.java b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathAnnotationExpressionFactory.java
index 52dcf71ee19..39c8ef43df5 100644
--- a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathAnnotationExpressionFactory.java
+++ b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathAnnotationExpressionFactory.java
@@ -23,6 +23,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
 import org.apache.camel.support.language.DefaultAnnotationExpressionFactory;
 import org.apache.camel.support.language.LanguageAnnotation;
+import org.apache.camel.util.ObjectHelper;
 
 public class JsonPathAnnotationExpressionFactory extends DefaultAnnotationExpressionFactory {
 
@@ -34,8 +35,12 @@ public class JsonPathAnnotationExpressionFactory extends DefaultAnnotationExpres
         String expression = getExpressionFromAnnotation(annotation);
         JsonPathExpression answer = new JsonPathExpression(expression);
 
-        if (expressionReturnType != null) {
-            answer.setResultType(expressionReturnType);
+        Class<?> resultType = getResultType(annotation);
+        if (resultType.equals(Object.class)) {
+            resultType = expressionReturnType;
+        }
+        if (resultType != null) {
+            answer.setResultType(resultType);
         }
 
         if (annotation instanceof JsonPath) {
@@ -43,7 +48,12 @@ public class JsonPathAnnotationExpressionFactory extends DefaultAnnotationExpres
 
             answer.setSuppressExceptions(jsonPathAnnotation.suppressExceptions());
             answer.setAllowSimple(jsonPathAnnotation.allowSimple());
-
+            if (ObjectHelper.isNotEmpty(jsonPathAnnotation.headerName())) {
+                answer.setHeaderName(jsonPathAnnotation.headerName());
+            }
+            if (ObjectHelper.isNotEmpty(jsonPathAnnotation.propertyName())) {
+                answer.setPropertyName(jsonPathAnnotation.propertyName());
+            }
             Option[] options = jsonPathAnnotation.options();
             answer.setOptions(options);
         }
@@ -52,4 +62,7 @@ public class JsonPathAnnotationExpressionFactory extends DefaultAnnotationExpres
         return answer;
     }
 
+    private Class<?> getResultType(Annotation annotation) {
+        return (Class<?>) getAnnotationObjectValue(annotation, "resultType");
+    }
 }
diff --git a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathEngine.java b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathEngine.java
index 7db4b17afcc..597014fc751 100644
--- a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathEngine.java
+++ b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathEngine.java
@@ -56,6 +56,7 @@ public class JsonPathEngine {
     private final String expression;
     private final boolean writeAsString;
     private final String headerName;
+    private final String propertyName;
     private final Configuration configuration;
     private final boolean hasSimple;
     private JsonPathAdapter adapter;
@@ -63,14 +64,15 @@ public class JsonPathEngine {
 
     @Deprecated
     public JsonPathEngine(String expression) {
-        this(expression, false, false, true, null, null, null);
+        this(expression, false, false, true, null, null, null, null);
     }
 
     public JsonPathEngine(String expression, boolean writeAsString, boolean suppressExceptions, boolean allowSimple,
-                          String headerName, Option[] options, CamelContext context) {
+                          String headerName, String propertyName, Option[] options, CamelContext context) {
         this.expression = expression;
         this.writeAsString = writeAsString;
         this.headerName = headerName;
+        this.propertyName = propertyName;
 
         Configuration.ConfigurationBuilder builder = Configuration.builder();
         if (options != null) {
@@ -170,8 +172,23 @@ public class JsonPathEngine {
         return answer;
     }
 
+    private Object getPayload(Exchange exchange) {
+        Object payload = null;
+        if (headerName == null && propertyName == null) {
+            payload = exchange.getIn().getBody();
+        } else {
+            if (headerName != null) {
+                payload = exchange.getIn().getHeader(headerName);
+            }
+            if (payload == null && propertyName != null) {
+                payload = exchange.getProperty(propertyName);
+            }
+        }
+        return payload;
+    }
+
     private Object doRead(String path, Exchange exchange) throws IOException, CamelExchangeException {
-        Object json = headerName != null ? exchange.getIn().getHeader(headerName) : exchange.getIn().getBody();
+        final Object json = getPayload(exchange);
 
         if (json instanceof InputStream) {
             return readWithInputStream(path, exchange);
diff --git a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java
index f4218e3c4e4..25c35f8e6a2 100644
--- a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java
+++ b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java
@@ -44,6 +44,7 @@ public class JsonPathExpression extends ExpressionAdapter {
     private boolean writeAsString;
     private boolean unpackArray;
     private String headerName;
+    private String propertyName;
     private Option[] options;
 
     public JsonPathExpression(String expression) {
@@ -139,6 +140,19 @@ public class JsonPathExpression extends ExpressionAdapter {
         this.headerName = headerName;
     }
 
+    public String getPropertyName() {
+        return propertyName;
+    }
+
+    /**
+     * Name of property to use as input, instead of the message body.
+     * <p>
+     * It has a lower precedent than the name of header if both are set.
+     */
+    public void setPropertyName(String propertyName) {
+        this.propertyName = propertyName;
+    }
+
     public Option[] getOptions() {
         return options;
     }
@@ -190,7 +204,8 @@ public class JsonPathExpression extends ExpressionAdapter {
 
         LOG.debug("Initializing {} using: {}", predicate ? "predicate" : "expression", exp);
         try {
-            engine = new JsonPathEngine(exp, writeAsString, suppressExceptions, allowSimple, headerName, options, context);
+            engine = new JsonPathEngine(
+                    exp, writeAsString, suppressExceptions, allowSimple, headerName, propertyName, options, context);
         } catch (Exception e) {
             throw new ExpressionIllegalSyntaxException(exp, e);
         }
diff --git a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
index 650fd912ef6..1dc16711993 100644
--- a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
+++ b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
@@ -27,29 +27,19 @@ import org.apache.camel.Predicate;
 import org.apache.camel.jsonpath.easypredicate.EasyPredicateParser;
 import org.apache.camel.spi.PropertyConfigurer;
 import org.apache.camel.spi.annotations.Language;
-import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.support.SingleInputTypedLanguageSupport;
 import org.apache.camel.support.component.PropertyConfigurerSupport;
 
 @Language("jsonpath")
-public class JsonPathLanguage extends LanguageSupport implements PropertyConfigurer {
+public class JsonPathLanguage extends SingleInputTypedLanguageSupport implements PropertyConfigurer {
 
-    private Class<?> resultType;
     private boolean suppressExceptions;
     private boolean allowSimple = true;
     private boolean allowEasyPredicate = true;
     private boolean writeAsString;
     private boolean unpackArray;
-    private String headerName;
     private Option[] options;
 
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
     public boolean isSuppressExceptions() {
         return suppressExceptions;
     }
@@ -90,14 +80,6 @@ public class JsonPathLanguage extends LanguageSupport implements PropertyConfigu
         this.unpackArray = unpackArray;
     }
 
-    public String getHeaderName() {
-        return headerName;
-    }
-
-    public void setHeaderName(String headerName) {
-        this.headerName = headerName;
-    }
-
     public Option[] getOptions() {
         return options;
     }
@@ -116,14 +98,14 @@ public class JsonPathLanguage extends LanguageSupport implements PropertyConfigu
     @Override
     public Expression createExpression(String expression) {
         JsonPathExpression answer = new JsonPathExpression(expression);
-        answer.setResultType(resultType);
+        answer.setResultType(getResultType());
         answer.setSuppressExceptions(suppressExceptions);
         answer.setAllowSimple(allowSimple);
         answer.setAllowEasyPredicate(allowEasyPredicate);
-        answer.setHeaderName(headerName);
+        answer.setHeaderName(getHeaderName());
         answer.setWriteAsString(writeAsString);
         answer.setUnpackArray(unpackArray);
-        answer.setHeaderName(headerName);
+        answer.setPropertyName(getPropertyName());
         answer.setOptions(options);
         answer.init(getCamelContext());
         return answer;
@@ -139,21 +121,22 @@ public class JsonPathLanguage extends LanguageSupport implements PropertyConfigu
     @Override
     public Expression createExpression(String expression, Object[] properties) {
         JsonPathExpression answer = new JsonPathExpression(expression);
-        answer.setResultType(property(Class.class, properties, 0, resultType));
+        answer.setResultType(property(Class.class, properties, 0, getResultType()));
         answer.setSuppressExceptions(property(boolean.class, properties, 1, suppressExceptions));
         answer.setAllowSimple(property(boolean.class, properties, 2, allowSimple));
         answer.setAllowEasyPredicate(property(boolean.class, properties, 3, allowEasyPredicate));
         answer.setWriteAsString(property(boolean.class, properties, 4, writeAsString));
         answer.setUnpackArray(property(boolean.class, properties, 5, unpackArray));
-        answer.setHeaderName(property(String.class, properties, 6, headerName));
+        answer.setHeaderName(property(String.class, properties, 6, getHeaderName()));
         String option = (String) properties[7];
         if (option != null) {
             List<Option> list = new ArrayList<>();
             for (String s : option.split(",")) {
                 list.add(getCamelContext().getTypeConverter().convertTo(Option.class, s));
             }
-            answer.setOptions(list.toArray(new Option[list.size()]));
+            answer.setOptions(list.toArray(new Option[0]));
         }
+        answer.setPropertyName(property(String.class, properties, 8, getPropertyName()));
         answer.init(getCamelContext());
         return answer;
     }
@@ -199,6 +182,10 @@ public class JsonPathLanguage extends LanguageSupport implements PropertyConfigu
             case "headerName":
                 setHeaderName(PropertyConfigurerSupport.property(camelContext, String.class, value));
                 return true;
+            case "propertyname":
+            case "propertyName":
+                setPropertyName(PropertyConfigurerSupport.property(camelContext, String.class, value));
+                return true;
             case "writeasstring":
             case "writeAsString":
                 setWriteAsString(PropertyConfigurerSupport.property(camelContext, boolean.class, value));
diff --git a/components/camel-jsonpath/src/test/java/org/apache/camel/language/JsonPathLanguageTest.java b/components/camel-jsonpath/src/test/java/org/apache/camel/language/JsonPathLanguageTest.java
new file mode 100644
index 00000000000..c1b69ce2ac5
--- /dev/null
+++ b/components/camel-jsonpath/src/test/java/org/apache/camel/language/JsonPathLanguageTest.java
@@ -0,0 +1,35 @@
+/*
+ * 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.language;
+
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.model.language.JsonPathExpression;
+
+/**
+ * Ensures that the "jsonpath" language is compliant with the single input / typed language expectations.
+ */
+class JsonPathLanguageTest extends AbstractSingleInputTypedLanguageTest<JsonPathExpression.Builder, JsonPathExpression> {
+
+    JsonPathLanguageTest() {
+        super("$.foo", LanguageBuilderFactory::jsonpath);
+    }
+
+    @Override
+    protected Object defaultContentToSend() {
+        return "{\"foo\": \"1\"}";
+    }
+}
diff --git a/components/camel-mvel/pom.xml b/components/camel-mvel/pom.xml
index f9964ae1294..2bf7b3878ca 100644
--- a/components/camel-mvel/pom.xml
+++ b/components/camel-mvel/pom.xml
@@ -63,6 +63,17 @@
             <artifactId>junit-jupiter</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/components/camel-mvel/src/generated/resources/org/apache/camel/language/mvel/mvel.json b/components/camel-mvel/src/generated/resources/org/apache/camel/language/mvel/mvel.json
index be7cd361860..5e7e9b3c7dd 100644
--- a/components/camel-mvel/src/generated/resources/org/apache/camel/language/mvel/mvel.json
+++ b/components/camel-mvel/src/generated/resources/org/apache/camel/language/mvel/mvel.json
@@ -17,6 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-mvel/src/main/java/org/apache/camel/language/mvel/MvelLanguage.java b/components/camel-mvel/src/main/java/org/apache/camel/language/mvel/MvelLanguage.java
index c9e7e046956..33b6b60a2c9 100644
--- a/components/camel-mvel/src/main/java/org/apache/camel/language/mvel/MvelLanguage.java
+++ b/components/camel-mvel/src/main/java/org/apache/camel/language/mvel/MvelLanguage.java
@@ -24,24 +24,26 @@ import org.apache.camel.ExpressionIllegalSyntaxException;
 import org.apache.camel.Predicate;
 import org.apache.camel.spi.ScriptingLanguage;
 import org.apache.camel.spi.annotations.Language;
-import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.support.TypedLanguageSupport;
 
 /**
  * An <a href="http://mvel.codehaus.org/">MVEL</a> {@link org.apache.camel.spi.Language} plugin
  */
 @Language("mvel")
-public class MvelLanguage extends LanguageSupport implements ScriptingLanguage {
+public class MvelLanguage extends TypedLanguageSupport implements ScriptingLanguage {
 
     @Override
     public Predicate createPredicate(String expression) {
-        expression = loadResource(expression);
-        return new MvelExpression(expression, Boolean.class);
+        return createMvelExpression(expression, Boolean.class);
     }
 
     @Override
     public Expression createExpression(String expression) {
-        expression = loadResource(expression);
-        return new MvelExpression(expression, Object.class);
+        return createMvelExpression(expression, Object.class);
+    }
+
+    private MvelExpression createMvelExpression(String expression, Class<?> type) {
+        return new MvelExpression(loadResource(expression), type);
     }
 
     @Override
diff --git a/components/camel-mvel/src/test/java/org/apache/camel/language/MvelLanguageTest.java b/components/camel-mvel/src/test/java/org/apache/camel/language/MvelLanguageTest.java
new file mode 100644
index 00000000000..090ad9af83c
--- /dev/null
+++ b/components/camel-mvel/src/test/java/org/apache/camel/language/MvelLanguageTest.java
@@ -0,0 +1,30 @@
+/*
+ * 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.language;
+
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.model.language.MvelExpression;
+
+/**
+ * Ensures that the "mvel" language is compliant with the typed language expectations.
+ */
+class MvelLanguageTest extends AbstractTypedLanguageTest<MvelExpression.Builder, MvelExpression> {
+
+    MvelLanguageTest() {
+        super("message.body", LanguageBuilderFactory::mvel);
+    }
+}
diff --git a/components/camel-ognl/pom.xml b/components/camel-ognl/pom.xml
index 8d229d96f82..3a282116161 100644
--- a/components/camel-ognl/pom.xml
+++ b/components/camel-ognl/pom.xml
@@ -60,6 +60,17 @@
             <artifactId>junit-jupiter</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/components/camel-ognl/src/generated/resources/org/apache/camel/language/ognl/ognl.json b/components/camel-ognl/src/generated/resources/org/apache/camel/language/ognl/ognl.json
index ef9df77f818..ff3928f6706 100644
--- a/components/camel-ognl/src/generated/resources/org/apache/camel/language/ognl/ognl.json
+++ b/components/camel-ognl/src/generated/resources/org/apache/camel/language/ognl/ognl.json
@@ -17,6 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-ognl/src/main/java/org/apache/camel/language/ognl/OgnlLanguage.java b/components/camel-ognl/src/main/java/org/apache/camel/language/ognl/OgnlLanguage.java
index 8412250ab0b..3a7a855dec2 100644
--- a/components/camel-ognl/src/main/java/org/apache/camel/language/ognl/OgnlLanguage.java
+++ b/components/camel-ognl/src/main/java/org/apache/camel/language/ognl/OgnlLanguage.java
@@ -25,21 +25,23 @@ import org.apache.camel.ExpressionIllegalSyntaxException;
 import org.apache.camel.Predicate;
 import org.apache.camel.spi.ScriptingLanguage;
 import org.apache.camel.spi.annotations.Language;
-import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.support.TypedLanguageSupport;
 
 @Language("ognl")
-public class OgnlLanguage extends LanguageSupport implements ScriptingLanguage {
+public class OgnlLanguage extends TypedLanguageSupport implements ScriptingLanguage {
 
     @Override
     public Predicate createPredicate(String expression) {
-        expression = loadResource(expression);
-        return new OgnlExpression(expression, Boolean.class);
+        return createOgnlExpression(expression, Boolean.class);
     }
 
     @Override
     public Expression createExpression(String expression) {
-        expression = loadResource(expression);
-        return new OgnlExpression(expression, Object.class);
+        return createOgnlExpression(expression, Object.class);
+    }
+
+    private OgnlExpression createOgnlExpression(String expression, Class<?> type) {
+        return new OgnlExpression(loadResource(expression), type);
     }
 
     @Override
diff --git a/components/camel-ognl/src/test/java/org/apache/camel/language/OgnlLanguageTest.java b/components/camel-ognl/src/test/java/org/apache/camel/language/OgnlLanguageTest.java
new file mode 100644
index 00000000000..dcedc666c83
--- /dev/null
+++ b/components/camel-ognl/src/test/java/org/apache/camel/language/OgnlLanguageTest.java
@@ -0,0 +1,30 @@
+/*
+ * 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.language;
+
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.model.language.OgnlExpression;
+
+/**
+ * Ensures that the "ognl" language is compliant with the typed language expectations.
+ */
+class OgnlLanguageTest extends AbstractTypedLanguageTest<OgnlExpression.Builder, OgnlExpression> {
+
+    OgnlLanguageTest() {
+        super("request.body", LanguageBuilderFactory::ognl);
+    }
+}
diff --git a/components/camel-python/pom.xml b/components/camel-python/pom.xml
index e372e96c2bb..5172fb162f8 100644
--- a/components/camel-python/pom.xml
+++ b/components/camel-python/pom.xml
@@ -62,6 +62,17 @@
             <artifactId>junit-jupiter</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/components/camel-python/src/generated/resources/org/apache/camel/language/python/python.json b/components/camel-python/src/generated/resources/org/apache/camel/language/python/python.json
index 9679ec2462a..59848f8a877 100644
--- a/components/camel-python/src/generated/resources/org/apache/camel/language/python/python.json
+++ b/components/camel-python/src/generated/resources/org/apache/camel/language/python/python.json
@@ -18,7 +18,6 @@
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-python/src/main/java/org/apache/camel/language/python/PythonLanguage.java b/components/camel-python/src/main/java/org/apache/camel/language/python/PythonLanguage.java
index 382284211c4..5ee5decc299 100644
--- a/components/camel-python/src/main/java/org/apache/camel/language/python/PythonLanguage.java
+++ b/components/camel-python/src/main/java/org/apache/camel/language/python/PythonLanguage.java
@@ -23,23 +23,25 @@ import org.apache.camel.ExpressionIllegalSyntaxException;
 import org.apache.camel.Predicate;
 import org.apache.camel.spi.ScriptingLanguage;
 import org.apache.camel.spi.annotations.Language;
-import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.support.TypedLanguageSupport;
 import org.python.core.PyObject;
 import org.python.util.PythonInterpreter;
 
 @Language("python")
-public class PythonLanguage extends LanguageSupport implements ScriptingLanguage {
+public class PythonLanguage extends TypedLanguageSupport implements ScriptingLanguage {
 
     @Override
     public Predicate createPredicate(String expression) {
-        expression = loadResource(expression);
-        return new PythonExpression(expression, Boolean.class);
+        return createPythonExpression(expression, Boolean.class);
     }
 
     @Override
     public Expression createExpression(String expression) {
-        expression = loadResource(expression);
-        return new PythonExpression(expression, Object.class);
+        return createPythonExpression(expression, Object.class);
+    }
+
+    private PythonExpression createPythonExpression(String expression, Class<?> type) {
+        return new PythonExpression(loadResource(expression), type);
     }
 
     @Override
diff --git a/components/camel-python/src/test/java/org/apache/camel/language/PythonLanguageTest.java b/components/camel-python/src/test/java/org/apache/camel/language/PythonLanguageTest.java
new file mode 100644
index 00000000000..d6180db8909
--- /dev/null
+++ b/components/camel-python/src/test/java/org/apache/camel/language/PythonLanguageTest.java
@@ -0,0 +1,30 @@
+/*
+ * 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.language;
+
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.model.language.PythonExpression;
+
+/**
+ * Ensures that the "python" language is compliant with the typed language expectations.
+ */
+class PythonLanguageTest extends AbstractTypedLanguageTest<PythonExpression.Builder, PythonExpression> {
+
+    PythonLanguageTest() {
+        super("body", LanguageBuilderFactory::python);
+    }
+}
diff --git a/components/camel-saxon/pom.xml b/components/camel-saxon/pom.xml
index 853561e5827..5e3f04981c2 100644
--- a/components/camel-saxon/pom.xml
+++ b/components/camel-saxon/pom.xml
@@ -66,6 +66,17 @@
             <artifactId>junit-jupiter</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/components/camel-saxon/src/generated/java/org/apache/camel/component/xquery/XQueryEndpointConfigurer.java b/components/camel-saxon/src/generated/java/org/apache/camel/component/xquery/XQueryEndpointConfigurer.java
index d28641aba1b..4280bb380d8 100644
--- a/components/camel-saxon/src/generated/java/org/apache/camel/component/xquery/XQueryEndpointConfigurer.java
+++ b/components/camel-saxon/src/generated/java/org/apache/camel/component/xquery/XQueryEndpointConfigurer.java
@@ -54,6 +54,8 @@ public class XQueryEndpointConfigurer extends PropertyConfigurerSupport implemen
         case "pollstrategy":
         case "pollStrategy": target.setPollStrategy(property(camelContext, org.apache.camel.spi.PollingConsumerPollStrategy.class, value)); return true;
         case "properties": target.setProperties(property(camelContext, java.util.Properties.class, value)); return true;
+        case "propertyname":
+        case "propertyName": target.setPropertyName(property(camelContext, java.lang.String.class, value)); return true;
         case "repeatcount":
         case "repeatCount": target.setRepeatCount(property(camelContext, long.class, value)); return true;
         case "resulttype":
@@ -119,6 +121,8 @@ public class XQueryEndpointConfigurer extends PropertyConfigurerSupport implemen
         case "pollstrategy":
         case "pollStrategy": return org.apache.camel.spi.PollingConsumerPollStrategy.class;
         case "properties": return java.util.Properties.class;
+        case "propertyname":
+        case "propertyName": return java.lang.String.class;
         case "repeatcount":
         case "repeatCount": return long.class;
         case "resulttype":
@@ -185,6 +189,8 @@ public class XQueryEndpointConfigurer extends PropertyConfigurerSupport implemen
         case "pollstrategy":
         case "pollStrategy": return target.getPollStrategy();
         case "properties": return target.getProperties();
+        case "propertyname":
+        case "propertyName": return target.getPropertyName();
         case "repeatcount":
         case "repeatCount": return target.getRepeatCount();
         case "resulttype":
diff --git a/components/camel-saxon/src/generated/java/org/apache/camel/component/xquery/XQueryEndpointUriFactory.java b/components/camel-saxon/src/generated/java/org/apache/camel/component/xquery/XQueryEndpointUriFactory.java
index d7c41737036..38a3973ed41 100644
--- a/components/camel-saxon/src/generated/java/org/apache/camel/component/xquery/XQueryEndpointUriFactory.java
+++ b/components/camel-saxon/src/generated/java/org/apache/camel/component/xquery/XQueryEndpointUriFactory.java
@@ -21,7 +21,7 @@ public class XQueryEndpointUriFactory extends org.apache.camel.support.component
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(33);
+        Set<String> props = new HashSet<>(34);
         props.add("allowStAX");
         props.add("backoffErrorThreshold");
         props.add("backoffIdleThreshold");
@@ -41,6 +41,7 @@ public class XQueryEndpointUriFactory extends org.apache.camel.support.component
         props.add("parameters");
         props.add("pollStrategy");
         props.add("properties");
+        props.add("propertyName");
         props.add("repeatCount");
         props.add("resourceUri");
         props.add("resultType");
diff --git a/components/camel-saxon/src/generated/resources/org/apache/camel/component/xquery/xquery.json b/components/camel-saxon/src/generated/resources/org/apache/camel/component/xquery/xquery.json
index 63736e3eb4e..1de5d5a2e74 100644
--- a/components/camel-saxon/src/generated/resources/org/apache/camel/component/xquery/xquery.json
+++ b/components/camel-saxon/src/generated/resources/org/apache/camel/component/xquery/xquery.json
@@ -34,6 +34,7 @@
     "allowStAX": { "kind": "parameter", "displayName": "Allow St AX", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to allow using StAX mode" },
     "headerName": { "kind": "parameter", "displayName": "Header Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To use a Camel Message header as the input source instead of Message body." },
     "namespacePrefixes": { "kind": "parameter", "displayName": "Namespace Prefixes", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to control which namespace prefixes to use for a set of namespace mappings" },
+    "propertyName": { "kind": "parameter", "displayName": "Property Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To use a Camel Exchange property as the input source instead of Message body. It has a lower precedent than the name of header if both are set." },
     "resultsFormat": { "kind": "parameter", "displayName": "Results Format", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.xquery.ResultFormat", "enum": [ "Bytes", "BytesSource", "DOM", "DOMSource", "List", "String", "StringSource" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "DOM", "description": "What output result to use" },
     "resultType": { "kind": "parameter", "displayName": "Result Type", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.Class<java.lang.Object>", "deprecated": false, "autowired": false, "secret": false, "description": "What output result to use defined as a class" },
     "stripsAllWhiteSpace": { "kind": "parameter", "displayName": "Strips All White Space", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to strip all whitespaces" },
diff --git a/components/camel-saxon/src/generated/resources/org/apache/camel/language/xquery/xquery.json b/components/camel-saxon/src/generated/resources/org/apache/camel/language/xquery/xquery.json
index 31f16aab599..55fa7afd886 100644
--- a/components/camel-saxon/src/generated/resources/org/apache/camel/language/xquery/xquery.json
+++ b/components/camel-saxon/src/generated/resources/org/apache/camel/language/xquery/xquery.json
@@ -17,10 +17,12 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "type": { "kind": "attribute", "displayName": "Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output) The default result type is NodeSet" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body" },
     "configurationRef": { "kind": "attribute", "displayName": "Configuration Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Reference to a saxon configuration instance in the registry to use for xquery (requires camel-saxon). This may be needed to add custom functions to a saxon configuration, so these custom functions can be used in xquery expressions." },
     "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQuery.java b/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQuery.java
index 81e50fe2387..6d160dd7298 100644
--- a/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQuery.java
+++ b/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQuery.java
@@ -44,8 +44,19 @@ public @interface XQuery {
     };
 
     /**
-     * @return The name of the header we want to apply the Xquery expression to. If this is empty then the Xquery
-     *         expression will be applied to the body instead.
+     * The desired return type.
+     */
+    Class<?> resultType() default Object.class;
+
+    /**
+     * @return The name of the header we want to apply the XQuery expression to. If this is empty then the Xquery
+     *         expression will be applied to the value of the exchange property or the body instead.
      */
     String headerName() default "";
+
+    /**
+     * @return The name of the property we want to apply the XQuery expression to. If this is empty then the Xquery
+     *         expression will be applied to the body instead.
+     */
+    String propertyName() default "";
 }
diff --git a/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryAnnotationExpressionFactory.java b/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryAnnotationExpressionFactory.java
index 6c90f2b5d8b..12cbd2be1dd 100644
--- a/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryAnnotationExpressionFactory.java
+++ b/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryAnnotationExpressionFactory.java
@@ -42,6 +42,9 @@ public class XQueryAnnotationExpressionFactory extends DefaultAnnotationExpressi
             if (ObjectHelper.isNotEmpty(xQueryAnnotation.headerName())) {
                 builder.setHeaderName(xQueryAnnotation.headerName());
             }
+            if (ObjectHelper.isNotEmpty(xQueryAnnotation.propertyName())) {
+                builder.setPropertyName(xQueryAnnotation.propertyName());
+            }
             NamespacePrefix[] namespaces = xQueryAnnotation.namespaces();
             if (namespaces != null) {
                 for (NamespacePrefix namespacePrefix : namespaces) {
@@ -49,16 +52,23 @@ public class XQueryAnnotationExpressionFactory extends DefaultAnnotationExpressi
                 }
             }
         }
-        if (expressionReturnType.isAssignableFrom(String.class)) {
+        Class<?> resultType = getResultType(annotation);
+        if (resultType.equals(Object.class)) {
+            resultType = expressionReturnType;
+        }
+        if (resultType.isAssignableFrom(String.class)) {
             builder.setResultsFormat(ResultFormat.String);
-        } else if (expressionReturnType.isAssignableFrom(CollectionFn.class)) {
+        } else if (resultType.isAssignableFrom(CollectionFn.class)) {
             builder.setResultsFormat(ResultFormat.List);
-        } else if (expressionReturnType.isAssignableFrom(Node.class)) {
+        } else if (resultType.isAssignableFrom(Node.class)) {
             builder.setResultsFormat(ResultFormat.DOM);
-        } else if (expressionReturnType.isAssignableFrom(byte[].class)) {
+        } else if (resultType.isAssignableFrom(byte[].class)) {
             builder.setResultsFormat(ResultFormat.Bytes);
         }
         return builder;
     }
 
+    protected Class<?> getResultType(Annotation annotation) {
+        return (Class<?>) getAnnotationObjectValue(annotation, "resultType");
+    }
 }
diff --git a/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java b/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java
index 2b4c07aaec7..09cfa08a7b1 100644
--- a/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java
+++ b/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java
@@ -99,6 +99,12 @@ public abstract class XQueryBuilder implements Expression, Predicate, NamespaceA
     private ModuleURIResolver moduleURIResolver;
     private boolean allowStAX;
     private String headerName;
+    /**
+     * Name of property to use as input, instead of the message body.
+     * <p>
+     * It has a lower precedent than the name of header if both are set.
+     */
+    private String propertyName;
 
     @Override
     public String toString() {
@@ -518,10 +524,26 @@ public abstract class XQueryBuilder implements Expression, Predicate, NamespaceA
         return headerName;
     }
 
+    /**
+     * Name of header to use as input, instead of the message body
+     */
     public void setHeaderName(String headerName) {
         this.headerName = headerName;
     }
 
+    public String getPropertyName() {
+        return propertyName;
+    }
+
+    /**
+     * Name of property to use as input, instead of the message body.
+     * <p>
+     * It has a lower precedent than the name of header if both are set.
+     */
+    public void setPropertyName(String propertyName) {
+        this.propertyName = propertyName;
+    }
+
     public boolean isAllowStAX() {
         return allowStAX;
     }
@@ -547,9 +569,11 @@ public abstract class XQueryBuilder implements Expression, Predicate, NamespaceA
         DynamicQueryContext dynamicQueryContext = new DynamicQueryContext(config);
 
         Message in = exchange.getIn();
-        Item item = null;
+        Item item;
         if (ObjectHelper.isNotEmpty(getHeaderName())) {
             item = in.getHeader(getHeaderName(), Item.class);
+        } else if (ObjectHelper.isNotEmpty(getPropertyName())) {
+            item = exchange.getProperty(getPropertyName(), Item.class);
         } else {
             item = in.getBody(Item.class);
         }
@@ -559,6 +583,8 @@ public abstract class XQueryBuilder implements Expression, Predicate, NamespaceA
             Object body;
             if (ObjectHelper.isNotEmpty(getHeaderName())) {
                 body = in.getHeader(getHeaderName());
+            } else if (ObjectHelper.isNotEmpty(getPropertyName())) {
+                body = exchange.getProperty(getPropertyName());
             } else {
                 body = in.getBody();
             }
@@ -571,6 +597,8 @@ public abstract class XQueryBuilder implements Expression, Predicate, NamespaceA
                 if (isInputStreamNeeded(exchange)) {
                     if (ObjectHelper.isNotEmpty(getHeaderName())) {
                         is = exchange.getIn().getHeader(getHeaderName(), InputStream.class);
+                    } else if (ObjectHelper.isNotEmpty(getPropertyName())) {
+                        is = exchange.getProperty(getPropertyName(), InputStream.class);
                     } else {
                         is = exchange.getIn().getBody(InputStream.class);
                     }
diff --git a/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryEndpoint.java b/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryEndpoint.java
index dcc2a18792b..260a3e327b3 100644
--- a/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryEndpoint.java
+++ b/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryEndpoint.java
@@ -74,6 +74,8 @@ public class XQueryEndpoint extends ProcessorEndpoint {
     private boolean allowStAX;
     @UriParam
     private String headerName;
+    @UriParam
+    private String propertyName;
 
     public XQueryEndpoint(String endpointUri, Component component) {
         super(endpointUri, component);
@@ -222,6 +224,19 @@ public class XQueryEndpoint extends ProcessorEndpoint {
         this.headerName = headerName;
     }
 
+    public String getPropertyName() {
+        return propertyName;
+    }
+
+    /**
+     * To use a Camel Exchange property as the input source instead of Message body.
+     * <p>
+     * It has a lower precedent than the name of header if both are set.
+     */
+    public void setPropertyName(String propertyName) {
+        this.propertyName = propertyName;
+    }
+
     @Override
     protected void doInit() throws Exception {
         super.doInit();
@@ -255,6 +270,7 @@ public class XQueryEndpoint extends ProcessorEndpoint {
         this.xquery.setStripsAllWhiteSpace(isStripsAllWhiteSpace());
         this.xquery.setAllowStAX(isAllowStAX());
         this.xquery.setHeaderName(getHeaderName());
+        this.xquery.setPropertyName(getPropertyName());
         this.xquery.setModuleURIResolver(getModuleURIResolver());
         this.xquery.init(getCamelContext());
 
diff --git a/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java b/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java
index 3cb668d033b..77a30a46ace 100644
--- a/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java
+++ b/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java
@@ -23,32 +23,14 @@ import org.apache.camel.Predicate;
 import org.apache.camel.component.xquery.XQueryBuilder;
 import org.apache.camel.spi.PropertyConfigurer;
 import org.apache.camel.spi.annotations.Language;
-import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.support.SingleInputTypedLanguageSupport;
 import org.apache.camel.support.component.PropertyConfigurerSupport;
 
 @Language("xquery")
-public class XQueryLanguage extends LanguageSupport implements PropertyConfigurer {
+public class XQueryLanguage extends SingleInputTypedLanguageSupport implements PropertyConfigurer {
 
-    private Class<?> resultType;
-    private String headerName;
     private Configuration configuration;
 
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
-    public String getHeaderName() {
-        return headerName;
-    }
-
-    public void setHeaderName(String headerName) {
-        this.headerName = headerName;
-    }
-
     public Configuration getConfiguration() {
         return configuration;
     }
@@ -82,14 +64,18 @@ public class XQueryLanguage extends LanguageSupport implements PropertyConfigure
     }
 
     protected void configureBuilder(XQueryBuilder builder, Object[] properties) {
-        Class<?> clazz = property(Class.class, properties, 0, resultType);
+        Class<?> clazz = property(Class.class, properties, 0, getResultType());
         if (clazz != null) {
             builder.setResultType(clazz);
         }
-        String str = property(String.class, properties, 1, headerName);
+        String str = property(String.class, properties, 1, getHeaderName());
         if (str != null) {
             builder.setHeaderName(str);
         }
+        str = property(String.class, properties, 2, getPropertyName());
+        if (str != null) {
+            builder.setPropertyName(str);
+        }
         if (configuration != null) {
             builder.setConfiguration(configuration);
         }
@@ -109,6 +95,10 @@ public class XQueryLanguage extends LanguageSupport implements PropertyConfigure
             case "headerName":
                 setHeaderName(PropertyConfigurerSupport.property(camelContext, String.class, value));
                 return true;
+            case "propertyname":
+            case "propertyName":
+                setPropertyName(PropertyConfigurerSupport.property(camelContext, String.class, value));
+                return true;
             case "configuration":
             case "Configuration":
                 setConfiguration(PropertyConfigurerSupport.property(camelContext, Configuration.class, value));
diff --git a/components/camel-saxon/src/test/java/org/apache/camel/language/XQueryLanguageTest.java b/components/camel-saxon/src/test/java/org/apache/camel/language/XQueryLanguageTest.java
new file mode 100644
index 00000000000..28cd53c9106
--- /dev/null
+++ b/components/camel-saxon/src/test/java/org/apache/camel/language/XQueryLanguageTest.java
@@ -0,0 +1,34 @@
+/*
+ * 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.language;
+
+import org.apache.camel.model.language.XQueryExpression;
+
+/**
+ * Ensures that the "xquery" language is compliant with the single input expectations.
+ */
+class XQueryLanguageTest extends AbstractSingleInputLanguageTest<XQueryExpression.Builder, XQueryExpression> {
+
+    XQueryLanguageTest() {
+        super("/foo/text()", factory -> factory.xquery().resultType(String.class));
+    }
+
+    @Override
+    protected TestContext testContext() {
+        return new TestContext("<foo>John</foo>", "John", String.class);
+    }
+}
diff --git a/components/camel-spring-xml/pom.xml b/components/camel-spring-xml/pom.xml
index 2878ded8bb1..033b50adb34 100644
--- a/components/camel-spring-xml/pom.xml
+++ b/components/camel-spring-xml/pom.xml
@@ -138,6 +138,17 @@
             <artifactId>derby</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>javax.annotation</groupId>
             <artifactId>javax.annotation-api</artifactId>
diff --git a/components/camel-spring-xml/src/test/java/org/apache/camel/language/SpelLanguageTest.java b/components/camel-spring-xml/src/test/java/org/apache/camel/language/SpelLanguageTest.java
new file mode 100644
index 00000000000..ccdd7c0fba3
--- /dev/null
+++ b/components/camel-spring-xml/src/test/java/org/apache/camel/language/SpelLanguageTest.java
@@ -0,0 +1,30 @@
+/*
+ * 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.language;
+
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.model.language.SpELExpression;
+
+/**
+ * Ensures that the "spel" language is compliant with the typed language expectations.
+ */
+class SpelLanguageTest extends AbstractTypedLanguageTest<SpELExpression.Builder, SpELExpression> {
+
+    SpelLanguageTest() {
+        super("#{message.body}", LanguageBuilderFactory::spel);
+    }
+}
diff --git a/components/camel-spring/src/generated/resources/org/apache/camel/language/spel/spel.json b/components/camel-spring/src/generated/resources/org/apache/camel/language/spel/spel.json
index 0dfa61eae49..0b24c3a9c89 100644
--- a/components/camel-spring/src/generated/resources/org/apache/camel/language/spel/spel.json
+++ b/components/camel-spring/src/generated/resources/org/apache/camel/language/spel/spel.json
@@ -17,6 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java b/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java
index 7ae0e22e47d..72aa2790eef 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java
@@ -22,7 +22,7 @@ import org.apache.camel.StaticService;
 import org.apache.camel.spi.annotations.Language;
 import org.apache.camel.spring.SpringCamelContext;
 import org.apache.camel.spring.util.RegistryBeanResolver;
-import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.support.TypedLanguageSupport;
 import org.apache.camel.util.ObjectHelper;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.expression.BeanFactoryResolver;
@@ -32,22 +32,22 @@ import org.springframework.expression.BeanResolver;
  * A Spring Expression {@link org.apache.camel.spi.Language} plugin
  */
 @Language("spel")
-public class SpelLanguage extends LanguageSupport implements StaticService {
+public class SpelLanguage extends TypedLanguageSupport implements StaticService {
 
     private BeanResolver beanResolver;
 
     @Override
     public Predicate createPredicate(String expression) {
-        expression = loadResource(expression);
-        Predicate answer = new SpelExpression(expression, Boolean.class, beanResolver);
-        answer.init(getCamelContext());
-        return answer;
+        return createSpelExpression(expression, Boolean.class);
     }
 
     @Override
     public Expression createExpression(String expression) {
-        expression = loadResource(expression);
-        Expression answer = new SpelExpression(expression, Object.class, beanResolver);
+        return createSpelExpression(expression, Object.class);
+    }
+
+    private SpelExpression createSpelExpression(String expression, Class<?> type) {
+        SpelExpression answer = new SpelExpression(loadResource(expression), type, beanResolver);
         answer.init(getCamelContext());
         return answer;
     }
diff --git a/components/camel-stax/pom.xml b/components/camel-stax/pom.xml
index 8d65d3e51a9..54726be57fc 100644
--- a/components/camel-stax/pom.xml
+++ b/components/camel-stax/pom.xml
@@ -60,6 +60,17 @@
             <artifactId>camel-test-spring-junit5</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
         <!-- camel-jaxb is used for XPath testing -->
         <dependency>
             <groupId>org.apache.camel</groupId>
diff --git a/components/camel-stax/src/generated/resources/org/apache/camel/language/xtokenizer/xtokenize.json b/components/camel-stax/src/generated/resources/org/apache/camel/language/xtokenizer/xtokenize.json
index 2f931f4d78d..a0dade2fac7 100644
--- a/components/camel-stax/src/generated/resources/org/apache/camel/language/xtokenizer/xtokenize.json
+++ b/components/camel-stax/src/generated/resources/org/apache/camel/language/xtokenizer/xtokenize.json
@@ -16,10 +16,11 @@
     "modelJavaType": "org.apache.camel.model.language.XMLTokenizerExpression"
   },
   "properties": {
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to tokenize instead of using the message body." },
     "mode": { "kind": "attribute", "displayName": "Mode", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "i", "w", "u", "t" ], "deprecated": false, "autowired": false, "secret": false, "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its c [...]
     "group": { "kind": "attribute", "displayName": "Group", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together" },
     "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-stax/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java b/components/camel-stax/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java
index 14ac0564c4d..0b9d2cc0852 100644
--- a/components/camel-stax/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java
+++ b/components/camel-stax/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenExpressionIterator.java
@@ -58,15 +58,17 @@ public class XMLTokenExpressionIterator extends ExpressionAdapter implements Nam
     protected char mode;
     protected int group;
     protected String headerName;
+    protected String propertyName;
     protected Map<String, String> nsmap;
 
     public XMLTokenExpressionIterator(String path, char mode) {
-        this(path, mode, 1, null);
+        this(path, mode, 1, null, null);
     }
 
-    public XMLTokenExpressionIterator(String path, char mode, int group, String headerName) {
+    public XMLTokenExpressionIterator(String path, char mode, int group, String headerName, String propertyName) {
         StringHelper.notEmpty(path, "path");
         this.headerName = headerName;
+        this.propertyName = propertyName;
         this.path = path;
         this.mode = mode;
         this.group = Math.max(group, 1);
@@ -106,6 +108,14 @@ public class XMLTokenExpressionIterator extends ExpressionAdapter implements Nam
         this.headerName = headerName;
     }
 
+    public String getPropertyName() {
+        return propertyName;
+    }
+
+    public void setPropertyName(String propertyName) {
+        this.propertyName = propertyName;
+    }
+
     protected Iterator<?> createIterator(InputStream in, String charset)
             throws XMLStreamException, UnsupportedEncodingException {
         return createIterator(new InputStreamReader(in, charset));
@@ -147,6 +157,9 @@ public class XMLTokenExpressionIterator extends ExpressionAdapter implements Nam
             if (headerName != null) {
                 String val = exchange.getIn().getHeader(headerName, String.class);
                 reader = new StringReader(val);
+            } else if (propertyName != null) {
+                String val = exchange.getProperty(propertyName, String.class);
+                reader = new StringReader(val);
             } else {
                 InputStream in = exchange.getIn().getMandatoryBody(InputStream.class);
                 // use xml stream reader which is capable of handling reading the xml stream
diff --git a/components/camel-stax/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java b/components/camel-stax/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java
index 6ad908c07ba..b39163510bc 100644
--- a/components/camel-stax/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java
+++ b/components/camel-stax/src/main/java/org/apache/camel/language/xtokenizer/XMLTokenizeLanguage.java
@@ -24,7 +24,7 @@ import org.apache.camel.Predicate;
 import org.apache.camel.spi.PropertyConfigurer;
 import org.apache.camel.spi.annotations.Language;
 import org.apache.camel.support.ExpressionToPredicateAdapter;
-import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.support.SingleInputLanguageSupport;
 import org.apache.camel.support.builder.Namespaces;
 import org.apache.camel.support.component.PropertyConfigurerSupport;
 import org.apache.camel.util.ObjectHelper;
@@ -41,9 +41,8 @@ import org.apache.camel.util.ObjectHelper;
  * </ul>
  */
 @Language("xtokenize")
-public class XMLTokenizeLanguage extends LanguageSupport implements PropertyConfigurer {
+public class XMLTokenizeLanguage extends SingleInputLanguageSupport implements PropertyConfigurer {
 
-    private String headerName;
     private String path;
     private char mode;
     private int group;
@@ -91,7 +90,7 @@ public class XMLTokenizeLanguage extends LanguageSupport implements PropertyConf
     public Expression createExpression(String expression) {
         String path = expression != null ? expression : this.path;
         ObjectHelper.notNull(path, "path");
-        XMLTokenExpressionIterator expr = new XMLTokenExpressionIterator(path, mode, group, headerName);
+        XMLTokenExpressionIterator expr = new XMLTokenExpressionIterator(path, mode, group, getHeaderName(), getPropertyName());
         if (namespaces != null) {
             expr.setNamespaces(namespaces.getNamespaces());
         }
@@ -106,7 +105,7 @@ public class XMLTokenizeLanguage extends LanguageSupport implements PropertyConf
     @Override
     public Expression createExpression(String expression, Object[] properties) {
         XMLTokenizeLanguage answer = new XMLTokenizeLanguage();
-        answer.setHeaderName(property(String.class, properties, 0, headerName));
+        answer.setHeaderName(property(String.class, properties, 0, getHeaderName()));
         answer.setMode(property(Character.class, properties, 1, "i"));
         answer.setGroup(property(Integer.class, properties, 2, group));
         Object obj = properties[3];
@@ -120,17 +119,10 @@ public class XMLTokenizeLanguage extends LanguageSupport implements PropertyConf
             throw new IllegalArgumentException("Namespaces is not instance of java.util.Map or " + Namespaces.class.getName());
         }
         String path = expression != null ? expression : this.path;
+        answer.setPropertyName(property(String.class, properties, 4, getPropertyName()));
         return answer.createExpression(path);
     }
 
-    public String getHeaderName() {
-        return headerName;
-    }
-
-    public void setHeaderName(String headerName) {
-        this.headerName = headerName;
-    }
-
     public String getPath() {
         return path;
     }
@@ -173,6 +165,10 @@ public class XMLTokenizeLanguage extends LanguageSupport implements PropertyConf
             case "headerName":
                 setHeaderName(PropertyConfigurerSupport.property(camelContext, String.class, value));
                 return true;
+            case "propertyname":
+            case "propertyName":
+                setPropertyName(PropertyConfigurerSupport.property(camelContext, String.class, value));
+                return true;
             case "mode":
                 setMode(PropertyConfigurerSupport.property(camelContext, char.class, value));
                 return true;
diff --git a/components/camel-stax/src/test/java/org/apache/camel/language/XMLTokenizeLanguageTest.java b/components/camel-stax/src/test/java/org/apache/camel/language/XMLTokenizeLanguageTest.java
new file mode 100644
index 00000000000..5641cc37320
--- /dev/null
+++ b/components/camel-stax/src/test/java/org/apache/camel/language/XMLTokenizeLanguageTest.java
@@ -0,0 +1,41 @@
+/*
+ * 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.language;
+
+import org.apache.camel.model.language.XMLTokenizerExpression;
+import org.apache.camel.support.builder.Namespaces;
+
+/**
+ * Ensures that the "xtokenize" language is compliant with the single input expectations.
+ */
+class XMLTokenizeLanguageTest extends AbstractSingleInputLanguageTest<XMLTokenizerExpression.Builder, XMLTokenizerExpression> {
+
+    XMLTokenizeLanguageTest() {
+        super("/orders/order", factory -> factory.xtokenize().namespaces(new Namespaces("", "http:acme.com")));
+    }
+
+    protected String createBody() {
+        return "<?xml version=\"1.0\"?>\n" + "<orders xmlns=\"http:acme.com\">\n" +
+               "  <order>Camel in Action</order>\n" +
+               "</orders>";
+    }
+
+    @Override
+    protected TestContext testContext() {
+        return new TestContext(createBody(), "<order xmlns=\"http:acme.com\">Camel in Action</order>", String.class);
+    }
+}
diff --git a/components/camel-xpath/src/generated/resources/org/apache/camel/language/xpath/xpath.json b/components/camel-xpath/src/generated/resources/org/apache/camel/language/xpath/xpath.json
index 691b469b0ab..b838176c688 100644
--- a/components/camel-xpath/src/generated/resources/org/apache/camel/language/xpath/xpath.json
+++ b/components/camel-xpath/src/generated/resources/org/apache/camel/language/xpath/xpath.json
@@ -23,10 +23,11 @@
     "factoryRef": { "kind": "attribute", "displayName": "Factory Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a custom XPathFactory to lookup in the registry" },
     "objectModel": { "kind": "attribute", "displayName": "Object Model", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The XPath object model to use" },
     "logNamespaces": { "kind": "attribute", "displayName": "Log Namespaces", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to log namespaces which can assist during troubleshooting" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body" },
     "threadSafety": { "kind": "attribute", "displayName": "Thread Safety", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable thread-safety for the returned result of the xpath expression. This applies to when using NODESET as the result type, and the returned set has multiple elements. In this situation there can be thread-safety iss [...]
     "preCompile": { "kind": "attribute", "displayName": "Pre Compile", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to enable pre-compiling the xpath expression during initialization phase. pre-compile is enabled by default. This can be used to turn off, for example in cases the compilation phase is desired at the starting phase, such as i [...]
     "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPath.java b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPath.java
index 922259f7a21..1235f488ecd 100644
--- a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPath.java
+++ b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPath.java
@@ -55,10 +55,18 @@ public @interface XPath {
 
     /**
      * The name of the header we want to apply the XPath expression to. If this is empty then the XPath expression will
-     * be applied to the body instead.
+     * be applied to the exchange property or the body instead.
      */
     String headerName() default "";
 
+    /**
+     * The name of the header we want to apply the XPath expression to. If this is empty then the XPath expression will
+     * be applied to the body instead.
+     * <p>
+     * It has a lower precedent than the name of header if both are set.
+     */
+    String propertyName() default "";
+
     /**
      * Whether to log namespaces which can assist during troubleshooting
      */
diff --git a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathAnnotationExpressionFactory.java b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathAnnotationExpressionFactory.java
index 26aa250e7ba..eb20e46853e 100644
--- a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathAnnotationExpressionFactory.java
+++ b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathAnnotationExpressionFactory.java
@@ -56,6 +56,10 @@ public class XPathAnnotationExpressionFactory extends DefaultAnnotationExpressio
         if (ObjectHelper.isNotEmpty(headerName)) {
             builder.setHeaderName(headerName);
         }
+        String propertyName = getPropertyName(annotation);
+        if (ObjectHelper.isNotEmpty(propertyName)) {
+            builder.setPropertyName(propertyName);
+        }
 
         return builder;
     }
@@ -72,7 +76,7 @@ public class XPathAnnotationExpressionFactory extends DefaultAnnotationExpressio
      * Extracts the value of the header method in the Annotation. For backwards compatibility this method will return
      * null if the annotation's method is not found.
      * 
-     * @return If the annotation has the method 'header' then the name of the header we want to apply the XPath
+     * @return If the annotation has the method 'headerName' then the name of the header we want to apply the XPath
      *         expression to. Otherwise, null will be returned
      */
     protected String getHeaderName(Annotation annotation) {
@@ -85,6 +89,23 @@ public class XPathAnnotationExpressionFactory extends DefaultAnnotationExpressio
         return headerValue;
     }
 
+    /**
+     * Extracts the value of the property method in the Annotation. For backwards compatibility this method will return
+     * null if the annotation's method is not found.
+     *
+     * @return If the annotation has the method 'propertyName' then the name of the property we want to apply the XPath
+     *         expression to. Otherwise, null will be returned
+     */
+    protected String getPropertyName(Annotation annotation) {
+        String propertyValue = null;
+        try {
+            propertyValue = (String) getAnnotationObjectValue(annotation, "propertyName");
+        } catch (Exception e) {
+            // Do Nothing
+        }
+        return propertyValue;
+    }
+
     protected boolean isLogNamespaces(Annotation annotation) {
         // in case @XPath is extended in a custom annotation then it may not have the method
         try {
diff --git a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathBuilder.java b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathBuilder.java
index 846ae337d49..0ba08a0613a 100644
--- a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathBuilder.java
+++ b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathBuilder.java
@@ -129,9 +129,16 @@ public class XPathBuilder extends ServiceSupport
     private volatile XPathFunction simpleFunction;
     /**
      * The name of the header we want to apply the XPath expression to, which when set will cause the xpath to be
-     * evaluated on the required header, otherwise it will be applied to the body
+     * evaluated on the required header, otherwise it will be applied to the value of the property or the body
      */
     private volatile String headerName;
+    /**
+     * The name of the property we want to apply the XPath expression to, which when set will cause the xpath to be
+     * evaluated on the required property, otherwise it will be applied to the body
+     * <p>
+     * It has a lower precedent than the name of header if both are set.
+     */
+    private volatile String propertyName;
 
     /**
      * @param text The XPath expression
@@ -564,6 +571,14 @@ public class XPathBuilder extends ServiceSupport
         this.headerName = headerName;
     }
 
+    public String getPropertyName() {
+        return propertyName;
+    }
+
+    public void setPropertyName(String propertyName) {
+        this.propertyName = propertyName;
+    }
+
     public boolean isThreadSafety() {
         return threadSafety;
     }
@@ -1020,6 +1035,15 @@ public class XPathBuilder extends ServiceSupport
                     Object headerObject = exchange.getIn().getHeader(getHeaderName());
                     document = getDocument(exchange, headerObject);
                 }
+            } else if (ObjectHelper.isNotEmpty(getPropertyName())) {
+                // only convert to input stream if really needed
+                if (isInputStreamNeededForProperty(exchange, propertyName)) {
+                    is = exchange.getProperty(propertyName, InputStream.class);
+                    document = getDocument(exchange, is);
+                } else {
+                    Object headerObject = exchange.getProperty(propertyName);
+                    document = getDocument(exchange, headerObject);
+                }
             } else {
                 // only convert to input stream if really needed
                 if (isInputStreamNeeded(exchange)) {
@@ -1059,12 +1083,16 @@ public class XPathBuilder extends ServiceSupport
             String message = getText();
             if (ObjectHelper.isNotEmpty(getHeaderName())) {
                 message = message + " with headerName " + getHeaderName();
+            } else if (ObjectHelper.isNotEmpty(getPropertyName())) {
+                message = message + " with propertyName " + getPropertyName();
             }
             throw new RuntimeCamelException(message, e);
         } catch (XPathExpressionException e) {
             String message = getText();
             if (ObjectHelper.isNotEmpty(getHeaderName())) {
                 message = message + " with headerName " + getHeaderName();
+            } else if (ObjectHelper.isNotEmpty(getPropertyName())) {
+                message = message + " with propertyName " + getPropertyName();
             }
             throw new InvalidXPathException(message, e);
         } finally {
@@ -1232,6 +1260,19 @@ public class XPathBuilder extends ServiceSupport
         return isInputStreamNeededForObject(exchange, header);
     }
 
+    /**
+     * Checks whether we need an {@link InputStream} to access the exchange property.
+     * <p/>
+     * Depending on the content in the exchange property, we may not need to convert to {@link InputStream}.
+     *
+     * @param  exchange the current exchange
+     * @return          <tt>true</tt> to convert to {@link InputStream} beforehand converting afterwards.
+     */
+    protected boolean isInputStreamNeededForProperty(Exchange exchange, String propertyName) {
+        Object property = exchange.getProperty(propertyName);
+        return isInputStreamNeededForObject(exchange, property);
+    }
+
     /**
      * Checks whether we need an {@link InputStream} to access this object
      * <p/>
diff --git a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java
index 25cc2911af1..e4bac284933 100644
--- a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java
+++ b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java
@@ -24,15 +24,14 @@ import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
 import org.apache.camel.spi.PropertyConfigurer;
 import org.apache.camel.spi.annotations.Language;
-import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.support.SingleInputTypedLanguageSupport;
 import org.apache.camel.support.component.PropertyConfigurerSupport;
 
 /**
  * XPath language.
  */
 @Language("xpath")
-public class XPathLanguage extends LanguageSupport implements PropertyConfigurer {
-    private Class<?> resultType;
+public class XPathLanguage extends SingleInputTypedLanguageSupport implements PropertyConfigurer {
     private QName resultQName;
     private Class<?> documentType;
     private XPathFactory xpathFactory;
@@ -40,7 +39,6 @@ public class XPathLanguage extends LanguageSupport implements PropertyConfigurer
     private String objectModelUri;
     private Boolean threadSafety;
     private Boolean logNamespaces;
-    private String headerName;
     private Boolean preCompile;
 
     @Override
@@ -75,10 +73,6 @@ public class XPathLanguage extends LanguageSupport implements PropertyConfigurer
         return builder;
     }
 
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
     public void setResultQName(QName qName) {
         this.resultQName = qName;
     }
@@ -87,10 +81,6 @@ public class XPathLanguage extends LanguageSupport implements PropertyConfigurer
         return resultQName;
     }
 
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
     public Class<?> getDocumentType() {
         return documentType;
     }
@@ -139,14 +129,6 @@ public class XPathLanguage extends LanguageSupport implements PropertyConfigurer
         this.logNamespaces = logNamespaces;
     }
 
-    public String getHeaderName() {
-        return headerName;
-    }
-
-    public void setHeaderName(String headerName) {
-        this.headerName = headerName;
-    }
-
     public Boolean getPreCompile() {
         return preCompile;
     }
@@ -164,7 +146,7 @@ public class XPathLanguage extends LanguageSupport implements PropertyConfigurer
         if (qname != null) {
             builder.setResultQName(qname);
         }
-        clazz = property(Class.class, properties, 2, resultType);
+        clazz = property(Class.class, properties, 2, getResultType());
         if (clazz != null) {
             builder.setResultType(clazz);
         }
@@ -198,10 +180,14 @@ public class XPathLanguage extends LanguageSupport implements PropertyConfigurer
         if (bool != null) {
             builder.setLogNamespaces(bool);
         }
-        String str = property(String.class, properties, 9, headerName);
+        String str = property(String.class, properties, 9, getHeaderName());
         if (str != null) {
             builder.setHeaderName(str);
         }
+        str = property(String.class, properties, 10, getPropertyName());
+        if (str != null) {
+            builder.setPropertyName(str);
+        }
     }
 
     @Override
@@ -246,6 +232,10 @@ public class XPathLanguage extends LanguageSupport implements PropertyConfigurer
             case "headerName":
                 setHeaderName(PropertyConfigurerSupport.property(camelContext, String.class, value));
                 return true;
+            case "propertyname":
+            case "propertyName":
+                setPropertyName(PropertyConfigurerSupport.property(camelContext, String.class, value));
+                return true;
             case "preCompile":
             case "precompile":
                 setPreCompile(PropertyConfigurerSupport.property(camelContext, Boolean.class, value));
diff --git a/core/camel-core-languages/src/generated/resources/org/apache/camel/language/constant/constant.json b/core/camel-core-languages/src/generated/resources/org/apache/camel/language/constant/constant.json
index 8905dbbe253..05a3f15472e 100644
--- a/core/camel-core-languages/src/generated/resources/org/apache/camel/language/constant/constant.json
+++ b/core/camel-core-languages/src/generated/resources/org/apache/camel/language/constant/constant.json
@@ -17,7 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the constant type" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-languages/src/generated/resources/org/apache/camel/language/csimple/csimple.json b/core/camel-core-languages/src/generated/resources/org/apache/camel/language/csimple/csimple.json
index d8b28d3d14c..670544fe1ba 100644
--- a/core/camel-core-languages/src/generated/resources/org/apache/camel/language/csimple/csimple.json
+++ b/core/camel-core-languages/src/generated/resources/org/apache/camel/language/csimple/csimple.json
@@ -17,7 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-languages/src/generated/resources/org/apache/camel/language/ref/ref.json b/core/camel-core-languages/src/generated/resources/org/apache/camel/language/ref/ref.json
index 9e8c3d9f212..f64dbf6cc6a 100644
--- a/core/camel-core-languages/src/generated/resources/org/apache/camel/language/ref/ref.json
+++ b/core/camel-core-languages/src/generated/resources/org/apache/camel/language/ref/ref.json
@@ -17,6 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-languages/src/generated/resources/org/apache/camel/language/simple/file.json b/core/camel-core-languages/src/generated/resources/org/apache/camel/language/simple/file.json
index 82246ab226d..03ec90d88f8 100644
--- a/core/camel-core-languages/src/generated/resources/org/apache/camel/language/simple/file.json
+++ b/core/camel-core-languages/src/generated/resources/org/apache/camel/language/simple/file.json
@@ -17,7 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-languages/src/generated/resources/org/apache/camel/language/simple/simple.json b/core/camel-core-languages/src/generated/resources/org/apache/camel/language/simple/simple.json
index a2dc80f3b8f..d50872d4bbb 100644
--- a/core/camel-core-languages/src/generated/resources/org/apache/camel/language/simple/simple.json
+++ b/core/camel-core-languages/src/generated/resources/org/apache/camel/language/simple/simple.json
@@ -17,7 +17,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-languages/src/generated/resources/org/apache/camel/language/tokenizer/tokenize.json b/core/camel-core-languages/src/generated/resources/org/apache/camel/language/tokenizer/tokenize.json
index 3fd68ba3887..db8ecd8327d 100644
--- a/core/camel-core-languages/src/generated/resources/org/apache/camel/language/tokenizer/tokenize.json
+++ b/core/camel-core-languages/src/generated/resources/org/apache/camel/language/tokenizer/tokenize.json
@@ -19,13 +19,14 @@
     "token": { "kind": "attribute", "displayName": "Token", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The (start) token to use as tokenizer, for example you can use the new line token. You can use simple language as the token to support dynamic tokens." },
     "endToken": { "kind": "attribute", "displayName": "End Token", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The end token to use as tokenizer if using start\/end token pairs. You can use simple language as the token to support dynamic tokens." },
     "inheritNamespaceTagName": { "kind": "attribute", "displayName": "Inherit Namespace Tag Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To inherit namespaces from a root\/parent tag name when using XML You can use simple language as the tag name to support dynamic names." },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to tokenize instead of using the message body." },
     "regex": { "kind": "attribute", "displayName": "Regex", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the token is a regular expression pattern. The default value is false" },
     "xml": { "kind": "attribute", "displayName": "Xml", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the input is XML messages. This option must be set to true if working with XML payloads." },
     "includeTokens": { "kind": "attribute", "displayName": "Include Tokens", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to include the tokens in the parts when using pairs The default value is false" },
     "group": { "kind": "attribute", "displayName": "Group", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together, for example to split big files into chunks of 1000 lines. You can use simple language as the group to support dynamic group sizes." },
     "groupDelimiter": { "kind": "attribute", "displayName": "Group Delimiter", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the delimiter to use when grouping. If this has not been set then token will be used as the delimiter." },
     "skipFirst": { "kind": "attribute", "displayName": "Skip First", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "To skip the very first element" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleLanguage.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleLanguage.java
index 5b4709e198c..23ae057c0a7 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleLanguage.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleLanguage.java
@@ -36,7 +36,8 @@ import org.apache.camel.Predicate;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.StaticService;
 import org.apache.camel.spi.annotations.Language;
-import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.support.TypedLanguageSupport;
+import org.apache.camel.support.builder.ExpressionBuilder;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.StringHelper;
@@ -44,7 +45,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Language("csimple")
-public class CSimpleLanguage extends LanguageSupport implements StaticService {
+public class CSimpleLanguage extends TypedLanguageSupport implements StaticService {
 
     public static final String PRE_COMPILED_FILE = "META-INF/services/org/apache/camel/csimple.properties";
     public static final String CONFIG_FILE = "camel-csimple.properties";
@@ -130,7 +131,7 @@ public class CSimpleLanguage extends LanguageSupport implements StaticService {
             throw new IllegalArgumentException("expression must be specified");
         }
         // text should be single line and trimmed as it can be multi lined
-        String text = expression.replaceAll("\n", "");
+        String text = expression.replace("\n", "");
         text = text.trim();
 
         Predicate answer = compiledPredicates.get(text);
@@ -150,13 +151,16 @@ public class CSimpleLanguage extends LanguageSupport implements StaticService {
 
     @Override
     public Expression createExpression(String expression, Object[] properties) {
-        Class<?> resultType = (Class<?>) (properties != null && properties.length == 1 ? properties[0] : null);
+        Class<?> resultType = property(Class.class, properties, 0, getResultType());
         if (Boolean.class == resultType || boolean.class == resultType) {
             // we want it compiled as a predicate
             return (Expression) createPredicate(expression);
-        } else {
+        } else if (resultType == null || resultType == Object.class) {
+            // No specific result type has been provided
             return createExpression(expression);
         }
+        // A specific result type has been provided
+        return ExpressionBuilder.convertToExpression(createExpression(expression), resultType);
     }
 
     @Override
@@ -165,7 +169,7 @@ public class CSimpleLanguage extends LanguageSupport implements StaticService {
             throw new IllegalArgumentException("expression must be specified");
         }
         // text should be single line and trimmed as it can be multi lined
-        String text = expression.replaceAll("\n", "");
+        String text = expression.replace("\n", "");
         text = text.trim();
 
         Expression answer = compiledExpressions.get(text);
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/ref/RefLanguage.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/ref/RefLanguage.java
index ecb0cdf95b4..1656fb00380 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/ref/RefLanguage.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/ref/RefLanguage.java
@@ -23,15 +23,15 @@ import org.apache.camel.Predicate;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.support.ExpressionAdapter;
 import org.apache.camel.support.ExpressionToPredicateAdapter;
-import org.apache.camel.support.LanguageSupport;
 import org.apache.camel.support.PredicateToExpressionAdapter;
+import org.apache.camel.support.TypedLanguageSupport;
 import org.apache.camel.support.builder.ExpressionBuilder;
 
 /**
  * A language for referred expressions or predicates.
  */
 @org.apache.camel.spi.annotations.Language("ref")
-public class RefLanguage extends LanguageSupport {
+public class RefLanguage extends TypedLanguageSupport {
 
     @Override
     public Predicate createPredicate(String expression) {
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
index 27388e08b55..3e3eb52b32b 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
@@ -236,7 +236,7 @@ public class SimpleFunctionExpression extends LiteralExpression {
             }
 
             // there are parameters then map them into properties
-            Object[] properties = new Object[5];
+            Object[] properties = new Object[6];
             properties[2] = type;
             properties[3] = ref;
             properties[1] = method;
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java
index dfd4b6329b3..e0836186eda 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/tokenizer/TokenizeLanguage.java
@@ -21,7 +21,7 @@ import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
 import org.apache.camel.spi.PropertyConfigurer;
 import org.apache.camel.support.ExpressionToPredicateAdapter;
-import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.support.SingleInputLanguageSupport;
 import org.apache.camel.support.builder.ExpressionBuilder;
 import org.apache.camel.support.component.PropertyConfigurerSupport;
 import org.apache.camel.util.ObjectHelper;
@@ -39,12 +39,11 @@ import org.apache.camel.util.ObjectHelper;
  * <tt>token</tt> and <tt>endToken</tt>. And the <tt>xml</tt> mode supports the <tt>inheritNamespaceTagName</tt> option.
  */
 @org.apache.camel.spi.annotations.Language("tokenize")
-public class TokenizeLanguage extends LanguageSupport implements PropertyConfigurer {
+public class TokenizeLanguage extends SingleInputLanguageSupport implements PropertyConfigurer {
 
     private String token;
     private String endToken;
     private String inheritNamespaceTagName;
-    private String headerName;
     private boolean regex;
     private boolean xml;
     private boolean includeTokens;
@@ -62,7 +61,7 @@ public class TokenizeLanguage extends LanguageSupport implements PropertyConfigu
         TokenizeLanguage language = new TokenizeLanguage();
         language.setToken(token);
         language.setRegex(regex);
-        return language.createExpression((String) null);
+        return language.createExpression(null);
     }
 
     @Deprecated
@@ -76,7 +75,7 @@ public class TokenizeLanguage extends LanguageSupport implements PropertyConfigu
         language.setHeaderName(headerName);
         language.setToken(token);
         language.setRegex(regex);
-        return language.createExpression((String) null);
+        return language.createExpression(null);
     }
 
     @Deprecated
@@ -85,7 +84,7 @@ public class TokenizeLanguage extends LanguageSupport implements PropertyConfigu
         language.setToken(startToken);
         language.setEndToken(endToken);
         language.setIncludeTokens(includeTokens);
-        return language.createExpression((String) null);
+        return language.createExpression(null);
     }
 
     @Deprecated
@@ -118,6 +117,10 @@ public class TokenizeLanguage extends LanguageSupport implements PropertyConfigu
             case "headerName":
                 setHeaderName(PropertyConfigurerSupport.property(camelContext, String.class, value));
                 return true;
+            case "propertyname":
+            case "propertyName":
+                setPropertyName(PropertyConfigurerSupport.property(camelContext, String.class, value));
+                return true;
             case "regex":
                 setRegex(PropertyConfigurerSupport.property(camelContext, Boolean.class, value));
                 return true;
@@ -172,8 +175,7 @@ public class TokenizeLanguage extends LanguageSupport implements PropertyConfigu
 
         if (answer == null) {
             // use the regular tokenizer
-            Expression exp
-                    = headerName == null ? ExpressionBuilder.bodyExpression() : ExpressionBuilder.headerExpression(headerName);
+            final Expression exp = ExpressionBuilder.singleInputExpression(getHeaderName(), getPropertyName());
             if (regex) {
                 answer = ExpressionBuilder.regexTokenizeExpression(exp, token);
             } else {
@@ -221,13 +223,14 @@ public class TokenizeLanguage extends LanguageSupport implements PropertyConfigu
         answer.setEndToken(property(String.class, properties, 1, endToken));
         answer.setInheritNamespaceTagName(
                 property(String.class, properties, 2, inheritNamespaceTagName));
-        answer.setHeaderName(property(String.class, properties, 3, headerName));
+        answer.setHeaderName(property(String.class, properties, 3, getHeaderName()));
         answer.setGroupDelimiter(property(String.class, properties, 4, groupDelimiter));
         answer.setRegex(property(boolean.class, properties, 5, regex));
         answer.setXml(property(boolean.class, properties, 6, xml));
         answer.setIncludeTokens(property(boolean.class, properties, 7, includeTokens));
         answer.setGroup(property(String.class, properties, 8, group));
         answer.setSkipFirst(property(boolean.class, properties, 9, skipFirst));
+        answer.setPropertyName(property(String.class, properties, 10, getPropertyName()));
         return answer.createExpression(expression);
     }
 
@@ -247,14 +250,6 @@ public class TokenizeLanguage extends LanguageSupport implements PropertyConfigu
         this.endToken = endToken;
     }
 
-    public String getHeaderName() {
-        return headerName;
-    }
-
-    public void setHeaderName(String headerName) {
-        this.headerName = headerName;
-    }
-
     public boolean isRegex() {
         return regex;
     }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/constant.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/constant.json
index a278b369ea5..71230852b52 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/constant.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/constant.json
@@ -14,7 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the constant type" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/csimple.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/csimple.json
index 7fddf1b0686..625cf16ede3 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/csimple.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/csimple.json
@@ -14,7 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/datasonnet.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/datasonnet.json
index adfe20ad2ac..2960dffb9ae 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/datasonnet.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/datasonnet.json
@@ -16,7 +16,7 @@
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "bodyMediaType": { "kind": "attribute", "displayName": "Body Media Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The String representation of the message's body MediaType" },
     "outputMediaType": { "kind": "attribute", "displayName": "Output Media Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The String representation of the MediaType to output" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output) The default result type is com.datasonnet.document.Document" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/groovy.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/groovy.json
index 77c92e989bd..e051cb61ca7 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/groovy.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/groovy.json
@@ -14,6 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/hl7terser.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/hl7terser.json
index 7369115647a..a841dd839ad 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/hl7terser.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/hl7terser.json
@@ -14,6 +14,9 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/joor.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/joor.json
index 4c710ce53a3..10bbf095efa 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/joor.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/joor.json
@@ -16,7 +16,7 @@
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "preCompile": { "kind": "attribute", "displayName": "Pre Compile", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the expression should be pre compiled once during initialization phase. If this is turned off, then the expression is reloaded and compiled on each evaluation." },
     "singleQuotes": { "kind": "attribute", "displayName": "Single Quotes", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether single quotes can be used as replacement for double quotes. This is convenient when you need to work with strings inside strings." },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jq.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jq.json
index 4d69c75867a..fcafe7d45fd 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jq.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jq.json
@@ -14,8 +14,9 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/js.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/js.json
index 7a3f1324f03..84536020c35 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/js.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/js.json
@@ -15,7 +15,6 @@
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jsonpath.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jsonpath.json
index a20f08e33cc..a07dcf4d677 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jsonpath.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jsonpath.json
@@ -14,14 +14,15 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
     "suppressExceptions": { "kind": "attribute", "displayName": "Suppress Exceptions", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to suppress exceptions such as PathNotFoundException." },
     "allowSimple": { "kind": "attribute", "displayName": "Allow Simple", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to allow in inlined Simple exceptions in the JSONPath expression" },
     "allowEasyPredicate": { "kind": "attribute", "displayName": "Allow Easy Predicate", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to allow using the easy predicate parser to pre-parse predicates." },
     "writeAsString": { "kind": "attribute", "displayName": "Write As String", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to write the output of each row\/element as a JSON String value instead of a Map\/POJO value." },
     "unpackArray": { "kind": "attribute", "displayName": "Unpack Array", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to unpack a single element json-array into an object." },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body" },
     "option": { "kind": "attribute", "displayName": "Option", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "DEFAULT_PATH_LEAF_TO_NULL", "ALWAYS_RETURN_LIST", "AS_PATH_LIST", "SUPPRESS_EXCEPTIONS", "REQUIRE_PROPERTIES" ], "deprecated": false, "autowired": false, "secret": false, "description": "To configure additional options on JSONPath. Multiple values can be separated by comma." },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/method.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/method.json
index 0596578e62c..9d5d97d2f02 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/method.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/method.json
@@ -17,6 +17,7 @@
     "method": { "kind": "attribute", "displayName": "Method", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of method to call" },
     "beanType": { "kind": "attribute", "displayName": "Bean Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Class name (fully qualified) of the bean to use Will lookup in registry and if there is a single instance of the same type, then the existing bean is used, otherwise a new bean is created (requires a default no-arg constructor)." },
     "scope": { "kind": "attribute", "displayName": "Scope", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "Singleton", "Request", "Prototype" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "Singleton", "description": "Scope of bean. When using singleton scope (default) the bean is created or looked up only once and reused for the lifetime of the endpoint. The bean should be thread-safe in case concurrent th [...]
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/mvel.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/mvel.json
index 88afff8f89e..eda586fae34 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/mvel.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/mvel.json
@@ -14,6 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/ognl.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/ognl.json
index f5af40bcfbf..04159b670ff 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/ognl.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/ognl.json
@@ -14,6 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/python.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/python.json
index 051b931520a..7ce9963ddf7 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/python.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/python.json
@@ -15,7 +15,6 @@
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
     "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/ref.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/ref.json
index f2cf694e0c7..7b6db096791 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/ref.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/ref.json
@@ -14,6 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/simple.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/simple.json
index 16b3220d23d..496a452373c 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/simple.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/simple.json
@@ -14,7 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
-    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output)" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/spel.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/spel.json
index ec1362c3e79..07bf4b24910 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/spel.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/spel.json
@@ -14,6 +14,7 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/tokenize.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/tokenize.json
index 8a3af1b3f66..4c8379a9151 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/tokenize.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/tokenize.json
@@ -16,13 +16,14 @@
     "token": { "kind": "attribute", "displayName": "Token", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The (start) token to use as tokenizer, for example you can use the new line token. You can use simple language as the token to support dynamic tokens." },
     "endToken": { "kind": "attribute", "displayName": "End Token", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The end token to use as tokenizer if using start\/end token pairs. You can use simple language as the token to support dynamic tokens." },
     "inheritNamespaceTagName": { "kind": "attribute", "displayName": "Inherit Namespace Tag Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To inherit namespaces from a root\/parent tag name when using XML You can use simple language as the tag name to support dynamic names." },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to tokenize instead of using the message body." },
     "regex": { "kind": "attribute", "displayName": "Regex", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the token is a regular expression pattern. The default value is false" },
     "xml": { "kind": "attribute", "displayName": "Xml", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the input is XML messages. This option must be set to true if working with XML payloads." },
     "includeTokens": { "kind": "attribute", "displayName": "Include Tokens", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to include the tokens in the parts when using pairs The default value is false" },
     "group": { "kind": "attribute", "displayName": "Group", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together, for example to split big files into chunks of 1000 lines. You can use simple language as the group to support dynamic group sizes." },
     "groupDelimiter": { "kind": "attribute", "displayName": "Group Delimiter", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the delimiter to use when grouping. If this has not been set then token will be used as the delimiter." },
     "skipFirst": { "kind": "attribute", "displayName": "Skip First", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "To skip the very first element" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xpath.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xpath.json
index c39cc1016ef..3faab8a68ef 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xpath.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xpath.json
@@ -20,10 +20,11 @@
     "factoryRef": { "kind": "attribute", "displayName": "Factory Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a custom XPathFactory to lookup in the registry" },
     "objectModel": { "kind": "attribute", "displayName": "Object Model", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The XPath object model to use" },
     "logNamespaces": { "kind": "attribute", "displayName": "Log Namespaces", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to log namespaces which can assist during troubleshooting" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body" },
     "threadSafety": { "kind": "attribute", "displayName": "Thread Safety", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to enable thread-safety for the returned result of the xpath expression. This applies to when using NODESET as the result type, and the returned set has multiple elements. In this situation there can be thread-safety iss [...]
     "preCompile": { "kind": "attribute", "displayName": "Pre Compile", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to enable pre-compiling the xpath expression during initialization phase. pre-compile is enabled by default. This can be used to turn off, for example in cases the compilation phase is desired at the starting phase, such as i [...]
     "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xquery.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xquery.json
index aa108ec71e5..940fa878d77 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xquery.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xquery.json
@@ -14,10 +14,12 @@
   },
   "properties": {
     "expression": { "kind": "value", "displayName": "Expression", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The expression value in your chosen language syntax" },
+    "resultType": { "kind": "attribute", "displayName": "Result Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class of the result type (type from output)" },
     "type": { "kind": "attribute", "displayName": "Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the class name of the result type (type from output) The default result type is NodeSet" },
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body" },
     "configurationRef": { "kind": "attribute", "displayName": "Configuration Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Reference to a saxon configuration instance in the registry to use for xquery (requires camel-saxon). This may be needed to add custom functions to a saxon configuration, so these custom functions can be used in xquery expressions." },
     "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xtokenize.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xtokenize.json
index 7b7ecd858f4..61172988455 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xtokenize.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/xtokenize.json
@@ -13,10 +13,11 @@
     "output": false
   },
   "properties": {
-    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to tokenize instead of using the message body." },
     "mode": { "kind": "attribute", "displayName": "Mode", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "i", "w", "u", "t" ], "deprecated": false, "autowired": false, "secret": false, "description": "The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its c [...]
     "group": { "kind": "attribute", "displayName": "Group", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "To group N parts together" },
     "namespace": { "kind": "element", "displayName": "Namespace", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<org.apache.camel.model.PropertyDefinition>", "deprecated": false, "autowired": false, "secret": false, "description": "Injects the XML Namespaces of prefix - uri mappings" },
+    "headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body It has as higher precedent than the propertyName if both are set." },
+    "propertyName": { "kind": "attribute", "displayName": "Property Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of property to use as input, instead of the message body. It has a lower precedent than the headerName if both are set." },
     "trim": { "kind": "attribute", "displayName": "Trim", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to trim the value to remove leading and trailing whitespaces and line breaks" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" }
   }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
index adee8ec861d..2bb79abd0de 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
@@ -227,7 +227,7 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi
     /**
      * Evaluates an expression using the <a href="http://camel.apache.org/bean-language.html>bean language</a> which
      * basically means the bean is invoked to determine the expression value.
-     *
+     * <p>
      * Will lookup in registry and if there is a single instance of the same type, then the existing bean is used,
      * otherwise a new bean is created (requires a default no-arg constructor).
      *
@@ -294,7 +294,7 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi
     /**
      * Evaluates an expression using the <a href="http://camel.apache.org/bean-language.html>bean language</a> which
      * basically means the bean is invoked to determine the expression value.
-     *
+     * <p>
      * Will lookup in registry and if there is a single instance of the same type, then the existing bean is used,
      * otherwise a new bean is created (requires a default no-arg constructor).
      *
@@ -309,7 +309,7 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi
     /**
      * Evaluates an expression using the <a href="http://camel.apache.org/bean-language.html>bean language</a> which
      * basically means the bean is invoked to determine the expression value.
-     *
+     * <p>
      * Will lookup in registry and if there is a single instance of the same type, then the existing bean is used,
      * otherwise a new bean is created (requires a default no-arg constructor).
      *
@@ -326,7 +326,7 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi
     /**
      * Evaluates an expression using the <a href="http://camel.apache.org/bean-language.html>bean language</a> which
      * basically means the bean is invoked to determine the expression value.
-     *
+     * <p>
      * Will lookup in registry and if there is a single instance of the same type, then the existing bean is used,
      * otherwise a new bean is created (requires a default no-arg constructor).
      *
@@ -1125,6 +1125,7 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi
      */
     public T xpath(String text, Class<?> resultType, String headerName) {
         XPathExpression expression = new XPathExpression(text);
+        expression.setResultType(resultType);
         expression.setHeaderName(headerName);
         expression(expression);
         return result;
@@ -1253,6 +1254,7 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi
      */
     public T xquery(String text, Class<?> resultType, String headerName) {
         XQueryExpression expression = new XQueryExpression(text);
+        expression.setResultType(resultType);
         expression.setHeaderName(headerName);
         expression(expression);
         return result;
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/CSimpleExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/CSimpleExpression.java
index 24f03d4a572..31f012b4e3d 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/CSimpleExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/CSimpleExpression.java
@@ -18,7 +18,6 @@ package org.apache.camel.model.language;
 
 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;
 
@@ -30,12 +29,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "3.7.0", label = "language,java", title = "CSimple")
 @XmlRootElement(name = "csimple")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class CSimpleExpression extends ExpressionDefinition {
-
-    @XmlAttribute(name = "resultType")
-    private String resultTypeName;
-    @XmlTransient
-    private Class<?> resultType;
+public class CSimpleExpression extends TypedExpressionDefinition {
 
     public CSimpleExpression() {
     }
@@ -46,8 +40,6 @@ public class CSimpleExpression extends ExpressionDefinition {
 
     private CSimpleExpression(Builder builder) {
         super(builder);
-        this.resultTypeName = builder.resultTypeName;
-        this.resultType = builder.resultType;
     }
 
     @Override
@@ -55,53 +47,12 @@ public class CSimpleExpression extends ExpressionDefinition {
         return "csimple";
     }
 
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    /**
-     * Sets the class of the result type (type from output)
-     */
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
-    public String getResultTypeName() {
-        return resultTypeName;
-    }
-
-    /**
-     * Sets the class name of the result type (type from output)
-     */
-    public void setResultTypeName(String resultTypeName) {
-        this.resultTypeName = resultTypeName;
-    }
-
     /**
      * {@code Builder} is a specific builder for {@link CSimpleExpression}.
      */
     @XmlTransient
     public static class Builder extends AbstractBuilder<Builder, CSimpleExpression> {
 
-        private String resultTypeName;
-        private Class<?> resultType;
-
-        /**
-         * Sets the class of the result type (type from output)
-         */
-        public Builder resultType(Class<?> resultType) {
-            this.resultType = resultType;
-            return this;
-        }
-
-        /**
-         * Sets the class name of the result type (type from output)
-         */
-        public Builder resultTypeName(String resultTypeName) {
-            this.resultTypeName = resultTypeName;
-            return this;
-        }
-
         @Override
         public CSimpleExpression end() {
             return new CSimpleExpression(this);
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/ConstantExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/ConstantExpression.java
index 26d12d82589..da9ecc10098 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/ConstantExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/ConstantExpression.java
@@ -18,7 +18,6 @@ package org.apache.camel.model.language;
 
 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;
 
@@ -30,12 +29,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "1.5.0", label = "language,core", title = "Constant")
 @XmlRootElement(name = "constant")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ConstantExpression extends ExpressionDefinition {
-
-    @XmlAttribute(name = "resultType")
-    private String resultTypeName;
-    @XmlTransient
-    private Class<?> resultType;
+public class ConstantExpression extends TypedExpressionDefinition {
 
     public ConstantExpression() {
     }
@@ -46,8 +40,6 @@ public class ConstantExpression extends ExpressionDefinition {
 
     private ConstantExpression(Builder builder) {
         super(builder);
-        this.resultTypeName = builder.resultTypeName;
-        this.resultType = builder.resultType;
     }
 
     @Override
@@ -55,53 +47,12 @@ public class ConstantExpression extends ExpressionDefinition {
         return "constant";
     }
 
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    /**
-     * Sets the class of the constant type
-     */
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
-    public String getResultTypeName() {
-        return resultTypeName;
-    }
-
-    /**
-     * Sets the class name of the constant type
-     */
-    public void setResultTypeName(String resultTypeName) {
-        this.resultTypeName = resultTypeName;
-    }
-
     /**
      * {@code Builder} is a specific builder for {@link ConstantExpression}.
      */
     @XmlTransient
     public static class Builder extends AbstractBuilder<Builder, ConstantExpression> {
 
-        private String resultTypeName;
-        private Class<?> resultType;
-
-        /**
-         * Sets the class of the constant type
-         */
-        public Builder resultType(Class<?> resultType) {
-            this.resultType = resultType;
-            return this;
-        }
-
-        /**
-         * Sets the class name of the constant type
-         */
-        public Builder resultTypeName(String resultTypeName) {
-            this.resultTypeName = resultTypeName;
-            return this;
-        }
-
         @Override
         public ConstantExpression end() {
             return new ConstantExpression(this);
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/DatasonnetExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/DatasonnetExpression.java
index d21368be89a..420952c0bab 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/DatasonnetExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/DatasonnetExpression.java
@@ -31,16 +31,12 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "3.7.0", label = "language,transformation", title = "DataSonnet")
 @XmlRootElement(name = "datasonnet")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class DatasonnetExpression extends ExpressionDefinition {
+public class DatasonnetExpression extends TypedExpressionDefinition {
 
     @XmlAttribute(name = "bodyMediaType")
     private String bodyMediaType;
     @XmlAttribute(name = "outputMediaType")
     private String outputMediaType;
-    @XmlAttribute(name = "resultType")
-    private String resultTypeName;
-    @XmlTransient
-    private Class<?> resultType;
 
     public DatasonnetExpression() {
     }
@@ -57,8 +53,6 @@ public class DatasonnetExpression extends ExpressionDefinition {
         super(builder);
         this.bodyMediaType = builder.bodyMediaType;
         this.outputMediaType = builder.outputMediaType;
-        this.resultTypeName = builder.resultTypeName;
-        this.resultType = builder.resultType;
     }
 
     @Override
@@ -88,32 +82,6 @@ public class DatasonnetExpression extends ExpressionDefinition {
         this.outputMediaType = outputMediaType;
     }
 
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    /**
-     * Sets the class of the result type (type from output).
-     * <p/>
-     * The default result type is com.datasonnet.document.Document
-     */
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
-    public String getResultTypeName() {
-        return resultTypeName;
-    }
-
-    /**
-     * Sets the class name of the result type (type from output)
-     * <p/>
-     * The default result type is com.datasonnet.document.Document
-     */
-    public void setResultTypeName(String resultTypeName) {
-        this.resultTypeName = resultTypeName;
-    }
-
     /**
      * {@code Builder} is a specific builder for {@link DatasonnetExpression}.
      */
@@ -122,8 +90,6 @@ public class DatasonnetExpression extends ExpressionDefinition {
 
         private String bodyMediaType;
         private String outputMediaType;
-        private String resultTypeName;
-        private Class<?> resultType;
 
         /**
          * The String representation of the message's body MediaType
@@ -141,26 +107,6 @@ public class DatasonnetExpression extends ExpressionDefinition {
             return this;
         }
 
-        /**
-         * Sets the class of the result type (type from output).
-         * <p/>
-         * The default result type is com.datasonnet.document.Document
-         */
-        public Builder resultType(Class<?> resultType) {
-            this.resultType = resultType;
-            return this;
-        }
-
-        /**
-         * Sets the class name of the result type (type from output)
-         * <p/>
-         * The default result type is com.datasonnet.document.Document
-         */
-        public Builder resultTypeName(String resultTypeName) {
-            this.resultTypeName = resultTypeName;
-            return this;
-        }
-
         @Override
         public DatasonnetExpression end() {
             return new DatasonnetExpression(this);
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/GroovyExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/GroovyExpression.java
index 84b6606fd77..852019cd792 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/GroovyExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/GroovyExpression.java
@@ -29,7 +29,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "1.3.0", label = "language,script", title = "Groovy")
 @XmlRootElement(name = "groovy")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class GroovyExpression extends ExpressionDefinition {
+public class GroovyExpression extends TypedExpressionDefinition {
 
     public GroovyExpression() {
     }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/Hl7TerserExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/Hl7TerserExpression.java
index a65cb4457ce..e50b6adab15 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/Hl7TerserExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/Hl7TerserExpression.java
@@ -29,7 +29,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "2.11.0", label = "language,hl7", title = "HL7 Terser")
 @XmlRootElement(name = "hl7terser")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class Hl7TerserExpression extends ExpressionDefinition {
+public class Hl7TerserExpression extends SingleInputTypedExpressionDefinition {
 
     public Hl7TerserExpression() {
     }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JavaScriptExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/JavaScriptExpression.java
index a4efb18de0e..3d066a5762a 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JavaScriptExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/JavaScriptExpression.java
@@ -18,7 +18,6 @@ package org.apache.camel.model.language;
 
 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;
 
@@ -30,17 +29,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "3.20.0", label = "language,javascript", title = "JavaScript")
 @XmlRootElement(name = "js")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class JavaScriptExpression extends ExpressionDefinition {
-
-    @XmlAttribute(name = "resultType")
-    private String resultTypeName;
-    @XmlTransient
-    private Class<?> resultType;
-    @XmlAttribute
-    @Metadata(label = "advanced")
-    private String headerName;
-    @Metadata(label = "advanced")
-    private String propertyName;
+public class JavaScriptExpression extends TypedExpressionDefinition {
 
     public JavaScriptExpression() {
     }
@@ -49,12 +38,8 @@ public class JavaScriptExpression extends ExpressionDefinition {
         super(expression);
     }
 
-    private JavaScriptExpression(JavaScriptExpression.Builder builder) {
+    private JavaScriptExpression(Builder builder) {
         super(builder);
-        this.resultTypeName = builder.resultTypeName;
-        this.resultType = builder.resultType;
-        this.headerName = builder.headerName;
-        this.propertyName = builder.propertyName;
     }
 
     @Override
@@ -62,100 +47,11 @@ public class JavaScriptExpression extends ExpressionDefinition {
         return "js";
     }
 
-    public String getResultTypeName() {
-        return resultTypeName;
-    }
-
-    /**
-     * Sets the class of the result type (type from output)
-     */
-    public void setResultTypeName(String resultTypeName) {
-        this.resultTypeName = resultTypeName;
-    }
-
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    /**
-     * Sets the class name of the result type (type from output)
-     */
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
-    public String getHeaderName() {
-        return headerName;
-    }
-
-    /**
-     * Name of header to use as input, instead of the message body
-     * </p>
-     * It has as higher precedent than the propertyName if both are set.
-     */
-    public void setHeaderName(String headerName) {
-        this.headerName = headerName;
-    }
-
-    public String getPropertyName() {
-        return propertyName;
-    }
-
-    /**
-     * Name of property to use as input, instead of the message body.
-     * </p>
-     * It has a lower precedent than the headerName if both are set.
-     */
-    public void setPropertyName(String propertyName) {
-        this.propertyName = propertyName;
-    }
-
     /**
      * {@code Builder} is a specific builder for {@link JavaScriptExpression}.
      */
     @XmlTransient
-    public static class Builder extends AbstractBuilder<JavaScriptExpression.Builder, JavaScriptExpression> {
-
-        private String resultTypeName;
-        private Class<?> resultType;
-        private String headerName;
-        private String propertyName;
-
-        /**
-         * Sets the class name of the result type (type from output)
-         */
-        public JavaScriptExpression.Builder resultType(Class<?> resultType) {
-            this.resultType = resultType;
-            return this;
-        }
-
-        /**
-         * Sets the class of the result type (type from output)
-         */
-        public JavaScriptExpression.Builder resultTypeName(String resultTypeName) {
-            this.resultTypeName = resultTypeName;
-            return this;
-        }
-
-        /**
-         * Name of header to use as input, instead of the message body
-         * </p>
-         * It has as higher precedent than the propertyName if both are set.
-         */
-        public JavaScriptExpression.Builder headerName(String headerName) {
-            this.headerName = headerName;
-            return this;
-        }
-
-        /**
-         * Name of property to use as input, instead of the message body.
-         * </p>
-         * It has a lower precedent than the headerName if both are set.
-         */
-        public JavaScriptExpression.Builder propertyName(String propertyName) {
-            this.propertyName = propertyName;
-            return this;
-        }
+    public static class Builder extends AbstractBuilder<Builder, JavaScriptExpression> {
 
         @Override
         public JavaScriptExpression end() {
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JoorExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/JoorExpression.java
index 12d8e6e9466..17af1314dcd 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JoorExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/JoorExpression.java
@@ -30,7 +30,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "3.7.0", label = "language", title = "jOOR")
 @XmlRootElement(name = "joor")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class JoorExpression extends ExpressionDefinition {
+public class JoorExpression extends TypedExpressionDefinition {
 
     @XmlAttribute
     @Metadata(label = "advanced", defaultValue = "true", javaType = "java.lang.Boolean")
@@ -38,10 +38,6 @@ public class JoorExpression extends ExpressionDefinition {
     @XmlAttribute
     @Metadata(label = "advanced", defaultValue = "true", javaType = "java.lang.Boolean")
     private String singleQuotes;
-    @XmlAttribute(name = "resultType")
-    private String resultTypeName;
-    @XmlTransient
-    private Class<?> resultType;
 
     public JoorExpression() {
     }
@@ -54,8 +50,6 @@ public class JoorExpression extends ExpressionDefinition {
         super(builder);
         this.preCompile = builder.preCompile;
         this.singleQuotes = builder.singleQuotes;
-        this.resultTypeName = builder.resultTypeName;
-        this.resultType = builder.resultType;
     }
 
     @Override
@@ -87,28 +81,6 @@ public class JoorExpression extends ExpressionDefinition {
         this.singleQuotes = singleQuotes;
     }
 
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    /**
-     * Sets the class of the result type (type from output)
-     */
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
-    public String getResultTypeName() {
-        return resultTypeName;
-    }
-
-    /**
-     * Sets the class name of the result type (type from output)
-     */
-    public void setResultTypeName(String resultTypeName) {
-        this.resultTypeName = resultTypeName;
-    }
-
     /**
      * {@code Builder} is a specific builder for {@link JoorExpression}.
      */
@@ -117,8 +89,6 @@ public class JoorExpression extends ExpressionDefinition {
 
         private String preCompile;
         private String singleQuotes;
-        private String resultTypeName;
-        private Class<?> resultType;
 
         /**
          * Whether the expression should be pre compiled once during initialization phase. If this is turned off, then
@@ -156,22 +126,6 @@ public class JoorExpression extends ExpressionDefinition {
             return this;
         }
 
-        /**
-         * Sets the class of the result type (type from output)
-         */
-        public Builder resultType(Class<?> resultType) {
-            this.resultType = resultType;
-            return this;
-        }
-
-        /**
-         * Sets the class name of the result type (type from output)
-         */
-        public Builder resultTypeName(String resultTypeName) {
-            this.resultTypeName = resultTypeName;
-            return this;
-        }
-
         @Override
         public JoorExpression end() {
             return new JoorExpression(this);
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JqExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/JqExpression.java
index 13db5d36f12..66797c49324 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JqExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/JqExpression.java
@@ -18,7 +18,6 @@ package org.apache.camel.model.language;
 
 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;
 
@@ -30,16 +29,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "3.18.0", label = "language,json", title = "JQ")
 @XmlRootElement(name = "jq")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class JqExpression extends ExpressionDefinition {
-    @XmlAttribute(name = "resultType")
-    private String resultTypeName;
-    @XmlTransient
-    private Class<?> resultType;
-    @XmlAttribute
-    @Metadata(label = "advanced")
-    private String headerName;
-    @Metadata(label = "advanced")
-    private String propertyName;
+public class JqExpression extends SingleInputTypedExpressionDefinition {
 
     public JqExpression() {
     }
@@ -50,10 +40,6 @@ public class JqExpression extends ExpressionDefinition {
 
     private JqExpression(Builder builder) {
         super(builder);
-        this.resultTypeName = builder.resultTypeName;
-        this.resultType = builder.resultType;
-        this.headerName = builder.headerName;
-        this.propertyName = builder.propertyName;
     }
 
     @Override
@@ -61,101 +47,12 @@ public class JqExpression extends ExpressionDefinition {
         return "jq";
     }
 
-    public String getResultTypeName() {
-        return resultTypeName;
-    }
-
-    /**
-     * Sets the class of the result type (type from output)
-     */
-    public void setResultTypeName(String resultTypeName) {
-        this.resultTypeName = resultTypeName;
-    }
-
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    /**
-     * Sets the class name of the result type (type from output)
-     */
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
-    public String getHeaderName() {
-        return headerName;
-    }
-
-    /**
-     * Name of header to use as input, instead of the message body
-     * </p>
-     * It has as higher precedent than the propertyName if both are set.
-     */
-    public void setHeaderName(String headerName) {
-        this.headerName = headerName;
-    }
-
-    public String getPropertyName() {
-        return propertyName;
-    }
-
-    /**
-     * Name of property to use as input, instead of the message body.
-     * </p>
-     * It has a lower precedent than the headerName if both are set.
-     */
-    public void setPropertyName(String propertyName) {
-        this.propertyName = propertyName;
-    }
-
     /**
      * {@code Builder} is a specific builder for {@link JqExpression}.
      */
     @XmlTransient
     public static class Builder extends AbstractBuilder<Builder, JqExpression> {
 
-        private String resultTypeName;
-        private Class<?> resultType;
-        private String headerName;
-        private String propertyName;
-
-        /**
-         * Sets the class name of the result type (type from output)
-         */
-        public Builder resultType(Class<?> resultType) {
-            this.resultType = resultType;
-            return this;
-        }
-
-        /**
-         * Sets the class of the result type (type from output)
-         */
-        public Builder resultTypeName(String resultTypeName) {
-            this.resultTypeName = resultTypeName;
-            return this;
-        }
-
-        /**
-         * Name of header to use as input, instead of the message body
-         * </p>
-         * It has as higher precedent than the propertyName if both are set.
-         */
-        public Builder headerName(String headerName) {
-            this.headerName = headerName;
-            return this;
-        }
-
-        /**
-         * Name of property to use as input, instead of the message body.
-         * </p>
-         * It has a lower precedent than the headerName if both are set.
-         */
-        public Builder propertyName(String propertyName) {
-            this.propertyName = propertyName;
-            return this;
-        }
-
         @Override
         public JqExpression end() {
             return new JqExpression(this);
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JsonPathExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
index 540759c11b5..226234b8812 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
@@ -30,12 +30,8 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "2.13.0", label = "language,json", title = "JSONPath")
 @XmlRootElement(name = "jsonpath")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class JsonPathExpression extends ExpressionDefinition {
+public class JsonPathExpression extends SingleInputTypedExpressionDefinition {
 
-    @XmlAttribute(name = "resultType")
-    private String resultTypeName;
-    @XmlTransient
-    private Class<?> resultType;
     @XmlAttribute
     @Metadata(defaultValue = "false", javaType = "java.lang.Boolean")
     private String suppressExceptions;
@@ -52,9 +48,6 @@ public class JsonPathExpression extends ExpressionDefinition {
     @Metadata(defaultValue = "false", javaType = "java.lang.Boolean")
     private String unpackArray;
     @XmlAttribute
-    @Metadata(label = "advanced")
-    private String headerName;
-    @XmlAttribute
     @Metadata(label = "advanced",
               enums = "DEFAULT_PATH_LEAF_TO_NULL,ALWAYS_RETURN_LIST,AS_PATH_LIST,SUPPRESS_EXCEPTIONS,REQUIRE_PROPERTIES")
     private String option;
@@ -68,39 +61,14 @@ public class JsonPathExpression extends ExpressionDefinition {
 
     private JsonPathExpression(Builder builder) {
         super(builder);
-        this.resultTypeName = builder.resultTypeName;
-        this.resultType = builder.resultType;
         this.suppressExceptions = builder.suppressExceptions;
         this.allowSimple = builder.allowSimple;
         this.allowEasyPredicate = builder.allowEasyPredicate;
         this.writeAsString = builder.writeAsString;
         this.unpackArray = builder.unpackArray;
-        this.headerName = builder.headerName;
         this.option = builder.option;
     }
 
-    public String getResultTypeName() {
-        return resultTypeName;
-    }
-
-    /**
-     * Sets the class name of the result type (type from output)
-     */
-    public void setResultTypeName(String resultTypeName) {
-        this.resultTypeName = resultTypeName;
-    }
-
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    /**
-     * Sets the class of the result type (type from output)
-     */
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
     public String getSuppressExceptions() {
         return suppressExceptions;
     }
@@ -156,17 +124,6 @@ public class JsonPathExpression extends ExpressionDefinition {
         this.unpackArray = unpackArray;
     }
 
-    public String getHeaderName() {
-        return headerName;
-    }
-
-    /**
-     * Name of header to use as input, instead of the message body
-     */
-    public void setHeaderName(String headerName) {
-        this.headerName = headerName;
-    }
-
     public String getOption() {
         return option;
     }
@@ -189,32 +146,13 @@ public class JsonPathExpression extends ExpressionDefinition {
     @XmlTransient
     public static class Builder extends AbstractBuilder<Builder, JsonPathExpression> {
 
-        private String resultTypeName;
-        private Class<?> resultType;
         private String suppressExceptions;
         private String allowSimple;
         private String allowEasyPredicate;
         private String writeAsString;
         private String unpackArray;
-        private String headerName;
         private String option;
 
-        /**
-         * Sets the class of the result type (type from output)
-         */
-        public Builder resultType(Class<?> resultType) {
-            this.resultType = resultType;
-            return this;
-        }
-
-        /**
-         * Sets the class name of the result type (type from output)
-         */
-        public Builder resultTypeName(String resultTypeName) {
-            this.resultTypeName = resultTypeName;
-            return this;
-        }
-
         /**
          * Whether to suppress exceptions such as PathNotFoundException.
          */
@@ -295,14 +233,6 @@ public class JsonPathExpression extends ExpressionDefinition {
             return this;
         }
 
-        /**
-         * Name of header to use as input, instead of the message body
-         */
-        public Builder headerName(String headerName) {
-            this.headerName = headerName;
-            return this;
-        }
-
         /**
          * To configure additional options on JSONPath. Multiple values can be separated by comma.
          */
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/MethodCallExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
index cebce5ab291..88328182e2b 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
@@ -31,7 +31,7 @@ import org.apache.camel.util.StringHelper;
 @Metadata(firstVersion = "1.3.0", label = "language,core,java", title = "Bean Method")
 @XmlRootElement(name = "method")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class MethodCallExpression extends ExpressionDefinition {
+public class MethodCallExpression extends TypedExpressionDefinition {
 
     @XmlTransient
     private Class<?> beanType;
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/MvelExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/MvelExpression.java
index 66aa146e3cc..aa5dda1359f 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/MvelExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/MvelExpression.java
@@ -29,7 +29,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "2.0.0", label = "language,java", title = "MVEL")
 @XmlRootElement(name = "mvel")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class MvelExpression extends ExpressionDefinition {
+public class MvelExpression extends TypedExpressionDefinition {
 
     public MvelExpression() {
     }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java
index 2e663fa63e4..fca9fb6f073 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/NamespaceAwareExpression.java
@@ -28,13 +28,14 @@ import javax.xml.bind.annotation.XmlTransient;
 import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.NamespaceAware;
+import org.apache.camel.support.builder.Namespaces;
 
 /**
  * A useful base class for any expression which may be namespace or XML content aware such as {@link XPathExpression} or
  * {@link XQueryExpression}
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-public abstract class NamespaceAwareExpression extends ExpressionDefinition implements NamespaceAware {
+public abstract class NamespaceAwareExpression extends SingleInputExpressionDefinition implements NamespaceAware {
 
     @XmlElement(name = "namespace")
     @Metadata(label = "common")
@@ -42,10 +43,10 @@ public abstract class NamespaceAwareExpression extends ExpressionDefinition impl
     @XmlTransient
     private Map<String, String> namespaces;
 
-    public NamespaceAwareExpression() {
+    protected NamespaceAwareExpression() {
     }
 
-    public NamespaceAwareExpression(String expression) {
+    protected NamespaceAwareExpression(String expression) {
         super(expression);
     }
 
@@ -99,12 +100,22 @@ public abstract class NamespaceAwareExpression extends ExpressionDefinition impl
     @XmlTransient
     @SuppressWarnings("unchecked")
     abstract static class AbstractNamespaceAwareBuilder<
-            T extends AbstractNamespaceAwareBuilder<T, E>, E extends ExpressionDefinition>
+            T extends AbstractNamespaceAwareBuilder<T, E>, E extends NamespaceAwareExpression>
             extends AbstractBuilder<T, E> {
 
         private List<PropertyDefinition> namespace;
         private Map<String, String> namespaces;
 
+        /**
+         * Injects the XML Namespaces of prefix -> uri mappings
+         *
+         * @param namespaces the XML namespaces
+         */
+        public T namespaces(Namespaces namespaces) {
+            this.namespaces = namespaces.getNamespaces();
+            return (T) this;
+        }
+
         /**
          * Injects the XML Namespaces of prefix -> uri mappings
          *
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/OgnlExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/OgnlExpression.java
index bddede57951..2755a919ada 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/OgnlExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/OgnlExpression.java
@@ -29,7 +29,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "1.1.0", label = "language,java", title = "OGNL")
 @XmlRootElement(name = "ognl")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class OgnlExpression extends ExpressionDefinition {
+public class OgnlExpression extends TypedExpressionDefinition {
 
     public OgnlExpression() {
     }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/PythonExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/PythonExpression.java
index 0b3cba33ad4..72b805fab65 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/PythonExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/PythonExpression.java
@@ -18,7 +18,6 @@ package org.apache.camel.model.language;
 
 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;
 
@@ -30,17 +29,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "3.19.0", label = "language,python", title = "Python")
 @XmlRootElement(name = "python")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class PythonExpression extends ExpressionDefinition {
-
-    @XmlAttribute(name = "resultType")
-    private String resultTypeName;
-    @XmlTransient
-    private Class<?> resultType;
-    @XmlAttribute
-    @Metadata(label = "advanced")
-    private String headerName;
-    @Metadata(label = "advanced")
-    private String propertyName;
+public class PythonExpression extends TypedExpressionDefinition {
 
     public PythonExpression() {
     }
@@ -49,12 +38,8 @@ public class PythonExpression extends ExpressionDefinition {
         super(expression);
     }
 
-    private PythonExpression(PythonExpression.Builder builder) {
+    private PythonExpression(Builder builder) {
         super(builder);
-        this.resultTypeName = builder.resultTypeName;
-        this.resultType = builder.resultType;
-        this.headerName = builder.headerName;
-        this.propertyName = builder.propertyName;
     }
 
     @Override
@@ -62,100 +47,11 @@ public class PythonExpression extends ExpressionDefinition {
         return "python";
     }
 
-    public String getResultTypeName() {
-        return resultTypeName;
-    }
-
-    /**
-     * Sets the class of the result type (type from output)
-     */
-    public void setResultTypeName(String resultTypeName) {
-        this.resultTypeName = resultTypeName;
-    }
-
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    /**
-     * Sets the class name of the result type (type from output)
-     */
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
-    public String getHeaderName() {
-        return headerName;
-    }
-
-    /**
-     * Name of header to use as input, instead of the message body
-     * </p>
-     * It has as higher precedent than the propertyName if both are set.
-     */
-    public void setHeaderName(String headerName) {
-        this.headerName = headerName;
-    }
-
-    public String getPropertyName() {
-        return propertyName;
-    }
-
-    /**
-     * Name of property to use as input, instead of the message body.
-     * </p>
-     * It has a lower precedent than the headerName if both are set.
-     */
-    public void setPropertyName(String propertyName) {
-        this.propertyName = propertyName;
-    }
-
     /**
      * {@code Builder} is a specific builder for {@link PythonExpression}.
      */
     @XmlTransient
-    public static class Builder extends AbstractBuilder<PythonExpression.Builder, PythonExpression> {
-
-        private String resultTypeName;
-        private Class<?> resultType;
-        private String headerName;
-        private String propertyName;
-
-        /**
-         * Sets the class name of the result type (type from output)
-         */
-        public PythonExpression.Builder resultType(Class<?> resultType) {
-            this.resultType = resultType;
-            return this;
-        }
-
-        /**
-         * Sets the class of the result type (type from output)
-         */
-        public PythonExpression.Builder resultTypeName(String resultTypeName) {
-            this.resultTypeName = resultTypeName;
-            return this;
-        }
-
-        /**
-         * Name of header to use as input, instead of the message body
-         * </p>
-         * It has as higher precedent than the propertyName if both are set.
-         */
-        public PythonExpression.Builder headerName(String headerName) {
-            this.headerName = headerName;
-            return this;
-        }
-
-        /**
-         * Name of property to use as input, instead of the message body.
-         * </p>
-         * It has a lower precedent than the headerName if both are set.
-         */
-        public PythonExpression.Builder propertyName(String propertyName) {
-            this.propertyName = propertyName;
-            return this;
-        }
+    public static class Builder extends AbstractBuilder<Builder, PythonExpression> {
 
         @Override
         public PythonExpression end() {
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/RefExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/RefExpression.java
index 8f575ce92d9..bd37b906d05 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/RefExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/RefExpression.java
@@ -29,7 +29,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "2.8.0", label = "language,core", title = "Ref")
 @XmlRootElement(name = "ref")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class RefExpression extends ExpressionDefinition {
+public class RefExpression extends TypedExpressionDefinition {
 
     public RefExpression() {
     }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/SimpleExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/SimpleExpression.java
index 89408037d69..693bfc2e9f6 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/SimpleExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/SimpleExpression.java
@@ -18,7 +18,6 @@ package org.apache.camel.model.language;
 
 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;
 
@@ -31,12 +30,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "1.1.0", label = "language,core,java", title = "Simple")
 @XmlRootElement(name = "simple")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class SimpleExpression extends ExpressionDefinition {
-
-    @XmlAttribute(name = "resultType")
-    private String resultTypeName;
-    @XmlTransient
-    private Class<?> resultType;
+public class SimpleExpression extends TypedExpressionDefinition {
 
     public SimpleExpression() {
     }
@@ -51,8 +45,6 @@ public class SimpleExpression extends ExpressionDefinition {
 
     private SimpleExpression(Builder builder) {
         super(builder);
-        this.resultTypeName = builder.resultTypeName;
-        this.resultType = builder.resultType;
     }
 
     @Override
@@ -60,53 +52,12 @@ public class SimpleExpression extends ExpressionDefinition {
         return "simple";
     }
 
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    /**
-     * Sets the class of the result type (type from output)
-     */
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
-    public String getResultTypeName() {
-        return resultTypeName;
-    }
-
-    /**
-     * Sets the class name of the result type (type from output)
-     */
-    public void setResultTypeName(String resultTypeName) {
-        this.resultTypeName = resultTypeName;
-    }
-
     /**
      * {@code Builder} is a specific builder for {@link SimpleExpression}.
      */
     @XmlTransient
     public static class Builder extends AbstractBuilder<Builder, SimpleExpression> {
 
-        private String resultTypeName;
-        private Class<?> resultType;
-
-        /**
-         * Sets the class of the result type (type from output)
-         */
-        public Builder resultType(Class<?> resultType) {
-            this.resultType = resultType;
-            return this;
-        }
-
-        /**
-         * Sets the class name of the result type (type from output)
-         */
-        public Builder resultTypeName(String resultTypeName) {
-            this.resultTypeName = resultTypeName;
-            return this;
-        }
-
         @Override
         public SimpleExpression end() {
             return new SimpleExpression(this);
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JqExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/SingleInputExpressionDefinition.java
similarity index 53%
copy from core/camel-core-model/src/main/java/org/apache/camel/model/language/JqExpression.java
copy to core/camel-core-model/src/main/java/org/apache/camel/model/language/SingleInputExpressionDefinition.java
index 13db5d36f12..cc947100825 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JqExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/SingleInputExpressionDefinition.java
@@ -16,73 +16,41 @@
  */
 package org.apache.camel.model.language;
 
-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.Expression;
 import org.apache.camel.spi.Metadata;
 
 /**
- * Evaluates a JQ expression against a JSON message body.
+ * Expression for which the source of the input (body, header or property) can be provided.
  */
-@Metadata(firstVersion = "3.18.0", label = "language,json", title = "JQ")
-@XmlRootElement(name = "jq")
-@XmlAccessorType(XmlAccessType.FIELD)
-public class JqExpression extends ExpressionDefinition {
-    @XmlAttribute(name = "resultType")
-    private String resultTypeName;
-    @XmlTransient
-    private Class<?> resultType;
+public abstract class SingleInputExpressionDefinition extends ExpressionDefinition {
+
     @XmlAttribute
     @Metadata(label = "advanced")
     private String headerName;
+    @XmlAttribute
     @Metadata(label = "advanced")
     private String propertyName;
 
-    public JqExpression() {
+    protected SingleInputExpressionDefinition() {
+    }
+
+    protected SingleInputExpressionDefinition(String expression) {
+        super(expression);
     }
 
-    public JqExpression(String expression) {
+    protected SingleInputExpressionDefinition(Expression expression) {
         super(expression);
     }
 
-    private JqExpression(Builder builder) {
+    protected SingleInputExpressionDefinition(AbstractBuilder<?, ?> builder) {
         super(builder);
-        this.resultTypeName = builder.resultTypeName;
-        this.resultType = builder.resultType;
         this.headerName = builder.headerName;
         this.propertyName = builder.propertyName;
     }
 
-    @Override
-    public String getLanguage() {
-        return "jq";
-    }
-
-    public String getResultTypeName() {
-        return resultTypeName;
-    }
-
-    /**
-     * Sets the class of the result type (type from output)
-     */
-    public void setResultTypeName(String resultTypeName) {
-        this.resultTypeName = resultTypeName;
-    }
-
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    /**
-     * Sets the class name of the result type (type from output)
-     */
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
     public String getHeaderName() {
         return headerName;
     }
@@ -110,40 +78,25 @@ public class JqExpression extends ExpressionDefinition {
     }
 
     /**
-     * {@code Builder} is a specific builder for {@link JqExpression}.
+     * {@code AbstractBuilder} is the base builder for typed expression.
      */
     @XmlTransient
-    public static class Builder extends AbstractBuilder<Builder, JqExpression> {
+    @SuppressWarnings("unchecked")
+    public abstract static class AbstractBuilder<
+            T extends AbstractBuilder<T, E>, E extends SingleInputExpressionDefinition>
+            extends ExpressionDefinition.AbstractBuilder<T, E> {
 
-        private String resultTypeName;
-        private Class<?> resultType;
         private String headerName;
         private String propertyName;
 
-        /**
-         * Sets the class name of the result type (type from output)
-         */
-        public Builder resultType(Class<?> resultType) {
-            this.resultType = resultType;
-            return this;
-        }
-
-        /**
-         * Sets the class of the result type (type from output)
-         */
-        public Builder resultTypeName(String resultTypeName) {
-            this.resultTypeName = resultTypeName;
-            return this;
-        }
-
         /**
          * Name of header to use as input, instead of the message body
          * </p>
          * It has as higher precedent than the propertyName if both are set.
          */
-        public Builder headerName(String headerName) {
+        public T headerName(String headerName) {
             this.headerName = headerName;
-            return this;
+            return (T) this;
         }
 
         /**
@@ -151,14 +104,9 @@ public class JqExpression extends ExpressionDefinition {
          * </p>
          * It has a lower precedent than the headerName if both are set.
          */
-        public Builder propertyName(String propertyName) {
+        public T propertyName(String propertyName) {
             this.propertyName = propertyName;
-            return this;
-        }
-
-        @Override
-        public JqExpression end() {
-            return new JqExpression(this);
+            return (T) this;
         }
     }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JqExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/SingleInputTypedExpressionDefinition.java
similarity index 53%
copy from core/camel-core-model/src/main/java/org/apache/camel/model/language/JqExpression.java
copy to core/camel-core-model/src/main/java/org/apache/camel/model/language/SingleInputTypedExpressionDefinition.java
index 13db5d36f12..fcc995ac19a 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JqExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/SingleInputTypedExpressionDefinition.java
@@ -16,73 +16,41 @@
  */
 package org.apache.camel.model.language;
 
-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.Expression;
 import org.apache.camel.spi.Metadata;
 
 /**
- * Evaluates a JQ expression against a JSON message body.
+ * Expression for which a result type can be provided along with the source of the input (body, header or property).
  */
-@Metadata(firstVersion = "3.18.0", label = "language,json", title = "JQ")
-@XmlRootElement(name = "jq")
-@XmlAccessorType(XmlAccessType.FIELD)
-public class JqExpression extends ExpressionDefinition {
-    @XmlAttribute(name = "resultType")
-    private String resultTypeName;
-    @XmlTransient
-    private Class<?> resultType;
+public abstract class SingleInputTypedExpressionDefinition extends TypedExpressionDefinition {
+
     @XmlAttribute
     @Metadata(label = "advanced")
     private String headerName;
+    @XmlAttribute
     @Metadata(label = "advanced")
     private String propertyName;
 
-    public JqExpression() {
+    protected SingleInputTypedExpressionDefinition() {
+    }
+
+    protected SingleInputTypedExpressionDefinition(String expression) {
+        super(expression);
     }
 
-    public JqExpression(String expression) {
+    protected SingleInputTypedExpressionDefinition(Expression expression) {
         super(expression);
     }
 
-    private JqExpression(Builder builder) {
+    protected SingleInputTypedExpressionDefinition(AbstractBuilder<?, ?> builder) {
         super(builder);
-        this.resultTypeName = builder.resultTypeName;
-        this.resultType = builder.resultType;
         this.headerName = builder.headerName;
         this.propertyName = builder.propertyName;
     }
 
-    @Override
-    public String getLanguage() {
-        return "jq";
-    }
-
-    public String getResultTypeName() {
-        return resultTypeName;
-    }
-
-    /**
-     * Sets the class of the result type (type from output)
-     */
-    public void setResultTypeName(String resultTypeName) {
-        this.resultTypeName = resultTypeName;
-    }
-
-    public Class<?> getResultType() {
-        return resultType;
-    }
-
-    /**
-     * Sets the class name of the result type (type from output)
-     */
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
-    }
-
     public String getHeaderName() {
         return headerName;
     }
@@ -110,40 +78,25 @@ public class JqExpression extends ExpressionDefinition {
     }
 
     /**
-     * {@code Builder} is a specific builder for {@link JqExpression}.
+     * {@code AbstractBuilder} is the base builder for typed expression.
      */
     @XmlTransient
-    public static class Builder extends AbstractBuilder<Builder, JqExpression> {
+    @SuppressWarnings("unchecked")
+    public abstract static class AbstractBuilder<
+            T extends AbstractBuilder<T, E>, E extends SingleInputTypedExpressionDefinition>
+            extends TypedExpressionDefinition.AbstractBuilder<T, E> {
 
-        private String resultTypeName;
-        private Class<?> resultType;
         private String headerName;
         private String propertyName;
 
-        /**
-         * Sets the class name of the result type (type from output)
-         */
-        public Builder resultType(Class<?> resultType) {
-            this.resultType = resultType;
-            return this;
-        }
-
-        /**
-         * Sets the class of the result type (type from output)
-         */
-        public Builder resultTypeName(String resultTypeName) {
-            this.resultTypeName = resultTypeName;
-            return this;
-        }
-
         /**
          * Name of header to use as input, instead of the message body
          * </p>
          * It has as higher precedent than the propertyName if both are set.
          */
-        public Builder headerName(String headerName) {
+        public T headerName(String headerName) {
             this.headerName = headerName;
-            return this;
+            return (T) this;
         }
 
         /**
@@ -151,14 +104,9 @@ public class JqExpression extends ExpressionDefinition {
          * </p>
          * It has a lower precedent than the headerName if both are set.
          */
-        public Builder propertyName(String propertyName) {
+        public T propertyName(String propertyName) {
             this.propertyName = propertyName;
-            return this;
-        }
-
-        @Override
-        public JqExpression end() {
-            return new JqExpression(this);
+            return (T) this;
         }
     }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/SpELExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/SpELExpression.java
index 2dac641e99d..d5e8e5ac4af 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/SpELExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/SpELExpression.java
@@ -29,7 +29,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "2.7.0", label = "language,spring", title = "SpEL")
 @XmlRootElement(name = "spel")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class SpELExpression extends ExpressionDefinition {
+public class SpELExpression extends TypedExpressionDefinition {
 
     public SpELExpression() {
     }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/TokenizerExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/TokenizerExpression.java
index 3cea1fe10db..63280a46fc3 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/TokenizerExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/TokenizerExpression.java
@@ -30,7 +30,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(firstVersion = "2.0.0", label = "language,core", title = "Tokenize")
 @XmlRootElement(name = "tokenize")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class TokenizerExpression extends ExpressionDefinition {
+public class TokenizerExpression extends SingleInputExpressionDefinition {
 
     @XmlAttribute(required = true)
     private String token;
@@ -40,9 +40,6 @@ public class TokenizerExpression extends ExpressionDefinition {
     @Metadata(label = "advanced")
     private String inheritNamespaceTagName;
     @XmlAttribute
-    @Metadata(label = "advanced")
-    private String headerName;
-    @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
     private String regex;
     @XmlAttribute
@@ -73,7 +70,6 @@ public class TokenizerExpression extends ExpressionDefinition {
         this.token = builder.token;
         this.endToken = builder.endToken;
         this.inheritNamespaceTagName = builder.inheritNamespaceTagName;
-        this.headerName = builder.headerName;
         this.regex = builder.regex;
         this.xml = builder.xml;
         this.includeTokens = builder.includeTokens;
@@ -111,17 +107,6 @@ public class TokenizerExpression extends ExpressionDefinition {
         this.endToken = endToken;
     }
 
-    public String getHeaderName() {
-        return headerName;
-    }
-
-    /**
-     * Name of header to tokenize instead of using the message body.
-     */
-    public void setHeaderName(String headerName) {
-        this.headerName = headerName;
-    }
-
     /**
      * If the token is a regular expression pattern.
      * <p/>
@@ -210,7 +195,15 @@ public class TokenizerExpression extends ExpressionDefinition {
         if (endToken != null) {
             return "tokenize{body() using tokens: " + token + "..." + endToken + "}";
         } else {
-            return "tokenize{" + (headerName != null ? "header: " + headerName : "body()") + " using token: " + token + "}";
+            final String source;
+            if (getHeaderName() != null) {
+                source = "header: " + getHeaderName();
+            } else if (getPropertyName() != null) {
+                source = "property: " + getPropertyName();
+            } else {
+                source = "body()";
+            }
+            return "tokenize{" + source + " using token: " + token + "}";
         }
     }
 
@@ -223,7 +216,6 @@ public class TokenizerExpression extends ExpressionDefinition {
         private String token;
         private String endToken;
         private String inheritNamespaceTagName;
-        private String headerName;
         private String regex;
         private String xml;
         private String includeTokens;
@@ -258,14 +250,6 @@ public class TokenizerExpression extends ExpressionDefinition {
             return this;
         }
 
-        /**
-         * Name of header to tokenize instead of using the message body.
-         */
-        public Builder headerName(String headerName) {
-            this.headerName = headerName;
-            return this;
-        }
-
         /**
          * If the token is a regular expression pattern.
          * <p/>
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/CSimpleExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/TypedExpressionDefinition.java
similarity index 66%
copy from core/camel-core-model/src/main/java/org/apache/camel/model/language/CSimpleExpression.java
copy to core/camel-core-model/src/main/java/org/apache/camel/model/language/TypedExpressionDefinition.java
index 24f03d4a572..5fde699b715 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/CSimpleExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/TypedExpressionDefinition.java
@@ -16,72 +16,67 @@
  */
 package org.apache.camel.model.language;
 
-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;
+import org.apache.camel.Expression;
 
 /**
- * Evaluate a compiled simple expression.
+ * Expression for which a result type can be provided.
  */
-@Metadata(firstVersion = "3.7.0", label = "language,java", title = "CSimple")
-@XmlRootElement(name = "csimple")
-@XmlAccessorType(XmlAccessType.FIELD)
-public class CSimpleExpression extends ExpressionDefinition {
+public abstract class TypedExpressionDefinition extends ExpressionDefinition {
 
     @XmlAttribute(name = "resultType")
     private String resultTypeName;
     @XmlTransient
     private Class<?> resultType;
 
-    public CSimpleExpression() {
+    protected TypedExpressionDefinition() {
     }
 
-    public CSimpleExpression(String expression) {
+    protected TypedExpressionDefinition(String expression) {
         super(expression);
     }
 
-    private CSimpleExpression(Builder builder) {
+    protected TypedExpressionDefinition(Expression expression) {
+        super(expression);
+    }
+
+    protected TypedExpressionDefinition(AbstractBuilder<?, ?> builder) {
         super(builder);
         this.resultTypeName = builder.resultTypeName;
         this.resultType = builder.resultType;
     }
 
-    @Override
-    public String getLanguage() {
-        return "csimple";
-    }
-
-    public Class<?> getResultType() {
-        return resultType;
+    public String getResultTypeName() {
+        return resultTypeName;
     }
 
     /**
      * Sets the class of the result type (type from output)
      */
-    public void setResultType(Class<?> resultType) {
-        this.resultType = resultType;
+    public void setResultTypeName(String resultTypeName) {
+        this.resultTypeName = resultTypeName;
     }
 
-    public String getResultTypeName() {
-        return resultTypeName;
+    public Class<?> getResultType() {
+        return resultType;
     }
 
     /**
      * Sets the class name of the result type (type from output)
      */
-    public void setResultTypeName(String resultTypeName) {
-        this.resultTypeName = resultTypeName;
+    public void setResultType(Class<?> resultType) {
+        this.resultType = resultType;
     }
 
     /**
-     * {@code Builder} is a specific builder for {@link CSimpleExpression}.
+     * {@code AbstractBuilder} is the base builder for typed expression.
      */
     @XmlTransient
-    public static class Builder extends AbstractBuilder<Builder, CSimpleExpression> {
+    @SuppressWarnings("unchecked")
+    public abstract static class AbstractBuilder<T extends AbstractBuilder<T, E>, E extends TypedExpressionDefinition>
+            extends ExpressionDefinition.AbstractBuilder<T, E> {
 
         private String resultTypeName;
         private Class<?> resultType;
@@ -89,22 +84,17 @@ public class CSimpleExpression extends ExpressionDefinition {
         /**
          * Sets the class of the result type (type from output)
          */
-        public Builder resultType(Class<?> resultType) {
-            this.resultType = resultType;
-            return this;
+        public T resultTypeName(String resultTypeName) {
+            this.resultTypeName = resultTypeName;
+            return (T) this;
         }
 
         /**
          * Sets the class name of the result type (type from output)
          */
-        public Builder resultTypeName(String resultTypeName) {
-            this.resultTypeName = resultTypeName;
-            return this;
-        }
-
-        @Override
-        public CSimpleExpression end() {
-            return new CSimpleExpression(this);
+        public T resultType(Class<?> resultType) {
+            this.resultType = resultType;
+            return (T) this;
         }
     }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java
index 487cc288bfd..c0c445c6725 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/XMLTokenizerExpression.java
@@ -32,9 +32,6 @@ import org.apache.camel.spi.Metadata;
 @XmlAccessorType(XmlAccessType.FIELD)
 public class XMLTokenizerExpression extends NamespaceAwareExpression {
 
-    @XmlAttribute
-    @Metadata(label = "advanced")
-    private String headerName;
     @XmlAttribute
     @Metadata(label = "advanced", enums = "i,w,u,t")
     private String mode;
@@ -51,7 +48,6 @@ public class XMLTokenizerExpression extends NamespaceAwareExpression {
 
     private XMLTokenizerExpression(Builder builder) {
         super(builder);
-        this.headerName = builder.headerName;
         this.mode = builder.mode;
         this.group = builder.group;
     }
@@ -61,17 +57,6 @@ public class XMLTokenizerExpression extends NamespaceAwareExpression {
         return "xtokenize";
     }
 
-    public String getHeaderName() {
-        return headerName;
-    }
-
-    /**
-     * Name of header to tokenize instead of using the message body.
-     */
-    public void setHeaderName(String headerName) {
-        this.headerName = headerName;
-    }
-
     public String getMode() {
         return mode;
     }
@@ -106,18 +91,9 @@ public class XMLTokenizerExpression extends NamespaceAwareExpression {
     @XmlTransient
     public static class Builder extends AbstractNamespaceAwareBuilder<Builder, XMLTokenizerExpression> {
 
-        private String headerName;
         private String mode;
         private String group;
 
-        /**
-         * Name of header to tokenize instead of using the message body.
-         */
-        public Builder headerName(String headerName) {
-            this.headerName = headerName;
-            return this;
-        }
-
         /**
          * The extraction mode. The available extraction modes are:
          * <ul>
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/XPathExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/XPathExpression.java
index 983e75b528f..16b53a79672 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/XPathExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/XPathExpression.java
@@ -60,9 +60,6 @@ public class XPathExpression extends NamespaceAwareExpression {
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
     private String logNamespaces;
     @XmlAttribute
-    @Metadata(label = "advanced")
-    private String headerName;
-    @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
     private String threadSafety;
     @XmlAttribute
@@ -91,7 +88,6 @@ public class XPathExpression extends NamespaceAwareExpression {
         this.factoryRef = builder.factoryRef;
         this.objectModel = builder.objectModel;
         this.logNamespaces = builder.logNamespaces;
-        this.headerName = builder.headerName;
         this.threadSafety = builder.threadSafety;
         this.preCompile = builder.preCompile;
     }
@@ -197,17 +193,6 @@ public class XPathExpression extends NamespaceAwareExpression {
         return logNamespaces;
     }
 
-    public String getHeaderName() {
-        return headerName;
-    }
-
-    /**
-     * Name of header to use as input, instead of the message body
-     */
-    public void setHeaderName(String headerName) {
-        this.headerName = headerName;
-    }
-
     public XPathFactory getXPathFactory() {
         return xpathFactory;
     }
@@ -240,7 +225,7 @@ public class XPathExpression extends NamespaceAwareExpression {
     /**
      * Whether to enable pre-compiling the xpath expression during initialization phase. pre-compile is enabled by
      * default.
-     *
+     * <p>
      * This can be used to turn off, for example in cases the compilation phase is desired at the starting phase, such
      * as if the application is ahead of time compiled (for example with camel-quarkus) which would then load the xpath
      * factory of the built operating system, and not a JVM runtime.
@@ -264,7 +249,6 @@ public class XPathExpression extends NamespaceAwareExpression {
         private String factoryRef;
         private String objectModel;
         private String logNamespaces;
-        private String headerName;
         private String threadSafety;
         private String preCompile;
 
@@ -361,14 +345,6 @@ public class XPathExpression extends NamespaceAwareExpression {
             return this;
         }
 
-        /**
-         * Name of header to use as input, instead of the message body
-         */
-        public Builder headerName(String headerName) {
-            this.headerName = headerName;
-            return this;
-        }
-
         /**
          * Whether to enable thread-safety for the returned result of the xpath expression. This applies to when using
          * NODESET as the result type, and the returned set has multiple elements. In this situation there can be
@@ -400,7 +376,7 @@ public class XPathExpression extends NamespaceAwareExpression {
         /**
          * Whether to enable pre-compiling the xpath expression during initialization phase. pre-compile is enabled by
          * default.
-         *
+         * <p>
          * This can be used to turn off, for example in cases the compilation phase is desired at the starting phase,
          * such as if the application is ahead of time compiled (for example with camel-quarkus) which would then load
          * the xpath factory of the built operating system, and not a JVM runtime.
@@ -413,7 +389,7 @@ public class XPathExpression extends NamespaceAwareExpression {
         /**
          * Whether to enable pre-compiling the xpath expression during initialization phase. pre-compile is enabled by
          * default.
-         *
+         * <p>
          * This can be used to turn off, for example in cases the compilation phase is desired at the starting phase,
          * such as if the application is ahead of time compiled (for example with camel-quarkus) which would then load
          * the xpath factory of the built operating system, and not a JVM runtime.
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/XQueryExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/XQueryExpression.java
index 1d88a6f6128..35baa594472 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/XQueryExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/XQueryExpression.java
@@ -34,6 +34,8 @@ public class XQueryExpression extends NamespaceAwareExpression {
 
     @XmlTransient
     private Class<?> resultType;
+    @XmlAttribute(name = "resultType")
+    private String resultTypeName;
     @XmlTransient
     private Object configuration;
 
@@ -41,9 +43,6 @@ public class XQueryExpression extends NamespaceAwareExpression {
     private String type;
     @XmlAttribute
     @Metadata(label = "advanced")
-    private String headerName;
-    @XmlAttribute
-    @Metadata(label = "advanced")
     private String configurationRef;
 
     public XQueryExpression() {
@@ -55,10 +54,10 @@ public class XQueryExpression extends NamespaceAwareExpression {
 
     private XQueryExpression(Builder builder) {
         super(builder);
+        this.resultTypeName = builder.resultTypeName;
         this.resultType = builder.resultType;
         this.configuration = builder.configuration;
         this.type = builder.type;
-        this.headerName = builder.headerName;
         this.configurationRef = builder.configurationRef;
     }
 
@@ -93,15 +92,15 @@ public class XQueryExpression extends NamespaceAwareExpression {
         this.resultType = resultType;
     }
 
-    public String getHeaderName() {
-        return headerName;
+    public String getResultTypeName() {
+        return resultTypeName;
     }
 
     /**
-     * Name of header to use as input, instead of the message body
+     * Sets the class of the result type (type from output)
      */
-    public void setHeaderName(String headerName) {
-        this.headerName = headerName;
+    public void setResultTypeName(String resultTypeName) {
+        this.resultTypeName = resultTypeName;
     }
 
     public String getConfigurationRef() {
@@ -135,12 +134,20 @@ public class XQueryExpression extends NamespaceAwareExpression {
     @XmlTransient
     public static class Builder extends AbstractNamespaceAwareBuilder<Builder, XQueryExpression> {
 
+        private String resultTypeName;
         private Class<?> resultType;
         private Object configuration;
         private String type;
-        private String headerName;
         private String configurationRef;
 
+        /**
+         * Sets the class of the result type (type from output)
+         */
+        public Builder resultTypeName(String resultTypeName) {
+            this.resultTypeName = resultTypeName;
+            return this;
+        }
+
         /**
          * Sets the class of the result type (type from output).
          * <p/>
@@ -170,14 +177,6 @@ public class XQueryExpression extends NamespaceAwareExpression {
             return this;
         }
 
-        /**
-         * Name of header to use as input, instead of the message body
-         */
-        public Builder headerName(String headerName) {
-            this.headerName = headerName;
-            return this;
-        }
-
         /**
          * Reference to a saxon configuration instance in the registry to use for xquery (requires camel-saxon). This
          * may be needed to add custom functions to a saxon configuration, so these custom functions can be used in
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/CSimpleExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/CSimpleExpressionReifier.java
index a9c0da356e5..68adfbff2be 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/CSimpleExpressionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/CSimpleExpressionReifier.java
@@ -17,35 +17,13 @@
 package org.apache.camel.reifier.language;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
-import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.model.language.CSimpleExpression;
 import org.apache.camel.model.language.ExpressionDefinition;
-import org.apache.camel.spi.Language;
 
-public class CSimpleExpressionReifier extends ExpressionReifier<CSimpleExpression> {
+public class CSimpleExpressionReifier extends TypedExpressionReifier<CSimpleExpression> {
 
     public CSimpleExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) {
-        super(camelContext, (CSimpleExpression) definition);
-    }
-
-    @Override
-    protected void configureLanguage(Language language) {
-        if (definition.getResultType() == null && definition.getResultTypeName() != null) {
-            try {
-                Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getResultTypeName());
-                definition.setResultType(clazz);
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeException(e);
-            }
-        }
-    }
-
-    private Object[] createProperties() {
-        Object[] properties = new Object[1];
-        properties[0] = definition.getResultType();
-        return properties;
+        super(camelContext, definition);
     }
 
     @Override
@@ -54,14 +32,4 @@ public class CSimpleExpressionReifier extends ExpressionReifier<CSimpleExpressio
         return false;
     }
 
-    @Override
-    protected Expression createExpression(Language language, String exp) {
-        return language.createExpression(exp, createProperties());
-    }
-
-    @Override
-    protected Predicate createPredicate(Language language, String exp) {
-        return language.createPredicate(exp, createProperties());
-    }
-
 }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/DatasonnetExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/DatasonnetExpressionReifier.java
index 904ff16b4d3..3c5cb244e89 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/DatasonnetExpressionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/DatasonnetExpressionReifier.java
@@ -17,42 +17,17 @@
 package org.apache.camel.reifier.language;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
-import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.model.language.DatasonnetExpression;
 import org.apache.camel.model.language.ExpressionDefinition;
-import org.apache.camel.spi.Language;
 
-public class DatasonnetExpressionReifier extends ExpressionReifier<DatasonnetExpression> {
+public class DatasonnetExpressionReifier extends TypedExpressionReifier<DatasonnetExpression> {
 
     public DatasonnetExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) {
-        super(camelContext, (DatasonnetExpression) definition);
+        super(camelContext, definition);
     }
 
     @Override
-    protected void configureLanguage(Language language) {
-        if (definition.getResultType() == null && definition.getResultTypeName() != null) {
-            try {
-                Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getResultTypeName());
-                definition.setResultType(clazz);
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeException(e);
-            }
-        }
-    }
-
-    @Override
-    protected Expression createExpression(Language language, String exp) {
-        return language.createExpression(exp, createProperties());
-    }
-
-    @Override
-    protected Predicate createPredicate(Language language, String exp) {
-        return language.createPredicate(exp, createProperties());
-    }
-
-    private Object[] createProperties() {
+    protected Object[] createProperties() {
         Object[] properties = new Object[3];
         properties[0] = definition.getResultType();
         properties[1] = parseString(definition.getBodyMediaType());
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java
index 11092449c7f..68f50e475c0 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java
@@ -30,26 +30,16 @@ import org.apache.camel.NoSuchLanguageException;
 import org.apache.camel.Predicate;
 import org.apache.camel.model.ExpressionSubElementDefinition;
 import org.apache.camel.model.language.CSimpleExpression;
-import org.apache.camel.model.language.ConstantExpression;
 import org.apache.camel.model.language.DatasonnetExpression;
-import org.apache.camel.model.language.ExchangePropertyExpression;
 import org.apache.camel.model.language.ExpressionDefinition;
-import org.apache.camel.model.language.GroovyExpression;
-import org.apache.camel.model.language.HeaderExpression;
-import org.apache.camel.model.language.Hl7TerserExpression;
-import org.apache.camel.model.language.JavaScriptExpression;
 import org.apache.camel.model.language.JoorExpression;
 import org.apache.camel.model.language.JqExpression;
 import org.apache.camel.model.language.JsonPathExpression;
-import org.apache.camel.model.language.LanguageExpression;
 import org.apache.camel.model.language.MethodCallExpression;
-import org.apache.camel.model.language.MvelExpression;
-import org.apache.camel.model.language.OgnlExpression;
-import org.apache.camel.model.language.PythonExpression;
-import org.apache.camel.model.language.RefExpression;
 import org.apache.camel.model.language.SimpleExpression;
-import org.apache.camel.model.language.SpELExpression;
+import org.apache.camel.model.language.SingleInputTypedExpressionDefinition;
 import org.apache.camel.model.language.TokenizerExpression;
+import org.apache.camel.model.language.TypedExpressionDefinition;
 import org.apache.camel.model.language.XMLTokenizerExpression;
 import org.apache.camel.model.language.XPathExpression;
 import org.apache.camel.model.language.XQueryExpression;
@@ -116,44 +106,20 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR
 
     private static ExpressionReifier<? extends ExpressionDefinition> coreReifier(
             CamelContext camelContext, ExpressionDefinition definition) {
-        if (definition instanceof ConstantExpression) {
-            return new ConstantExpressionReifier(camelContext, definition);
-        } else if (definition instanceof CSimpleExpression) {
+        if (definition instanceof CSimpleExpression) {
             return new CSimpleExpressionReifier(camelContext, definition);
         } else if (definition instanceof DatasonnetExpression) {
             return new DatasonnetExpressionReifier(camelContext, definition);
-        } else if (definition instanceof ExchangePropertyExpression) {
-            return new ExpressionReifier<>(camelContext, definition);
-        } else if (definition instanceof GroovyExpression) {
-            return new ExpressionReifier<>(camelContext, definition);
-        } else if (definition instanceof HeaderExpression) {
-            return new ExpressionReifier<>(camelContext, definition);
-        } else if (definition instanceof Hl7TerserExpression) {
-            return new ExpressionReifier<>(camelContext, definition);
-        } else if (definition instanceof JavaScriptExpression) {
-            return new JavaScriptExpressionReifier(camelContext, definition);
         } else if (definition instanceof JoorExpression) {
             return new JoorExpressionReifier(camelContext, definition);
         } else if (definition instanceof JqExpression) {
             return new JqExpressionReifier(camelContext, definition);
         } else if (definition instanceof JsonPathExpression) {
             return new JsonPathExpressionReifier(camelContext, definition);
-        } else if (definition instanceof LanguageExpression) {
-            return new ExpressionReifier<>(camelContext, definition);
         } else if (definition instanceof MethodCallExpression) {
             return new MethodCallExpressionReifier(camelContext, definition);
-        } else if (definition instanceof MvelExpression) {
-            return new ExpressionReifier<>(camelContext, definition);
-        } else if (definition instanceof OgnlExpression) {
-            return new ExpressionReifier<>(camelContext, definition);
-        } else if (definition instanceof PythonExpression) {
-            return new PythonExpressionReifier(camelContext, definition);
-        } else if (definition instanceof RefExpression) {
-            return new ExpressionReifier<>(camelContext, definition);
         } else if (definition instanceof SimpleExpression) {
             return new SimpleExpressionReifier(camelContext, definition);
-        } else if (definition instanceof SpELExpression) {
-            return new ExpressionReifier<>(camelContext, definition);
         } else if (definition instanceof TokenizerExpression) {
             return new TokenizerExpressionReifier(camelContext, definition);
         } else if (definition instanceof XMLTokenizerExpression) {
@@ -162,7 +128,11 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR
             return new XPathExpressionReifier(camelContext, definition);
         } else if (definition instanceof XQueryExpression) {
             return new XQueryExpressionReifier(camelContext, definition);
-        } else if (definition instanceof ExpressionDefinition) {
+        } else if (definition instanceof SingleInputTypedExpressionDefinition) {
+            return new SingleInputTypedExpressionReifier<>(camelContext, definition);
+        } else if (definition instanceof TypedExpressionDefinition) {
+            return new TypedExpressionReifier<>(camelContext, definition);
+        } else if (definition != null) {
             return new ExpressionReifier<>(camelContext, definition);
         }
         return null;
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JavaScriptExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JavaScriptExpressionReifier.java
deleted file mode 100644
index b0140c5fb65..00000000000
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JavaScriptExpressionReifier.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.reifier.language;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
-import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.model.language.ExpressionDefinition;
-import org.apache.camel.model.language.JavaScriptExpression;
-import org.apache.camel.spi.Language;
-
-public class JavaScriptExpressionReifier extends ExpressionReifier<JavaScriptExpression> {
-
-    public JavaScriptExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) {
-        super(camelContext, (JavaScriptExpression) definition);
-    }
-
-    @Override
-    protected void configureLanguage(Language language) {
-        if (definition.getResultType() == null && definition.getResultTypeName() != null) {
-            try {
-                Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getResultTypeName());
-                definition.setResultType(clazz);
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeException(e);
-            }
-        }
-    }
-
-    private Object[] createProperties() {
-        Object[] properties = new Object[3];
-        properties[0] = definition.getResultType();
-        properties[1] = parseString(definition.getHeaderName());
-        properties[2] = parseString(definition.getPropertyName());
-        return properties;
-    }
-
-    @Override
-    protected Expression createExpression(Language language, String exp) {
-        return language.createExpression(exp, createProperties());
-    }
-
-    @Override
-    protected Predicate createPredicate(Language language, String exp) {
-        return language.createPredicate(exp, createProperties());
-    }
-
-}
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JoorExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JoorExpressionReifier.java
index 1a4da7c9ae9..ec996ad0dfa 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JoorExpressionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JoorExpressionReifier.java
@@ -17,32 +17,17 @@
 package org.apache.camel.reifier.language;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
-import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.model.language.JoorExpression;
-import org.apache.camel.spi.Language;
 
-public class JoorExpressionReifier extends ExpressionReifier<JoorExpression> {
+public class JoorExpressionReifier extends TypedExpressionReifier<JoorExpression> {
 
     public JoorExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) {
-        super(camelContext, (JoorExpression) definition);
+        super(camelContext, definition);
     }
 
     @Override
-    protected void configureLanguage(Language language) {
-        if (definition.getResultType() == null && definition.getResultTypeName() != null) {
-            try {
-                Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getResultTypeName());
-                definition.setResultType(clazz);
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeException(e);
-            }
-        }
-    }
-
-    private Object[] createProperties() {
+    protected Object[] createProperties() {
         Object[] properties = new Object[3];
         properties[0] = parseBoolean(definition.getPreCompile());
         properties[1] = definition.getResultType();
@@ -56,14 +41,4 @@ public class JoorExpressionReifier extends ExpressionReifier<JoorExpression> {
         return false;
     }
 
-    @Override
-    protected Expression createExpression(Language language, String exp) {
-        return language.createExpression(exp, createProperties());
-    }
-
-    @Override
-    protected Predicate createPredicate(Language language, String exp) {
-        return language.createPredicate(exp, createProperties());
-    }
-
 }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JqExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JqExpressionReifier.java
index fe3a5c1a4e4..a712799a09d 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JqExpressionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JqExpressionReifier.java
@@ -17,37 +17,13 @@
 package org.apache.camel.reifier.language;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
-import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.model.language.JqExpression;
-import org.apache.camel.spi.Language;
 
-public class JqExpressionReifier extends ExpressionReifier<JqExpression> {
+public class JqExpressionReifier extends SingleInputTypedExpressionReifier<JqExpression> {
 
     public JqExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) {
-        super(camelContext, (JqExpression) definition);
-    }
-
-    @Override
-    protected void configureLanguage(Language language) {
-        if (definition.getResultType() == null && definition.getResultTypeName() != null) {
-            try {
-                Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getResultTypeName());
-                definition.setResultType(clazz);
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeException(e);
-            }
-        }
-    }
-
-    private Object[] createProperties() {
-        Object[] properties = new Object[3];
-        properties[0] = definition.getResultType();
-        properties[1] = parseString(definition.getHeaderName());
-        properties[2] = parseString(definition.getPropertyName());
-        return properties;
+        super(camelContext, definition);
     }
 
     @Override
@@ -56,14 +32,4 @@ public class JqExpressionReifier extends ExpressionReifier<JqExpression> {
         return false;
     }
 
-    @Override
-    protected Expression createExpression(Language language, String exp) {
-        return language.createExpression(exp, createProperties());
-    }
-
-    @Override
-    protected Predicate createPredicate(Language language, String exp) {
-        return language.createPredicate(exp, createProperties());
-    }
-
 }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java
index b3de1829766..71e3562bb8b 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java
@@ -17,33 +17,18 @@
 package org.apache.camel.reifier.language;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
-import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.model.language.JsonPathExpression;
-import org.apache.camel.spi.Language;
 
-public class JsonPathExpressionReifier extends ExpressionReifier<JsonPathExpression> {
+public class JsonPathExpressionReifier extends SingleInputTypedExpressionReifier<JsonPathExpression> {
 
     public JsonPathExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) {
-        super(camelContext, (JsonPathExpression) definition);
+        super(camelContext, definition);
     }
 
     @Override
-    protected void configureLanguage(Language language) {
-        if (definition.getResultType() == null && definition.getResultTypeName() != null) {
-            try {
-                Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getResultTypeName());
-                definition.setResultType(clazz);
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeException(e);
-            }
-        }
-    }
-
-    private Object[] createProperties() {
-        Object[] properties = new Object[8];
+    protected Object[] createProperties() {
+        Object[] properties = new Object[9];
         properties[0] = definition.getResultType();
         properties[1] = parseBoolean(definition.getSuppressExceptions());
         properties[2] = parseBoolean(definition.getAllowSimple());
@@ -52,17 +37,8 @@ public class JsonPathExpressionReifier extends ExpressionReifier<JsonPathExpress
         properties[5] = parseBoolean(definition.getUnpackArray());
         properties[6] = parseString(definition.getHeaderName());
         properties[7] = parseString(definition.getOption());
+        properties[8] = parseString(definition.getPropertyName());
         return properties;
     }
 
-    @Override
-    protected Expression createExpression(Language language, String exp) {
-        return language.createExpression(exp, createProperties());
-    }
-
-    @Override
-    protected Predicate createPredicate(Language language, String exp) {
-        return language.createPredicate(exp, createProperties());
-    }
-
 }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java
index 288941cbbcb..1794c7f2de8 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/MethodCallExpressionReifier.java
@@ -17,31 +17,32 @@
 package org.apache.camel.reifier.language;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.model.language.MethodCallExpression;
 import org.apache.camel.spi.Language;
 
-public class MethodCallExpressionReifier extends ExpressionReifier<MethodCallExpression> {
+public class MethodCallExpressionReifier extends TypedExpressionReifier<MethodCallExpression> {
 
     public MethodCallExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) {
-        super(camelContext, (MethodCallExpression) definition);
+        super(camelContext, definition);
     }
 
+    @Override
     protected Object[] createProperties() {
-        Object[] properties = new Object[5];
+        Object[] properties = new Object[6];
         properties[0] = definition.getInstance();
         properties[1] = parseString(definition.getMethod());
         properties[2] = definition.getBeanType();
         properties[3] = parseString(definition.getRef());
         properties[4] = parseString(definition.getScope());
+        properties[5] = definition.getResultType();
         return properties;
     }
 
     @Override
     protected void configureLanguage(Language language) {
+        super.configureLanguage(language);
         if (definition.getBeanType() == null && definition.getBeanTypeName() != null) {
             try {
                 Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getBeanTypeName());
@@ -51,14 +52,4 @@ public class MethodCallExpressionReifier extends ExpressionReifier<MethodCallExp
             }
         }
     }
-
-    @Override
-    protected Expression createExpression(Language language, String exp) {
-        return language.createExpression(exp, createProperties());
-    }
-
-    @Override
-    protected Predicate createPredicate(Language language, String exp) {
-        return language.createPredicate(exp, createProperties());
-    }
 }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/PythonExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/PythonExpressionReifier.java
deleted file mode 100644
index 5c4f8394644..00000000000
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/PythonExpressionReifier.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.reifier.language;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
-import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.model.language.ExpressionDefinition;
-import org.apache.camel.model.language.PythonExpression;
-import org.apache.camel.spi.Language;
-
-public class PythonExpressionReifier extends ExpressionReifier<PythonExpression> {
-
-    public PythonExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) {
-        super(camelContext, (PythonExpression) definition);
-    }
-
-    @Override
-    protected void configureLanguage(Language language) {
-        if (definition.getResultType() == null && definition.getResultTypeName() != null) {
-            try {
-                Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getResultTypeName());
-                definition.setResultType(clazz);
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeException(e);
-            }
-        }
-    }
-
-    private Object[] createProperties() {
-        Object[] properties = new Object[3];
-        properties[0] = definition.getResultType();
-        properties[1] = parseString(definition.getHeaderName());
-        properties[2] = parseString(definition.getPropertyName());
-        return properties;
-    }
-
-    @Override
-    protected Expression createExpression(Language language, String exp) {
-        return language.createExpression(exp, createProperties());
-    }
-
-    @Override
-    protected Predicate createPredicate(Language language, String exp) {
-        return language.createPredicate(exp, createProperties());
-    }
-
-}
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/SimpleExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/SimpleExpressionReifier.java
index 3ab86475879..59bb831cdc5 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/SimpleExpressionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/SimpleExpressionReifier.java
@@ -17,17 +17,13 @@
 package org.apache.camel.reifier.language;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
-import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.model.language.SimpleExpression;
-import org.apache.camel.spi.Language;
 
-public class SimpleExpressionReifier extends ExpressionReifier<SimpleExpression> {
+public class SimpleExpressionReifier extends TypedExpressionReifier<SimpleExpression> {
 
     public SimpleExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) {
-        super(camelContext, (SimpleExpression) definition);
+        super(camelContext, definition);
     }
 
     @Override
@@ -37,33 +33,11 @@ public class SimpleExpressionReifier extends ExpressionReifier<SimpleExpression>
     }
 
     @Override
-    protected Expression createExpression(Language language, String exp) {
-        return language.createExpression(exp, createProperties());
-    }
-
-    @Override
-    protected Predicate createPredicate(Language language, String exp) {
-        return language.createPredicate(exp, createProperties());
-    }
-
-    private Object[] createProperties() {
+    protected Object[] createProperties() {
         Object[] properties = new Object[2];
         properties[0] = definition.getResultType();
         properties[1] = parseBoolean(definition.getTrim());
         return properties;
     }
 
-    @Override
-    protected void configureLanguage(Language language) {
-        if (definition.getResultType() == null && definition.getResultTypeName() != null) {
-            Class<?> clazz;
-            try {
-                clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getResultTypeName());
-            } catch (ClassNotFoundException e) {
-                throw RuntimeCamelException.wrapRuntimeException(e);
-            }
-            definition.setResultType(clazz);
-        }
-    }
-
 }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/SingleInputTypedExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/SingleInputTypedExpressionReifier.java
new file mode 100644
index 00000000000..415a21622f1
--- /dev/null
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/SingleInputTypedExpressionReifier.java
@@ -0,0 +1,44 @@
+/*
+ * 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.reifier.language;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.model.language.SingleInputTypedExpressionDefinition;
+
+/**
+ * {@code SingleInputTypedExpressionReifier} is a specific reifier for expression for which a result type can be
+ * provided along with the source of the input (body, header or property).
+ *
+ * @param <T> the type of expression
+ */
+class SingleInputTypedExpressionReifier<T extends SingleInputTypedExpressionDefinition>
+        extends TypedExpressionReifier<T> {
+
+    SingleInputTypedExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) {
+        super(camelContext, definition);
+    }
+
+    @Override
+    protected Object[] createProperties() {
+        Object[] properties = new Object[3];
+        properties[0] = definition.getResultType();
+        properties[1] = parseString(definition.getHeaderName());
+        properties[2] = parseString(definition.getPropertyName());
+        return properties;
+    }
+}
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java
index b5e12fb1eca..ace72909c9c 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/TokenizerExpressionReifier.java
@@ -31,7 +31,7 @@ public class TokenizerExpressionReifier extends ExpressionReifier<TokenizerExpre
     }
 
     protected Object[] createProperties() {
-        Object[] properties = new Object[10];
+        Object[] properties = new Object[11];
         // special for new line tokens, if defined from XML then its 2
         // characters, so we replace that back to a single char
         String token = definition.getToken();
@@ -48,13 +48,13 @@ public class TokenizerExpressionReifier extends ExpressionReifier<TokenizerExpre
         properties[7] = parseBoolean(definition.getIncludeTokens());
         properties[8] = parseString(definition.getGroup());
         properties[9] = parseBoolean(definition.getSkipFirst());
+        properties[10] = parseString(definition.getPropertyName());
         return properties;
     }
 
     @Override
     public Predicate createPredicate() {
-        Expression exp = createExpression();
-        return ExpressionToPredicateAdapter.toPredicate(exp);
+        return ExpressionToPredicateAdapter.toPredicate(createExpression());
     }
 
     @Override
@@ -66,5 +66,4 @@ public class TokenizerExpressionReifier extends ExpressionReifier<TokenizerExpre
     protected Predicate createPredicate(Language language, String exp) {
         return language.createPredicate(exp, createProperties());
     }
-
 }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ConstantExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/TypedExpressionReifier.java
similarity index 79%
rename from core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ConstantExpressionReifier.java
rename to core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/TypedExpressionReifier.java
index 600623f790d..ef9c1120d28 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ConstantExpressionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/TypedExpressionReifier.java
@@ -20,14 +20,20 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
 import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.model.language.ConstantExpression;
 import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.model.language.TypedExpressionDefinition;
 import org.apache.camel.spi.Language;
 
-public class ConstantExpressionReifier extends ExpressionReifier<ConstantExpression> {
+/**
+ * {@code TypedExpressionReifier} is a specific reifier for expression for which a result type can be providedcd ...
+ *
+ * @param <T> the type of expression
+ */
+class TypedExpressionReifier<T extends TypedExpressionDefinition> extends ExpressionReifier<T> {
 
-    public ConstantExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) {
-        super(camelContext, (ConstantExpression) definition);
+    @SuppressWarnings("unchecked")
+    TypedExpressionReifier(CamelContext camelContext, ExpressionDefinition definition) {
+        super(camelContext, (T) definition);
     }
 
     @Override
@@ -42,7 +48,7 @@ public class ConstantExpressionReifier extends ExpressionReifier<ConstantExpress
         }
     }
 
-    private Object[] createProperties() {
+    protected Object[] createProperties() {
         Object[] properties = new Object[1];
         properties[0] = definition.getResultType();
         return properties;
@@ -57,5 +63,4 @@ public class ConstantExpressionReifier extends ExpressionReifier<ConstantExpress
     protected Predicate createPredicate(Language language, String exp) {
         return language.createPredicate(exp, createProperties());
     }
-
 }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java
index 51d3606ac60..8acd19e789d 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XMLTokenizerExpressionReifier.java
@@ -65,11 +65,12 @@ public class XMLTokenizerExpressionReifier extends ExpressionReifier<XMLTokenize
     }
 
     protected Object[] createProperties() {
-        Object[] properties = new Object[4];
+        Object[] properties = new Object[5];
         properties[0] = parseString(definition.getHeaderName());
         properties[1] = parseString(definition.getMode());
         properties[2] = parseInt(definition.getGroup());
         properties[3] = definition.getNamespaces();
+        properties[4] = parseString(definition.getPropertyName());
         return properties;
     }
 
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java
index 4d0e714b19d..fc5c3d0a39a 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XPathExpressionReifier.java
@@ -62,7 +62,7 @@ public class XPathExpressionReifier extends ExpressionReifier<XPathExpression> {
     }
 
     protected Object[] createProperties() {
-        Object[] properties = new Object[10];
+        Object[] properties = new Object[11];
         properties[0] = definition.getDocumentType();
         // resultType can either point to a QName or it can be a regular class that influence the qname
         // so we need this special logic to set resultQName and resultType accordingly
@@ -80,6 +80,7 @@ public class XPathExpressionReifier extends ExpressionReifier<XPathExpression> {
         properties[7] = parseBoolean(definition.getPreCompile());
         properties[8] = parseBoolean(definition.getLogNamespaces());
         properties[9] = parseString(definition.getHeaderName());
+        properties[10] = parseString(definition.getPropertyName());
         return properties;
     }
 
@@ -103,6 +104,14 @@ public class XPathExpressionReifier extends ExpressionReifier<XPathExpression> {
 
     @Override
     protected void configureLanguage(Language language) {
+        if (definition.getResultType() == null && definition.getResultTypeName() != null) {
+            try {
+                Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getResultTypeName());
+                definition.setResultType(clazz);
+            } catch (ClassNotFoundException e) {
+                throw RuntimeCamelException.wrapRuntimeException(e);
+            }
+        }
         if (definition.getDocumentType() == null && definition.getDocumentTypeName() != null) {
             try {
                 Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getDocumentTypeName());
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java
index 8c7bcf81ad9..a1939beeea6 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/XQueryExpressionReifier.java
@@ -59,14 +59,23 @@ public class XQueryExpressionReifier extends ExpressionReifier<XQueryExpression>
     }
 
     protected Object[] createProperties() {
-        Object[] properties = new Object[2];
+        Object[] properties = new Object[3];
         properties[0] = definition.getResultType();
         properties[1] = parseString(definition.getHeaderName());
+        properties[2] = parseString(definition.getPropertyName());
         return properties;
     }
 
     @Override
     protected void configureLanguage(Language language) {
+        if (definition.getResultType() == null && definition.getResultTypeName() != null) {
+            try {
+                Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getResultTypeName());
+                definition.setResultType(clazz);
+            } catch (ClassNotFoundException e) {
+                throw RuntimeCamelException.wrapRuntimeException(e);
+            }
+        }
         if (definition.getResultType() == null && definition.getType() != null) {
             try {
                 Class<?> clazz = camelContext.getClassResolver().resolveMandatoryClass(definition.getType());
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/AbstractSingleInputLanguageTest.java b/core/camel-core/src/test/java/org/apache/camel/language/AbstractSingleInputLanguageTest.java
new file mode 100644
index 00000000000..92724ca3011
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/language/AbstractSingleInputLanguageTest.java
@@ -0,0 +1,190 @@
+/*
+ * 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.language;
+
+import java.util.function.Function;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Message;
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.model.language.SingleInputExpressionDefinition;
+import org.junit.jupiter.api.Test;
+
+/**
+ * The base class of tests willing to validate the behavior of a language that supports different sources of input data.
+ *
+ * @param <T> the type of the builder used to build the language
+ * @param <E> the type of the target expression
+ */
+public abstract class AbstractSingleInputLanguageTest<
+        T extends SingleInputExpressionDefinition.AbstractBuilder<T, E>, E extends SingleInputExpressionDefinition>
+        extends ContextTestSupport {
+
+    protected final String expression;
+    protected final Function<LanguageBuilderFactory, T> factory;
+
+    protected AbstractSingleInputLanguageTest(String expression, Function<LanguageBuilderFactory, T> factory) {
+        this.expression = expression;
+        this.factory = factory;
+    }
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    protected abstract TestContext testContext();
+
+    @Test
+    void testExpressionOnly() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:expression-only")
+                    .split(
+                        expression(
+                            factory.apply(expression())
+                                .expression(expression)
+                                .end()
+                        )
+                    ).to("mock:expression-only");
+            }
+        });
+        context.start();
+        MockEndpoint mockEndpoint = getMockEndpoint("mock:expression-only");
+        TestContext context = testContext();
+        mockEndpoint.expectedBodiesReceived(context.getBodyReceived());
+
+        template.sendBody("direct:expression-only", context.getContentToSend());
+
+        assertMockEndpointsSatisfied();
+        assertIsInstanceOf(context.getBodyReceivedType(), mockEndpoint.getReceivedExchanges().get(0).getIn().getBody());
+    }
+
+    @Test
+    void testHeaderOnly() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:header-only")
+                    .split(
+                        expression(
+                            factory.apply(expression())
+                                .expression(expression)
+                                .headerName("someHeader")
+                                .end()
+                        )
+                    ).to("mock:header-only");
+            }
+        });
+        context.start();
+        MockEndpoint mockEndpoint = getMockEndpoint("mock:header-only");
+        TestContext context = testContext();
+        mockEndpoint.expectedBodiesReceived(context.getBodyReceived());
+
+        template.sendBodyAndHeader("direct:header-only", "foo", "someHeader", context.getContentToSend());
+
+        assertMockEndpointsSatisfied();
+        assertIsInstanceOf(context.getBodyReceivedType(), mockEndpoint.getReceivedExchanges().get(0).getIn().getBody());
+    }
+
+    @Test
+    void testPropertyOnly() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:property-only")
+                    .split(
+                        expression(factory.apply(expression())
+                            .expression(expression)
+                            .propertyName("someProperty")
+                            .end()
+                        )
+                    ).to("mock:property-only");
+            }
+        });
+        context.start();
+        MockEndpoint mockEndpoint = getMockEndpoint("mock:property-only");
+        TestContext context = testContext();
+        mockEndpoint.expectedBodiesReceived(context.getBodyReceived());
+
+        template.sendBodyAndProperty("direct:property-only", "foo", "someProperty", context.getContentToSend());
+
+        assertMockEndpointsSatisfied();
+        assertIsInstanceOf(context.getBodyReceivedType(), mockEndpoint.getReceivedExchanges().get(0).getIn().getBody());
+    }
+
+    @Test
+    void testAll() throws Exception {
+        TestContext testContext = testContext();
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:all")
+                    .split(
+                        expression(
+                            factory.apply(expression())
+                                .expression(expression)
+                                .headerName("someHeader")
+                                .propertyName("someProperty")
+                                .end()
+                        )
+                    ).to("mock:all");
+            }
+        });
+        context.start();
+        MockEndpoint mockEndpoint = getMockEndpoint("mock:all");
+        mockEndpoint.expectedBodiesReceived(testContext.getBodyReceived());
+
+        template.send("direct:all", exchange -> {
+            Message message = exchange.getIn();
+            message.setBody("foo");
+            message.setHeader("someHeader", testContext.getContentToSend());
+            exchange.setProperty("someProperty", "bar");
+        });
+
+        assertMockEndpointsSatisfied();
+        assertIsInstanceOf(testContext.getBodyReceivedType(), mockEndpoint.getReceivedExchanges().get(0).getIn().getBody());
+    }
+
+    protected static class TestContext {
+
+        private final Object contentToSend;
+        private final Object bodyReceived;
+        private final Class<?> bodyReceivedType;
+
+        public TestContext(Object contentToSend, Object bodyReceived, Class<?> bodyReceivedType) {
+            this.contentToSend = contentToSend;
+            this.bodyReceived = bodyReceived;
+            this.bodyReceivedType = bodyReceivedType;
+        }
+
+        public Object getContentToSend() {
+            return contentToSend;
+        }
+
+        public Object getBodyReceived() {
+            return bodyReceived;
+        }
+
+        public Class<?> getBodyReceivedType() {
+            return bodyReceivedType;
+        }
+    }
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/AbstractSingleInputTypedLanguageTest.java b/core/camel-core/src/test/java/org/apache/camel/language/AbstractSingleInputTypedLanguageTest.java
new file mode 100644
index 00000000000..9abbb91603e
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/language/AbstractSingleInputTypedLanguageTest.java
@@ -0,0 +1,192 @@
+/*
+ * 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.language;
+
+import java.util.function.Function;
+
+import org.apache.camel.Message;
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.model.language.SingleInputTypedExpressionDefinition;
+import org.junit.jupiter.api.Test;
+
+/**
+ * The base class of tests willing to validate the behavior of a language that supports a result type and different
+ * sources of input data.
+ *
+ * @param <T> the type of the builder used to build the language
+ * @param <E> the type of the target expression
+ */
+public abstract class AbstractSingleInputTypedLanguageTest<
+        T extends SingleInputTypedExpressionDefinition.AbstractBuilder<T, E>,
+        E extends SingleInputTypedExpressionDefinition>
+        extends AbstractTypedLanguageTest<T, E> {
+    protected AbstractSingleInputTypedLanguageTest(String expression, Function<LanguageBuilderFactory, T> factory) {
+        super(expression, factory);
+    }
+
+    @Test
+    void testHeaderOnly() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:header-only")
+                    .setBody()
+                    .expression(
+                        expression(
+                            factory.apply(expression())
+                                .expression(expression)
+                                .headerName("someHeader")
+                                .end()
+                        )
+                    ).to("mock:header-only");
+            }
+        });
+        context.start();
+        MockEndpoint mockEndpoint = getMockEndpoint("mock:header-only");
+        TestContext context = testWithoutTypeContext();
+        mockEndpoint.expectedBodiesReceived(context.getBodyReceived());
+
+        template.sendBodyAndHeader("direct:header-only", "foo", "someHeader", context.getContentToSend());
+
+        assertMockEndpointsSatisfied();
+        assertIsInstanceOf(context.getBodyReceivedType(), mockEndpoint.getReceivedExchanges().get(0).getIn().getBody());
+    }
+
+    @Test
+    void testPropertyOnly() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:property-only")
+                    .setBody()
+                    .expression(
+                        expression(factory.apply(expression())
+                            .expression(expression)
+                            .propertyName("someProperty")
+                            .end()
+                        )
+                    ).to("mock:property-only");
+            }
+        });
+        context.start();
+        MockEndpoint mockEndpoint = getMockEndpoint("mock:property-only");
+        TestContext context = testWithoutTypeContext();
+        mockEndpoint.expectedBodiesReceived(context.getBodyReceived());
+
+        template.sendBodyAndProperty("direct:property-only", "foo", "someProperty", context.getContentToSend());
+
+        assertMockEndpointsSatisfied();
+        assertIsInstanceOf(context.getBodyReceivedType(), mockEndpoint.getReceivedExchanges().get(0).getIn().getBody());
+    }
+
+    @Test
+    void testHeaderAndType() throws Exception {
+        TestContext testContext = testWithTypeContext();
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:header-and-type")
+                    .setBody()
+                    .expression(
+                        expression(
+                            factory.apply(expression())
+                                .expression(expression)
+                                .headerName("someHeader")
+                                .resultType(testContext.getBodyReceivedType())
+                                .end()
+                        )
+                    ).to("mock:header-and-type");
+            }
+        });
+        context.start();
+        MockEndpoint mockEndpoint = getMockEndpoint("mock:header-and-type");
+        mockEndpoint.expectedBodiesReceived(testContext.getBodyReceived());
+
+        template.sendBodyAndHeader("direct:header-and-type", "foo", "someHeader", testContext.getContentToSend());
+
+        assertMockEndpointsSatisfied();
+        assertIsInstanceOf(testContext.getBodyReceivedType(), mockEndpoint.getReceivedExchanges().get(0).getIn().getBody());
+
+    }
+
+    @Test
+    void testPropertyAndType() throws Exception {
+        TestContext testContext = testWithTypeContext();
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:property-and-type")
+                    .setBody()
+                    .expression(
+                        expression(
+                            factory.apply(expression())
+                                .expression(expression)
+                                .propertyName("someProperty")
+                                .resultType(testContext.getBodyReceivedType())
+                                .end()
+                        )
+                    ).to("mock:property-and-type");
+            }
+        });
+        context.start();
+        MockEndpoint mockEndpoint = getMockEndpoint("mock:property-and-type");
+        mockEndpoint.expectedBodiesReceived(testContext.getBodyReceived());
+
+        template.sendBodyAndProperty("direct:property-and-type", "foo", "someProperty", testContext.getContentToSend());
+
+        assertMockEndpointsSatisfied();
+        assertIsInstanceOf(testContext.getBodyReceivedType(), mockEndpoint.getReceivedExchanges().get(0).getIn().getBody());
+    }
+
+    @Test
+    void testAll() throws Exception {
+        TestContext testContext = testWithTypeContext();
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:all")
+                    .setBody()
+                    .expression(
+                        expression(
+                            factory.apply(expression())
+                                .expression(expression)
+                                .headerName("someHeader")
+                                .propertyName("someProperty")
+                                .resultType(testContext.getBodyReceivedType())
+                                .end()
+                        )
+                    ).to("mock:all");
+            }
+        });
+        context.start();
+        MockEndpoint mockEndpoint = getMockEndpoint("mock:all");
+        mockEndpoint.expectedBodiesReceived(testContext.getBodyReceived());
+
+        template.send("direct:all", exchange -> {
+            Message message = exchange.getIn();
+            message.setBody("foo");
+            message.setHeader("someHeader", testContext.getContentToSend());
+            exchange.setProperty("someProperty", "bar");
+        });
+
+        assertMockEndpointsSatisfied();
+        assertIsInstanceOf(testContext.getBodyReceivedType(), mockEndpoint.getReceivedExchanges().get(0).getIn().getBody());
+    }
+
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/AbstractTypedLanguageTest.java b/core/camel-core/src/test/java/org/apache/camel/language/AbstractTypedLanguageTest.java
new file mode 100644
index 00000000000..f2f1f854cc9
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/language/AbstractTypedLanguageTest.java
@@ -0,0 +1,160 @@
+/*
+ * 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.language;
+
+import java.util.function.Function;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.model.language.TypedExpressionDefinition;
+import org.junit.jupiter.api.Test;
+
+/**
+ * The base class of tests willing to validate the behavior of a language that supports a result type.
+ *
+ * @param <T> the type of the builder used to build the language
+ * @param <E> the type of the target expression
+ */
+public abstract class AbstractTypedLanguageTest<
+        T extends TypedExpressionDefinition.AbstractBuilder<T, E>, E extends TypedExpressionDefinition>
+        extends ContextTestSupport {
+
+    protected final String expression;
+    protected final Function<LanguageBuilderFactory, T> factory;
+
+    protected AbstractTypedLanguageTest(String expression, Function<LanguageBuilderFactory, T> factory) {
+        this.expression = expression;
+        this.factory = factory;
+    }
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    protected void assertResult(String uriSuffix, TestContext context) throws Exception {
+        MockEndpoint mockEndpoint = getMockEndpoint(String.format("mock:%s", uriSuffix));
+        mockEndpoint.expectedBodiesReceived(context.getBodyReceived());
+
+        template.sendBody(String.format("direct:%s", uriSuffix), context.getContentToSend());
+
+        assertMockEndpointsSatisfied();
+        assertIsInstanceOf(context.getBodyReceivedType(), mockEndpoint.getReceivedExchanges().get(0).getIn().getBody());
+    }
+
+    protected Object defaultContentToSend() {
+        return "1";
+    }
+
+    protected TestContext testWithoutTypeContext() {
+        return new TestContext(defaultContentToSend(), "1", String.class);
+    }
+
+    @Test
+    void testExpressionOnly() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:expression-only")
+                    .setBody()
+                    .expression(
+                        expression(
+                            factory.apply(expression())
+                                .expression(expression)
+                                .end()
+                        )
+                    ).to("mock:expression-only");
+            }
+        });
+        context.start();
+        assertResult("expression-only", testWithoutTypeContext());
+    }
+
+    protected TestContext testWithTypeContext() {
+        return new TestContext(defaultContentToSend(), 1, Integer.class);
+    }
+
+    @Test
+    void testTypedWithClass() throws Exception {
+        TestContext testContext = testWithTypeContext();
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:typed-with-class")
+                    .setBody()
+                    .expression(
+                        expression(
+                            factory.apply(expression())
+                                .expression(expression)
+                                .resultType(testContext.getBodyReceivedType())
+                                .end()
+                        )
+                    ).to("mock:typed-with-class");
+            }
+        });
+        context.start();
+        assertResult("typed-with-class", testContext);
+    }
+
+    @Test
+    void testTypedWithName() throws Exception {
+        TestContext testContext = testWithTypeContext();
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:typed-with-name")
+                    .split(
+                        expression(
+                            factory.apply(expression())
+                                .expression(expression)
+                                .resultTypeName(testContext.getBodyReceivedType().getName())
+                                .end()
+                        )
+                    ).to("mock:typed-with-name");
+            }
+        });
+        context.start();
+        assertResult("typed-with-name", testContext);
+    }
+
+    protected static class TestContext {
+
+        private final Object contentToSend;
+        private final Object bodyReceived;
+        private final Class<?> bodyReceivedType;
+
+        public TestContext(Object contentToSend, Object bodyReceived, Class<?> bodyReceivedType) {
+            this.contentToSend = contentToSend;
+            this.bodyReceived = bodyReceived;
+            this.bodyReceivedType = bodyReceivedType;
+        }
+
+        public Object getContentToSend() {
+            return contentToSend;
+        }
+
+        public Object getBodyReceived() {
+            return bodyReceived;
+        }
+
+        public Class<?> getBodyReceivedType() {
+            return bodyReceivedType;
+        }
+    }
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/BeanLanguageTest.java b/core/camel-core/src/test/java/org/apache/camel/language/BeanLanguageTest.java
new file mode 100644
index 00000000000..242c773c3bb
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/language/BeanLanguageTest.java
@@ -0,0 +1,43 @@
+/*
+ * 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.language;
+
+import org.apache.camel.model.language.MethodCallExpression;
+import org.apache.camel.spi.Registry;
+
+/**
+ * Ensures that the "bean" language is compliant with the typed language expectations.
+ */
+class BeanLanguageTest extends AbstractTypedLanguageTest<MethodCallExpression.Builder, MethodCallExpression> {
+
+    BeanLanguageTest() {
+        super(null, factory -> factory.bean().ref("someBean"));
+    }
+
+    @Override
+    protected Registry createRegistry() throws Exception {
+        Registry registry = super.createRegistry();
+        registry.bind("someBean", new SomeBean());
+        return registry;
+    }
+
+    public static class SomeBean {
+        public Object echo(Object body) {
+            return body;
+        }
+    }
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/ConstantLanguageTest.java b/core/camel-core/src/test/java/org/apache/camel/language/ConstantLanguageTest.java
new file mode 100644
index 00000000000..1172760da81
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/language/ConstantLanguageTest.java
@@ -0,0 +1,30 @@
+/*
+ * 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.language;
+
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.model.language.ConstantExpression;
+
+/**
+ * Ensures that the "constant" language is compliant with the typed language expectations.
+ */
+class ConstantLanguageTest extends AbstractTypedLanguageTest<ConstantExpression.Builder, ConstantExpression> {
+
+    ConstantLanguageTest() {
+        super("1", LanguageBuilderFactory::constant);
+    }
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/RefLanguageTest.java b/core/camel-core/src/test/java/org/apache/camel/language/RefLanguageTest.java
new file mode 100644
index 00000000000..fa8f5e922a1
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/language/RefLanguageTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.language;
+
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.model.language.RefExpression;
+import org.apache.camel.model.language.SimpleExpression;
+import org.apache.camel.spi.Registry;
+
+/**
+ * Ensures that the "ref" language is compliant with the typed language expectations.
+ */
+class RefLanguageTest extends AbstractTypedLanguageTest<RefExpression.Builder, RefExpression> {
+
+    RefLanguageTest() {
+        super("someExpression", LanguageBuilderFactory::ref);
+    }
+
+    @Override
+    protected Registry createRegistry() throws Exception {
+        Registry registry = super.createRegistry();
+        registry.bind("someExpression", new SimpleExpression("${body}"));
+        return registry;
+    }
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/SimpleLanguageTest.java b/core/camel-core/src/test/java/org/apache/camel/language/SimpleLanguageTest.java
new file mode 100644
index 00000000000..c11888e974d
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/language/SimpleLanguageTest.java
@@ -0,0 +1,30 @@
+/*
+ * 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.language;
+
+import org.apache.camel.builder.LanguageBuilderFactory;
+import org.apache.camel.model.language.SimpleExpression;
+
+/**
+ * Ensures that the "simple" language is compliant with the typed language expectations.
+ */
+class SimpleLanguageTest extends AbstractTypedLanguageTest<SimpleExpression.Builder, SimpleExpression> {
+
+    SimpleLanguageTest() {
+        super("${body}", LanguageBuilderFactory::simple);
+    }
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/TokenizeLanguageTest.java b/core/camel-core/src/test/java/org/apache/camel/language/TokenizeLanguageTest.java
new file mode 100644
index 00000000000..33026f0310e
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/language/TokenizeLanguageTest.java
@@ -0,0 +1,34 @@
+/*
+ * 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.language;
+
+import org.apache.camel.model.language.TokenizerExpression;
+
+/**
+ * Ensures that the "tokenize" language is compliant with the single input expectations.
+ */
+class TokenizeLanguageTest extends AbstractSingleInputLanguageTest<TokenizerExpression.Builder, TokenizerExpression> {
+
+    TokenizeLanguageTest() {
+        super(null, factory -> factory.tokenize().token("\n"));
+    }
+
+    @Override
+    protected TestContext testContext() {
+        return new TestContext("1\n", "1", String.class);
+    }
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/XPathLanguageTest.java b/core/camel-core/src/test/java/org/apache/camel/language/XPathLanguageTest.java
new file mode 100644
index 00000000000..7609ea03e5d
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/language/XPathLanguageTest.java
@@ -0,0 +1,34 @@
+/*
+ * 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.language;
+
+import org.apache.camel.model.language.XPathExpression;
+
+/**
+ * Ensures that the "xpath" language is compliant with the single input expectations.
+ */
+class XPathLanguageTest extends AbstractSingleInputLanguageTest<XPathExpression.Builder, XPathExpression> {
+
+    XPathLanguageTest() {
+        super("/foo/text()", factory -> factory.xpath().resultType(String.class));
+    }
+
+    @Override
+    protected TestContext testContext() {
+        return new TestContext("<foo>1</foo>", "1", String.class);
+    }
+}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/LanguageSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/LanguageSupport.java
index 9d7d871e91a..e7daaa3a8c1 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/LanguageSupport.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/LanguageSupport.java
@@ -119,7 +119,7 @@ public abstract class LanguageSupport implements Language, IsSingleton, CamelCon
      * @return              the value converted to the expected type
      */
     protected <T> T property(Class<T> type, Object[] properties, int index, Object defaultValue) {
-        Object value = properties != null ? properties[index] : null;
+        Object value = properties == null || index >= properties.length ? null : properties[index];
         if (value == null) {
             value = defaultValue;
         }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/SingleInputLanguageSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/SingleInputLanguageSupport.java
new file mode 100644
index 00000000000..b11e42d8982
--- /dev/null
+++ b/core/camel-support/src/main/java/org/apache/camel/support/SingleInputLanguageSupport.java
@@ -0,0 +1,60 @@
+/*
+ * 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.support;
+
+import org.apache.camel.spi.Language;
+
+/**
+ * Base class for {@link Language} implementations that support the source of the input.
+ */
+public abstract class SingleInputLanguageSupport extends LanguageSupport {
+
+    /**
+     * Name of header to use as input, instead of the message body
+     */
+    private String headerName;
+    /**
+     * Name of property to use as input, instead of the message body.
+     * <p>
+     * It has a lower precedent than the name of header if both are set.
+     */
+    private String propertyName;
+
+    public String getHeaderName() {
+        return headerName;
+    }
+
+    /**
+     * Name of header to use as input, instead of the message body
+     */
+    public void setHeaderName(String headerName) {
+        this.headerName = headerName;
+    }
+
+    public String getPropertyName() {
+        return propertyName;
+    }
+
+    /**
+     * Name of property to use as input, instead of the message body.
+     * <p>
+     * It has a lower precedent than the name of header if both are set.
+     */
+    public void setPropertyName(String propertyName) {
+        this.propertyName = propertyName;
+    }
+}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/SingleInputTypedLanguageSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/SingleInputTypedLanguageSupport.java
new file mode 100644
index 00000000000..bba1e5756b7
--- /dev/null
+++ b/core/camel-support/src/main/java/org/apache/camel/support/SingleInputTypedLanguageSupport.java
@@ -0,0 +1,86 @@
+/*
+ * 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.support;
+
+import org.apache.camel.Expression;
+import org.apache.camel.spi.Language;
+import org.apache.camel.support.builder.ExpressionBuilder;
+
+/**
+ * Base class for {@link Language} implementations that support a result type and the source of the input.
+ */
+public abstract class SingleInputTypedLanguageSupport extends TypedLanguageSupport {
+
+    /**
+     * Name of header to use as input, instead of the message body
+     */
+    private String headerName;
+    /**
+     * Name of property to use as input, instead of the message body.
+     * <p>
+     * It has a lower precedent than the name of header if both are set.
+     */
+    private String propertyName;
+
+    public String getHeaderName() {
+        return headerName;
+    }
+
+    /**
+     * Name of header to use as input, instead of the message body
+     */
+    public void setHeaderName(String headerName) {
+        this.headerName = headerName;
+    }
+
+    public String getPropertyName() {
+        return propertyName;
+    }
+
+    /**
+     * Name of property to use as input, instead of the message body.
+     * <p>
+     * It has a lower precedent than the name of header if both are set.
+     */
+    public void setPropertyName(String propertyName) {
+        this.propertyName = propertyName;
+    }
+
+    @Override
+    public Expression createExpression(String expression, Object[] properties) {
+        Class<?> type = property(Class.class, properties, 0, getResultType());
+        String header = property(String.class, properties, 1, getHeaderName());
+        String property = property(String.class, properties, 2, getPropertyName());
+        Expression source = ExpressionBuilder.singleInputExpression(header, property);
+        if (type == null || type == Object.class) {
+            return createExpression(source, expression, properties);
+        }
+        return ExpressionBuilder.convertToExpression(createExpression(source, expression, properties), type);
+    }
+
+    /**
+     * Creates an expression based on the input with properties.
+     *
+     * @param  source     the expression allowing to retrieve the input data of the main expression.
+     * @param  expression the main expression to evaluate.
+     * @param  properties configuration properties (optimized as object array with hardcoded positions for properties)
+     * @return            the created expression
+     */
+    protected Expression createExpression(Expression source, String expression, Object[] properties) {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/TypedLanguageSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/TypedLanguageSupport.java
new file mode 100644
index 00000000000..921f1d1c5b7
--- /dev/null
+++ b/core/camel-support/src/main/java/org/apache/camel/support/TypedLanguageSupport.java
@@ -0,0 +1,46 @@
+/*
+ * 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.support;
+
+import org.apache.camel.Expression;
+import org.apache.camel.spi.Language;
+import org.apache.camel.support.builder.ExpressionBuilder;
+
+/**
+ * Base class for {@link Language} implementations that support a result type.
+ */
+public abstract class TypedLanguageSupport extends LanguageSupport {
+
+    private Class<?> resultType;
+
+    public Class<?> getResultType() {
+        return resultType;
+    }
+
+    public void setResultType(Class<?> resultType) {
+        this.resultType = resultType;
+    }
+
+    @Override
+    public Expression createExpression(String expression, Object[] properties) {
+        Class<?> type = property(Class.class, properties, 0, getResultType());
+        if (type == null || type == Object.class) {
+            return createExpression(expression);
+        }
+        return ExpressionBuilder.convertToExpression(createExpression(expression), type);
+    }
+}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java b/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
index 25f4ba10231..6022709ba9e 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
@@ -998,6 +998,24 @@ public class ExpressionBuilder {
         };
     }
 
+    /**
+     * @param headerName the name of the header from which the input data must be extracted if not empty.
+     * @param propertyName the name of the property from which the input data must be extracted if not empty and {@code headerName} is empty.
+     * @return a header expression if {@code headerName} is not empty, otherwise if {@code propertyName} is not empty property expression or a body
+     * expression.
+     */
+    public static Expression singleInputExpression(String headerName, String propertyName) {
+        final Expression exp;
+        if (ObjectHelper.isNotEmpty(headerName)) {
+            exp = headerExpression(headerName);
+        } else if (ObjectHelper.isNotEmpty(propertyName)) {
+            exp = exchangePropertyExpression(propertyName);
+        } else {
+            exp = bodyExpression();
+        }
+        return exp;
+    }
+
     /**
      * Returns the expression for the current thread name
      */
diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
index 2f30cff942d..f4aaa921674 100644
--- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
+++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
@@ -2614,30 +2614,28 @@ public class ModelParser extends BaseParser {
             transactionErrorHandlerDefinitionAttributeHandler(), defaultErrorHandlerDefinitionElementHandler(), noValueHandler());
     }
     protected CSimpleExpression doParseCSimpleExpression() throws IOException, XmlPullParserException {
-        return doParse(new CSimpleExpression(), (def, key, val) -> {
+        return doParse(new CSimpleExpression(),
+            typedExpressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected <T extends TypedExpressionDefinition> AttributeHandler<T> typedExpressionDefinitionAttributeHandler() {
+        return (def, key, val) -> {
             if ("resultType".equals(key)) {
                 def.setResultTypeName(val);
                 return true;
             }
             return expressionDefinitionAttributeHandler().accept(def, key, val);
-        }, noElementHandler(), expressionDefinitionValueHandler());
+        };
     }
     protected ConstantExpression doParseConstantExpression() throws IOException, XmlPullParserException {
-        return doParse(new ConstantExpression(), (def, key, val) -> {
-            if ("resultType".equals(key)) {
-                def.setResultTypeName(val);
-                return true;
-            }
-            return expressionDefinitionAttributeHandler().accept(def, key, val);
-        }, noElementHandler(), expressionDefinitionValueHandler());
+        return doParse(new ConstantExpression(),
+            typedExpressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
     }
     protected DatasonnetExpression doParseDatasonnetExpression() throws IOException, XmlPullParserException {
         return doParse(new DatasonnetExpression(), (def, key, val) -> {
             switch (key) {
                 case "bodyMediaType": def.setBodyMediaType(val); break;
                 case "outputMediaType": def.setOutputMediaType(val); break;
-                case "resultType": def.setResultTypeName(val); break;
-                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+                default: return typedExpressionDefinitionAttributeHandler().accept(def, key, val);
             }
             return true;
         }, noElementHandler(), expressionDefinitionValueHandler());
@@ -2648,7 +2646,7 @@ public class ModelParser extends BaseParser {
     }
     protected GroovyExpression doParseGroovyExpression() throws IOException, XmlPullParserException {
         return doParse(new GroovyExpression(),
-            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+            typedExpressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
     }
     protected HeaderExpression doParseHeaderExpression() throws IOException, XmlPullParserException {
         return doParse(new HeaderExpression(),
@@ -2656,63 +2654,46 @@ public class ModelParser extends BaseParser {
     }
     protected Hl7TerserExpression doParseHl7TerserExpression() throws IOException, XmlPullParserException {
         return doParse(new Hl7TerserExpression(),
-            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+            singleInputTypedExpressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
     }
-    protected JavaScriptExpression doParseJavaScriptExpression() throws IOException, XmlPullParserException {
-        return doParse(new JavaScriptExpression(), (def, key, val) -> {
+    protected <T extends SingleInputTypedExpressionDefinition> AttributeHandler<T> singleInputTypedExpressionDefinitionAttributeHandler() {
+        return (def, key, val) -> {
             switch (key) {
                 case "headerName": def.setHeaderName(val); break;
-                case "resultType": def.setResultTypeName(val); break;
-                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+                case "propertyName": def.setPropertyName(val); break;
+                default: return typedExpressionDefinitionAttributeHandler().accept(def, key, val);
             }
             return true;
-        }, (def, key) -> {
-            if ("propertyName".equals(key)) {
-                def.setPropertyName(doParseText());
-                return true;
-            }
-            return false;
-        }, expressionDefinitionValueHandler());
+        };
+    }
+    protected JavaScriptExpression doParseJavaScriptExpression() throws IOException, XmlPullParserException {
+        return doParse(new JavaScriptExpression(),
+            typedExpressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
     }
     protected JoorExpression doParseJoorExpression() throws IOException, XmlPullParserException {
         return doParse(new JoorExpression(), (def, key, val) -> {
             switch (key) {
                 case "preCompile": def.setPreCompile(val); break;
-                case "resultType": def.setResultTypeName(val); break;
                 case "singleQuotes": def.setSingleQuotes(val); break;
-                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+                default: return typedExpressionDefinitionAttributeHandler().accept(def, key, val);
             }
             return true;
         }, noElementHandler(), expressionDefinitionValueHandler());
     }
     protected JqExpression doParseJqExpression() throws IOException, XmlPullParserException {
-        return doParse(new JqExpression(), (def, key, val) -> {
-            switch (key) {
-                case "headerName": def.setHeaderName(val); break;
-                case "resultType": def.setResultTypeName(val); break;
-                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
-            }
-            return true;
-        }, (def, key) -> {
-            if ("propertyName".equals(key)) {
-                def.setPropertyName(doParseText());
-                return true;
-            }
-            return false;
-        }, expressionDefinitionValueHandler());
+        return doParse(new JqExpression(),
+            singleInputTypedExpressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
     }
     protected JsonPathExpression doParseJsonPathExpression() throws IOException, XmlPullParserException {
         return doParse(new JsonPathExpression(), (def, key, val) -> {
             switch (key) {
                 case "allowEasyPredicate": def.setAllowEasyPredicate(val); break;
                 case "allowSimple": def.setAllowSimple(val); break;
-                case "headerName": def.setHeaderName(val); break;
                 case "option": def.setOption(val); break;
-                case "resultType": def.setResultTypeName(val); break;
                 case "suppressExceptions": def.setSuppressExceptions(val); break;
                 case "unpackArray": def.setUnpackArray(val); break;
                 case "writeAsString": def.setWriteAsString(val); break;
-                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+                default: return singleInputTypedExpressionDefinitionAttributeHandler().accept(def, key, val);
             }
             return true;
         }, noElementHandler(), expressionDefinitionValueHandler());
@@ -2733,51 +2714,34 @@ public class ModelParser extends BaseParser {
                 case "method": def.setMethod(val); break;
                 case "ref": def.setRef(val); break;
                 case "scope": def.setScope(val); break;
-                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+                default: return typedExpressionDefinitionAttributeHandler().accept(def, key, val);
             }
             return true;
         }, noElementHandler(), expressionDefinitionValueHandler());
     }
     protected MvelExpression doParseMvelExpression() throws IOException, XmlPullParserException {
         return doParse(new MvelExpression(),
-            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+            typedExpressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
     }
     protected OgnlExpression doParseOgnlExpression() throws IOException, XmlPullParserException {
         return doParse(new OgnlExpression(),
-            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+            typedExpressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
     }
     protected PythonExpression doParsePythonExpression() throws IOException, XmlPullParserException {
-        return doParse(new PythonExpression(), (def, key, val) -> {
-            switch (key) {
-                case "headerName": def.setHeaderName(val); break;
-                case "resultType": def.setResultTypeName(val); break;
-                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
-            }
-            return true;
-        }, (def, key) -> {
-            if ("propertyName".equals(key)) {
-                def.setPropertyName(doParseText());
-                return true;
-            }
-            return false;
-        }, expressionDefinitionValueHandler());
+        return doParse(new PythonExpression(),
+            typedExpressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
     }
     protected RefExpression doParseRefExpression() throws IOException, XmlPullParserException {
         return doParse(new RefExpression(),
-            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+            typedExpressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
     }
     protected SimpleExpression doParseSimpleExpression() throws IOException, XmlPullParserException {
-        return doParse(new SimpleExpression(), (def, key, val) -> {
-            if ("resultType".equals(key)) {
-                def.setResultTypeName(val);
-                return true;
-            }
-            return expressionDefinitionAttributeHandler().accept(def, key, val);
-        }, noElementHandler(), expressionDefinitionValueHandler());
+        return doParse(new SimpleExpression(),
+            typedExpressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
     }
     protected SpELExpression doParseSpELExpression() throws IOException, XmlPullParserException {
         return doParse(new SpELExpression(),
-            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+            typedExpressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
     }
     protected TokenizerExpression doParseTokenizerExpression() throws IOException, XmlPullParserException {
         return doParse(new TokenizerExpression(), (def, key, val) -> {
@@ -2785,25 +2749,33 @@ public class ModelParser extends BaseParser {
                 case "endToken": def.setEndToken(val); break;
                 case "group": def.setGroup(val); break;
                 case "groupDelimiter": def.setGroupDelimiter(val); break;
-                case "headerName": def.setHeaderName(val); break;
                 case "includeTokens": def.setIncludeTokens(val); break;
                 case "inheritNamespaceTagName": def.setInheritNamespaceTagName(val); break;
                 case "regex": def.setRegex(val); break;
                 case "skipFirst": def.setSkipFirst(val); break;
                 case "token": def.setToken(val); break;
                 case "xml": def.setXml(val); break;
-                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+                default: return singleInputExpressionDefinitionAttributeHandler().accept(def, key, val);
             }
             return true;
         }, noElementHandler(), expressionDefinitionValueHandler());
     }
+    protected <T extends SingleInputExpressionDefinition> AttributeHandler<T> singleInputExpressionDefinitionAttributeHandler() {
+        return (def, key, val) -> {
+            switch (key) {
+                case "headerName": def.setHeaderName(val); break;
+                case "propertyName": def.setPropertyName(val); break;
+                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        };
+    }
     protected XMLTokenizerExpression doParseXMLTokenizerExpression() throws IOException, XmlPullParserException {
         return doParse(new XMLTokenizerExpression(), (def, key, val) -> {
             switch (key) {
                 case "group": def.setGroup(val); break;
-                case "headerName": def.setHeaderName(val); break;
                 case "mode": def.setMode(val); break;
-                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+                default: return singleInputExpressionDefinitionAttributeHandler().accept(def, key, val);
             }
             return true;
         }, namespaceAwareExpressionElementHandler(), expressionDefinitionValueHandler());
@@ -2822,14 +2794,13 @@ public class ModelParser extends BaseParser {
             switch (key) {
                 case "documentType": def.setDocumentTypeName(val); break;
                 case "factoryRef": def.setFactoryRef(val); break;
-                case "headerName": def.setHeaderName(val); break;
                 case "logNamespaces": def.setLogNamespaces(val); break;
                 case "objectModel": def.setObjectModel(val); break;
                 case "preCompile": def.setPreCompile(val); break;
                 case "resultType": def.setResultTypeName(val); break;
                 case "saxon": def.setSaxon(val); break;
                 case "threadSafety": def.setThreadSafety(val); break;
-                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+                default: return singleInputExpressionDefinitionAttributeHandler().accept(def, key, val);
             }
             return true;
         }, namespaceAwareExpressionElementHandler(), expressionDefinitionValueHandler());
@@ -2838,9 +2809,9 @@ public class ModelParser extends BaseParser {
         return doParse(new XQueryExpression(), (def, key, val) -> {
             switch (key) {
                 case "configurationRef": def.setConfigurationRef(val); break;
-                case "headerName": def.setHeaderName(val); break;
+                case "resultType": def.setResultTypeName(val); break;
                 case "type": def.setType(val); break;
-                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+                default: return singleInputExpressionDefinitionAttributeHandler().accept(def, key, val);
             }
             return true;
         }, namespaceAwareExpressionElementHandler(), expressionDefinitionValueHandler());
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XQueryEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XQueryEndpointBuilderFactory.java
index aee46404b97..dbff8988f78 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XQueryEndpointBuilderFactory.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XQueryEndpointBuilderFactory.java
@@ -125,6 +125,22 @@ public interface XQueryEndpointBuilderFactory {
             doSetProperty("namespacePrefixes", namespacePrefixes);
             return this;
         }
+        /**
+         * To use a Camel Exchange property as the input source instead of
+         * Message body. It has a lower precedent than the name of header if
+         * both are set.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param propertyName the value to set
+         * @return the dsl builder
+         */
+        default XQueryEndpointConsumerBuilder propertyName(String propertyName) {
+            doSetProperty("propertyName", propertyName);
+            return this;
+        }
         /**
          * What output result to use.
          * 
@@ -1182,6 +1198,22 @@ public interface XQueryEndpointBuilderFactory {
             doSetProperty("namespacePrefixes", namespacePrefixes);
             return this;
         }
+        /**
+         * To use a Camel Exchange property as the input source instead of
+         * Message body. It has a lower precedent than the name of header if
+         * both are set.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param propertyName the value to set
+         * @return the dsl builder
+         */
+        default XQueryEndpointProducerBuilder propertyName(String propertyName) {
+            doSetProperty("propertyName", propertyName);
+            return this;
+        }
         /**
          * What output result to use.
          * 
@@ -1624,6 +1656,22 @@ public interface XQueryEndpointBuilderFactory {
             doSetProperty("namespacePrefixes", namespacePrefixes);
             return this;
         }
+        /**
+         * To use a Camel Exchange property as the input source instead of
+         * Message body. It has a lower precedent than the name of header if
+         * both are set.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param propertyName the value to set
+         * @return the dsl builder
+         */
+        default XQueryEndpointBuilder propertyName(String propertyName) {
+            doSetProperty("propertyName", propertyName);
+            return this;
+        }
         /**
          * What output result to use.
          * 
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
index f8548a4ff97..44b8fc6a07e 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
@@ -5813,6 +5813,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
             properties = {
                     @YamlProperty(name = "expression", type = "string", required = true),
                     @YamlProperty(name = "id", type = "string"),
+                    @YamlProperty(name = "result-type", type = "string"),
                     @YamlProperty(name = "trim", type = "boolean")
             }
     )
@@ -5845,6 +5846,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setId(val);
                     break;
                 }
+                case "result-type": {
+                    String val = asText(node);
+                    target.setResultTypeName(val);
+                    break;
+                }
                 case "trim": {
                     String val = asText(node);
                     target.setTrim(val);
@@ -6200,7 +6206,10 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
             order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
             properties = {
                     @YamlProperty(name = "expression", type = "string", required = true),
+                    @YamlProperty(name = "header-name", type = "string"),
                     @YamlProperty(name = "id", type = "string"),
+                    @YamlProperty(name = "property-name", type = "string"),
+                    @YamlProperty(name = "result-type", type = "string"),
                     @YamlProperty(name = "trim", type = "boolean")
             }
     )
@@ -6228,11 +6237,26 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setExpression(val);
                     break;
                 }
+                case "header-name": {
+                    String val = asText(node);
+                    target.setHeaderName(val);
+                    break;
+                }
                 case "id": {
                     String val = asText(node);
                     target.setId(val);
                     break;
                 }
+                case "property-name": {
+                    String val = asText(node);
+                    target.setPropertyName(val);
+                    break;
+                }
+                case "result-type": {
+                    String val = asText(node);
+                    target.setResultTypeName(val);
+                    break;
+                }
                 case "trim": {
                     String val = asText(node);
                     target.setTrim(val);
@@ -6966,7 +6990,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
             order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
             properties = {
                     @YamlProperty(name = "expression", type = "string", required = true),
-                    @YamlProperty(name = "header-name", type = "string"),
                     @YamlProperty(name = "id", type = "string"),
                     @YamlProperty(name = "result-type", type = "string"),
                     @YamlProperty(name = "trim", type = "boolean")
@@ -6996,11 +7019,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setExpression(val);
                     break;
                 }
-                case "header-name": {
-                    String val = asText(node);
-                    target.setHeaderName(val);
-                    break;
-                }
                 case "id": {
                     String val = asText(node);
                     target.setId(val);
@@ -7271,6 +7289,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "expression", type = "string", required = true),
                     @YamlProperty(name = "header-name", type = "string"),
                     @YamlProperty(name = "id", type = "string"),
+                    @YamlProperty(name = "property-name", type = "string"),
                     @YamlProperty(name = "result-type", type = "string"),
                     @YamlProperty(name = "trim", type = "boolean")
             }
@@ -7309,6 +7328,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setId(val);
                     break;
                 }
+                case "property-name": {
+                    String val = asText(node);
+                    target.setPropertyName(val);
+                    break;
+                }
                 case "result-type": {
                     String val = asText(node);
                     target.setResultTypeName(val);
@@ -7569,6 +7593,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "header-name", type = "string"),
                     @YamlProperty(name = "id", type = "string"),
                     @YamlProperty(name = "option", type = "enum:DEFAULT_PATH_LEAF_TO_NULL,ALWAYS_RETURN_LIST,AS_PATH_LIST,SUPPRESS_EXCEPTIONS,REQUIRE_PROPERTIES"),
+                    @YamlProperty(name = "property-name", type = "string"),
                     @YamlProperty(name = "result-type", type = "string"),
                     @YamlProperty(name = "suppress-exceptions", type = "boolean"),
                     @YamlProperty(name = "trim", type = "boolean"),
@@ -7625,6 +7650,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setOption(val);
                     break;
                 }
+                case "property-name": {
+                    String val = asText(node);
+                    target.setPropertyName(val);
+                    break;
+                }
                 case "result-type": {
                     String val = asText(node);
                     target.setResultTypeName(val);
@@ -8653,6 +8683,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "id", type = "string"),
                     @YamlProperty(name = "method", type = "string"),
                     @YamlProperty(name = "ref", type = "string"),
+                    @YamlProperty(name = "result-type", type = "string"),
                     @YamlProperty(name = "scope", type = "enum:Singleton,Request,Prototype"),
                     @YamlProperty(name = "trim", type = "boolean")
             }
@@ -8696,6 +8727,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setRef(val);
                     break;
                 }
+                case "result-type": {
+                    String val = asText(node);
+                    target.setResultTypeName(val);
+                    break;
+                }
                 case "scope": {
                     String val = asText(node);
                     target.setScope(val);
@@ -8967,6 +9003,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
             properties = {
                     @YamlProperty(name = "expression", type = "string", required = true),
                     @YamlProperty(name = "id", type = "string"),
+                    @YamlProperty(name = "result-type", type = "string"),
                     @YamlProperty(name = "trim", type = "boolean")
             }
     )
@@ -8999,6 +9036,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setId(val);
                     break;
                 }
+                case "result-type": {
+                    String val = asText(node);
+                    target.setResultTypeName(val);
+                    break;
+                }
                 case "trim": {
                     String val = asText(node);
                     target.setTrim(val);
@@ -9136,6 +9178,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
             properties = {
                     @YamlProperty(name = "expression", type = "string", required = true),
                     @YamlProperty(name = "id", type = "string"),
+                    @YamlProperty(name = "result-type", type = "string"),
                     @YamlProperty(name = "trim", type = "boolean")
             }
     )
@@ -9168,6 +9211,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setId(val);
                     break;
                 }
+                case "result-type": {
+                    String val = asText(node);
+                    target.setResultTypeName(val);
+                    break;
+                }
                 case "trim": {
                     String val = asText(node);
                     target.setTrim(val);
@@ -11164,7 +11212,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
             order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
             properties = {
                     @YamlProperty(name = "expression", type = "string", required = true),
-                    @YamlProperty(name = "header-name", type = "string"),
                     @YamlProperty(name = "id", type = "string"),
                     @YamlProperty(name = "result-type", type = "string"),
                     @YamlProperty(name = "trim", type = "boolean")
@@ -11194,11 +11241,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setExpression(val);
                     break;
                 }
-                case "header-name": {
-                    String val = asText(node);
-                    target.setHeaderName(val);
-                    break;
-                }
                 case "id": {
                     String val = asText(node);
                     target.setId(val);
@@ -11610,6 +11652,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
             properties = {
                     @YamlProperty(name = "expression", type = "string", required = true),
                     @YamlProperty(name = "id", type = "string"),
+                    @YamlProperty(name = "result-type", type = "string"),
                     @YamlProperty(name = "trim", type = "boolean")
             }
     )
@@ -11642,6 +11685,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setId(val);
                     break;
                 }
+                case "result-type": {
+                    String val = asText(node);
+                    target.setResultTypeName(val);
+                    break;
+                }
                 case "trim": {
                     String val = asText(node);
                     target.setTrim(val);
@@ -15073,6 +15121,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
             properties = {
                     @YamlProperty(name = "expression", type = "string", required = true),
                     @YamlProperty(name = "id", type = "string"),
+                    @YamlProperty(name = "result-type", type = "string"),
                     @YamlProperty(name = "trim", type = "boolean")
             }
     )
@@ -15105,6 +15154,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setId(val);
                     break;
                 }
+                case "result-type": {
+                    String val = asText(node);
+                    target.setResultTypeName(val);
+                    break;
+                }
                 case "trim": {
                     String val = asText(node);
                     target.setTrim(val);
@@ -16602,6 +16656,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "id", type = "string"),
                     @YamlProperty(name = "include-tokens", type = "boolean"),
                     @YamlProperty(name = "inherit-namespace-tag-name", type = "string"),
+                    @YamlProperty(name = "property-name", type = "string"),
                     @YamlProperty(name = "regex", type = "boolean"),
                     @YamlProperty(name = "skip-first", type = "boolean"),
                     @YamlProperty(name = "token", type = "string", required = true),
@@ -16663,6 +16718,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setInheritNamespaceTagName(val);
                     break;
                 }
+                case "property-name": {
+                    String val = asText(node);
+                    target.setPropertyName(val);
+                    break;
+                }
                 case "regex": {
                     String val = asText(node);
                     target.setRegex(val);
@@ -18369,6 +18429,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "id", type = "string"),
                     @YamlProperty(name = "mode", type = "enum:i,w,u,t"),
                     @YamlProperty(name = "namespace", type = "array:org.apache.camel.model.PropertyDefinition"),
+                    @YamlProperty(name = "property-name", type = "string"),
                     @YamlProperty(name = "trim", type = "boolean")
             }
     )
@@ -18416,6 +18477,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setNamespace(val);
                     break;
                 }
+                case "property-name": {
+                    String val = asText(node);
+                    target.setPropertyName(val);
+                    break;
+                }
                 case "trim": {
                     String val = asText(node);
                     target.setTrim(val);
@@ -18453,6 +18519,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "namespace", type = "array:org.apache.camel.model.PropertyDefinition"),
                     @YamlProperty(name = "object-model", type = "string"),
                     @YamlProperty(name = "pre-compile", type = "boolean"),
+                    @YamlProperty(name = "property-name", type = "string"),
                     @YamlProperty(name = "result-type", type = "enum:NUMBER,STRING,BOOLEAN,NODESET,NODE"),
                     @YamlProperty(name = "saxon", type = "boolean"),
                     @YamlProperty(name = "thread-safety", type = "boolean"),
@@ -18523,6 +18590,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setPreCompile(val);
                     break;
                 }
+                case "property-name": {
+                    String val = asText(node);
+                    target.setPropertyName(val);
+                    break;
+                }
                 case "result-type": {
                     String val = asText(node);
                     target.setResultTypeName(val);
@@ -18571,6 +18643,8 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     @YamlProperty(name = "header-name", type = "string"),
                     @YamlProperty(name = "id", type = "string"),
                     @YamlProperty(name = "namespace", type = "array:org.apache.camel.model.PropertyDefinition"),
+                    @YamlProperty(name = "property-name", type = "string"),
+                    @YamlProperty(name = "result-type", type = "string"),
                     @YamlProperty(name = "trim", type = "boolean"),
                     @YamlProperty(name = "type", type = "string")
             }
@@ -18619,6 +18693,16 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     target.setNamespace(val);
                     break;
                 }
+                case "property-name": {
+                    String val = asText(node);
+                    target.setPropertyName(val);
+                    break;
+                }
+                case "result-type": {
+                    String val = asText(node);
+                    target.setResultTypeName(val);
+                    break;
+                }
                 case "trim": {
                     String val = asText(node);
                     target.setTrim(val);
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json
index d390d3d2c52..960fa3c8b7f 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json
@@ -6365,6 +6365,9 @@
             "id" : {
               "type" : "string"
             },
+            "result-type" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             }
@@ -6400,9 +6403,18 @@
             "expression" : {
               "type" : "string"
             },
+            "header-name" : {
+              "type" : "string"
+            },
             "id" : {
               "type" : "string"
             },
+            "property-name" : {
+              "type" : "string"
+            },
+            "result-type" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             }
@@ -6419,9 +6431,6 @@
             "expression" : {
               "type" : "string"
             },
-            "header-name" : {
-              "type" : "string"
-            },
             "id" : {
               "type" : "string"
             },
@@ -6478,6 +6487,9 @@
             "id" : {
               "type" : "string"
             },
+            "property-name" : {
+              "type" : "string"
+            },
             "result-type" : {
               "type" : "string"
             },
@@ -6513,6 +6525,9 @@
               "type" : "string",
               "enum" : [ "DEFAULT_PATH_LEAF_TO_NULL", "ALWAYS_RETURN_LIST", "AS_PATH_LIST", "SUPPRESS_EXCEPTIONS", "REQUIRE_PROPERTIES" ]
             },
+            "property-name" : {
+              "type" : "string"
+            },
             "result-type" : {
               "type" : "string"
             },
@@ -6568,6 +6583,9 @@
             "ref" : {
               "type" : "string"
             },
+            "result-type" : {
+              "type" : "string"
+            },
             "scope" : {
               "type" : "string",
               "enum" : [ "Singleton", "Request", "Prototype" ]
@@ -6590,6 +6608,9 @@
             "id" : {
               "type" : "string"
             },
+            "result-type" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             }
@@ -6609,6 +6630,9 @@
             "id" : {
               "type" : "string"
             },
+            "result-type" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             }
@@ -6625,9 +6649,6 @@
             "expression" : {
               "type" : "string"
             },
-            "header-name" : {
-              "type" : "string"
-            },
             "id" : {
               "type" : "string"
             },
@@ -6653,6 +6674,9 @@
             "id" : {
               "type" : "string"
             },
+            "result-type" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             }
@@ -6694,6 +6718,9 @@
             "id" : {
               "type" : "string"
             },
+            "result-type" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             }
@@ -6728,6 +6755,9 @@
             "inherit-namespace-tag-name" : {
               "type" : "string"
             },
+            "property-name" : {
+              "type" : "string"
+            },
             "regex" : {
               "type" : "boolean"
             },
@@ -6772,6 +6802,9 @@
                 "$ref" : "#/items/definitions/org.apache.camel.model.PropertyDefinition"
               }
             },
+            "property-name" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             }
@@ -6814,6 +6847,9 @@
             "pre-compile" : {
               "type" : "boolean"
             },
+            "property-name" : {
+              "type" : "string"
+            },
             "result-type" : {
               "type" : "string",
               "enum" : [ "NUMBER", "STRING", "BOOLEAN", "NODESET", "NODE" ]
@@ -6855,6 +6891,12 @@
                 "$ref" : "#/items/definitions/org.apache.camel.model.PropertyDefinition"
               }
             },
+            "property-name" : {
+              "type" : "string"
+            },
+            "result-type" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             },
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
index 6e8d050fd1d..d98ccef879d 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
@@ -6266,6 +6266,9 @@
             "id" : {
               "type" : "string"
             },
+            "resultType" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             }
@@ -6301,9 +6304,18 @@
             "expression" : {
               "type" : "string"
             },
+            "headerName" : {
+              "type" : "string"
+            },
             "id" : {
               "type" : "string"
             },
+            "propertyName" : {
+              "type" : "string"
+            },
+            "resultType" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             }
@@ -6320,9 +6332,6 @@
             "expression" : {
               "type" : "string"
             },
-            "headerName" : {
-              "type" : "string"
-            },
             "id" : {
               "type" : "string"
             },
@@ -6379,6 +6388,9 @@
             "id" : {
               "type" : "string"
             },
+            "propertyName" : {
+              "type" : "string"
+            },
             "resultType" : {
               "type" : "string"
             },
@@ -6414,6 +6426,9 @@
               "type" : "string",
               "enum" : [ "DEFAULT_PATH_LEAF_TO_NULL", "ALWAYS_RETURN_LIST", "AS_PATH_LIST", "SUPPRESS_EXCEPTIONS", "REQUIRE_PROPERTIES" ]
             },
+            "propertyName" : {
+              "type" : "string"
+            },
             "resultType" : {
               "type" : "string"
             },
@@ -6469,6 +6484,9 @@
             "ref" : {
               "type" : "string"
             },
+            "resultType" : {
+              "type" : "string"
+            },
             "scope" : {
               "type" : "string",
               "enum" : [ "Singleton", "Request", "Prototype" ]
@@ -6491,6 +6509,9 @@
             "id" : {
               "type" : "string"
             },
+            "resultType" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             }
@@ -6510,6 +6531,9 @@
             "id" : {
               "type" : "string"
             },
+            "resultType" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             }
@@ -6526,9 +6550,6 @@
             "expression" : {
               "type" : "string"
             },
-            "headerName" : {
-              "type" : "string"
-            },
             "id" : {
               "type" : "string"
             },
@@ -6554,6 +6575,9 @@
             "id" : {
               "type" : "string"
             },
+            "resultType" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             }
@@ -6595,6 +6619,9 @@
             "id" : {
               "type" : "string"
             },
+            "resultType" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             }
@@ -6629,6 +6656,9 @@
             "inheritNamespaceTagName" : {
               "type" : "string"
             },
+            "propertyName" : {
+              "type" : "string"
+            },
             "regex" : {
               "type" : "boolean"
             },
@@ -6673,6 +6703,9 @@
                 "$ref" : "#/items/definitions/org.apache.camel.model.PropertyDefinition"
               }
             },
+            "propertyName" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             }
@@ -6715,6 +6748,9 @@
             "preCompile" : {
               "type" : "boolean"
             },
+            "propertyName" : {
+              "type" : "string"
+            },
             "resultType" : {
               "type" : "string",
               "enum" : [ "NUMBER", "STRING", "BOOLEAN", "NODESET", "NODE" ]
@@ -6756,6 +6792,12 @@
                 "$ref" : "#/items/definitions/org.apache.camel.model.PropertyDefinition"
               }
             },
+            "propertyName" : {
+              "type" : "string"
+            },
+            "resultType" : {
+              "type" : "string"
+            },
             "trim" : {
               "type" : "boolean"
             },