You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/11/26 08:45:55 UTC

[camel] branch master updated (89d92a7 -> f2b5858)

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

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


    from 89d92a7  Sync deps
     new 81f8d1d  CAMEL-15704: camel-csimple - Compiled simple language.
     new 5656ff7  Polishe lightweight mode INFO logging
     new f2b5858  CAMEL-15704: camel-csimple - Compiled simple language.

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


Summary of changes:
 bom/camel-bom/pom.xml                              |   5 +
 .../src/main/resources/camel-checkstyle.xml        |   4 +-
 .../org/apache/camel/catalog/docs.properties       |   2 +
 .../apache/camel/catalog/docs/csimple-joor.adoc    |  46 ++
 .../camel/catalog/docs/csimple-language.adoc       | 148 ++++++
 .../apache/camel/catalog/docs/simple-language.adoc |   5 +
 .../org/apache/camel/catalog/languages.properties  |   1 +
 .../apache/camel/catalog/languages/csimple.json    |  24 +
 .../org/apache/camel/catalog/models.properties     |   1 +
 .../org/apache/camel/catalog/models/aggregate.json |   8 +-
 .../org/apache/camel/catalog/models/csimple.json   |  20 +
 .../org/apache/camel/catalog/models/delay.json     |   2 +-
 .../apache/camel/catalog/models/dynamicRouter.json |   2 +-
 .../org/apache/camel/catalog/models/enrich.json    |   2 +-
 .../org/apache/camel/catalog/models/filter.json    |   2 +-
 .../camel/catalog/models/idempotentConsumer.json   |   2 +-
 .../org/apache/camel/catalog/models/loop.json      |   2 +-
 .../apache/camel/catalog/models/onException.json   |   6 +-
 .../apache/camel/catalog/models/pollEnrich.json    |   2 +-
 .../apache/camel/catalog/models/recipientList.json |   2 +-
 .../apache/camel/catalog/models/resequence.json    |   2 +-
 .../apache/camel/catalog/models/routingSlip.json   |   2 +-
 .../org/apache/camel/catalog/models/script.json    |   2 +-
 .../org/apache/camel/catalog/models/setBody.json   |   2 +-
 .../org/apache/camel/catalog/models/setHeader.json |   2 +-
 .../apache/camel/catalog/models/setProperty.json   |   2 +-
 .../org/apache/camel/catalog/models/sort.json      |   2 +-
 .../org/apache/camel/catalog/models/split.json     |   2 +-
 .../org/apache/camel/catalog/models/sticky.json    |   2 +-
 .../org/apache/camel/catalog/models/throttle.json  |   4 +-
 .../org/apache/camel/catalog/models/transform.json |   2 +-
 .../org/apache/camel/catalog/models/validate.json  |   2 +-
 .../org/apache/camel/catalog/models/when.json      |   2 +-
 .../catalog/models/whenSkipSendToEndpoint.json     |   2 +-
 .../org/apache/camel/catalog/models/wireTap.json   |   2 +-
 .../org/apache/camel/catalog/others.properties     |   1 +
 .../apache/camel/catalog/others/csimple-joor.json  |  14 +
 .../apache/camel/catalog/schemas/camel-spring.xsd  |  46 ++
 catalog/camel-csimple-maven-plugin/pom.xml         | 138 +++++
 .../src/main/docs/camel-csimple-maven-plugin.adoc  |  43 ++
 .../java/org/apache/camel/maven/GenerateMojo.java  | 445 ++++++++++++++++
 .../src/main/resources/META-INF/LICENSE.txt        |   0
 .../src/main/resources/META-INF/NOTICE.txt         |   0
 .../apache/camel/parser/RouteBuilderParser.java    |  55 +-
 .../org/apache/camel/parser/XmlRouteParser.java    |  60 ++-
 .../camel/parser/helper/CamelJavaParserHelper.java |  43 +-
 .../apache/camel/parser/helper/CamelXmlHelper.java |  12 +-
 .../model/CamelCSimpleExpressionDetails.java       |  24 +-
 .../parser/model/CamelSimpleExpressionDetails.java |  89 +---
 ...Details.java => LanguageExpressionDetails.java} |  18 +-
 .../camel/parser/java/MyCSimpleRouteBuilder.java   |  27 +-
 ...> RoasterCSimpleRouteBuilderConfigureTest.java} |  20 +-
 .../RoasterSimpleRouteBuilderConfigureTest.java    |   2 +-
 .../apache/camel/parser/xml/XmlCSimpleTest.java    |  55 ++
 .../org/apache/camel/parser/xml/csimple.xml        |  36 ++
 catalog/pom.xml                                    |   1 +
 components/camel-csimple-joor/pom.xml              |  81 +++
 .../services/org/apache/camel/csimple-compiler     |   2 +
 .../services/org/apache/camel/other.properties     |   7 +
 .../src/generated/resources/csimple-joor.json      |  14 +
 .../src/main/docs/csimple-joor.adoc                |  46 ++
 .../joor/JoorCSimpleCompilationException.java      |  58 +++
 .../language/csimple/joor/JoorCSimpleCompiler.java | 163 ++++++
 .../camel/language/csimple/joor/CSimpleTest.java   |  54 ++
 .../csimple/joor/JoorCSimpleCompilerTest.java      |  62 +++
 .../src/test/resources/log4j2.properties           |  30 ++
 .../camel/impl/engine/AbstractCamelContext.java    |   3 +-
 .../services/org/apache/camel/language.properties  |   2 +-
 .../services/org/apache/camel/language/csimple     |   2 +
 .../org/apache/camel/language/csimple/csimple.json |  24 +
 .../modules/languages/pages/csimple-language.adoc  | 148 ++++++
 .../modules/languages/pages/simple-language.adoc   |   5 +
 .../language/csimple/CSimpleCodeGenerator.java     | 154 ++++++
 .../camel/language/csimple/CSimpleCompiler.java    |  64 +++
 .../CSimpleException.java}                         |  23 +-
 .../CSimpleExpression.java}                        |  24 +-
 .../CSimpleExpressionParser.java}                  |  22 +-
 .../CSimpleGeneratedCode.java}                     |  32 +-
 .../camel/language/csimple/CSimpleHelper.java      | 576 +++++++++++++++++++++
 .../camel/language/csimple/CSimpleLanguage.java    | 245 +++++++++
 .../CSimpleMethod.java}                            |  23 +-
 .../CSimplePredicateParser.java}                   |  22 +-
 .../camel/language/csimple/CSimpleSupport.java     |  60 +++
 .../language/simple/SimpleExpressionParser.java    |  56 +-
 .../language/simple/SimplePredicateParser.java     |  43 +-
 .../language/simple/ast/BinaryExpression.java      |  65 +++
 .../language/simple/ast/BooleanExpression.java     |   5 +
 .../camel/language/simple/ast/CompositeNodes.java  |  18 +
 .../camel/language/simple/ast/DoubleQuoteEnd.java  |   5 +
 .../language/simple/ast/DoubleQuoteStart.java      |  14 +
 .../language/simple/ast/LiteralExpression.java     |   8 +-
 .../language/simple/ast/LogicalExpression.java     |  26 +-
 .../camel/language/simple/ast/NullExpression.java  |   5 +
 .../language/simple/ast/NumericExpression.java     |  16 +
 .../language/simple/ast/SimpleFunctionEnd.java     |   5 +
 .../simple/ast/SimpleFunctionExpression.java       | 558 +++++++++++++++++++-
 .../language/simple/ast/SimpleFunctionStart.java   |  69 +++
 .../camel/language/simple/ast/SimpleNode.java      |   9 +
 .../camel/language/simple/ast/SingleQuoteEnd.java  |   5 +
 .../language/simple/ast/SingleQuoteStart.java      |  18 +
 .../camel/language/simple/ast/UnaryExpression.java |  18 +
 .../services/org/apache/camel/model.properties     |   1 +
 .../org/apache/camel/model/aggregate.json          |   8 +-
 .../resources/org/apache/camel/model/delay.json    |   2 +-
 .../org/apache/camel/model/dynamicRouter.json      |   2 +-
 .../resources/org/apache/camel/model/enrich.json   |   2 +-
 .../resources/org/apache/camel/model/filter.json   |   2 +-
 .../org/apache/camel/model/idempotentConsumer.json |   2 +-
 .../org/apache/camel/model/language/csimple.json   |  20 +
 .../org/apache/camel/model/language/jaxb.index     |   1 +
 .../apache/camel/model/loadbalancer/sticky.json    |   2 +-
 .../resources/org/apache/camel/model/loop.json     |   2 +-
 .../org/apache/camel/model/onException.json        |   6 +-
 .../org/apache/camel/model/pollEnrich.json         |   2 +-
 .../org/apache/camel/model/recipientList.json      |   2 +-
 .../org/apache/camel/model/resequence.json         |   2 +-
 .../org/apache/camel/model/routingSlip.json        |   2 +-
 .../resources/org/apache/camel/model/script.json   |   2 +-
 .../resources/org/apache/camel/model/setBody.json  |   2 +-
 .../org/apache/camel/model/setHeader.json          |   2 +-
 .../org/apache/camel/model/setProperty.json        |   2 +-
 .../resources/org/apache/camel/model/sort.json     |   2 +-
 .../resources/org/apache/camel/model/split.json    |   2 +-
 .../resources/org/apache/camel/model/throttle.json |   4 +-
 .../org/apache/camel/model/transform.json          |   2 +-
 .../resources/org/apache/camel/model/validate.json |   2 +-
 .../resources/org/apache/camel/model/when.json     |   2 +-
 .../apache/camel/model/whenSkipSendToEndpoint.json |   2 +-
 .../resources/org/apache/camel/model/wireTap.json  |   2 +-
 .../org/apache/camel/builder/BuilderSupport.java   |  18 +
 .../org/apache/camel/builder/ExpressionClause.java |  14 +
 .../camel/builder/ExpressionClauseSupport.java     |  24 +
 .../camel/model/language/CSimpleExpression.java    |  74 +++
 .../reifier/language/CSimpleExpressionReifier.java |  67 +++
 .../camel/reifier/language/ExpressionReifier.java  |   3 +
 .../csimple/CSimpleExpressionParserTest.java       | 178 +++++++
 .../csimple/CSimplePredicateParserTest.java        | 105 ++++
 .../apache/camel/language/csimple/CSimpleTest.java |  54 ++
 .../camel/language/csimple/HighPredicate.java}     |  26 +-
 .../camel/language/csimple/MedPredicate.java}      |  26 +-
 .../simple/SimpleExpressionParserNodesTest.java    |  63 +++
 .../simple/SimplePredicateParserNodesTest.java     |  73 +++
 .../services/org/apache/camel/csimple.properties   |  19 +
 .../java/org/apache/camel/util/ObjectHelper.java   |   2 +-
 .../java/org/apache/camel/xml/in/ModelParser.java  |  10 +
 docs/components/modules/languages/nav.adoc         |   1 +
 .../modules/languages/pages/csimple-language.adoc  | 150 ++++++
 .../modules/languages/pages/simple-language.adoc   |   5 +
 docs/components/modules/others/nav.adoc            |   1 +
 .../modules/others/pages/csimple-joor.adoc         |  48 ++
 parent/pom.xml                                     |   5 +
 .../camel/itest/jmh/CSimpleOperatorTest.java       | 131 +++++
 .../org/apache/camel/itest/jmh/CSimpleScript1.java |  28 +-
 .../org/apache/camel/itest/jmh/CSimpleScript2.java |  28 +-
 .../org/apache/camel/itest/jmh/CSimpleScript3.java |  28 +-
 .../services/org/apache/camel/csimple.properties   |  20 +
 156 files changed, 5245 insertions(+), 376 deletions(-)
 create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/csimple-joor.adoc
 create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/csimple-language.adoc
 create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/csimple.json
 create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/csimple.json
 create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/csimple-joor.json
 create mode 100644 catalog/camel-csimple-maven-plugin/pom.xml
 create mode 100644 catalog/camel-csimple-maven-plugin/src/main/docs/camel-csimple-maven-plugin.adoc
 create mode 100644 catalog/camel-csimple-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java
 copy {tooling/swagger-rest-dsl-generator => catalog/camel-csimple-maven-plugin}/src/main/resources/META-INF/LICENSE.txt (100%)
 copy {tooling/maven/camel-resources-plugin => catalog/camel-csimple-maven-plugin}/src/main/resources/META-INF/NOTICE.txt (100%)
 copy core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java => catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelCSimpleExpressionDetails.java (65%)
 copy catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/{CamelSimpleExpressionDetails.java => LanguageExpressionDetails.java} (88%)
 copy core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java => catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/MyCSimpleRouteBuilder.java (63%)
 copy catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/{RoasterSimpleRouteBuilderConfigureTest.java => RoasterCSimpleRouteBuilderConfigureTest.java} (82%)
 create mode 100644 catalog/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlCSimpleTest.java
 create mode 100644 catalog/camel-route-parser/src/test/resources/org/apache/camel/parser/xml/csimple.xml
 create mode 100644 components/camel-csimple-joor/pom.xml
 create mode 100644 components/camel-csimple-joor/src/generated/resources/META-INF/services/org/apache/camel/csimple-compiler
 create mode 100644 components/camel-csimple-joor/src/generated/resources/META-INF/services/org/apache/camel/other.properties
 create mode 100644 components/camel-csimple-joor/src/generated/resources/csimple-joor.json
 create mode 100644 components/camel-csimple-joor/src/main/docs/csimple-joor.adoc
 create mode 100644 components/camel-csimple-joor/src/main/java/org/apache/camel/language/csimple/joor/JoorCSimpleCompilationException.java
 create mode 100644 components/camel-csimple-joor/src/main/java/org/apache/camel/language/csimple/joor/JoorCSimpleCompiler.java
 create mode 100644 components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/CSimpleTest.java
 create mode 100644 components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/JoorCSimpleCompilerTest.java
 create mode 100644 components/camel-csimple-joor/src/test/resources/log4j2.properties
 create mode 100644 core/camel-core-languages/src/generated/resources/META-INF/services/org/apache/camel/language/csimple
 create mode 100644 core/camel-core-languages/src/generated/resources/org/apache/camel/language/csimple/csimple.json
 create mode 100644 core/camel-core-languages/src/main/docs/modules/languages/pages/csimple-language.adoc
 create mode 100644 core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCodeGenerator.java
 create mode 100644 core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCompiler.java
 copy core/camel-core-languages/src/main/java/org/apache/camel/language/{simple/ast/SimpleFunctionEnd.java => csimple/CSimpleException.java} (63%)
 copy core/camel-core-languages/src/main/java/org/apache/camel/language/{simple/ast/SingleQuoteEnd.java => csimple/CSimpleExpression.java} (67%)
 copy core/camel-core-languages/src/main/java/org/apache/camel/language/{simple/ast/SimpleFunctionEnd.java => csimple/CSimpleExpressionParser.java} (63%)
 copy core/camel-core-languages/src/main/java/org/apache/camel/language/{simple/ast/SimpleFunctionEnd.java => csimple/CSimpleGeneratedCode.java} (63%)
 create mode 100644 core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleHelper.java
 create mode 100644 core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleLanguage.java
 copy core/camel-core-languages/src/main/java/org/apache/camel/language/{simple/ast/SimpleFunctionEnd.java => csimple/CSimpleMethod.java} (65%)
 copy core/camel-core-languages/src/main/java/org/apache/camel/language/{simple/ast/SimpleFunctionEnd.java => csimple/CSimplePredicateParser.java} (63%)
 create mode 100644 core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleSupport.java
 create mode 100644 core/camel-core-model/src/generated/resources/org/apache/camel/model/language/csimple.json
 create mode 100644 core/camel-core-model/src/main/java/org/apache/camel/model/language/CSimpleExpression.java
 create mode 100644 core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/CSimpleExpressionReifier.java
 create mode 100644 core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimpleExpressionParserTest.java
 create mode 100644 core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimplePredicateParserTest.java
 create mode 100644 core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimpleTest.java
 copy core/{camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java => camel-core/src/test/java/org/apache/camel/language/csimple/HighPredicate.java} (60%)
 copy core/{camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java => camel-core/src/test/java/org/apache/camel/language/csimple/MedPredicate.java} (60%)
 create mode 100644 core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleExpressionParserNodesTest.java
 create mode 100644 core/camel-core/src/test/java/org/apache/camel/language/simple/SimplePredicateParserNodesTest.java
 create mode 100644 core/camel-core/src/test/resources/META-INF/services/org/apache/camel/csimple.properties
 create mode 100644 docs/components/modules/languages/pages/csimple-language.adoc
 create mode 100644 docs/components/modules/others/pages/csimple-joor.adoc
 create mode 100644 tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleOperatorTest.java
 copy core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java => tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript1.java (57%)
 copy core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java => tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript2.java (57%)
 copy core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java => tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript3.java (57%)
 create mode 100644 tests/camel-jmh/src/test/resources/META-INF/services/org/apache/camel/csimple.properties


[camel] 02/03: Polishe lightweight mode INFO logging

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

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

commit 5656ff735da95f4ffd08e1f6d9b3166364488914
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Nov 25 17:20:14 2020 +0100

    Polishe lightweight mode INFO logging
---
 .../main/java/org/apache/camel/impl/engine/AbstractCamelContext.java   | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index fe18098..9983be0 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -2743,8 +2743,7 @@ public abstract class AbstractCamelContext extends BaseService
             bootstraps.clear();
 
             if (isLightweight()) {
-                LOG.info("Lightweight enabled. Clearing bootstrap services and route model to free up memory."
-                         + " Danger this impacts the CamelContext not being able to add new routes and anything related to camel-core-model.");
+                LOG.info("Lightweight mode enabled. Performing optimizations and memory reduction.");
                 ReifierStrategy.clearReifiers();
                 adapt(ExtendedCamelContext.class).disposeModel();
             }


[camel] 03/03: CAMEL-15704: camel-csimple - Compiled simple language.

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

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

commit f2b5858114de67ce0c526748979c33c26064c3c1
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Nov 26 09:45:24 2020 +0100

    CAMEL-15704: camel-csimple - Compiled simple language.
---
 .../camel/catalog/docs/csimple-language.adoc       | 123 ++++++++++++++++++---
 .../apache/camel/catalog/docs/simple-language.adoc |   5 +
 .../modules/languages/pages/csimple-language.adoc  | 123 ++++++++++++++++++---
 .../modules/languages/pages/simple-language.adoc   |   5 +
 .../csimple/CSimplePredicateParserTest.java        |  47 ++++----
 .../modules/languages/pages/csimple-language.adoc  | 123 ++++++++++++++++++---
 .../modules/languages/pages/simple-language.adoc   |   5 +
 7 files changed, 367 insertions(+), 64 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/csimple-language.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/csimple-language.adoc
index 25f62f0..ae1f337 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/csimple-language.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/csimple-language.adoc
@@ -11,22 +11,122 @@ include::{cq-version}@camel-quarkus:ROOT:partial$reference/languages/csimple.ado
 
 The CSimple language is *compiled* xref:simple-language.adoc[Simple] language.
 
-
 == Different between CSimple and Simple
 
-The simple language is a dynamic expression language which is runtime parsed into a set of Camel `Expression`'s or `Predicate`'s.
+The simple language is a dynamic expression language which is runtime parsed into a set of Camel Expressions or Predicates.
 
-The csimple language is parsed into regular Java source code and compiled together with all the other source code, or it
-can be compiled once during bootstrap via the `camel-csimple-joor` module.
+The csimple language is parsed into regular Java source code and compiled together with all the other source code,
+or compiled once during bootstrap via the `camel-csimple-joor` module.
 
 The simple langauge is generally very lightweight and fast, however for some use-cases with dynamic method calls via OGNL paths,
-then the simple language does runtime introspection and reflection calls. This has an overhead on performance, and one of the reasons
-why csimple was created. However csimple requires to be typesafe and method calls via OGNL paths requires to know the type during parsing.
-This means for csimple languages expressions you would need to provide the class type where as simple could introspect this at runtime.
+then the simple language does runtime introspection and reflection calls. This has an overhead on performance,
+and was one of the reasons why csimple was created.
 
-In other words the simple language is using _duck typing_ (if it looks like a duck, and quacks like a duck, then it is a duck)
-and csimple is using Java type (typesafety). If there is a type error then simple will report this at runtime, and csimple you will see a Java compiler error.
+Csimple requires to be typesafe and method calls via OGNL paths requires to know the type during parsing.
+This means for csimple languages expressions you would need to provide the class type in the script,
+where as simple introspects this at runtime.
 
+In other words the simple language is using _duck typing_ (if it looks like a duck, and quacks like a duck, then it is a duck)
+and csimple is using Java type (typesafety). If there is a type error then simple will report this at runtime,
+and with csimple there will be a Java compilation error.
+
+== Compilation
+
+The csimple language is parsed into regular Java source code and compiled together with all the other source code, or it can be compiled once during bootstrap via the `camel-csimple-joor` module.
+
+There are two ways to compile csimple
+
+- using the `camel-csimple-maven-plugin` generating source code at built time.
+- using `camel-csimple-joor` which does runtime in-memory compilation during bootstrap of Camel.
+
+=== Using camel-csimple-maven-plugin
+
+You should either use the `camel-csimple-maven-plugin` to use the Maven plugin to discover all the csimple scripts from the source code, and then automatic generate source code in the `src/generated/java` folder, which then gets compiled together with all the other sources.
+
+The maven plugin will do source code scanning of `.java` and `.xml` files (Java and XML DSL).
+The scanner is limited to detect certain code patterns, and it may miss discovering some csimple scripts if they are being used in unusual/rare ways.
+
+The runtime compilation using `camel-csimple-joor` does not have this limitation.
+
+However the pros is that all of the csimple scripts will be compiled using the regular Java compiler and therefore everything is included out of the box as `.class` files in the application JAR file.
+And no additional dependencies is needed at runtime.
+
+See the `camel-example-csimple` example at https://github.com/apache/camel-examples[Camel Examples] which uses the maven plugin.
+
+To use `camel-csimple-maven-plugin` you need to add it to your `pom.xml` file as shown:
+
+[source,xml]
+----
+<plugins>
+    <!-- generate source code for csimple languages -->
+    <plugin>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-csimple-maven-plugin</artifactId>
+        <version>${camel.version}</version>
+        <executions>
+            <execution>
+                <id>generate</id>
+                <goals>
+                    <goal>generate</goal>
+                </goals>
+            </execution>
+        </executions>
+    </plugin>
+    <!-- include source code generated to maven sources paths -->
+    <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <version>3.1.0</version>
+        <executions>
+            <execution>
+                <phase>generate-sources</phase>
+                <goals>
+                    <goal>add-source</goal>
+                    <goal>add-resource</goal>
+                </goals>
+                <configuration>
+                    <sources>
+                        <source>src/generated/java</source>
+                    </sources>
+                    <resources>
+                        <resource>
+                            <directory>src/generated/resources</directory>
+                        </resource>
+                    </resources>
+                </configuration>
+            </execution>
+        </executions>
+    </plugin>
+</plugins>
+----
+
+And then you must also add the `build-helper-maven-plugin` Maven plugin to include `src/generated` to the list of source folders for the Java compiler,
+to ensure the generated source code is compiled and included in the application JAR file.
+
+=== Using camel-csimple-joor
+
+The jOOR library integrates with the Java compiler and performs runtime compilation of Java code.
+
+The supported runtime when using `camel-simple-joor` is intended for Java standalone, Spring Boot, Camel Quarkus and other microservices runtimes.
+It is not supported in OSGi, Camel Karaf or any kind of Java Application Server runtime.
+
+jOOR does not support runtime compilation with Spring Boot using _fat jar_ packaging (https://github.com/jOOQ/jOOR/issues/69),
+it works with exploded classpath.
+
+To use `camel-simple-joor` you simply just add it as dependency to the classpath:
+
+[source,xml]
+----
+<dependency>
+  <groupId>org.apache.camel</groupId>
+  <artifactId>camel-csimple-joor</artifactId>
+  <version>x.x.x</version>
+</dependency>
+----
+
+There is no need for adding Maven plugins to the `pom.xml` file.
+
+See the `camel-example-csimple-joor` example at https://github.com/apache/camel-examples[Camel Examples] which uses the jOOR compiler.
 
 == CSimple Language options
 
@@ -46,8 +146,3 @@ The CSimple language supports 2 options, which are listed below.
 == More documentation
 
 See the xref:simple-language.adoc[Simple] language as csimple has the same set of functions as simple language.
-
-== Example
-
-See `camel-example-csimple` and `camel-example-csimple-joor` examples at https://github.com/apache/camel-examples[Camel Examples]
-
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/simple-language.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/simple-language.adoc
index 97c077a..6e98a0b 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/simple-language.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/simple-language.adoc
@@ -28,6 +28,11 @@ choose a more expressive and powerful language such as:
 
 The simple language uses `${body`} placeholders for complex expressions or functions.
 
+[NOTE]
+====
+See also the xref:csimple-language.adoc[CSimple] language which is *compiled*.
+====
+
 [TIP]
 ====
 *Alternative syntax* 
diff --git a/core/camel-core-languages/src/main/docs/modules/languages/pages/csimple-language.adoc b/core/camel-core-languages/src/main/docs/modules/languages/pages/csimple-language.adoc
index 25f62f0..ae1f337 100644
--- a/core/camel-core-languages/src/main/docs/modules/languages/pages/csimple-language.adoc
+++ b/core/camel-core-languages/src/main/docs/modules/languages/pages/csimple-language.adoc
@@ -11,22 +11,122 @@ include::{cq-version}@camel-quarkus:ROOT:partial$reference/languages/csimple.ado
 
 The CSimple language is *compiled* xref:simple-language.adoc[Simple] language.
 
-
 == Different between CSimple and Simple
 
-The simple language is a dynamic expression language which is runtime parsed into a set of Camel `Expression`'s or `Predicate`'s.
+The simple language is a dynamic expression language which is runtime parsed into a set of Camel Expressions or Predicates.
 
-The csimple language is parsed into regular Java source code and compiled together with all the other source code, or it
-can be compiled once during bootstrap via the `camel-csimple-joor` module.
+The csimple language is parsed into regular Java source code and compiled together with all the other source code,
+or compiled once during bootstrap via the `camel-csimple-joor` module.
 
 The simple langauge is generally very lightweight and fast, however for some use-cases with dynamic method calls via OGNL paths,
-then the simple language does runtime introspection and reflection calls. This has an overhead on performance, and one of the reasons
-why csimple was created. However csimple requires to be typesafe and method calls via OGNL paths requires to know the type during parsing.
-This means for csimple languages expressions you would need to provide the class type where as simple could introspect this at runtime.
+then the simple language does runtime introspection and reflection calls. This has an overhead on performance,
+and was one of the reasons why csimple was created.
 
-In other words the simple language is using _duck typing_ (if it looks like a duck, and quacks like a duck, then it is a duck)
-and csimple is using Java type (typesafety). If there is a type error then simple will report this at runtime, and csimple you will see a Java compiler error.
+Csimple requires to be typesafe and method calls via OGNL paths requires to know the type during parsing.
+This means for csimple languages expressions you would need to provide the class type in the script,
+where as simple introspects this at runtime.
 
+In other words the simple language is using _duck typing_ (if it looks like a duck, and quacks like a duck, then it is a duck)
+and csimple is using Java type (typesafety). If there is a type error then simple will report this at runtime,
+and with csimple there will be a Java compilation error.
+
+== Compilation
+
+The csimple language is parsed into regular Java source code and compiled together with all the other source code, or it can be compiled once during bootstrap via the `camel-csimple-joor` module.
+
+There are two ways to compile csimple
+
+- using the `camel-csimple-maven-plugin` generating source code at built time.
+- using `camel-csimple-joor` which does runtime in-memory compilation during bootstrap of Camel.
+
+=== Using camel-csimple-maven-plugin
+
+You should either use the `camel-csimple-maven-plugin` to use the Maven plugin to discover all the csimple scripts from the source code, and then automatic generate source code in the `src/generated/java` folder, which then gets compiled together with all the other sources.
+
+The maven plugin will do source code scanning of `.java` and `.xml` files (Java and XML DSL).
+The scanner is limited to detect certain code patterns, and it may miss discovering some csimple scripts if they are being used in unusual/rare ways.
+
+The runtime compilation using `camel-csimple-joor` does not have this limitation.
+
+However the pros is that all of the csimple scripts will be compiled using the regular Java compiler and therefore everything is included out of the box as `.class` files in the application JAR file.
+And no additional dependencies is needed at runtime.
+
+See the `camel-example-csimple` example at https://github.com/apache/camel-examples[Camel Examples] which uses the maven plugin.
+
+To use `camel-csimple-maven-plugin` you need to add it to your `pom.xml` file as shown:
+
+[source,xml]
+----
+<plugins>
+    <!-- generate source code for csimple languages -->
+    <plugin>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-csimple-maven-plugin</artifactId>
+        <version>${camel.version}</version>
+        <executions>
+            <execution>
+                <id>generate</id>
+                <goals>
+                    <goal>generate</goal>
+                </goals>
+            </execution>
+        </executions>
+    </plugin>
+    <!-- include source code generated to maven sources paths -->
+    <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <version>3.1.0</version>
+        <executions>
+            <execution>
+                <phase>generate-sources</phase>
+                <goals>
+                    <goal>add-source</goal>
+                    <goal>add-resource</goal>
+                </goals>
+                <configuration>
+                    <sources>
+                        <source>src/generated/java</source>
+                    </sources>
+                    <resources>
+                        <resource>
+                            <directory>src/generated/resources</directory>
+                        </resource>
+                    </resources>
+                </configuration>
+            </execution>
+        </executions>
+    </plugin>
+</plugins>
+----
+
+And then you must also add the `build-helper-maven-plugin` Maven plugin to include `src/generated` to the list of source folders for the Java compiler,
+to ensure the generated source code is compiled and included in the application JAR file.
+
+=== Using camel-csimple-joor
+
+The jOOR library integrates with the Java compiler and performs runtime compilation of Java code.
+
+The supported runtime when using `camel-simple-joor` is intended for Java standalone, Spring Boot, Camel Quarkus and other microservices runtimes.
+It is not supported in OSGi, Camel Karaf or any kind of Java Application Server runtime.
+
+jOOR does not support runtime compilation with Spring Boot using _fat jar_ packaging (https://github.com/jOOQ/jOOR/issues/69),
+it works with exploded classpath.
+
+To use `camel-simple-joor` you simply just add it as dependency to the classpath:
+
+[source,xml]
+----
+<dependency>
+  <groupId>org.apache.camel</groupId>
+  <artifactId>camel-csimple-joor</artifactId>
+  <version>x.x.x</version>
+</dependency>
+----
+
+There is no need for adding Maven plugins to the `pom.xml` file.
+
+See the `camel-example-csimple-joor` example at https://github.com/apache/camel-examples[Camel Examples] which uses the jOOR compiler.
 
 == CSimple Language options
 
@@ -46,8 +146,3 @@ The CSimple language supports 2 options, which are listed below.
 == More documentation
 
 See the xref:simple-language.adoc[Simple] language as csimple has the same set of functions as simple language.
-
-== Example
-
-See `camel-example-csimple` and `camel-example-csimple-joor` examples at https://github.com/apache/camel-examples[Camel Examples]
-
diff --git a/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc b/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc
index 97c077a..6e98a0b 100644
--- a/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc
+++ b/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc
@@ -28,6 +28,11 @@ choose a more expressive and powerful language such as:
 
 The simple language uses `${body`} placeholders for complex expressions or functions.
 
+[NOTE]
+====
+See also the xref:csimple-language.adoc[CSimple] language which is *compiled*.
+====
+
 [TIP]
 ====
 *Alternative syntax* 
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimplePredicateParserTest.java b/core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimplePredicateParserTest.java
index 47fd3c3..940986f 100644
--- a/core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimplePredicateParserTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimplePredicateParserTest.java
@@ -26,43 +26,44 @@ public class CSimplePredicateParserTest {
         CSimplePredicateParser parser = new CSimplePredicateParser();
 
         String code = parser.parsePredicate("'bar' != 'foo'");
-        Assertions.assertEquals("'bar' != 'foo'", code);
+        Assertions.assertEquals("isNotEqualTo(exchange, 'bar', 'foo')", code);
 
         code = parser.parsePredicate("${body} == 'foo'");
-        Assertions.assertEquals("body == 'foo'", code);
+        Assertions.assertEquals("isEqualTo(exchange, body, 'foo')", code);
 
         code = parser.parsePredicate("${body} != 'foo'");
-        Assertions.assertEquals("body != 'foo'", code);
+        Assertions.assertEquals("isNotEqualTo(exchange, body, 'foo')", code);
 
         code = parser.parsePredicate("${body} == 123");
-        Assertions.assertEquals("body == 123", code); // integer value
+        Assertions.assertEquals("isEqualTo(exchange, body, 123)", code);
 
         code = parser.parsePredicate("${body} > 9.95");
-        Assertions.assertEquals("body > 9.95d", code); // double value
+        Assertions.assertEquals("isGreaterThan(exchange, body, 9.95d)", code); // double value
 
         code = parser.parsePredicate("${body} > 123456789012345");
-        Assertions.assertEquals("body > 123456789012345l", code); // long value
+        Assertions.assertEquals("isGreaterThan(exchange, body, 123456789012345l)", code); // long value
 
         code = parser.parsePredicate("${bodyAs(int)} == 123");
-        Assertions.assertEquals("bodyAs(message, int.class) == 123", code);
+        Assertions.assertEquals("isEqualTo(exchange, bodyAs(message, int.class), 123)", code);
 
         code = parser.parsePredicate("${bodyAs(String).length()} == 4");
-        Assertions.assertEquals("bodyAs(message, String.class).length() == 4", code);
+        Assertions.assertEquals("isEqualTo(exchange, bodyAs(message, String.class).length(), 4)", code);
 
         code = parser.parsePredicate("${bodyAs(String).substring(3)} == 'DEF'");
-        Assertions.assertEquals("bodyAs(message, String.class).substring(3) == 'DEF'", code);
+        Assertions.assertEquals("isEqualTo(exchange, bodyAs(message, String.class).substring(3), 'DEF')", code);
 
         code = parser.parsePredicate("${bodyAs(int)} > ${headerAs('foo', int)}");
-        Assertions.assertEquals("bodyAs(message, int.class) > headerAs(message, 'foo', int.class)", code);
+        Assertions.assertEquals("isGreaterThan(exchange, bodyAs(message, int.class), headerAs(message, 'foo', int.class))",
+                code);
 
         code = parser.parsePredicate("${camelContext.getName()} == 'myCamel'");
-        Assertions.assertEquals("camelContext.getName() == 'myCamel'", code);
+        Assertions.assertEquals("isEqualTo(exchange, camelContext.getName(), 'myCamel')", code);
 
         code = parser.parsePredicate("${camelContext.name} == 'myCamel'");
-        Assertions.assertEquals("camelContext.getName() == 'myCamel'", code);
+        Assertions.assertEquals("isEqualTo(exchange, camelContext.getName(), 'myCamel')", code);
 
         code = parser.parsePredicate("${camelContext.inflightRepository.size()} > 0");
-        Assertions.assertEquals("camelContext.getInflightRepository().size() > 0", code);
+        Assertions.assertEquals("isGreaterThan(exchange, camelContext.getInflightRepository().size(), 0)", code);
     }
 
     @Test
@@ -70,33 +71,35 @@ public class CSimplePredicateParserTest {
         CSimplePredicateParser parser = new CSimplePredicateParser();
 
         String code = parser.parsePredicate("${body.substring(1, ${header.max})} == 'foo'");
-        Assertions.assertEquals("body.substring(1, header(message, 'max')) == 'foo'", code);
+        Assertions.assertEquals("isEqualTo(exchange, body.substring(1, header(message, 'max')), 'foo')", code);
     }
 
     @Test
     public void testParseSysFunctions() throws Exception {
         CSimplePredicateParser parser = new CSimplePredicateParser();
         String code = parser.parsePredicate("${sys.foo} != 'bar'");
-        Assertions.assertEquals("sys('foo') != 'bar'", code);
+        Assertions.assertEquals("isNotEqualTo(exchange, sys('foo'), 'bar')", code);
         code = parser.parsePredicate("${env.foo} != 'bar'");
-        Assertions.assertEquals("sysenv('foo') != 'bar'", code);
+        Assertions.assertEquals("isNotEqualTo(exchange, sysenv('foo'), 'bar')", code);
         code = parser.parsePredicate("${env:FOO} != 'bar'");
-        Assertions.assertEquals("sysenv('FOO') != 'bar'", code);
+        Assertions.assertEquals("isNotEqualTo(exchange, sysenv('FOO'), 'bar')", code);
     }
 
     @Test
     public void testParseExchangeProperty() throws Exception {
         CSimplePredicateParser parser = new CSimplePredicateParser();
         String code = parser.parsePredicate("${exchangeProperty.foo} != 'bar'");
-        Assertions.assertEquals("exchangeProperty(exchange, 'foo') != 'bar'", code);
+        Assertions.assertEquals("isNotEqualTo(exchange, exchangeProperty(exchange, 'foo'), 'bar')", code);
         code = parser.parsePredicate("${exchangeProperty[foo]} != 'bar'");
-        Assertions.assertEquals("exchangeProperty(exchange, 'foo') != 'bar'", code);
+        Assertions.assertEquals("isNotEqualTo(exchange, exchangeProperty(exchange, 'foo'), 'bar')", code);
         code = parser.parsePredicate("${exchangePropertyAs(foo, com.foo.User)} != 'bar'");
-        Assertions.assertEquals("exchangePropertyAs(exchange, 'foo', com.foo.User.class) != 'bar'", code);
+        Assertions.assertEquals("isNotEqualTo(exchange, exchangePropertyAs(exchange, 'foo', com.foo.User.class), 'bar')", code);
         code = parser.parsePredicate("${exchangePropertyAs(foo, com.foo.User).name} != 'bar'");
-        Assertions.assertEquals("exchangePropertyAs(exchange, 'foo', com.foo.User.class).getName() != 'bar'", code);
+        Assertions.assertEquals(
+                "isNotEqualTo(exchange, exchangePropertyAs(exchange, 'foo', com.foo.User.class).getName(), 'bar')", code);
         code = parser.parsePredicate("${exchangePropertyAs(foo, com.foo.User).getName()} != 'bar'");
-        Assertions.assertEquals("exchangePropertyAs(exchange, 'foo', com.foo.User.class).getName() != 'bar'", code);
+        Assertions.assertEquals(
+                "isNotEqualTo(exchange, exchangePropertyAs(exchange, 'foo', com.foo.User.class).getName(), 'bar')", code);
     }
 
 }
diff --git a/docs/components/modules/languages/pages/csimple-language.adoc b/docs/components/modules/languages/pages/csimple-language.adoc
index 1f023bd..f9b3370 100644
--- a/docs/components/modules/languages/pages/csimple-language.adoc
+++ b/docs/components/modules/languages/pages/csimple-language.adoc
@@ -13,22 +13,122 @@ include::{cq-version}@camel-quarkus:ROOT:partial$reference/languages/csimple.ado
 
 The CSimple language is *compiled* xref:simple-language.adoc[Simple] language.
 
-
 == Different between CSimple and Simple
 
-The simple language is a dynamic expression language which is runtime parsed into a set of Camel `Expression`'s or `Predicate`'s.
+The simple language is a dynamic expression language which is runtime parsed into a set of Camel Expressions or Predicates.
 
-The csimple language is parsed into regular Java source code and compiled together with all the other source code, or it
-can be compiled once during bootstrap via the `camel-csimple-joor` module.
+The csimple language is parsed into regular Java source code and compiled together with all the other source code,
+or compiled once during bootstrap via the `camel-csimple-joor` module.
 
 The simple langauge is generally very lightweight and fast, however for some use-cases with dynamic method calls via OGNL paths,
-then the simple language does runtime introspection and reflection calls. This has an overhead on performance, and one of the reasons
-why csimple was created. However csimple requires to be typesafe and method calls via OGNL paths requires to know the type during parsing.
-This means for csimple languages expressions you would need to provide the class type where as simple could introspect this at runtime.
+then the simple language does runtime introspection and reflection calls. This has an overhead on performance,
+and was one of the reasons why csimple was created.
 
-In other words the simple language is using _duck typing_ (if it looks like a duck, and quacks like a duck, then it is a duck)
-and csimple is using Java type (typesafety). If there is a type error then simple will report this at runtime, and csimple you will see a Java compiler error.
+Csimple requires to be typesafe and method calls via OGNL paths requires to know the type during parsing.
+This means for csimple languages expressions you would need to provide the class type in the script,
+where as simple introspects this at runtime.
 
+In other words the simple language is using _duck typing_ (if it looks like a duck, and quacks like a duck, then it is a duck)
+and csimple is using Java type (typesafety). If there is a type error then simple will report this at runtime,
+and with csimple there will be a Java compilation error.
+
+== Compilation
+
+The csimple language is parsed into regular Java source code and compiled together with all the other source code, or it can be compiled once during bootstrap via the `camel-csimple-joor` module.
+
+There are two ways to compile csimple
+
+- using the `camel-csimple-maven-plugin` generating source code at built time.
+- using `camel-csimple-joor` which does runtime in-memory compilation during bootstrap of Camel.
+
+=== Using camel-csimple-maven-plugin
+
+You should either use the `camel-csimple-maven-plugin` to use the Maven plugin to discover all the csimple scripts from the source code, and then automatic generate source code in the `src/generated/java` folder, which then gets compiled together with all the other sources.
+
+The maven plugin will do source code scanning of `.java` and `.xml` files (Java and XML DSL).
+The scanner is limited to detect certain code patterns, and it may miss discovering some csimple scripts if they are being used in unusual/rare ways.
+
+The runtime compilation using `camel-csimple-joor` does not have this limitation.
+
+However the pros is that all of the csimple scripts will be compiled using the regular Java compiler and therefore everything is included out of the box as `.class` files in the application JAR file.
+And no additional dependencies is needed at runtime.
+
+See the `camel-example-csimple` example at https://github.com/apache/camel-examples[Camel Examples] which uses the maven plugin.
+
+To use `camel-csimple-maven-plugin` you need to add it to your `pom.xml` file as shown:
+
+[source,xml]
+----
+<plugins>
+    <!-- generate source code for csimple languages -->
+    <plugin>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-csimple-maven-plugin</artifactId>
+        <version>${camel.version}</version>
+        <executions>
+            <execution>
+                <id>generate</id>
+                <goals>
+                    <goal>generate</goal>
+                </goals>
+            </execution>
+        </executions>
+    </plugin>
+    <!-- include source code generated to maven sources paths -->
+    <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <version>3.1.0</version>
+        <executions>
+            <execution>
+                <phase>generate-sources</phase>
+                <goals>
+                    <goal>add-source</goal>
+                    <goal>add-resource</goal>
+                </goals>
+                <configuration>
+                    <sources>
+                        <source>src/generated/java</source>
+                    </sources>
+                    <resources>
+                        <resource>
+                            <directory>src/generated/resources</directory>
+                        </resource>
+                    </resources>
+                </configuration>
+            </execution>
+        </executions>
+    </plugin>
+</plugins>
+----
+
+And then you must also add the `build-helper-maven-plugin` Maven plugin to include `src/generated` to the list of source folders for the Java compiler,
+to ensure the generated source code is compiled and included in the application JAR file.
+
+=== Using camel-csimple-joor
+
+The jOOR library integrates with the Java compiler and performs runtime compilation of Java code.
+
+The supported runtime when using `camel-simple-joor` is intended for Java standalone, Spring Boot, Camel Quarkus and other microservices runtimes.
+It is not supported in OSGi, Camel Karaf or any kind of Java Application Server runtime.
+
+jOOR does not support runtime compilation with Spring Boot using _fat jar_ packaging (https://github.com/jOOQ/jOOR/issues/69),
+it works with exploded classpath.
+
+To use `camel-simple-joor` you simply just add it as dependency to the classpath:
+
+[source,xml]
+----
+<dependency>
+  <groupId>org.apache.camel</groupId>
+  <artifactId>camel-csimple-joor</artifactId>
+  <version>x.x.x</version>
+</dependency>
+----
+
+There is no need for adding Maven plugins to the `pom.xml` file.
+
+See the `camel-example-csimple-joor` example at https://github.com/apache/camel-examples[Camel Examples] which uses the jOOR compiler.
 
 == CSimple Language options
 
@@ -48,8 +148,3 @@ The CSimple language supports 2 options, which are listed below.
 == More documentation
 
 See the xref:simple-language.adoc[Simple] language as csimple has the same set of functions as simple language.
-
-== Example
-
-See `camel-example-csimple` and `camel-example-csimple-joor` examples at https://github.com/apache/camel-examples[Camel Examples]
-
diff --git a/docs/components/modules/languages/pages/simple-language.adoc b/docs/components/modules/languages/pages/simple-language.adoc
index cb092a65..14e8c42 100644
--- a/docs/components/modules/languages/pages/simple-language.adoc
+++ b/docs/components/modules/languages/pages/simple-language.adoc
@@ -30,6 +30,11 @@ choose a more expressive and powerful language such as:
 
 The simple language uses `${body`} placeholders for complex expressions or functions.
 
+[NOTE]
+====
+See also the xref:csimple-language.adoc[CSimple] language which is *compiled*.
+====
+
 [TIP]
 ====
 *Alternative syntax* 


[camel] 01/03: CAMEL-15704: camel-csimple - Compiled simple language.

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

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

commit 81f8d1dd4ce6371285af3310a7574e53677ff638
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Nov 25 17:14:41 2020 +0100

    CAMEL-15704: camel-csimple - Compiled simple language.
---
 bom/camel-bom/pom.xml                              |   5 +
 .../src/main/resources/camel-checkstyle.xml        |   4 +-
 .../org/apache/camel/catalog/docs.properties       |   2 +
 .../apache/camel/catalog/docs/csimple-joor.adoc    |  46 ++
 .../camel/catalog/docs/csimple-language.adoc       |  53 ++
 .../org/apache/camel/catalog/languages.properties  |   1 +
 .../apache/camel/catalog/languages/csimple.json    |  24 +
 .../org/apache/camel/catalog/models.properties     |   1 +
 .../org/apache/camel/catalog/models/aggregate.json |   8 +-
 .../org/apache/camel/catalog/models/csimple.json   |  20 +
 .../org/apache/camel/catalog/models/delay.json     |   2 +-
 .../apache/camel/catalog/models/dynamicRouter.json |   2 +-
 .../org/apache/camel/catalog/models/enrich.json    |   2 +-
 .../org/apache/camel/catalog/models/filter.json    |   2 +-
 .../camel/catalog/models/idempotentConsumer.json   |   2 +-
 .../org/apache/camel/catalog/models/loop.json      |   2 +-
 .../apache/camel/catalog/models/onException.json   |   6 +-
 .../apache/camel/catalog/models/pollEnrich.json    |   2 +-
 .../apache/camel/catalog/models/recipientList.json |   2 +-
 .../apache/camel/catalog/models/resequence.json    |   2 +-
 .../apache/camel/catalog/models/routingSlip.json   |   2 +-
 .../org/apache/camel/catalog/models/script.json    |   2 +-
 .../org/apache/camel/catalog/models/setBody.json   |   2 +-
 .../org/apache/camel/catalog/models/setHeader.json |   2 +-
 .../apache/camel/catalog/models/setProperty.json   |   2 +-
 .../org/apache/camel/catalog/models/sort.json      |   2 +-
 .../org/apache/camel/catalog/models/split.json     |   2 +-
 .../org/apache/camel/catalog/models/sticky.json    |   2 +-
 .../org/apache/camel/catalog/models/throttle.json  |   4 +-
 .../org/apache/camel/catalog/models/transform.json |   2 +-
 .../org/apache/camel/catalog/models/validate.json  |   2 +-
 .../org/apache/camel/catalog/models/when.json      |   2 +-
 .../catalog/models/whenSkipSendToEndpoint.json     |   2 +-
 .../org/apache/camel/catalog/models/wireTap.json   |   2 +-
 .../org/apache/camel/catalog/others.properties     |   1 +
 .../apache/camel/catalog/others/csimple-joor.json  |  14 +
 .../apache/camel/catalog/schemas/camel-spring.xsd  |  46 ++
 catalog/camel-csimple-maven-plugin/pom.xml         | 138 +++++
 .../src/main/docs/camel-csimple-maven-plugin.adoc  |  43 ++
 .../java/org/apache/camel/maven/GenerateMojo.java  | 445 ++++++++++++++++
 .../src/main/resources/META-INF/LICENSE.txt        | 203 ++++++++
 .../src/main/resources/META-INF/NOTICE.txt         |  11 +
 .../apache/camel/parser/RouteBuilderParser.java    |  55 +-
 .../org/apache/camel/parser/XmlRouteParser.java    |  60 ++-
 .../camel/parser/helper/CamelJavaParserHelper.java |  43 +-
 .../apache/camel/parser/helper/CamelXmlHelper.java |  12 +-
 .../model/CamelCSimpleExpressionDetails.java       |  24 +-
 .../parser/model/CamelSimpleExpressionDetails.java |  89 +---
 ...Details.java => LanguageExpressionDetails.java} |  18 +-
 .../camel/parser/java/MyCSimpleRouteBuilder.java   |  27 +-
 ...> RoasterCSimpleRouteBuilderConfigureTest.java} |  20 +-
 .../RoasterSimpleRouteBuilderConfigureTest.java    |   2 +-
 .../apache/camel/parser/xml/XmlCSimpleTest.java    |  55 ++
 .../org/apache/camel/parser/xml/csimple.xml        |  36 ++
 catalog/pom.xml                                    |   1 +
 components/camel-csimple-joor/pom.xml              |  81 +++
 .../services/org/apache/camel/csimple-compiler     |   2 +
 .../services/org/apache/camel/other.properties     |   7 +
 .../src/generated/resources/csimple-joor.json      |  14 +
 .../src/main/docs/csimple-joor.adoc                |  46 ++
 .../joor/JoorCSimpleCompilationException.java      |  58 +++
 .../language/csimple/joor/JoorCSimpleCompiler.java | 163 ++++++
 .../camel/language/csimple/joor/CSimpleTest.java   |  54 ++
 .../csimple/joor/JoorCSimpleCompilerTest.java      |  62 +++
 .../src/test/resources/log4j2.properties           |  30 ++
 .../services/org/apache/camel/language.properties  |   2 +-
 .../services/org/apache/camel/language/csimple     |   2 +
 .../org/apache/camel/language/csimple/csimple.json |  24 +
 .../modules/languages/pages/csimple-language.adoc  |  53 ++
 .../language/csimple/CSimpleCodeGenerator.java     | 154 ++++++
 .../camel/language/csimple/CSimpleCompiler.java    |  64 +++
 .../CSimpleException.java}                         |  23 +-
 .../CSimpleExpression.java}                        |  24 +-
 .../CSimpleExpressionParser.java}                  |  22 +-
 .../CSimpleGeneratedCode.java}                     |  32 +-
 .../camel/language/csimple/CSimpleHelper.java      | 576 +++++++++++++++++++++
 .../camel/language/csimple/CSimpleLanguage.java    | 245 +++++++++
 .../CSimpleMethod.java}                            |  23 +-
 .../CSimplePredicateParser.java}                   |  22 +-
 .../camel/language/csimple/CSimpleSupport.java     |  60 +++
 .../language/simple/SimpleExpressionParser.java    |  56 +-
 .../language/simple/SimplePredicateParser.java     |  43 +-
 .../language/simple/ast/BinaryExpression.java      |  65 +++
 .../language/simple/ast/BooleanExpression.java     |   5 +
 .../camel/language/simple/ast/CompositeNodes.java  |  18 +
 .../camel/language/simple/ast/DoubleQuoteEnd.java  |   5 +
 .../language/simple/ast/DoubleQuoteStart.java      |  14 +
 .../language/simple/ast/LiteralExpression.java     |   8 +-
 .../language/simple/ast/LogicalExpression.java     |  26 +-
 .../camel/language/simple/ast/NullExpression.java  |   5 +
 .../language/simple/ast/NumericExpression.java     |  16 +
 .../language/simple/ast/SimpleFunctionEnd.java     |   5 +
 .../simple/ast/SimpleFunctionExpression.java       | 558 +++++++++++++++++++-
 .../language/simple/ast/SimpleFunctionStart.java   |  69 +++
 .../camel/language/simple/ast/SimpleNode.java      |   9 +
 .../camel/language/simple/ast/SingleQuoteEnd.java  |   5 +
 .../language/simple/ast/SingleQuoteStart.java      |  18 +
 .../camel/language/simple/ast/UnaryExpression.java |  18 +
 .../services/org/apache/camel/model.properties     |   1 +
 .../org/apache/camel/model/aggregate.json          |   8 +-
 .../resources/org/apache/camel/model/delay.json    |   2 +-
 .../org/apache/camel/model/dynamicRouter.json      |   2 +-
 .../resources/org/apache/camel/model/enrich.json   |   2 +-
 .../resources/org/apache/camel/model/filter.json   |   2 +-
 .../org/apache/camel/model/idempotentConsumer.json |   2 +-
 .../org/apache/camel/model/language/csimple.json   |  20 +
 .../org/apache/camel/model/language/jaxb.index     |   1 +
 .../apache/camel/model/loadbalancer/sticky.json    |   2 +-
 .../resources/org/apache/camel/model/loop.json     |   2 +-
 .../org/apache/camel/model/onException.json        |   6 +-
 .../org/apache/camel/model/pollEnrich.json         |   2 +-
 .../org/apache/camel/model/recipientList.json      |   2 +-
 .../org/apache/camel/model/resequence.json         |   2 +-
 .../org/apache/camel/model/routingSlip.json        |   2 +-
 .../resources/org/apache/camel/model/script.json   |   2 +-
 .../resources/org/apache/camel/model/setBody.json  |   2 +-
 .../org/apache/camel/model/setHeader.json          |   2 +-
 .../org/apache/camel/model/setProperty.json        |   2 +-
 .../resources/org/apache/camel/model/sort.json     |   2 +-
 .../resources/org/apache/camel/model/split.json    |   2 +-
 .../resources/org/apache/camel/model/throttle.json |   4 +-
 .../org/apache/camel/model/transform.json          |   2 +-
 .../resources/org/apache/camel/model/validate.json |   2 +-
 .../resources/org/apache/camel/model/when.json     |   2 +-
 .../apache/camel/model/whenSkipSendToEndpoint.json |   2 +-
 .../resources/org/apache/camel/model/wireTap.json  |   2 +-
 .../org/apache/camel/builder/BuilderSupport.java   |  18 +
 .../org/apache/camel/builder/ExpressionClause.java |  14 +
 .../camel/builder/ExpressionClauseSupport.java     |  24 +
 .../camel/model/language/CSimpleExpression.java    |  74 +++
 .../reifier/language/CSimpleExpressionReifier.java |  67 +++
 .../camel/reifier/language/ExpressionReifier.java  |   3 +
 .../csimple/CSimpleExpressionParserTest.java       | 178 +++++++
 .../csimple/CSimplePredicateParserTest.java        | 102 ++++
 .../apache/camel/language/csimple/CSimpleTest.java |  54 ++
 .../camel/language/csimple/HighPredicate.java}     |  26 +-
 .../camel/language/csimple/MedPredicate.java}      |  26 +-
 .../simple/SimpleExpressionParserNodesTest.java    |  63 +++
 .../simple/SimplePredicateParserNodesTest.java     |  73 +++
 .../services/org/apache/camel/csimple.properties   |  19 +
 .../java/org/apache/camel/util/ObjectHelper.java   |   2 +-
 .../java/org/apache/camel/xml/in/ModelParser.java  |  10 +
 docs/components/modules/languages/nav.adoc         |   1 +
 .../modules/languages/pages/csimple-language.adoc  |  55 ++
 docs/components/modules/others/nav.adoc            |   1 +
 .../modules/others/pages/csimple-joor.adoc         |  48 ++
 parent/pom.xml                                     |   5 +
 .../camel/itest/jmh/CSimpleOperatorTest.java       | 131 +++++
 .../org/apache/camel/itest/jmh/CSimpleScript1.java |  28 +-
 .../org/apache/camel/itest/jmh/CSimpleScript2.java |  28 +-
 .../org/apache/camel/itest/jmh/CSimpleScript3.java |  28 +-
 .../services/org/apache/camel/csimple.properties   |  20 +
 152 files changed, 5155 insertions(+), 374 deletions(-)

diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index c081e45..b330711b 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -594,6 +594,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-csimple-joor</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-csv</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/buildingtools/src/main/resources/camel-checkstyle.xml b/buildingtools/src/main/resources/camel-checkstyle.xml
index 8a2f679..38ffb6a 100644
--- a/buildingtools/src/main/resources/camel-checkstyle.xml
+++ b/buildingtools/src/main/resources/camel-checkstyle.xml
@@ -278,8 +278,8 @@ lengths, if/try depths, etc...
         <module name="JUnitTestCase"/>
         -->
         <module name="ReturnCount">
-            <property name="max" value="21"/>
-            <property name="maxForVoid" value="25"/>
+            <property name="max" value="30"/>
+            <property name="maxForVoid" value="30"/>
         </module>
 
         <!-- Um.. we tend to use these alot.. perhaps enable this check later.
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties
index 3197bd7..808e303 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties
@@ -120,6 +120,8 @@ cron-component
 crypto-cms-component
 crypto-component
 crypto-dataformat
+csimple-joor
+csimple-language
 csv-dataformat
 customLoadBalancer-eip
 cxf-component
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/csimple-joor.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/csimple-joor.adoc
new file mode 100644
index 0000000..9644370
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/csimple-joor.adoc
@@ -0,0 +1,46 @@
+[[csimple-joor-other]]
+= CSimple jOOR Component
+:docTitle: CSimple jOOR
+:artifactId: camel-csimple-joor
+:description: jOOR compiler for csimple language
+:since: 3.7
+:supportLevel: Preview
+include::{cq-version}@camel-quarkus:ROOT:partial$reference/others/csimple-joor.adoc[opts=optional]
+
+*Since Camel {since}*
+
+The csimple (compiled simple) expression language can either be source code generated and compiled together
+with your application using the regular Java compiler. Or compiled at runtime using jOOR during bootstrap.
+
+This module includes the jOOR compiler for the csimple language for runtime compilation.
+
+To use this, just include `camel-csimple-joor` in the classpath.
+
+NOTE: Java 8 is not supported. Java 11 or 14 is required.
+
+
+== Limitations
+
+The supported runtime is intended for Java standalone, Spring Boot, Camel Quarkus and other microservices runtimes.
+It is not supported in OSGi, Camel Karaf or any kind of Java Application Server runtime.
+
+jOOR does not support runtime compilation with Spring Boot using _fat jar_ packaging (https://github.com/jOOQ/jOOR/issues/69),
+it works with exploded classpath.
+
+== Dependencies
+
+To use scripting languages in your camel routes you need to add a
+dependency on *camel-csimple-joor*.
+
+If you use Maven you could just add the following to your `pom.xml`,
+substituting the version number for the latest and greatest release (see
+the download page for the latest versions).
+
+[source,xml]
+---------------------------------------
+<dependency>
+  <groupId>org.apache.camel</groupId>
+  <artifactId>camel-csimple-joor</artifactId>
+  <version>x.x.x</version>
+</dependency>
+---------------------------------------
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/csimple-language.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/csimple-language.adoc
new file mode 100644
index 0000000..25f62f0
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/csimple-language.adoc
@@ -0,0 +1,53 @@
+[[csimple-language]]
+= CSimple Language
+:docTitle: CSimple
+:artifactId: camel-core-languages
+:description: Evaluate a compile simple expression language.
+:since: 3.7
+:supportLevel: Preview
+include::{cq-version}@camel-quarkus:ROOT:partial$reference/languages/csimple.adoc[opts=optional]
+
+*Since Camel {since}*
+
+The CSimple language is *compiled* xref:simple-language.adoc[Simple] language.
+
+
+== Different between CSimple and Simple
+
+The simple language is a dynamic expression language which is runtime parsed into a set of Camel `Expression`'s or `Predicate`'s.
+
+The csimple language is parsed into regular Java source code and compiled together with all the other source code, or it
+can be compiled once during bootstrap via the `camel-csimple-joor` module.
+
+The simple langauge is generally very lightweight and fast, however for some use-cases with dynamic method calls via OGNL paths,
+then the simple language does runtime introspection and reflection calls. This has an overhead on performance, and one of the reasons
+why csimple was created. However csimple requires to be typesafe and method calls via OGNL paths requires to know the type during parsing.
+This means for csimple languages expressions you would need to provide the class type where as simple could introspect this at runtime.
+
+In other words the simple language is using _duck typing_ (if it looks like a duck, and quacks like a duck, then it is a duck)
+and csimple is using Java type (typesafety). If there is a type error then simple will report this at runtime, and csimple you will see a Java compiler error.
+
+
+== CSimple Language options
+
+// language options: START
+The CSimple language supports 2 options, which are listed below.
+
+
+
+[width="100%",cols="2,1m,1m,6",options="header"]
+|===
+| Name | Default | Java Type | Description
+| resultType |  | String | Sets the class name of the result type (type from output)
+| trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks
+|===
+// language options: END
+
+== More documentation
+
+See the xref:simple-language.adoc[Simple] language as csimple has the same set of functions as simple language.
+
+== Example
+
+See `camel-example-csimple` and `camel-example-csimple-joor` examples at https://github.com/apache/camel-examples[Camel Examples]
+
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages.properties
index bdfae0c..d5b4039 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages.properties
@@ -1,5 +1,6 @@
 bean
 constant
+csimple
 exchangeProperty
 file
 groovy
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
new file mode 100644
index 0000000..c9fda23
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/languages/csimple.json
@@ -0,0 +1,24 @@
+{
+  "language": {
+    "kind": "language",
+    "name": "csimple",
+    "title": "CSimple",
+    "description": "Evaluate a compile simple expression language.",
+    "deprecated": false,
+    "firstVersion": "3.7.0",
+    "label": "language",
+    "javaType": "org.apache.camel.language.csimple.CSimpleLanguage",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-core-languages",
+    "version": "3.7.0-SNAPSHOT",
+    "modelName": "csimple",
+    "modelJavaType": "org.apache.camel.model.language.CSimpleExpression"
+  },
+  "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)" },
+    "trim": { "kind": "attribute", "displayName": "Trim", "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.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models.properties
index c418993..4e1bde9 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models.properties
@@ -26,6 +26,7 @@ consumerTemplate
 contextScan
 convertBodyTo
 crypto
+csimple
 csv
 customDataFormat
 customLoadBalancer
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/aggregate.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/aggregate.json
index 1cb1022..00c25c3 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/aggregate.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/aggregate.json
@@ -11,10 +11,10 @@
     "output": false
   },
   "properties": {
-    "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "The expression [...]
-    "completionPredicate": { "kind": "expression", "displayName": "Completion Predicate", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description [...]
-    "completionTimeoutExpression": { "kind": "expression", "displayName": "Completion Timeout Expression", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": " [...]
-    "completionSizeExpression": { "kind": "expression", "displayName": "Completion Size Expression", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Number [...]
+    "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "The [...]
+    "completionPredicate": { "kind": "expression", "displayName": "Completion Predicate", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, " [...]
+    "completionTimeoutExpression": { "kind": "expression", "displayName": "Completion Timeout Expression", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "desc [...]
+    "completionSizeExpression": { "kind": "expression", "displayName": "Completion Size Expression", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descriptio [...]
     "optimisticLockRetryPolicy": { "kind": "element", "displayName": "Optimistic Lock Retry Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.OptimisticLockRetryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure retry settings when using optimistic locking." },
     "parallelProcessing": { "kind": "attribute", "displayName": "Parallel Processing", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "When aggregated are completed they are being send out of the aggregator. This option indicates whether or not Camel should use a thread pool with multiple threads for concurrency. If no custom thread pool has been specified then Camel cr [...]
     "optimisticLocking": { "kind": "attribute", "displayName": "Optimistic Locking", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Turns on using optimistic locking, which requires the aggregationRepository being used, is supporting this by implementing org.apache.camel.spi.OptimisticLockingAggregationRepository ." },
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
new file mode 100644
index 0000000..ede72c6
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/csimple.json
@@ -0,0 +1,20 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "csimple",
+    "title": "CSimple",
+    "description": "Evaluate a compile simple expression language.",
+    "deprecated": false,
+    "firstVersion": "3.7.0",
+    "label": "language",
+    "javaType": "org.apache.camel.model.language.CSimpleExpression",
+    "input": false,
+    "output": false
+  },
+  "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)" },
+    "trim": { "kind": "attribute", "displayName": "Trim", "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/delay.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/delay.json
index f9eec8c..d820f1d 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/delay.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/delay.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to define how long time to  [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to define how lo [...]
     "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Refers to a custom Thread Pool if asyncDelay has been enabled." },
     "asyncDelayed": { "kind": "attribute", "displayName": "Async Delayed", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Enables asynchronous delay which means the thread will not block while delaying." },
     "callerRunsWhenRejected": { "kind": "attribute", "displayName": "Caller Runs When Rejected", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the caller should run the task when it was rejected by the thread pool. Is by default true" },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/dynamicRouter.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/dynamicRouter.json
index bfc7818..e11f62f 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/dynamicRouter.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/dynamicRouter.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to call that returns the en [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to call that ret [...]
     "uriDelimiter": { "kind": "attribute", "displayName": "Uri Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": ",", "description": "Sets the uri delimiter to use" },
     "ignoreInvalidEndpoints": { "kind": "attribute", "displayName": "Ignore Invalid Endpoints", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Ignore the invalidate endpoint exception when try to create a producer with that endpoint" },
     "cacheSize": { "kind": "attribute", "displayName": "Cache Size", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this dynamic router, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic end [...]
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/enrich.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/enrich.json
index fcb8849..e843859 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/enrich.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/enrich.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that computes the endpoint  [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that computes th [...]
     "strategyRef": { "kind": "attribute", "displayName": "Strategy Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Refers to an AggregationStrategy to be used to merge the reply from the external service, into a single outgoing message. By default Camel will use the reply from the external service as outgoing message." },
     "strategyMethodName": { "kind": "attribute", "displayName": "Strategy Method Name", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy." },
     "strategyMethodAllowNull": { "kind": "attribute", "displayName": "Strategy Method Allow Null", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "If this option is false then the aggregate method is not used if there was no data to enrich. If this option is true then null values is used as the oldExchange (when no data to enrich), when using POJOs as the AggregationStrategy." },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/filter.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/filter.json
index adb3cb0..9b1d7cc 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/filter.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/filter.json
@@ -11,7 +11,7 @@
     "output": true
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expression to det [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expres [...]
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/idempotentConsumer.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/idempotentConsumer.json
index 4c10899..ce4c874 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/idempotentConsumer.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/idempotentConsumer.json
@@ -11,7 +11,7 @@
     "output": true
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression used to calculate the corre [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression used to calculat [...]
     "messageIdRepositoryRef": { "kind": "attribute", "displayName": "Message Id Repository Ref", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the reference name of the message id repository" },
     "eager": { "kind": "attribute", "displayName": "Eager", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether to eagerly add the key to the idempotent repository or wait until the exchange is complete. Eager is default enabled." },
     "completionEager": { "kind": "attribute", "displayName": "Completion Eager", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets whether to complete the idempotent consumer eager or when the exchange is done. If this option is true to complete eager, then the idempotent consumer will trigger its completion when the exchange reached the end of the block of the idempotent consumer pattern. S [...]
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/loop.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/loop.json
index 0777d87..0f80d41 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/loop.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/loop.json
@@ -11,7 +11,7 @@
     "output": true
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to define how many times we [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to define how ma [...]
     "copy": { "kind": "attribute", "displayName": "Copy", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the copy attribute is true, a copy of the input Exchange is used for each iteration. That means each iteration will start from a copy of the same message. By default loop will loop the same exchange all over, so each iteration may have different message content." },
     "doWhile": { "kind": "attribute", "displayName": "Do While", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enables the while loop that loops until the predicate evaluates to false or null." },
     "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/onException.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/onException.json
index b8769da..11faf03 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/onException.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/onException.json
@@ -13,11 +13,11 @@
   "properties": {
     "exception": { "kind": "element", "displayName": "Exception", "required": true, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "description": "A set of exceptions to react upon." },
     "onWhen": { "kind": "element", "displayName": "On When", "required": false, "type": "object", "javaType": "org.apache.camel.model.WhenDefinition", "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Sets an additional predicate that should be true before the onException is triggered. To be used for fine grained controlling whether a thrown exception should be intercepted by this exception type or not." },
-    "retryWhile": { "kind": "expression", "displayName": "Retry While", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Sets the retry [...]
+    "retryWhile": { "kind": "expression", "displayName": "Retry While", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Set [...]
     "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Used for configuring redelivery options" },
     "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to lookup in the org.apache.camel.spi.Registry to be used." },
-    "handled": { "kind": "expression", "displayName": "Handled", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Sets whether the exch [...]
-    "continued": { "kind": "expression", "displayName": "Continued", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Sets whether the  [...]
+    "handled": { "kind": "expression", "displayName": "Handled", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Sets wheth [...]
+    "continued": { "kind": "expression", "displayName": "Continued", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Sets w [...]
     "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
     "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown from this processor will be ign [...]
     "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and the org.apache [...]
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/pollEnrich.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/pollEnrich.json
index fb28e16..eada138 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/pollEnrich.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/pollEnrich.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that computes the endpoint  [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that computes th [...]
     "timeout": { "kind": "attribute", "displayName": "Timeout", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "-1", "description": "Timeout in millis when polling from the external service. The timeout has influence about the poll enrich behavior. It basically operations in three different modes: negative value - Waits until a message is available and then returns it. Warning that this meth [...]
     "strategyRef": { "kind": "attribute", "displayName": "Strategy Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Refers to an AggregationStrategy to be used to merge the reply from the external service, into a single outgoing message. By default Camel will use the reply from the external service as outgoing message." },
     "strategyMethodName": { "kind": "attribute", "displayName": "Strategy Method Name", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy." },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/recipientList.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/recipientList.json
index 3396a9d..ac0e90b 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/recipientList.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/recipientList.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that returns which endpoint [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that returns whi [...]
     "delimiter": { "kind": "attribute", "displayName": "Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": ",", "description": "Delimiter used if the Expression returned multiple endpoints. Can be turned off using the value false. The default value is ," },
     "parallelProcessing": { "kind": "attribute", "displayName": "Parallel Processing", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If enabled then sending messages to the recipients occurs concurrently. Note the caller thread will still wait until all messages has been fully processed, before it continues. Its only the sending and processing the replies from the rec [...]
     "strategyRef": { "kind": "attribute", "displayName": "Strategy Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to the AggregationStrategy to be used to assemble the replies from the recipients, into a single outgoing message from the RecipientList. By default Camel will use the last reply as the outgoing message. You can also use a POJO as the AggregationStrategy" },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/resequence.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/resequence.json
index 7596ce1..4ef1c99 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/resequence.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/resequence.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to use for re-ordering the  [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to use for re-or [...]
     "resequencerConfig": { "kind": "element", "displayName": "Resequencer Config", "required": false, "type": "object", "javaType": "org.apache.camel.model.config.ResequencerConfig", "oneOf": [ "batch-config", "stream-config" ], "deprecated": false, "autowired": false, "secret": false, "description": "To configure the resequencer in using either batch or stream configuration. Will by default use batch configuration." },
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/routingSlip.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/routingSlip.json
index 58c1085..8b3687a 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/routingSlip.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/routingSlip.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to define the routing slip, [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to define the ro [...]
     "uriDelimiter": { "kind": "attribute", "displayName": "Uri Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": ",", "description": "Sets the uri delimiter to use" },
     "ignoreInvalidEndpoints": { "kind": "attribute", "displayName": "Ignore Invalid Endpoints", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Ignore the invalidate endpoint exception when try to create a producer with that endpoint" },
     "cacheSize": { "kind": "attribute", "displayName": "Cache Size", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this routing slip, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpo [...]
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/script.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/script.json
index 018ff9a..7059874 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/script.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/script.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the transformed m [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the tr [...]
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/setBody.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/setBody.json
index 15b69dd..8c0d376 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/setBody.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/setBody.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that returns the new body t [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that returns the [...]
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/setHeader.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/setHeader.json
index 49c4025..004b947 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/setHeader.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/setHeader.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the value of the  [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the va [...]
     "name": { "kind": "attribute", "displayName": "Name", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of message header to set a new value The simple language can be used to define a dynamic evaluated header name to be used. Otherwise a constant name will be used." },
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/setProperty.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/setProperty.json
index a42c5df..0865177 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/setProperty.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/setProperty.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the value of the  [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the va [...]
     "name": { "kind": "attribute", "displayName": "Name", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of exchange property to set a new value. The simple language can be used to define a dynamic evaluated exchange property name to be used. Otherwise a constant name will be used." },
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/sort.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/sort.json
index 5efd011..44b1cb7 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/sort.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/sort.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Optional expression to sort by somethi [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Optional expression to sort [...]
     "comparatorRef": { "kind": "attribute", "displayName": "Comparator Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to lookup for the comparator to use for sorting" },
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/split.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/split.json
index 0c833d7..be7368f 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/split.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/split.json
@@ -11,7 +11,7 @@
     "output": true
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression of how to split the message [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression of how to split  [...]
     "delimiter": { "kind": "attribute", "displayName": "Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": ",", "description": "Delimiter used in splitting messages. Can be turned off using the value false. The default value is ," },
     "parallelProcessing": { "kind": "attribute", "displayName": "Parallel Processing", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If enabled then processing each splitted messages occurs concurrently. Note the caller thread will still wait until all messages has been fully processed, before it continues. Its only processing the sub messages from the splitter which  [...]
     "strategyRef": { "kind": "attribute", "displayName": "Strategy Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to the AggregationStrategy to be used to assemble the replies from the splitted messages, into a single outgoing message from the Splitter. By default Camel will use the original incoming message to the splitter (leave it unchanged). You can also use a POJO a [...]
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/sticky.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/sticky.json
index 8c6d828..407ec4e 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/sticky.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/sticky.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "The correlatio [...]
+    "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "The [...]
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/throttle.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/throttle.json
index ea33cd9..ee29b33 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/throttle.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/throttle.json
@@ -11,8 +11,8 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to configure the maximum nu [...]
-    "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "The expressio [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to configure the [...]
+    "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Th [...]
     "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom thread pool (ScheduledExecutorService) by the throttler." },
     "timePeriodMillis": { "kind": "attribute", "displayName": "Time Period Millis", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the time period during which the maximum request count is valid for" },
     "asyncDelayed": { "kind": "attribute", "displayName": "Async Delayed", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enables asynchronous delay which means the thread will not block while delaying." },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/transform.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/transform.json
index 1a7ed52..c6cd847 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/transform.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/transform.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the transformed m [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the tr [...]
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/validate.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/validate.json
index 42d99c7..ba37232 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/validate.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/validate.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expression to use [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expres [...]
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/when.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/when.json
index fba1421..a6202fc 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/when.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/when.json
@@ -11,7 +11,7 @@
     "output": true
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expression used a [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expres [...]
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/whenSkipSendToEndpoint.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/whenSkipSendToEndpoint.json
index 5215594..34ce534 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/whenSkipSendToEndpoint.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/whenSkipSendToEndpoint.json
@@ -11,7 +11,7 @@
     "output": true
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expression used a [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expres [...]
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/wireTap.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/wireTap.json
index 60089b7..70da4d5 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/wireTap.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/wireTap.json
@@ -12,7 +12,7 @@
   },
   "properties": {
     "processorRef": { "kind": "attribute", "displayName": "Processor Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Reference to a Processor to use for creating a new body as the message to use for wire tapping" },
-    "body": { "kind": "expression", "displayName": "Body", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Uses the expression for creating a new body as t [...]
+    "body": { "kind": "expression", "displayName": "Body", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Uses the expression for creating a ne [...]
     "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Uses a custom thread pool" },
     "copy": { "kind": "attribute", "displayName": "Copy", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Uses a copy of the original exchange" },
     "dynamicUri": { "kind": "attribute", "displayName": "Dynamic Uri", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the uri is dynamic or static. If the uri is dynamic then the simple language is used to evaluate a dynamic uri to use as the wire-tap destination, for each incoming message. This works similar to how the toD EIP pattern works. If static then the  [...]
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
index 1921cbf..1ebe455 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
@@ -1,6 +1,7 @@
 attachments
 aws-xray
 cdi
+csimple-joor
 cxf-transport
 etcd3
 headersmap
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/csimple-joor.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/csimple-joor.json
new file mode 100644
index 0000000..cb80040
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/csimple-joor.json
@@ -0,0 +1,14 @@
+{
+  "other": {
+    "kind": "other",
+    "name": "csimple-joor",
+    "title": "CSimple jOOR",
+    "description": "jOOR compiler for csimple language",
+    "deprecated": false,
+    "firstVersion": "3.7.0",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-csimple-joor",
+    "version": "3.7.0-SNAPSHOT"
+  }
+}
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 23a6601..64bba1c 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
@@ -229,6 +229,14 @@ Encrypt and decrypt messages using Java Cryptography Extension (JCE).
     </xs:annotation>
   </xs:element>
 
+  <xs:element name="csimple" type="tns:cSimpleExpression">
+    <xs:annotation>
+      <xs:documentation xml:lang="en"><![CDATA[
+Evaluate a compile simple expression language.
+      ]]></xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
   <xs:element name="csv" type="tns:csvDataFormat">
     <xs:annotation>
       <xs:documentation xml:lang="en"><![CDATA[
@@ -3175,6 +3183,7 @@ external sources to control this aggregator.
   <xs:complexType name="expressionSubElementDefinition">
     <xs:choice>
       <xs:element ref="tns:expressionDefinition"/>
+      <xs:element ref="tns:csimple"/>
       <xs:element ref="tns:constant"/>
       <xs:element ref="tns:exchangeProperty"/>
       <xs:element ref="tns:groovy"/>
@@ -3405,6 +3414,7 @@ implementation. Default value: Singleton
         <xs:sequence>
           <xs:choice>
             <xs:element ref="tns:expressionDefinition"/>
+            <xs:element ref="tns:csimple"/>
             <xs:element ref="tns:constant"/>
             <xs:element ref="tns:exchangeProperty"/>
             <xs:element ref="tns:groovy"/>
@@ -4373,6 +4383,7 @@ data formats marshalling to JSON etc. Default value: false
       <xs:extension base="tns:processorDefinition">
         <xs:choice>
           <xs:element ref="tns:expressionDefinition"/>
+          <xs:element ref="tns:csimple"/>
           <xs:element ref="tns:constant"/>
           <xs:element ref="tns:exchangeProperty"/>
           <xs:element ref="tns:groovy"/>
@@ -4424,6 +4435,7 @@ pool. Is by default true. Default value: true
       <xs:extension base="tns:processorDefinition">
         <xs:choice>
           <xs:element ref="tns:expressionDefinition"/>
+          <xs:element ref="tns:csimple"/>
           <xs:element ref="tns:constant"/>
           <xs:element ref="tns:exchangeProperty"/>
           <xs:element ref="tns:groovy"/>
@@ -4487,6 +4499,7 @@ producers.
       <xs:extension base="tns:processorDefinition">
         <xs:choice>
           <xs:element ref="tns:expressionDefinition"/>
+          <xs:element ref="tns:csimple"/>
           <xs:element ref="tns:constant"/>
           <xs:element ref="tns:exchangeProperty"/>
           <xs:element ref="tns:groovy"/>
@@ -4591,6 +4604,7 @@ endpoint. Default value: false
         <xs:sequence>
           <xs:choice>
             <xs:element ref="tns:expressionDefinition"/>
+            <xs:element ref="tns:csimple"/>
             <xs:element ref="tns:constant"/>
             <xs:element ref="tns:exchangeProperty"/>
             <xs:element ref="tns:groovy"/>
@@ -4803,6 +4817,7 @@ Global option value.
         <xs:sequence>
           <xs:choice>
             <xs:element ref="tns:expressionDefinition"/>
+            <xs:element ref="tns:csimple"/>
             <xs:element ref="tns:constant"/>
             <xs:element ref="tns:exchangeProperty"/>
             <xs:element ref="tns:groovy"/>
@@ -5459,6 +5474,7 @@ To refer to a custom logger instance to lookup from the registry.
         <xs:sequence>
           <xs:choice>
             <xs:element ref="tns:expressionDefinition"/>
+            <xs:element ref="tns:csimple"/>
             <xs:element ref="tns:constant"/>
             <xs:element ref="tns:exchangeProperty"/>
             <xs:element ref="tns:groovy"/>
@@ -9024,6 +9040,7 @@ Sets a reference to use for lookup the policy in the registry.
       <xs:extension base="tns:processorDefinition">
         <xs:choice>
           <xs:element ref="tns:expressionDefinition"/>
+          <xs:element ref="tns:csimple"/>
           <xs:element ref="tns:constant"/>
           <xs:element ref="tns:exchangeProperty"/>
           <xs:element ref="tns:groovy"/>
@@ -9154,6 +9171,7 @@ Reference to the Processor to lookup in the registry to use.
       <xs:extension base="tns:processorDefinition">
         <xs:choice>
           <xs:element ref="tns:expressionDefinition"/>
+          <xs:element ref="tns:csimple"/>
           <xs:element ref="tns:constant"/>
           <xs:element ref="tns:exchangeProperty"/>
           <xs:element ref="tns:groovy"/>
@@ -9432,6 +9450,7 @@ Name of property to remove.
           </xs:choice>
           <xs:choice>
             <xs:element ref="tns:expressionDefinition"/>
+            <xs:element ref="tns:csimple"/>
             <xs:element ref="tns:constant"/>
             <xs:element ref="tns:exchangeProperty"/>
             <xs:element ref="tns:groovy"/>
@@ -9932,6 +9951,7 @@ Parameter description.
       <xs:extension base="tns:processorDefinition">
         <xs:choice>
           <xs:element ref="tns:expressionDefinition"/>
+          <xs:element ref="tns:csimple"/>
           <xs:element ref="tns:constant"/>
           <xs:element ref="tns:exchangeProperty"/>
           <xs:element ref="tns:groovy"/>
@@ -10122,6 +10142,7 @@ use.
   <xs:complexType name="sagaOptionDefinition">
     <xs:choice>
       <xs:element ref="tns:expressionDefinition"/>
+      <xs:element ref="tns:csimple"/>
       <xs:element ref="tns:constant"/>
       <xs:element ref="tns:exchangeProperty"/>
       <xs:element ref="tns:groovy"/>
@@ -10181,6 +10202,7 @@ Default value: SECONDS
       <xs:extension base="tns:processorDefinition">
         <xs:choice>
           <xs:element ref="tns:expressionDefinition"/>
+          <xs:element ref="tns:csimple"/>
           <xs:element ref="tns:constant"/>
           <xs:element ref="tns:exchangeProperty"/>
           <xs:element ref="tns:groovy"/>
@@ -10209,6 +10231,7 @@ Default value: SECONDS
       <xs:extension base="tns:processorDefinition">
         <xs:choice>
           <xs:element ref="tns:expressionDefinition"/>
+          <xs:element ref="tns:csimple"/>
           <xs:element ref="tns:constant"/>
           <xs:element ref="tns:exchangeProperty"/>
           <xs:element ref="tns:groovy"/>
@@ -10253,6 +10276,7 @@ forward.
       <xs:extension base="tns:processorDefinition">
         <xs:choice>
           <xs:element ref="tns:expressionDefinition"/>
+          <xs:element ref="tns:csimple"/>
           <xs:element ref="tns:constant"/>
           <xs:element ref="tns:exchangeProperty"/>
           <xs:element ref="tns:groovy"/>
@@ -10290,6 +10314,7 @@ will be used.
       <xs:extension base="tns:processorDefinition">
         <xs:choice>
           <xs:element ref="tns:expressionDefinition"/>
+          <xs:element ref="tns:csimple"/>
           <xs:element ref="tns:constant"/>
           <xs:element ref="tns:exchangeProperty"/>
           <xs:element ref="tns:groovy"/>
@@ -10327,6 +10352,7 @@ constant name will be used.
       <xs:extension base="tns:processorDefinition">
         <xs:choice>
           <xs:element ref="tns:expressionDefinition"/>
+          <xs:element ref="tns:csimple"/>
           <xs:element ref="tns:constant"/>
           <xs:element ref="tns:exchangeProperty"/>
           <xs:element ref="tns:groovy"/>
@@ -10363,6 +10389,7 @@ Sets a reference to lookup for the comparator to use for sorting.
         <xs:sequence>
           <xs:choice>
             <xs:element ref="tns:expressionDefinition"/>
+            <xs:element ref="tns:csimple"/>
             <xs:element ref="tns:constant"/>
             <xs:element ref="tns:exchangeProperty"/>
             <xs:element ref="tns:groovy"/>
@@ -10836,6 +10863,7 @@ rejection handler. Is by default true. Default value: true
         <xs:sequence>
           <xs:choice>
             <xs:element ref="tns:expressionDefinition"/>
+            <xs:element ref="tns:csimple"/>
             <xs:element ref="tns:constant"/>
             <xs:element ref="tns:exchangeProperty"/>
             <xs:element ref="tns:groovy"/>
@@ -11099,6 +11127,7 @@ Sets a reference to use for lookup the policy in the registry.
       <xs:extension base="tns:processorDefinition">
         <xs:choice>
           <xs:element ref="tns:expressionDefinition"/>
+          <xs:element ref="tns:csimple"/>
           <xs:element ref="tns:constant"/>
           <xs:element ref="tns:exchangeProperty"/>
           <xs:element ref="tns:groovy"/>
@@ -11255,6 +11284,7 @@ Sets a reference to use for lookup the policy in the registry.
       <xs:extension base="tns:processorDefinition">
         <xs:choice>
           <xs:element ref="tns:expressionDefinition"/>
+          <xs:element ref="tns:csimple"/>
           <xs:element ref="tns:constant"/>
           <xs:element ref="tns:exchangeProperty"/>
           <xs:element ref="tns:groovy"/>
@@ -11989,6 +12019,7 @@ Set the base path to store in ZK.
         <xs:sequence>
           <xs:choice minOccurs="0">
             <xs:element ref="tns:expressionDefinition"/>
+            <xs:element ref="tns:csimple"/>
             <xs:element ref="tns:constant"/>
             <xs:element ref="tns:exchangeProperty"/>
             <xs:element ref="tns:groovy"/>
@@ -12191,6 +12222,20 @@ Set a reference to a custom Expression to use.
     </xs:sequence>
   </xs:complexType>
 
+  <xs:complexType name="cSimpleExpression">
+    <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:simpleContent>
+  </xs:complexType>
+
   <xs:complexType name="constantExpression">
     <xs:simpleContent>
       <xs:extension base="tns:expression"/>
@@ -13646,6 +13691,7 @@ password, application or accessCode.
       <xs:extension base="tns:validator">
         <xs:choice>
           <xs:element ref="tns:expressionDefinition"/>
+          <xs:element ref="tns:csimple"/>
           <xs:element ref="tns:constant"/>
           <xs:element ref="tns:exchangeProperty"/>
           <xs:element ref="tns:groovy"/>
diff --git a/catalog/camel-csimple-maven-plugin/pom.xml b/catalog/camel-csimple-maven-plugin/pom.xml
new file mode 100644
index 0000000..495a508
--- /dev/null
+++ b/catalog/camel-csimple-maven-plugin/pom.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!-- NOTE parent need to point to camel maven plugins -->
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>maven-plugins</artifactId>
+        <version>3.7.0-SNAPSHOT</version>
+        <relativePath>../../tooling/maven</relativePath>
+    </parent>
+
+    <artifactId>camel-csimple-maven-plugin</artifactId>
+    <packaging>maven-plugin</packaging>
+    <name>Camel :: Catalog :: Camel Compiled Simple Maven Plugin</name>
+    <description>Maven plugin to source code generate csimple language</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>tooling-parent</artifactId>
+                <version>${project.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-core</artifactId>
+        </dependency>
+        <!-- we extend the exec-maven-plugin for this camel maven plugin -->
+        <dependency>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>exec-maven-plugin</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.maven</groupId>
+                    <artifactId>maven-plugin-descriptor</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-plugin-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-compat</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven.plugin-tools</groupId>
+            <artifactId>maven-plugin-annotations</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+        </dependency>
+
+        <!-- disable all components -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-allcomponents</artifactId>
+            <version>${project.version}</version>
+            <type>pom</type>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.camel</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- camel route parser -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-route-parser</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <!-- roaster java parser -->
+        <dependency>
+            <groupId>org.jboss.forge.roaster</groupId>
+            <artifactId>roaster-api</artifactId>
+            <version>${roaster-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.forge.roaster</groupId>
+            <artifactId>roaster-jdt</artifactId>
+            <version>${roaster-version}</version>
+        </dependency>
+
+        <!-- logging -->
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-plugin-plugin</artifactId>
+                <configuration>
+                    <mojoDependencies>
+                        <dep>org.codehaus.mojo:exec-maven-plugin</dep>
+                        <dep>org.apache.maven:maven-plugin-api</dep>
+                    </mojoDependencies>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/catalog/camel-csimple-maven-plugin/src/main/docs/camel-csimple-maven-plugin.adoc b/catalog/camel-csimple-maven-plugin/src/main/docs/camel-csimple-maven-plugin.adoc
new file mode 100644
index 0000000..c609c93
--- /dev/null
+++ b/catalog/camel-csimple-maven-plugin/src/main/docs/camel-csimple-maven-plugin.adoc
@@ -0,0 +1,43 @@
+= Camel Compile Simple Maven Plugin
+
+The Camel Compile Simple Maven Plugin supports the following goals
+
+ - camel-report:generate - To generate source code for csimple language
+
+== camel:generate
+
+To source code generate csimple languages discovered from the source code in the project
+
+----
+mvn camel-csimple:generate
+----
+
+You should
+
+[source,xml]
+----
+<plugin>
+  <groupId>org.apache.camel</groupId>
+  <artifactId>camel-csimple-maven-plugin</artifactId>
+  <executions>
+    <execution>
+      <phase>process-classes</phase>
+      <goals>
+        <goal>generate</goal>
+      </goals>
+    </execution>
+  </executions>
+</plugin>
+----
+
+The phase determines when the plugin runs. In the sample above the phase is `process-classes` which runs after
+the compilation of the main source code.
+
+=== Options
+
+The maven plugin *generate* goal supports the following options which can be configured from the command line (use `-D` syntax), or defined in the `pom.xml` file in the `<configuration>` tag.
+
+|===
+| Parameter | Default Value | Description
+|===
+
diff --git a/catalog/camel-csimple-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java b/catalog/camel-csimple-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java
new file mode 100644
index 0000000..0eebbaa
--- /dev/null
+++ b/catalog/camel-csimple-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java
@@ -0,0 +1,445 @@
+/*
+ * 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.maven;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOError;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.language.csimple.CSimpleCodeGenerator;
+import org.apache.camel.language.csimple.CSimpleGeneratedCode;
+import org.apache.camel.parser.RouteBuilderParser;
+import org.apache.camel.parser.XmlRouteParser;
+import org.apache.camel.parser.model.CamelCSimpleExpressionDetails;
+import org.apache.camel.support.PatternHelper;
+import org.apache.camel.tooling.util.FileUtil;
+import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.StringHelper;
+import org.apache.maven.model.Resource;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.mojo.exec.AbstractExecMojo;
+import org.jboss.forge.roaster.Roaster;
+import org.jboss.forge.roaster.model.JavaType;
+import org.jboss.forge.roaster.model.source.JavaClassSource;
+
+/**
+ * Parses the source code and generates source code for the csimple language.
+ */
+@Mojo(name = "generate", threadSafe = true, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME,
+      defaultPhase = LifecyclePhase.GENERATE_SOURCES)
+public class GenerateMojo extends AbstractExecMojo {
+
+    public static final String GENERATED_MSG = "Generated by camel build tools - do NOT edit this file!";
+    public static final String RESOURCE_FILE = "META-INF/services/org/apache/camel/csimple.properties";
+
+    private final Set<String> imports = new TreeSet<>();
+    private final Map<String, String> aliases = new HashMap<>();
+
+    /**
+     * The maven project.
+     */
+    @Parameter(property = "project", required = true, readonly = true)
+    protected MavenProject project;
+
+    // Output directory
+
+    /**
+     * The output directory for generated source files
+     */
+    @Parameter(defaultValue = "${project.basedir}/src/generated/java")
+    protected File outputDir;
+
+    /**
+     * The output directory for generated resources files
+     */
+    @Parameter(defaultValue = "${project.basedir}/src/generated/resources")
+    protected File outputResourceDir;
+
+    /**
+     * The resources directory for configuration files
+     */
+    @Parameter(defaultValue = "${project.basedir}/src/main/resources")
+    protected File resourceDir;
+
+    /**
+     * Whether to include Java files to be validated for invalid Camel endpoints
+     */
+    @Parameter(property = "camel.includeJava", defaultValue = "true")
+    private boolean includeJava;
+
+    /**
+     * Whether to include XML files to be validated for invalid Camel endpoints
+     */
+    @Parameter(property = "camel.includeXml", defaultValue = "true")
+    private boolean includeXml;
+
+    /**
+     * Whether to include test source code
+     */
+    @Parameter(property = "camel.includeTest", defaultValue = "false")
+    private boolean includeTest;
+
+    /**
+     * To filter the names of java and xml files to only include files matching any of the given list of patterns
+     * (wildcard and regular expression). Multiple values can be separated by comma.
+     */
+    @Parameter(property = "camel.includes")
+    private String includes;
+
+    /**
+     * To filter the names of java and xml files to exclude files matching any of the given list of patterns (wildcard
+     * and regular expression). Multiple values can be separated by comma.
+     */
+    @Parameter(property = "camel.excludes")
+    private String excludes;
+
+    // CHECKSTYLE:OFF
+    @Override
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        loadConfiguration();
+
+        CSimpleCodeGenerator generator = new CSimpleCodeGenerator();
+        generator.setAliases(aliases);
+        generator.setImports(imports);
+
+        doExecuteRoutes(generator);
+    }
+
+    protected void doExecuteRoutes(CSimpleCodeGenerator generator) throws MojoExecutionException, MojoFailureException {
+        List<CamelCSimpleExpressionDetails> csimpleExpressions = new ArrayList<>();
+        Set<File> javaFiles = new LinkedHashSet<>();
+        Set<File> xmlFiles = new LinkedHashSet<>();
+
+        // find all java route builder classes
+        if (includeJava) {
+            List list = project.getCompileSourceRoots();
+            for (Object obj : list) {
+                String dir = (String) obj;
+                findJavaFiles(new File(dir), javaFiles);
+            }
+            if (includeTest) {
+                list = project.getTestCompileSourceRoots();
+                for (Object obj : list) {
+                    String dir = (String) obj;
+                    findJavaFiles(new File(dir), javaFiles);
+                }
+            }
+        }
+        // find all xml routes
+        if (includeXml) {
+            List list = project.getResources();
+            for (Object obj : list) {
+                Resource dir = (Resource) obj;
+                findXmlFiles(new File(dir.getDirectory()), xmlFiles);
+            }
+            if (includeTest) {
+                list = project.getTestResources();
+                for (Object obj : list) {
+                    Resource dir = (Resource) obj;
+                    findXmlFiles(new File(dir.getDirectory()), xmlFiles);
+                }
+            }
+        }
+
+        for (File file : javaFiles) {
+            if (matchRouteFile(file)) {
+                try {
+                    List<CamelCSimpleExpressionDetails> fileCSimpleExpressions = new ArrayList<>();
+
+                    // parse the java source code and find Camel RouteBuilder classes
+                    String fqn = file.getPath();
+                    String baseDir = ".";
+                    JavaType out = Roaster.parse(file);
+                    // we should only parse java classes (not interfaces and enums etc)
+                    if (out instanceof JavaClassSource) {
+                        JavaClassSource clazz = (JavaClassSource) out;
+                        RouteBuilderParser.parseRouteBuilderCSimpleExpressions(clazz, baseDir, fqn, fileCSimpleExpressions);
+                        csimpleExpressions.addAll(fileCSimpleExpressions);
+                    }
+                } catch (Exception e) {
+                    getLog().warn("Error parsing java file " + file + " code due " + e.getMessage(), e);
+                }
+            }
+        }
+        for (File file : xmlFiles) {
+            if (matchRouteFile(file)) {
+                try {
+                    List<CamelCSimpleExpressionDetails> fileSimpleExpressions = new ArrayList<>();
+                    // parse the xml source code and find Camel routes
+                    String fqn = file.getPath();
+                    String baseDir = ".";
+                    InputStream is = new FileInputStream(file);
+                    XmlRouteParser.parseXmlRouteCSimpleExpressions(is, baseDir, fqn, fileSimpleExpressions);
+                    is.close();
+                    csimpleExpressions.addAll(fileSimpleExpressions);
+                } catch (Exception e) {
+                    getLog().warn("Error parsing xml file " + file + " code due " + e.getMessage(), e);
+                }
+            }
+        }
+
+
+        if (!csimpleExpressions.isEmpty()) {
+            getLog().info("Discovered " + csimpleExpressions.size() + " csimple expressions");
+
+            final List<CSimpleGeneratedCode> classes = new ArrayList<>();
+
+            for (CamelCSimpleExpressionDetails cs : csimpleExpressions) {
+                String script = cs.getCsimple();
+                String fqn = cs.getClassName();
+                if (script != null && fqn == null) {
+                    // its from XML file so use a pseduo fqn name instead
+                    fqn = "org.apache.camel.language.csimple.XmlRouteBuilder";
+                }
+                if (script != null) {
+                    CSimpleGeneratedCode code;
+                    if (cs.isPredicate()) {
+                        code = generator.generatePredicate(fqn, script);
+                    } else {
+                        code = generator.generateExpression(fqn, script);
+                    }
+                    classes.add(code);
+                    if (getLog().isDebugEnabled()) {
+                        getLog().debug("Generated source code:\n\n\n" + code.getCode() + "\n\n\n");
+                    }
+                    String fileName = code.getFqn().replace('.', '/') + ".java";
+                    outputDir.mkdirs();
+                    boolean saved = updateResource(outputDir.toPath().resolve(fileName), code.getCode());
+                    if (saved) {
+                        getLog().info("Generated csimple source code file: " + fileName);
+                    }
+                }
+            }
+            if (!classes.isEmpty()) {
+                // generate .properties file
+                StringWriter w = new StringWriter();
+                w.append("# " + GENERATED_MSG + "\n");
+                classes.forEach(c -> w.write(c.getFqn() + "\n"));
+                String fileName = RESOURCE_FILE;
+                outputResourceDir.mkdirs();
+                boolean saved = updateResource(outputResourceDir.toPath().resolve(RESOURCE_FILE), w.toString());
+                if (saved) {
+                    getLog().info("Generated csimple resource file: " + fileName);
+                }
+            }
+        }
+
+    }
+
+    private void loadConfiguration() {
+        String configFile = resourceDir.getPath() + "/camel-csimple.properties";
+
+        String loaded;
+        InputStream is = null;
+        try {
+            // load from file system
+            File file = new File(configFile);
+            if (file.exists()) {
+                is = new FileInputStream(file);
+            }
+            if (is == null) {
+                return;
+            }
+            loaded = IOHelper.loadText(is);
+        } catch (IOException e) {
+            throw new RuntimeCamelException("Cannot load " + configFile);
+
+        }
+        IOHelper.close(is);
+
+        int counter1 = 0;
+        int counter2 = 0;
+        String[] lines = loaded.split("\n");
+        for (String line : lines) {
+            line = line.trim();
+            // skip comments
+            if (line.startsWith("#")) {
+                continue;
+            }
+            // imports
+            if (line.startsWith("import ")) {
+                imports.add(line);
+                counter1++;
+                continue;
+            }
+            // aliases as key=value
+            String key = StringHelper.before(line, "=");
+            String value = StringHelper.after(line, "=");
+            if (key != null) {
+                key = key.trim();
+            }
+            if (value != null) {
+                value = value.trim();
+            }
+            if (key != null && value != null) {
+                this.aliases.put(key, value);
+                counter2++;
+            }
+        }
+        if (counter1 > 0 || counter2 > 0) {
+            getLog().info("Loaded csimple language imports: " + counter1 + " and aliases: " + counter2 + " from configuration: " + configFile);
+        }
+    }
+
+    // CHECKSTYLE:ON
+
+    private void findJavaFiles(File dir, Set<File> javaFiles) {
+        File[] files = dir.isDirectory() ? dir.listFiles() : null;
+        if (files != null) {
+            for (File file : files) {
+                if (file.getName().endsWith(".java")) {
+                    javaFiles.add(file);
+                } else if (file.isDirectory()) {
+                    findJavaFiles(file, javaFiles);
+                }
+            }
+        }
+    }
+
+    private void findXmlFiles(File dir, Set<File> xmlFiles) {
+        File[] files = dir.isDirectory() ? dir.listFiles() : null;
+        if (files != null) {
+            for (File file : files) {
+                if (file.getName().endsWith(".xml")) {
+                    xmlFiles.add(file);
+                } else if (file.isDirectory()) {
+                    findXmlFiles(file, xmlFiles);
+                }
+            }
+        }
+    }
+
+    private boolean matchRouteFile(File file) {
+        if (excludes == null && includes == null) {
+            return true;
+        }
+
+        // exclude take precedence
+        if (excludes != null) {
+            for (String exclude : excludes.split(",")) {
+                exclude = exclude.trim();
+                // try both with and without directory in the name
+                String fqn = stripRootPath(asRelativeFile(file.getAbsolutePath()));
+                boolean match = PatternHelper.matchPattern(fqn, exclude) || PatternHelper.matchPattern(file.getName(), exclude);
+                if (match) {
+                    return false;
+                }
+            }
+        }
+
+        // include
+        if (includes != null) {
+            for (String include : includes.split(",")) {
+                include = include.trim();
+                // try both with and without directory in the name
+                String fqn = stripRootPath(asRelativeFile(file.getAbsolutePath()));
+                boolean match = PatternHelper.matchPattern(fqn, include) || PatternHelper.matchPattern(file.getName(), include);
+                if (match) {
+                    return true;
+                }
+            }
+            // did not match any includes
+            return false;
+        }
+
+        // was not excluded nor failed include so its accepted
+        return true;
+    }
+
+    private String asRelativeFile(String name) {
+        String answer = name;
+
+        String base = project.getBasedir().getAbsolutePath();
+        if (name.startsWith(base)) {
+            answer = name.substring(base.length());
+            // skip leading slash for relative path
+            if (answer.startsWith(File.separator)) {
+                answer = answer.substring(1);
+            }
+        }
+        return answer;
+    }
+
+    private String stripRootPath(String name) {
+        // strip out any leading source / resource directory
+
+        List list = project.getCompileSourceRoots();
+        for (Object obj : list) {
+            String dir = (String) obj;
+            dir = asRelativeFile(dir);
+            if (name.startsWith(dir)) {
+                return name.substring(dir.length() + 1);
+            }
+        }
+        list = project.getTestCompileSourceRoots();
+        for (Object obj : list) {
+            String dir = (String) obj;
+            dir = asRelativeFile(dir);
+            if (name.startsWith(dir)) {
+                return name.substring(dir.length() + 1);
+            }
+        }
+        List resources = project.getResources();
+        for (Object obj : resources) {
+            Resource resource = (Resource) obj;
+            String dir = asRelativeFile(resource.getDirectory());
+            if (name.startsWith(dir)) {
+                return name.substring(dir.length() + 1);
+            }
+        }
+        resources = project.getTestResources();
+        for (Object obj : resources) {
+            Resource resource = (Resource) obj;
+            String dir = asRelativeFile(resource.getDirectory());
+            if (name.startsWith(dir)) {
+                return name.substring(dir.length() + 1);
+            }
+        }
+
+        return name;
+    }
+
+    public static boolean updateResource(Path out, String data) {
+        try {
+            if (FileUtil.updateFile(out, data)) {
+                return true;
+            }
+        } catch (IOException e) {
+            throw new IOError(e);
+        }
+        return false;
+    }
+
+}
diff --git a/catalog/camel-csimple-maven-plugin/src/main/resources/META-INF/LICENSE.txt b/catalog/camel-csimple-maven-plugin/src/main/resources/META-INF/LICENSE.txt
new file mode 100644
index 0000000..6b0b127
--- /dev/null
+++ b/catalog/camel-csimple-maven-plugin/src/main/resources/META-INF/LICENSE.txt
@@ -0,0 +1,203 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
+
diff --git a/catalog/camel-csimple-maven-plugin/src/main/resources/META-INF/NOTICE.txt b/catalog/camel-csimple-maven-plugin/src/main/resources/META-INF/NOTICE.txt
new file mode 100644
index 0000000..2e215bf
--- /dev/null
+++ b/catalog/camel-csimple-maven-plugin/src/main/resources/META-INF/NOTICE.txt
@@ -0,0 +1,11 @@
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the Apache Camel distribution.                    ==
+   =========================================================================
+
+   This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).
+
+   Please read the different LICENSE files present in the licenses directory of
+   this distribution.
diff --git a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java
index 19b537d..b9e7d06 100644
--- a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java
+++ b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java
@@ -24,6 +24,7 @@ import java.util.List;
 
 import org.apache.camel.parser.helper.CamelJavaParserHelper;
 import org.apache.camel.parser.helper.CamelJavaTreeParserHelper;
+import org.apache.camel.parser.model.CamelCSimpleExpressionDetails;
 import org.apache.camel.parser.model.CamelEndpointDetails;
 import org.apache.camel.parser.model.CamelNodeDetails;
 import org.apache.camel.parser.model.CamelRouteDetails;
@@ -294,10 +295,9 @@ public final class RouteBuilderParser {
     public static void parseRouteBuilderSimpleExpressions(
             JavaClassSource clazz, String baseDir, String fullyQualifiedFileName,
             List<CamelSimpleExpressionDetails> simpleExpressions) {
-
         MethodSource<JavaClassSource> method = CamelJavaParserHelper.findConfigureMethod(clazz);
         if (method != null) {
-            List<ParserResult> expressions = CamelJavaParserHelper.parseCamelSimpleExpressions(method);
+            List<ParserResult> expressions = CamelJavaParserHelper.parseCamelLanguageExpressions(method, "simple");
             for (ParserResult result : expressions) {
                 if (result.isParsed()) {
                     String fileName = fullyQualifiedFileName;
@@ -336,6 +336,57 @@ public final class RouteBuilderParser {
     }
 
     /**
+     * Parses the java source class to discover Camel compiled simple expressions.
+     *
+     * @param clazz                  the java source class
+     * @param baseDir                the base of the source code
+     * @param fullyQualifiedFileName the fully qualified source code file name
+     * @param csimpleExpressions     list to add discovered and parsed simple expressions
+     */
+    public static void parseRouteBuilderCSimpleExpressions(
+            JavaClassSource clazz, String baseDir, String fullyQualifiedFileName,
+            List<CamelCSimpleExpressionDetails> csimpleExpressions) {
+        MethodSource<JavaClassSource> method = CamelJavaParserHelper.findConfigureMethod(clazz);
+        if (method != null) {
+            List<ParserResult> expressions = CamelJavaParserHelper.parseCamelLanguageExpressions(method, "csimple");
+            for (ParserResult result : expressions) {
+                if (result.isParsed()) {
+                    String fileName = fullyQualifiedFileName;
+                    if (fileName.startsWith(baseDir)) {
+                        fileName = fileName.substring(baseDir.length() + 1);
+                    }
+
+                    CamelCSimpleExpressionDetails detail = new CamelCSimpleExpressionDetails();
+                    detail.setFileName(fileName);
+                    detail.setClassName(clazz.getQualifiedName());
+                    detail.setMethodName("configure");
+                    int line = findLineNumber(clazz.toUnformattedString(), result.getPosition());
+                    if (line > -1) {
+                        detail.setLineNumber("" + line);
+                    }
+                    int endLine = findLineNumber(clazz.toUnformattedString(), result.getPosition() + result.getLength());
+                    if (endLine > -1) {
+                        detail.setLineNumberEnd("" + endLine);
+                    }
+                    detail.setAbsolutePosition(result.getPosition());
+                    int linePos = findLinePosition(clazz.toUnformattedString(), result.getPosition());
+                    if (linePos > -1) {
+                        detail.setLinePosition(linePos);
+                    }
+                    detail.setCsimple(result.getElement());
+
+                    boolean predicate = result.getPredicate() != null ? result.getPredicate() : false;
+                    boolean expression = !predicate;
+                    detail.setPredicate(predicate);
+                    detail.setExpression(expression);
+
+                    csimpleExpressions.add(detail);
+                }
+            }
+        }
+    }
+
+    /**
      * Parses the java source class to discover Camel routes with id's assigned.
      *
      * @param clazz                  the java source class
diff --git a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/XmlRouteParser.java b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/XmlRouteParser.java
index 1887ecd..9a463ae 100644
--- a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/XmlRouteParser.java
+++ b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/XmlRouteParser.java
@@ -27,6 +27,7 @@ import org.apache.camel.parser.helper.CamelJavaParserHelper;
 import org.apache.camel.parser.helper.CamelXmlHelper;
 import org.apache.camel.parser.helper.CamelXmlTreeParserHelper;
 import org.apache.camel.parser.helper.XmlLineNumberParser;
+import org.apache.camel.parser.model.CamelCSimpleExpressionDetails;
 import org.apache.camel.parser.model.CamelEndpointDetails;
 import org.apache.camel.parser.model.CamelNodeDetails;
 import org.apache.camel.parser.model.CamelNodeDetailsFactory;
@@ -175,7 +176,7 @@ public final class XmlRouteParser {
     }
 
     /**
-     * Parses the XML source to discover Camel endpoints.
+     * Parses the XML source to discover Camel simple languages.
      *
      * @param xml                    the xml file as input stream
      * @param baseDir                the base of the source code
@@ -196,7 +197,7 @@ public final class XmlRouteParser {
             // ignore as the xml file may not be valid at this point
         }
         if (dom != null) {
-            List<Node> nodes = CamelXmlHelper.findAllSimpleExpressions(dom);
+            List<Node> nodes = CamelXmlHelper.findAllLanguageExpressions(dom, "simple");
             for (Node node : nodes) {
                 String simple = node.getTextContent();
                 String lineNumber = (String) node.getUserData(XmlLineNumberParser.LINE_NUMBER);
@@ -230,6 +231,61 @@ public final class XmlRouteParser {
     }
 
     /**
+     * Parses the XML source to discover Camel compiled simple language.
+     *
+     * @param xml                    the xml file as input stream
+     * @param baseDir                the base of the source code
+     * @param fullyQualifiedFileName the fully qualified source code file name
+     * @param csimpleExpressions     list to add discovered and parsed compiled simple expressions
+     */
+    public static void parseXmlRouteCSimpleExpressions(
+            InputStream xml, String baseDir, String fullyQualifiedFileName,
+            List<CamelCSimpleExpressionDetails> csimpleExpressions)
+            throws Exception {
+
+        // find all the simple expressions
+        // try parse it as dom
+        Document dom = null;
+        try {
+            dom = XmlLineNumberParser.parseXml(xml);
+        } catch (Exception e) {
+            // ignore as the xml file may not be valid at this point
+        }
+        if (dom != null) {
+            List<Node> nodes = CamelXmlHelper.findAllLanguageExpressions(dom, "csimple");
+            for (Node node : nodes) {
+                String simple = node.getTextContent();
+                String lineNumber = (String) node.getUserData(XmlLineNumberParser.LINE_NUMBER);
+                String lineNumberEnd = (String) node.getUserData(XmlLineNumberParser.LINE_NUMBER_END);
+
+                // we only want the relative dir name from the resource directory, eg META-INF/spring/foo.xml
+                String fileName = fullyQualifiedFileName;
+                if (fileName.startsWith(baseDir)) {
+                    fileName = fileName.substring(baseDir.length() + 1);
+                }
+
+                CamelCSimpleExpressionDetails detail = new CamelCSimpleExpressionDetails();
+                detail.setFileName(fileName);
+                detail.setLineNumber(lineNumber);
+                detail.setLineNumberEnd(lineNumberEnd);
+                detail.setCsimple(simple);
+
+                String column = (String) node.getUserData(XmlLineNumberParser.COLUMN_NUMBER);
+                if (column != null) {
+                    detail.setLinePosition(Integer.valueOf(column));
+                }
+
+                // is it used as predicate or not
+                boolean asPredicate = isSimplePredicate(node);
+                detail.setPredicate(asPredicate);
+                detail.setExpression(!asPredicate);
+
+                csimpleExpressions.add(detail);
+            }
+        }
+    }
+
+    /**
      * Parses the XML source to discover Camel routes with id's assigned.
      *
      * @param xml                    the xml file as input stream
diff --git a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaParserHelper.java b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaParserHelper.java
index 8d7747f..1e6ea23 100644
--- a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaParserHelper.java
+++ b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaParserHelper.java
@@ -416,7 +416,7 @@ public final class CamelJavaParserHelper {
         uris.add(new ParserResult(node, -1, -1, arg.toString(), false));
     }
 
-    public static List<ParserResult> parseCamelSimpleExpressions(MethodSource<JavaClassSource> method) {
+    public static List<ParserResult> parseCamelLanguageExpressions(MethodSource<JavaClassSource> method, String language) {
         List<ParserResult> answer = new ArrayList<>();
 
         MethodDeclaration md = (MethodDeclaration) method.getInternal();
@@ -429,7 +429,7 @@ public final class CamelJavaParserHelper {
                     Expression exp = es.getExpression();
 
                     List<ParserResult> expressions = new ArrayList<>();
-                    parseExpression(null, method.getOrigin(), block, exp, expressions);
+                    parseExpression(null, method.getOrigin(), block, exp, expressions, language);
                     if (!expressions.isEmpty()) {
                         // reverse the order as we will grab them from last->first
                         Collections.reverse(expressions);
@@ -443,47 +443,46 @@ public final class CamelJavaParserHelper {
     }
 
     private static void parseExpression(
-            String node, JavaClassSource clazz, Block block, Expression exp, List<ParserResult> expressions) {
+            String node, JavaClassSource clazz, Block block, Expression exp, List<ParserResult> expressions, String language) {
         if (exp == null) {
             return;
         }
         if (exp instanceof MethodInvocation) {
             MethodInvocation mi = (MethodInvocation) exp;
-            doParseCamelSimple(node, clazz, block, mi, expressions);
+            doParseCamelLanguage(node, clazz, block, mi, expressions, language);
             // if the method was called on another method, then recursive
             exp = mi.getExpression();
-            parseExpression(node, clazz, block, exp, expressions);
+            parseExpression(node, clazz, block, exp, expressions, language);
         }
     }
 
-    private static void doParseCamelSimple(
-            String node, JavaClassSource clazz, Block block, MethodInvocation mi, List<ParserResult> expressions) {
+    private static void doParseCamelLanguage(
+            String node, JavaClassSource clazz, Block block, MethodInvocation mi, List<ParserResult> expressions,
+            String language) {
         String name = mi.getName().getIdentifier();
 
-        if ("simple".equals(name)) {
+        if (language.equals(name)) {
             List args = mi.arguments();
-            // the first argument is a string parameter for the simple expression
+            // the first argument is a string parameter for the language expression
             if (args != null && !args.isEmpty()) {
                 // it is a String type
                 Object arg = args.get(0);
-                String simple = getLiteralValue(clazz, block, (Expression) arg);
-                if (!Strings.isNullOrEmpty(simple)) {
-                    // is this a simple expression that is called as a predicate or expression
+                String exp = getLiteralValue(clazz, block, (Expression) arg);
+                if (!Strings.isNullOrEmpty(exp)) {
+                    // is this a expression that is called as a predicate or expression
                     boolean predicate = false;
                     Expression parent = mi.getExpression();
                     if (parent == null) {
                         // maybe its an argument
-                        // simple maybe be passed in as an argument
                         List list = mi.arguments();
                         // must be a single argument
                         if (list != null && list.size() == 1) {
                             ASTNode o = (ASTNode) list.get(0);
                             ASTNode p = o.getParent();
                             if (p instanceof MethodInvocation) {
-                                // this is simple
                                 String pName = ((MethodInvocation) p).getName().getIdentifier();
-                                if ("simple".equals(pName)) {
-                                    // okay find the parent of simple which is the method that uses simple
+                                if (language.equals(pName)) {
+                                    // okay find the parent of the language which is the method that uses the language
                                     parent = (Expression) p.getParent();
                                 }
                             }
@@ -492,34 +491,34 @@ public final class CamelJavaParserHelper {
                     if (parent instanceof MethodInvocation) {
                         MethodInvocation emi = (MethodInvocation) parent;
                         String parentName = emi.getName().getIdentifier();
-                        predicate = isSimplePredicate(parentName);
+                        predicate = isLanguagePredicate(parentName);
                     }
 
                     int position = ((Expression) arg).getStartPosition();
                     int len = ((Expression) arg).getLength();
-                    ParserResult result = new ParserResult(node, position, len, simple);
+                    ParserResult result = new ParserResult(node, position, len, exp);
                     result.setPredicate(predicate);
                     expressions.add(result);
                 }
             }
         }
 
-        // simple maybe be passed in as an argument
+        // the language maybe be passed in as an argument
         List args = mi.arguments();
         if (args != null) {
             for (Object arg : args) {
                 if (arg instanceof MethodInvocation) {
                     MethodInvocation ami = (MethodInvocation) arg;
-                    doParseCamelSimple(node, clazz, block, ami, expressions);
+                    doParseCamelLanguage(node, clazz, block, ami, expressions, language);
                 }
             }
         }
     }
 
     /**
-     * Using simple expressions in the Java DSL may be used in certain places as predicate only
+     * Using language expressions in the Java DSL may be used in certain places as predicate only
      */
-    private static boolean isSimplePredicate(String name) {
+    private static boolean isLanguagePredicate(String name) {
         if (name == null) {
             return false;
         }
diff --git a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlHelper.java b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlHelper.java
index 726f3f9..52f89c5 100644
--- a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlHelper.java
+++ b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlHelper.java
@@ -152,23 +152,23 @@ public final class CamelXmlHelper {
         return nodes;
     }
 
-    public static List<Node> findAllSimpleExpressions(Document dom) {
+    public static List<Node> findAllLanguageExpressions(Document dom, String language) {
         List<Node> nodes = new ArrayList<>();
 
         NodeList list = getElementsByTagName(dom, "route");
         for (int i = 0; i < list.getLength(); i++) {
             Node child = list.item(i);
             if (isNodeName("route", child)) {
-                findAllSimpleExpressionsRecursive(child, nodes);
+                findAllLanguageExpressionsRecursive(child, nodes, language);
             }
         }
 
         return nodes;
     }
 
-    private static void findAllSimpleExpressionsRecursive(Node node, List<Node> nodes) {
-        // okay its a route so grab if its <simple>
-        if (isNodeName("simple", node)) {
+    private static void findAllLanguageExpressionsRecursive(Node node, List<Node> nodes, String language) {
+        // okay its a route so grab if its the language
+        if (isNodeName(language, node)) {
             nodes.add(node);
         }
 
@@ -177,7 +177,7 @@ public final class CamelXmlHelper {
             for (int i = 0; i < children.getLength(); i++) {
                 Node child = children.item(i);
                 if (child.getNodeType() == Node.ELEMENT_NODE) {
-                    findAllSimpleExpressionsRecursive(child, nodes);
+                    findAllLanguageExpressionsRecursive(child, nodes, language);
                 }
             }
         }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelCSimpleExpressionDetails.java
similarity index 65%
copy from core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
copy to catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelCSimpleExpressionDetails.java
index 03c71fc..9ccc146 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
+++ b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelCSimpleExpressionDetails.java
@@ -14,24 +14,26 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.language.simple.ast;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.language.simple.types.SimpleToken;
+package org.apache.camel.parser.model;
 
 /**
- * Ends a function
+ * Details about a parsed and discovered Camel compile simple expression.
  */
-public class SimpleFunctionEnd extends BaseSimpleNode implements BlockEnd {
+public class CamelCSimpleExpressionDetails extends LanguageExpressionDetails {
+
+    private String csimple;
+
+    public String getCsimple() {
+        return csimple;
+    }
 
-    public SimpleFunctionEnd(SimpleToken token) {
-        super(token);
+    public void setCsimple(String csimple) {
+        this.csimple = csimple;
     }
 
     @Override
-    public Expression createExpression(CamelContext camelContext, String expression) {
-        return null;
+    public String toString() {
+        return csimple;
     }
 
 }
diff --git a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java
index bb13678..0170fbe 100644
--- a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java
+++ b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java
@@ -19,80 +19,9 @@ package org.apache.camel.parser.model;
 /**
  * Details about a parsed and discovered Camel simple expression.
  */
-public class CamelSimpleExpressionDetails {
+public class CamelSimpleExpressionDetails extends LanguageExpressionDetails {
 
-    private String fileName;
-    private String lineNumber;
-    private String lineNumberEnd;
-    private int absolutePosition;
-    private int linePosition;
-    private String className;
-    private String methodName;
     private String simple;
-    private boolean predicate;
-    private boolean expression;
-
-    public String getFileName() {
-        return fileName;
-    }
-
-    public void setFileName(String fileName) {
-        this.fileName = fileName;
-    }
-
-    public String getLineNumber() {
-        return lineNumber;
-    }
-
-    public void setLineNumber(String lineNumber) {
-        this.lineNumber = lineNumber;
-    }
-
-    public String getLineNumberEnd() {
-        return lineNumberEnd;
-    }
-
-    public void setLineNumberEnd(String lineNumberEnd) {
-        this.lineNumberEnd = lineNumberEnd;
-    }
-
-    public int getAbsolutePosition() {
-        return absolutePosition;
-    }
-
-    /**
-     * The absolute position where 0 is the beginning of the file. This is only available for Java DSL.
-     */
-    public void setAbsolutePosition(int absolutePosition) {
-        this.absolutePosition = absolutePosition;
-    }
-
-    public int getLinePosition() {
-        return linePosition;
-    }
-
-    /**
-     * The relative position in the begin line number.
-     */
-    public void setLinePosition(int linePosition) {
-        this.linePosition = linePosition;
-    }
-
-    public String getClassName() {
-        return className;
-    }
-
-    public void setClassName(String className) {
-        this.className = className;
-    }
-
-    public String getMethodName() {
-        return methodName;
-    }
-
-    public void setMethodName(String methodName) {
-        this.methodName = methodName;
-    }
 
     public String getSimple() {
         return simple;
@@ -102,22 +31,6 @@ public class CamelSimpleExpressionDetails {
         this.simple = simple;
     }
 
-    public boolean isPredicate() {
-        return predicate;
-    }
-
-    public void setPredicate(boolean predicate) {
-        this.predicate = predicate;
-    }
-
-    public boolean isExpression() {
-        return expression;
-    }
-
-    public void setExpression(boolean expression) {
-        this.expression = expression;
-    }
-
     @Override
     public String toString() {
         return simple;
diff --git a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/LanguageExpressionDetails.java
similarity index 88%
copy from catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java
copy to catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/LanguageExpressionDetails.java
index bb13678..e5d144d 100644
--- a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java
+++ b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/LanguageExpressionDetails.java
@@ -16,10 +16,7 @@
  */
 package org.apache.camel.parser.model;
 
-/**
- * Details about a parsed and discovered Camel simple expression.
- */
-public class CamelSimpleExpressionDetails {
+abstract class LanguageExpressionDetails {
 
     private String fileName;
     private String lineNumber;
@@ -28,7 +25,6 @@ public class CamelSimpleExpressionDetails {
     private int linePosition;
     private String className;
     private String methodName;
-    private String simple;
     private boolean predicate;
     private boolean expression;
 
@@ -94,14 +90,6 @@ public class CamelSimpleExpressionDetails {
         this.methodName = methodName;
     }
 
-    public String getSimple() {
-        return simple;
-    }
-
-    public void setSimple(String simple) {
-        this.simple = simple;
-    }
-
     public boolean isPredicate() {
         return predicate;
     }
@@ -118,8 +106,4 @@ public class CamelSimpleExpressionDetails {
         this.expression = expression;
     }
 
-    @Override
-    public String toString() {
-        return simple;
-    }
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java b/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/MyCSimpleRouteBuilder.java
similarity index 63%
copy from core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
copy to catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/MyCSimpleRouteBuilder.java
index 03c71fc..6f23a94 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
+++ b/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/MyCSimpleRouteBuilder.java
@@ -14,24 +14,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.language.simple.ast;
+package org.apache.camel.parser.java;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.language.simple.types.SimpleToken;
+import org.apache.camel.builder.RouteBuilder;
 
-/**
- * Ends a function
- */
-public class SimpleFunctionEnd extends BaseSimpleNode implements BlockEnd {
-
-    public SimpleFunctionEnd(SimpleToken token) {
-        super(token);
-    }
+public class MyCSimpleRouteBuilder extends RouteBuilder {
 
     @Override
-    public Expression createExpression(CamelContext camelContext, String expression) {
-        return null;
+    public void configure() {
+        from("timer:foo")
+                .filter(csimple("${body} > 99"))
+                    .toD("log:a")
+                .end()
+                .filter().csimple("${body} > 201")
+                    .to("log:b")
+                .end()
+                .to("log:c");
     }
-
 }
diff --git a/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterSimpleRouteBuilderConfigureTest.java b/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterCSimpleRouteBuilderConfigureTest.java
similarity index 82%
copy from catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterSimpleRouteBuilderConfigureTest.java
copy to catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterCSimpleRouteBuilderConfigureTest.java
index e8d31ac..8d030fc 100644
--- a/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterSimpleRouteBuilderConfigureTest.java
+++ b/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterCSimpleRouteBuilderConfigureTest.java
@@ -32,25 +32,25 @@ import org.slf4j.LoggerFactory;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-public class RoasterSimpleRouteBuilderConfigureTest {
+public class RoasterCSimpleRouteBuilderConfigureTest {
 
-    private static final Logger LOG = LoggerFactory.getLogger(RoasterSimpleRouteBuilderConfigureTest.class);
+    private static final Logger LOG = LoggerFactory.getLogger(RoasterCSimpleRouteBuilderConfigureTest.class);
 
     @Test
     void parse() throws Exception {
         JavaClassSource clazz = (JavaClassSource) Roaster
-                .parse(new File("src/test/java/org/apache/camel/parser/java/MySimpleRouteBuilder.java"));
+                .parse(new File("src/test/java/org/apache/camel/parser/java/MyCSimpleRouteBuilder.java"));
         MethodSource<JavaClassSource> method = clazz.getMethod("configure");
 
-        List<ParserResult> list = CamelJavaParserHelper.parseCamelSimpleExpressions(method);
-        for (ParserResult simple : list) {
-            LOG.info("Simple: " + simple.getElement());
-            LOG.info("  Line: " + findLineNumber(simple.getPosition()));
+        List<ParserResult> list = CamelJavaParserHelper.parseCamelLanguageExpressions(method, "csimple");
+        for (ParserResult csimple : list) {
+            LOG.info("CSimple: " + csimple.getElement());
+            LOG.info("   Line: " + findLineNumber(csimple.getPosition()));
         }
-        assertEquals("${body} > 100", list.get(0).getElement());
+        assertEquals("${body} > 99", list.get(0).getElement());
         assertEquals(true, list.get(0).getPredicate());
         assertEquals(27, findLineNumber(list.get(0).getPosition()));
-        assertEquals("${body} > 200", list.get(1).getElement());
+        assertEquals("${body} > 201", list.get(1).getElement());
         assertEquals(true, list.get(1).getPredicate());
         assertEquals(30, findLineNumber(list.get(1).getPosition()));
     }
@@ -58,7 +58,7 @@ public class RoasterSimpleRouteBuilderConfigureTest {
     public static int findLineNumber(int pos) throws Exception {
         int lines = 0;
         int current = 0;
-        File file = new File("src/test/java/org/apache/camel/parser/java/MySimpleRouteBuilder.java");
+        File file = new File("src/test/java/org/apache/camel/parser/java/MyCSimpleRouteBuilder.java");
         try (BufferedReader br = new BufferedReader(new FileReader(file))) {
             String line;
             while ((line = br.readLine()) != null) {
diff --git a/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterSimpleRouteBuilderConfigureTest.java b/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterSimpleRouteBuilderConfigureTest.java
index e8d31ac..b3fd65b 100644
--- a/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterSimpleRouteBuilderConfigureTest.java
+++ b/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterSimpleRouteBuilderConfigureTest.java
@@ -42,7 +42,7 @@ public class RoasterSimpleRouteBuilderConfigureTest {
                 .parse(new File("src/test/java/org/apache/camel/parser/java/MySimpleRouteBuilder.java"));
         MethodSource<JavaClassSource> method = clazz.getMethod("configure");
 
-        List<ParserResult> list = CamelJavaParserHelper.parseCamelSimpleExpressions(method);
+        List<ParserResult> list = CamelJavaParserHelper.parseCamelLanguageExpressions(method, "simple");
         for (ParserResult simple : list) {
             LOG.info("Simple: " + simple.getElement());
             LOG.info("  Line: " + findLineNumber(simple.getPosition()));
diff --git a/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlCSimpleTest.java b/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlCSimpleTest.java
new file mode 100644
index 0000000..3d2c0e9
--- /dev/null
+++ b/catalog/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlCSimpleTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.parser.xml;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.parser.XmlRouteParser;
+import org.apache.camel.parser.model.CamelCSimpleExpressionDetails;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class XmlCSimpleTest {
+
+    private static final Logger LOG = LoggerFactory.getLogger(XmlCSimpleTest.class);
+
+    @Test
+    void testXml() throws Exception {
+        List<CamelCSimpleExpressionDetails> list = new ArrayList<>();
+
+        InputStream is = new FileInputStream("src/test/resources/org/apache/camel/parser/xml/csimple.xml");
+        String fqn = "src/test/resources/org/apache/camel/camel/parser/xml/csimple.xml";
+        String baseDir = "src/test/resources";
+        XmlRouteParser.parseXmlRouteCSimpleExpressions(is, baseDir, fqn, list);
+
+        for (CamelCSimpleExpressionDetails detail : list) {
+            LOG.info(detail.getCsimple());
+        }
+
+        assertEquals(1, list.size());
+        assertEquals("${body} != 'Camel'", list.get(0).getCsimple());
+        assertTrue(list.get(0).isPredicate());
+        assertFalse(list.get(0).isExpression());
+    }
+
+}
diff --git a/catalog/camel-route-parser/src/test/resources/org/apache/camel/parser/xml/csimple.xml b/catalog/camel-route-parser/src/test/resources/org/apache/camel/parser/xml/csimple.xml
new file mode 100644
index 0000000..35ceba8
--- /dev/null
+++ b/catalog/camel-route-parser/src/test/resources/org/apache/camel/parser/xml/csimple.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+  <camelContext xmlns="http://camel.apache.org/schema/spring">
+    <route>
+      <from uri="direct:start"/>
+      <filter>
+        <csimple>${body} != 'Camel'</csimple>
+        <to uri="mock:camel"/>
+      </filter>
+    </route>
+  </camelContext>
+
+</beans>
diff --git a/catalog/pom.xml b/catalog/pom.xml
index 08e6a35..b1c306d 100644
--- a/catalog/pom.xml
+++ b/catalog/pom.xml
@@ -42,6 +42,7 @@
         <module>camel-catalog-maven</module>
         <!-- tooling that depends on catalog -->
         <module>camel-route-parser</module>
+        <module>camel-csimple-maven-plugin</module>
         <module>camel-report-maven-plugin</module>
     </modules>
 
diff --git a/components/camel-csimple-joor/pom.xml b/components/camel-csimple-joor/pom.xml
new file mode 100644
index 0000000..d1ddfaf
--- /dev/null
+++ b/components/camel-csimple-joor/pom.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>3.7.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-csimple-joor</artifactId>
+    <packaging>jar</packaging>
+    <name>Camel :: csimple jOOR</name>
+    <description>jOOR compiler for csimple language</description>
+
+    <properties>
+        <firstVersion>3.7.0</firstVersion>
+        <title>CSimple jOOR</title>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core-languages</artifactId>
+        </dependency>
+
+        <!-- requires Java 11 or 14 -->
+        <dependency>
+            <groupId>org.jooq</groupId>
+            <artifactId>joor</artifactId>
+            <version>${joor-version}</version>
+        </dependency>
+
+        <!-- test dependencies -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <!-- skip testing on java 8 -->
+    <profiles>
+        <profile>
+            <id>jdk8</id>
+            <activation>
+                <jdk>[,8)</jdk>
+            </activation>
+            <properties>
+                <maven.test.skip.exec>true</maven.test.skip.exec>
+            </properties>
+        </profile>
+    </profiles>
+
+
+</project>
\ No newline at end of file
diff --git a/components/camel-csimple-joor/src/generated/resources/META-INF/services/org/apache/camel/csimple-compiler b/components/camel-csimple-joor/src/generated/resources/META-INF/services/org/apache/camel/csimple-compiler
new file mode 100644
index 0000000..f706ed0
--- /dev/null
+++ b/components/camel-csimple-joor/src/generated/resources/META-INF/services/org/apache/camel/csimple-compiler
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.language.csimple.joor.JoorCSimpleCompiler
diff --git a/components/camel-csimple-joor/src/generated/resources/META-INF/services/org/apache/camel/other.properties b/components/camel-csimple-joor/src/generated/resources/META-INF/services/org/apache/camel/other.properties
new file mode 100644
index 0000000..ccee2a4
--- /dev/null
+++ b/components/camel-csimple-joor/src/generated/resources/META-INF/services/org/apache/camel/other.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+name=csimple-joor
+groupId=org.apache.camel
+artifactId=camel-csimple-joor
+version=3.7.0-SNAPSHOT
+projectName=Camel :: csimple jOOR
+projectDescription=jOOR compiler for csimple language
diff --git a/components/camel-csimple-joor/src/generated/resources/csimple-joor.json b/components/camel-csimple-joor/src/generated/resources/csimple-joor.json
new file mode 100644
index 0000000..cb80040
--- /dev/null
+++ b/components/camel-csimple-joor/src/generated/resources/csimple-joor.json
@@ -0,0 +1,14 @@
+{
+  "other": {
+    "kind": "other",
+    "name": "csimple-joor",
+    "title": "CSimple jOOR",
+    "description": "jOOR compiler for csimple language",
+    "deprecated": false,
+    "firstVersion": "3.7.0",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-csimple-joor",
+    "version": "3.7.0-SNAPSHOT"
+  }
+}
diff --git a/components/camel-csimple-joor/src/main/docs/csimple-joor.adoc b/components/camel-csimple-joor/src/main/docs/csimple-joor.adoc
new file mode 100644
index 0000000..9644370
--- /dev/null
+++ b/components/camel-csimple-joor/src/main/docs/csimple-joor.adoc
@@ -0,0 +1,46 @@
+[[csimple-joor-other]]
+= CSimple jOOR Component
+:docTitle: CSimple jOOR
+:artifactId: camel-csimple-joor
+:description: jOOR compiler for csimple language
+:since: 3.7
+:supportLevel: Preview
+include::{cq-version}@camel-quarkus:ROOT:partial$reference/others/csimple-joor.adoc[opts=optional]
+
+*Since Camel {since}*
+
+The csimple (compiled simple) expression language can either be source code generated and compiled together
+with your application using the regular Java compiler. Or compiled at runtime using jOOR during bootstrap.
+
+This module includes the jOOR compiler for the csimple language for runtime compilation.
+
+To use this, just include `camel-csimple-joor` in the classpath.
+
+NOTE: Java 8 is not supported. Java 11 or 14 is required.
+
+
+== Limitations
+
+The supported runtime is intended for Java standalone, Spring Boot, Camel Quarkus and other microservices runtimes.
+It is not supported in OSGi, Camel Karaf or any kind of Java Application Server runtime.
+
+jOOR does not support runtime compilation with Spring Boot using _fat jar_ packaging (https://github.com/jOOQ/jOOR/issues/69),
+it works with exploded classpath.
+
+== Dependencies
+
+To use scripting languages in your camel routes you need to add a
+dependency on *camel-csimple-joor*.
+
+If you use Maven you could just add the following to your `pom.xml`,
+substituting the version number for the latest and greatest release (see
+the download page for the latest versions).
+
+[source,xml]
+---------------------------------------
+<dependency>
+  <groupId>org.apache.camel</groupId>
+  <artifactId>camel-csimple-joor</artifactId>
+  <version>x.x.x</version>
+</dependency>
+---------------------------------------
diff --git a/components/camel-csimple-joor/src/main/java/org/apache/camel/language/csimple/joor/JoorCSimpleCompilationException.java b/components/camel-csimple-joor/src/main/java/org/apache/camel/language/csimple/joor/JoorCSimpleCompilationException.java
new file mode 100644
index 0000000..88917f9
--- /dev/null
+++ b/components/camel-csimple-joor/src/main/java/org/apache/camel/language/csimple/joor/JoorCSimpleCompilationException.java
@@ -0,0 +1,58 @@
+/*
+ * 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.csimple.joor;
+
+/**
+ * jOOR Compilation error.
+ */
+public class JoorCSimpleCompilationException extends RuntimeException {
+
+    private final String className;
+    private final String code;
+
+    public JoorCSimpleCompilationException(String className, String code, Throwable cause) {
+        super("csimple-joor compilation error for class: " + className, cause);
+        this.className = className;
+        this.code = code;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    @Override
+    public String getMessage() {
+        return super.getMessage() + "\n\n" + codeWithLineNumbers() + "\n\n";
+    }
+
+    private String codeWithLineNumbers() {
+        StringBuilder sb = new StringBuilder();
+        String[] lines = code.split("\n");
+        int counter = 0;
+        for (String line : lines) {
+            String s = String.format("%3d %s", ++counter, line);
+            sb.append(s);
+            sb.append("\n");
+        }
+        return sb.toString();
+    }
+
+}
diff --git a/components/camel-csimple-joor/src/main/java/org/apache/camel/language/csimple/joor/JoorCSimpleCompiler.java b/components/camel-csimple-joor/src/main/java/org/apache/camel/language/csimple/joor/JoorCSimpleCompiler.java
new file mode 100644
index 0000000..e35977c
--- /dev/null
+++ b/components/camel-csimple-joor/src/main/java/org/apache/camel/language/csimple/joor/JoorCSimpleCompiler.java
@@ -0,0 +1,163 @@
+/*
+ * 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.csimple.joor;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.StaticService;
+import org.apache.camel.language.csimple.CSimpleCodeGenerator;
+import org.apache.camel.language.csimple.CSimpleCompiler;
+import org.apache.camel.language.csimple.CSimpleExpression;
+import org.apache.camel.language.csimple.CSimpleGeneratedCode;
+import org.apache.camel.spi.annotations.JdkService;
+import org.apache.camel.support.ScriptHelper;
+import org.apache.camel.support.service.ServiceSupport;
+import org.apache.camel.util.StopWatch;
+import org.joor.Reflect;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * jOOR compiler for csimple language.
+ */
+@JdkService(CSimpleCompiler.FACTORY)
+public class JoorCSimpleCompiler extends ServiceSupport implements CSimpleCompiler, StaticService {
+
+    private static final Logger LOG = LoggerFactory.getLogger(JoorCSimpleCompiler.class);
+    private static final AtomicInteger UUID = new AtomicInteger();
+    private Set<String> imports = new TreeSet<>();
+    private Map<String, String> aliases;
+    private int counter;
+    private long taken;
+
+    public Set<String> getImports() {
+        return imports;
+    }
+
+    public void setImports(Set<String> imports) {
+        this.imports = imports;
+    }
+
+    public Map<String, String> getAliases() {
+        return aliases;
+    }
+
+    public void setAliases(Map<String, String> aliases) {
+        this.aliases = aliases;
+    }
+
+    @Override
+    public void addImport(String imports) {
+        this.imports.add(imports);
+    }
+
+    @Override
+    public void addAliases(String key, String value) {
+        this.aliases.put(key, value);
+    }
+
+    @Override
+    public CSimpleExpression compileExpression(CamelContext camelContext, String script) {
+        return doCompile(camelContext, script, false);
+    }
+
+    @Override
+    public CSimpleExpression compilePredicate(CamelContext camelContext, String script) {
+        return doCompile(camelContext, script, true);
+    }
+
+    private CSimpleExpression doCompile(CamelContext camelContext, String script, boolean predicate) {
+        StopWatch watch = new StopWatch();
+
+        CSimpleExpression answer;
+        String className = nextFQN();
+        CSimpleGeneratedCode code;
+        if (predicate) {
+            code = evalCodePredicate(camelContext, className, script);
+        } else {
+            code = evalCodeExpression(camelContext, className, script);
+        }
+        try {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Compiling code:\n\n" + code.getCode() + "\n");
+            }
+            Reflect ref = Reflect.compile(code.getFqn(), code.getCode());
+            Class<?> clazz = ref.type();
+            answer = (CSimpleExpression) clazz.getConstructor(CamelContext.class).newInstance(camelContext);
+        } catch (Exception e) {
+            throw new JoorCSimpleCompilationException(code.getFqn(), code.getCode(), e);
+        }
+
+        counter++;
+        taken += watch.taken();
+        return answer;
+    }
+
+    private CSimpleGeneratedCode evalCodeExpression(CamelContext camelContext, String fqn, String script) {
+        return doEvalCode(camelContext, fqn, script, false);
+    }
+
+    private CSimpleGeneratedCode evalCodePredicate(CamelContext camelContext, String fqn, String script) {
+        return doEvalCode(camelContext, fqn, script, true);
+    }
+
+    private CSimpleGeneratedCode doEvalCode(CamelContext camelContext, String fqn, String script, boolean predicate) {
+        // reload script
+        script = ScriptHelper.resolveOptionalExternalScript(camelContext, script);
+        // trim text
+        script = script.trim();
+
+        CSimpleCodeGenerator generator = new CSimpleCodeGenerator();
+        if (aliases != null && !aliases.isEmpty()) {
+            generator.setAliases(aliases);
+        }
+        if (imports != null && !imports.isEmpty()) {
+            generator.setImports(imports);
+        }
+
+        CSimpleGeneratedCode code;
+        if (predicate) {
+            code = generator.generatePredicate(fqn, script);
+        } else {
+            code = generator.generateExpression(fqn, script);
+        }
+
+        return code;
+    }
+
+    private static String nextFQN() {
+        return "org.apache.camel.language.csimple.joor.compiled.CSimpleJoorScript" + UUID.incrementAndGet();
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        // noop
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        super.doStop();
+        if (counter > 0) {
+            LOG.info("csimple-joor compiled {} scripts in {} millis", counter, taken);
+        }
+    }
+
+}
diff --git a/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/CSimpleTest.java b/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/CSimpleTest.java
new file mode 100644
index 0000000..2700874
--- /dev/null
+++ b/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/CSimpleTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.csimple.joor;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+public class CSimpleTest extends CamelTestSupport {
+
+    @Test
+    public void testCSimple() throws Exception {
+        getMockEndpoint("mock:high").expectedBodiesReceived("24", "20");
+        getMockEndpoint("mock:med").expectedBodiesReceived("9", "6");
+        getMockEndpoint("mock:low").expectedBodiesReceived("1", "2");
+
+        template.sendBody("direct:start", 9);
+        template.sendBody("direct:start", 1);
+        template.sendBody("direct:start", 24);
+        template.sendBody("direct:start", 2);
+        template.sendBody("direct:start", 6);
+        template.sendBody("direct:start", 20);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .choice()
+                        .when(csimple("${bodyAs(int)} > 10")).to("mock:high")
+                        .when(csimple("${bodyAs(int)} > 5")).to("mock:med")
+                        .otherwise().to("mock:low");
+            }
+        };
+    }
+}
diff --git a/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/JoorCSimpleCompilerTest.java b/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/JoorCSimpleCompilerTest.java
new file mode 100644
index 0000000..19db7a9
--- /dev/null
+++ b/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/JoorCSimpleCompilerTest.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.language.csimple.joor;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.language.csimple.CSimpleExpression;
+import org.apache.camel.support.DefaultExchange;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class JoorCSimpleCompilerTest extends CamelTestSupport {
+
+    @Test
+    public void testCompiler() throws Exception {
+        JoorCSimpleCompiler compiler = new JoorCSimpleCompiler();
+        compiler.start();
+
+        CSimpleExpression method = compiler.compileExpression(context, "Hello ${body}");
+
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setBody("Camel");
+
+        Object out = method.evaluate(exchange, Object.class);
+        Assertions.assertEquals("Hello Camel", out);
+
+        compiler.stop();
+    }
+
+    @Test
+    public void testCompilerPredicate() throws Exception {
+        JoorCSimpleCompiler compiler = new JoorCSimpleCompiler();
+        compiler.start();
+
+        CSimpleExpression method = compiler.compilePredicate(context, "${bodyAs(int)} > 100");
+
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setBody("123");
+        boolean out = method.matches(exchange);
+        Assertions.assertTrue(out);
+
+        exchange.getMessage().setBody("44");
+        out = method.matches(exchange);
+        Assertions.assertFalse(out);
+
+        compiler.stop();
+    }
+}
diff --git a/components/camel-csimple-joor/src/test/resources/log4j2.properties b/components/camel-csimple-joor/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..e177fd1
--- /dev/null
+++ b/components/camel-csimple-joor/src/test/resources/log4j2.properties
@@ -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.
+## ---------------------------------------------------------------------------
+
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-csimple-joor-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = [%30.30t] %-30.30c{1} %-5p %m%n
+logger.csimple.name = org.apache.camel.language.csimple
+logger.csimple.level = DEBUG
+rootLogger.level = INFO
+rootLogger.appenderRef.file.ref = file
diff --git a/core/camel-core-languages/src/generated/resources/META-INF/services/org/apache/camel/language.properties b/core/camel-core-languages/src/generated/resources/META-INF/services/org/apache/camel/language.properties
index 59a8354..189e731 100644
--- a/core/camel-core-languages/src/generated/resources/META-INF/services/org/apache/camel/language.properties
+++ b/core/camel-core-languages/src/generated/resources/META-INF/services/org/apache/camel/language.properties
@@ -1,5 +1,5 @@
 # Generated by camel build tools - do NOT edit this file!
-languages=constant exchangeProperty file header ref simple tokenize
+languages=constant csimple exchangeProperty file header ref simple tokenize
 groupId=org.apache.camel
 artifactId=camel-core-languages
 version=3.7.0-SNAPSHOT
diff --git a/core/camel-core-languages/src/generated/resources/META-INF/services/org/apache/camel/language/csimple b/core/camel-core-languages/src/generated/resources/META-INF/services/org/apache/camel/language/csimple
new file mode 100644
index 0000000..191b7ba
--- /dev/null
+++ b/core/camel-core-languages/src/generated/resources/META-INF/services/org/apache/camel/language/csimple
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.language.csimple.CSimpleLanguage
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
new file mode 100644
index 0000000..c9fda23
--- /dev/null
+++ b/core/camel-core-languages/src/generated/resources/org/apache/camel/language/csimple/csimple.json
@@ -0,0 +1,24 @@
+{
+  "language": {
+    "kind": "language",
+    "name": "csimple",
+    "title": "CSimple",
+    "description": "Evaluate a compile simple expression language.",
+    "deprecated": false,
+    "firstVersion": "3.7.0",
+    "label": "language",
+    "javaType": "org.apache.camel.language.csimple.CSimpleLanguage",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-core-languages",
+    "version": "3.7.0-SNAPSHOT",
+    "modelName": "csimple",
+    "modelJavaType": "org.apache.camel.model.language.CSimpleExpression"
+  },
+  "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)" },
+    "trim": { "kind": "attribute", "displayName": "Trim", "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/docs/modules/languages/pages/csimple-language.adoc b/core/camel-core-languages/src/main/docs/modules/languages/pages/csimple-language.adoc
new file mode 100644
index 0000000..25f62f0
--- /dev/null
+++ b/core/camel-core-languages/src/main/docs/modules/languages/pages/csimple-language.adoc
@@ -0,0 +1,53 @@
+[[csimple-language]]
+= CSimple Language
+:docTitle: CSimple
+:artifactId: camel-core-languages
+:description: Evaluate a compile simple expression language.
+:since: 3.7
+:supportLevel: Preview
+include::{cq-version}@camel-quarkus:ROOT:partial$reference/languages/csimple.adoc[opts=optional]
+
+*Since Camel {since}*
+
+The CSimple language is *compiled* xref:simple-language.adoc[Simple] language.
+
+
+== Different between CSimple and Simple
+
+The simple language is a dynamic expression language which is runtime parsed into a set of Camel `Expression`'s or `Predicate`'s.
+
+The csimple language is parsed into regular Java source code and compiled together with all the other source code, or it
+can be compiled once during bootstrap via the `camel-csimple-joor` module.
+
+The simple langauge is generally very lightweight and fast, however for some use-cases with dynamic method calls via OGNL paths,
+then the simple language does runtime introspection and reflection calls. This has an overhead on performance, and one of the reasons
+why csimple was created. However csimple requires to be typesafe and method calls via OGNL paths requires to know the type during parsing.
+This means for csimple languages expressions you would need to provide the class type where as simple could introspect this at runtime.
+
+In other words the simple language is using _duck typing_ (if it looks like a duck, and quacks like a duck, then it is a duck)
+and csimple is using Java type (typesafety). If there is a type error then simple will report this at runtime, and csimple you will see a Java compiler error.
+
+
+== CSimple Language options
+
+// language options: START
+The CSimple language supports 2 options, which are listed below.
+
+
+
+[width="100%",cols="2,1m,1m,6",options="header"]
+|===
+| Name | Default | Java Type | Description
+| resultType |  | String | Sets the class name of the result type (type from output)
+| trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks
+|===
+// language options: END
+
+== More documentation
+
+See the xref:simple-language.adoc[Simple] language as csimple has the same set of functions as simple language.
+
+== Example
+
+See `camel-example-csimple` and `camel-example-csimple-joor` examples at https://github.com/apache/camel-examples[Camel Examples]
+
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCodeGenerator.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCodeGenerator.java
new file mode 100644
index 0000000..0f86ca9
--- /dev/null
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCodeGenerator.java
@@ -0,0 +1,154 @@
+/*
+ * 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.csimple;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.camel.util.StringHelper;
+
+/**
+ * Source code generate for csimple language.
+ *
+ * @see CSimpleGeneratedCode
+ */
+public class CSimpleCodeGenerator {
+
+    private static final AtomicInteger UUID = new AtomicInteger();
+
+    private Set<String> imports = new TreeSet<>();
+    private Map<String, String> aliases = new HashMap<>();
+
+    public Set<String> getImports() {
+        return imports;
+    }
+
+    public void setImports(Set<String> imports) {
+        this.imports = imports;
+    }
+
+    public Map<String, String> getAliases() {
+        return aliases;
+    }
+
+    public void setAliases(Map<String, String> aliases) {
+        this.aliases = aliases;
+    }
+
+    public CSimpleGeneratedCode generateExpression(String fqn, String script) {
+        return generateCode(fqn, script, false);
+    }
+
+    public CSimpleGeneratedCode generatePredicate(String fqn, String script) {
+        return generateCode(fqn, script, true);
+    }
+
+    private CSimpleGeneratedCode generateCode(String fqn, String script, boolean predicate) {
+        String text = script;
+        // text should be single line and trimmed as it can be multi lined
+        text = text.replaceAll("\n", "");
+        text = text.trim();
+
+        String qn = fqn.substring(0, fqn.lastIndexOf('.'));
+        String name = nextName();
+
+        // trim text
+        script = script.trim();
+        script = alias(script);
+
+        //  wrap text into a class method we can call
+        StringBuilder sb = new StringBuilder();
+        sb.append("package ").append(qn).append(";\n");
+        sb.append("\n");
+        sb.append("import java.util.*;\n");
+        sb.append("import java.util.concurrent.*;\n");
+        sb.append("import java.util.stream.*;\n");
+        sb.append("\n");
+        sb.append("import org.apache.camel.*;\n");
+        sb.append("import org.apache.camel.util.*;\n");
+        sb.append("import static org.apache.camel.language.csimple.CSimpleHelper.*;\n");
+        sb.append("\n");
+        // custom imports
+        for (String i : imports) {
+            sb.append(i);
+            if (!i.endsWith(";")) {
+                sb.append(";");
+            }
+            sb.append("\n");
+        }
+        sb.append("\n");
+        sb.append("public class ").append(name).append(" extends org.apache.camel.language.csimple.CSimpleSupport {\n");
+        sb.append("\n");
+
+        sb.append("    public ").append(name).append("(CamelContext context) {\n");
+        sb.append("        init(context);\n");
+        sb.append("    }\n");
+        sb.append("\n");
+
+        sb.append("    @Override\n");
+        sb.append("    public String getText() {\n");
+        sb.append("        return \"").append(text).append("\";\n");
+        sb.append("    }\n");
+        sb.append("\n");
+
+        sb.append("    @Override\n");
+        sb.append(
+                "    public Object evaluate(CamelContext context, Exchange exchange, Message message, Object body) throws Exception {\n");
+        sb.append("        ");
+        if (!script.contains("return ")) {
+            sb.append("return ");
+        }
+
+        if (predicate) {
+            CSimplePredicateParser parser = new CSimplePredicateParser();
+            script = parser.parsePredicate(script);
+        } else {
+            CSimpleExpressionParser parser = new CSimpleExpressionParser();
+            script = parser.parseExpression(script);
+        }
+
+        // single quotes instead of double quotes, as its very annoying for string in strings
+        String quoted = script.replace('\'', '"');
+        sb.append(quoted);
+        if (!script.endsWith("}") && !script.endsWith(";")) {
+            sb.append(";");
+        }
+        sb.append("\n");
+        sb.append("    }\n");
+        sb.append("}\n");
+        sb.append("\n");
+
+        return new CSimpleGeneratedCode(qn + "." + name, sb.toString());
+    }
+
+    private String alias(String script) {
+        for (Map.Entry<String, String> entry : aliases.entrySet()) {
+            String key = entry.getKey();
+            String value = entry.getValue();
+            script = StringHelper.replaceAll(script, key, value);
+        }
+        return script;
+    }
+
+    private static String nextName() {
+        return "CSimpleScript" + UUID.incrementAndGet();
+    }
+
+}
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCompiler.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCompiler.java
new file mode 100644
index 0000000..246b8ef
--- /dev/null
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleCompiler.java
@@ -0,0 +1,64 @@
+/*
+ * 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.csimple;
+
+import org.apache.camel.CamelContext;
+
+/**
+ * SPI plugin for custom compilers to use at runtime.
+ */
+public interface CSimpleCompiler {
+
+    /**
+     * Service factory key.
+     */
+    String FACTORY = "csimple-compiler";
+
+    /**
+     * Adds an import line
+     *
+     * @param imports import such as com.foo.MyClass
+     */
+    void addImport(String imports);
+
+    /**
+     * Adds an alias
+     *
+     * @param key   the key
+     * @param value the value
+     */
+    void addAliases(String key, String value);
+
+    /**
+     * Create an expression from the given csimple script
+     *
+     * @param  camelContext the camel context
+     * @param  script       the csimple script
+     * @return              the compiled expression
+     */
+    CSimpleExpression compileExpression(CamelContext camelContext, String script);
+
+    /**
+     * Create an expression from the given csimple script
+     *
+     * @param  camelContext the camel context
+     * @param  script       the csimple script
+     * @return              the compiled preidcate
+     */
+    CSimpleExpression compilePredicate(CamelContext camelContext, String script);
+
+}
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleException.java
similarity index 63%
copy from core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
copy to core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleException.java
index 03c71fc..e150247 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleException.java
@@ -14,24 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.language.simple.ast;
+package org.apache.camel.language.csimple;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.language.simple.types.SimpleToken;
+import org.apache.camel.RuntimeCamelException;
 
 /**
- * Ends a function
+ * General csimple exception.
  */
-public class SimpleFunctionEnd extends BaseSimpleNode implements BlockEnd {
+public class CSimpleException extends RuntimeCamelException {
 
-    public SimpleFunctionEnd(SimpleToken token) {
-        super(token);
-    }
+    private final String expression;
 
-    @Override
-    public Expression createExpression(CamelContext camelContext, String expression) {
-        return null;
+    public CSimpleException(String message, String expression) {
+        super(message);
+        this.expression = expression;
     }
 
+    public String getExpression() {
+        return expression;
+    }
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SingleQuoteEnd.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleExpression.java
similarity index 67%
copy from core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SingleQuoteEnd.java
copy to core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleExpression.java
index b0f590b..b33fbd3 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SingleQuoteEnd.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleExpression.java
@@ -14,24 +14,30 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.language.simple.ast;
+package org.apache.camel.language.csimple;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
-import org.apache.camel.language.simple.types.SimpleToken;
+import org.apache.camel.Predicate;
 
 /**
- * Ends a block enclosed by single quotes
+ * CSimple for {@link Expression} or {@link Predicate}.
  */
-public class SingleQuoteEnd extends BaseSimpleNode implements BlockEnd {
+public interface CSimpleExpression extends Expression, Predicate {
 
-    public SingleQuoteEnd(SimpleToken token) {
-        super(token);
-    }
+    /**
+     * The csimple script as text
+     */
+    String getText();
 
+    /**
+     * To do custom initialization
+     *
+     * @param context the camel context
+     */
     @Override
-    public Expression createExpression(CamelContext camelContext, String expression) {
-        return null;
+    default void init(CamelContext context) {
+        // noop
     }
 
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleExpressionParser.java
similarity index 63%
copy from core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
copy to core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleExpressionParser.java
index 03c71fc..01bc576 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleExpressionParser.java
@@ -14,24 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.language.simple.ast;
+package org.apache.camel.language.csimple;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.language.simple.types.SimpleToken;
+import org.apache.camel.language.simple.SimpleExpressionParser;
 
 /**
- * Ends a function
+ * Expression parser for csimple.
  */
-public class SimpleFunctionEnd extends BaseSimpleNode implements BlockEnd {
+public class CSimpleExpressionParser {
 
-    public SimpleFunctionEnd(SimpleToken token) {
-        super(token);
-    }
-
-    @Override
-    public Expression createExpression(CamelContext camelContext, String expression) {
-        return null;
+    public String parseExpression(String expression) {
+        // reuse simple language parser but output the result as java code
+        SimpleExpressionParser parser = new SimpleExpressionParser(null, expression, true, null);
+        String code = parser.parseCode();
+        return code;
     }
 
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleGeneratedCode.java
similarity index 63%
copy from core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
copy to core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleGeneratedCode.java
index 03c71fc..87a1e12 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleGeneratedCode.java
@@ -14,24 +14,32 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.language.simple.ast;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.language.simple.types.SimpleToken;
+package org.apache.camel.language.csimple;
 
 /**
- * Ends a function
+ * Generated csimple code.
  */
-public class SimpleFunctionEnd extends BaseSimpleNode implements BlockEnd {
+public final class CSimpleGeneratedCode {
+
+    private String fqn;
+    private String code;
 
-    public SimpleFunctionEnd(SimpleToken token) {
-        super(token);
+    public CSimpleGeneratedCode(String fqn, String code) {
+        this.fqn = fqn;
+        this.code = code;
     }
 
-    @Override
-    public Expression createExpression(CamelContext camelContext, String expression) {
-        return null;
+    /**
+     * The FQN class name
+     */
+    public String getFqn() {
+        return fqn;
     }
 
+    /**
+     * The generated java source code
+     */
+    public String getCode() {
+        return code;
+    }
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleHelper.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleHelper.java
new file mode 100644
index 0000000..fc3fe5a
--- /dev/null
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleHelper.java
@@ -0,0 +1,576 @@
+/*
+ * 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.csimple;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+import java.util.TimeZone;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelExchangeException;
+import org.apache.camel.Exchange;
+import org.apache.camel.InvalidPayloadException;
+import org.apache.camel.Message;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.ExchangeFormatter;
+import org.apache.camel.spi.Language;
+import org.apache.camel.spi.PropertiesComponent;
+import org.apache.camel.support.CamelContextHelper;
+import org.apache.camel.support.ExchangeHelper;
+import org.apache.camel.support.GroupIterator;
+import org.apache.camel.support.MessageHelper;
+import org.apache.camel.support.processor.DefaultExchangeFormatter;
+import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.InetAddressUtil;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.SkipIterator;
+import org.apache.camel.util.StringHelper;
+import org.apache.camel.util.TimeUtils;
+
+/**
+ * A set of helper as static imports for the Camel compiled simple language.
+ */
+public final class CSimpleHelper {
+
+    // this is special for the range operator where you define the range as from..to (where from and to are numbers)
+    private static final Pattern RANGE_PATTERN = Pattern.compile("^(\\d+)(\\.\\.)(\\d+)$");
+    // use for date operator
+    private static final Pattern OFFSET_PATTERN = Pattern.compile("([+-])([^+-]+)");
+
+    private static ExchangeFormatter exchangeFormatter;
+    private static Language beanLanguage;
+
+    private CSimpleHelper() {
+    }
+
+    public static <T> T bodyAs(Message message, Class<T> type) {
+        return message.getBody(type);
+    }
+
+    public static <T> T mandatoryBodyAs(Message message, Class<T> type) throws InvalidPayloadException {
+        return message.getMandatoryBody(type);
+    }
+
+    public static Object header(Message message, String name) {
+        return message.getHeader(name);
+    }
+
+    public static <T> T headerAs(Message message, String name, Class<T> type) {
+        return message.getHeader(name, type);
+    }
+
+    public static Object exchangeProperty(Exchange exchange, String name) {
+        return exchange.getProperty(name);
+    }
+
+    public static <T> T exchangePropertyAs(Exchange exchange, String name, Class<T> type) {
+        return exchange.getProperty(name, type);
+    }
+
+    public static String bodyOneLine(Exchange exchange) {
+        String body = exchange.getIn().getBody(String.class);
+        if (body == null) {
+            return null;
+        }
+        body = StringHelper.replaceAll(body, System.lineSeparator(), "");
+        return body;
+    }
+
+    public static Exception exception(Exchange exchange) {
+        Exception exception = exchange.getException();
+        if (exception == null) {
+            exception = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
+        }
+        return exception;
+    }
+
+    public static <T> T exceptionAs(Exchange exchange, Class<T> type) {
+        Exception exception = exchange.getException();
+        if (exception == null) {
+            exception = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
+        }
+        if (exception != null) {
+            return type.cast(exception);
+        } else {
+            return null;
+        }
+    }
+
+    public static String exceptionMessage(Exchange exchange) {
+        Exception exception = exception(exchange);
+        if (exception != null) {
+            return exception.getMessage();
+        } else {
+            return null;
+        }
+    }
+
+    public static String exceptionStacktrace(Exchange exchange) {
+        Exception exception = exception(exchange);
+        if (exception != null) {
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+            exception.printStackTrace(pw);
+            IOHelper.close(pw, sw);
+            return sw.toString();
+        } else {
+            return null;
+        }
+    }
+
+    public static String threadName() {
+        return Thread.currentThread().getName();
+    }
+
+    public static String hostName() {
+        return InetAddressUtil.getLocalHostNameSafe();
+    }
+
+    public static String routeId(Exchange exchange) {
+        return ExchangeHelper.getRouteId(exchange);
+    }
+
+    public static String stepId(Exchange exchange) {
+        return exchange.getProperty(Exchange.STEP_ID, String.class);
+    }
+
+    public static String fileName(Message message) {
+        return message.getHeader(Exchange.FILE_NAME, String.class);
+    }
+
+    public static String fileNameNoExt(Message message) {
+        String name = message.getHeader(Exchange.FILE_NAME, String.class);
+        return FileUtil.stripExt(name);
+    }
+
+    public static String fileNameNoExtSingle(Message message) {
+        String name = message.getHeader(Exchange.FILE_NAME, String.class);
+        return FileUtil.stripExt(name, true);
+    }
+
+    public static String fileNameExt(Message message) {
+        String name = message.getHeader(Exchange.FILE_NAME, String.class);
+        return FileUtil.onlyExt(name);
+    }
+
+    public static String fileNameExtSingle(Message message) {
+        String name = message.getHeader(Exchange.FILE_NAME, String.class);
+        return FileUtil.onlyExt(name, true);
+    }
+
+    public static String fileOnlyName(Message message) {
+        String answer = message.getHeader(Exchange.FILE_NAME_ONLY, String.class);
+        if (answer == null) {
+            answer = message.getHeader(Exchange.FILE_NAME, String.class);
+            answer = FileUtil.stripPath(answer);
+        }
+        return answer;
+    }
+
+    public static String fileOnlyNameNoExt(Message message) {
+        String name = fileOnlyName(message);
+        return FileUtil.stripExt(name);
+    }
+
+    public static String fileOnlyNameNoExtSingle(Message message) {
+        String name = fileOnlyName(message);
+        return FileUtil.stripExt(name, true);
+    }
+
+    public static String fileParent(Message message) {
+        return message.getHeader("CamelFileParent", String.class);
+    }
+
+    public static String filePath(Message message) {
+        return message.getHeader("CamelFilePath", String.class);
+    }
+
+    public static Boolean fileAbsolute(Message message) {
+        return message.getHeader("CamelFileAbsolute", Boolean.class);
+    }
+
+    public static String fileAbsolutePath(Message message) {
+        return message.getHeader("CamelFileAbsolutePath", String.class);
+    }
+
+    public static Long fileSize(Message message) {
+        return message.getHeader(Exchange.FILE_LENGTH, Long.class);
+    }
+
+    public static Long fileModified(Message message) {
+        return message.getHeader(Exchange.FILE_LAST_MODIFIED, Long.class);
+    }
+
+    public static Date date(Exchange exchange, String commandWithOffsets) {
+        return (Date) doDate(exchange, commandWithOffsets, null, null);
+    }
+
+    public static String date(Exchange exchange, String commandWithOffsets, String timezone, String pattern) {
+        return (String) doDate(exchange, commandWithOffsets, timezone, pattern);
+    }
+
+    private static Object doDate(Exchange exchange, String commandWithOffsets, String timezone, String pattern) {
+        final String command = commandWithOffsets.split("[+-]", 2)[0].trim();
+        // Capture optional time offsets
+        final List<Long> offsets = new ArrayList<>();
+        Matcher offsetMatcher = OFFSET_PATTERN.matcher(commandWithOffsets);
+        while (offsetMatcher.find()) {
+            String time = offsetMatcher.group(2).trim();
+            long value = TimeUtils.toMilliSeconds(time);
+            offsets.add(offsetMatcher.group(1).equals("+") ? value : -value);
+        }
+
+        Date date;
+        if ("now".equals(command)) {
+            date = new Date();
+        } else if ("exchangeCreated".equals(command)) {
+            long num = exchange.getCreated();
+            date = new Date(num);
+        } else if (command.startsWith("header.")) {
+            String key = command.substring(command.lastIndexOf('.') + 1);
+            Object obj = exchange.getMessage().getHeader(key);
+            if (obj instanceof Date) {
+                date = (Date) obj;
+            } else if (obj instanceof Long) {
+                date = new Date((Long) obj);
+            } else {
+                throw new IllegalArgumentException("Cannot find Date/long object at command: " + command);
+            }
+        } else if (command.startsWith("exchangeProperty.")) {
+            String key = command.substring(command.lastIndexOf('.') + 1);
+            Object obj = exchange.getProperty(key);
+            if (obj instanceof Date) {
+                date = (Date) obj;
+            } else if (obj instanceof Long) {
+                date = new Date((Long) obj);
+            } else {
+                throw new IllegalArgumentException("Cannot find Date/long object at command: " + command);
+            }
+        } else if ("file".equals(command)) {
+            Long num = exchange.getIn().getHeader(Exchange.FILE_LAST_MODIFIED, Long.class);
+            if (num != null && num > 0) {
+                date = new Date(num);
+            } else {
+                date = exchange.getIn().getHeader(Exchange.FILE_LAST_MODIFIED, Date.class);
+                if (date == null) {
+                    throw new IllegalArgumentException(
+                            "Cannot find " + Exchange.FILE_LAST_MODIFIED + " header at command: " + command);
+                }
+            }
+        } else {
+            throw new IllegalArgumentException("Command not supported for dateExpression: " + command);
+        }
+
+        // Apply offsets
+        long dateAsLong = date.getTime();
+        for (long offset : offsets) {
+            dateAsLong += offset;
+        }
+        date = new Date(dateAsLong);
+
+        if (pattern != null && !pattern.isEmpty()) {
+            SimpleDateFormat df = new SimpleDateFormat(pattern);
+            if (timezone != null && !timezone.isEmpty()) {
+                df.setTimeZone(TimeZone.getTimeZone(timezone));
+            }
+            return df.format(date);
+        } else {
+            return date;
+        }
+    }
+
+    public static String property(Exchange exchange, String key, String defaultValue) {
+        try {
+            // enclose key with {{ }} to force parsing as key can be a nested expression too
+            PropertiesComponent pc = exchange.getContext().getPropertiesComponent();
+            return pc.parseUri(PropertiesComponent.PREFIX_TOKEN + key + PropertiesComponent.SUFFIX_TOKEN);
+        } catch (Exception e) {
+            // property with key not found, use default value if provided
+            if (defaultValue != null) {
+                return defaultValue;
+            }
+            throw RuntimeCamelException.wrapRuntimeCamelException(e);
+        }
+    }
+
+    public static Object ref(Exchange exchange, String key) {
+        return exchange.getContext().getRegistry().lookupByName(key);
+    }
+
+    public static Class<?> type(Exchange exchange, Class<?> type) {
+        return type;
+    }
+
+    public static Object type(Exchange exchange, Class<?> type, String field) {
+        return ObjectHelper.lookupConstantFieldValue(type, field);
+    }
+
+    public static Object bean(Exchange exchange, String ref, String method, Object scope) {
+        Class<?> type = null;
+        if (ref != null && ref.startsWith("type:")) {
+            try {
+                type = exchange.getContext().getClassResolver().resolveMandatoryClass(ref.substring(5));
+                ref = null;
+            } catch (ClassNotFoundException e) {
+                throw RuntimeCamelException.wrapRuntimeException(e);
+            }
+        }
+
+        Language bean = getOrCreateBeanLanguage(exchange.getContext());
+        Object[] properties = new Object[5];
+        properties[2] = type;
+        properties[3] = ref;
+        properties[1] = method;
+        properties[4] = scope;
+        return bean.createExpression(null, properties).evaluate(exchange, Object.class);
+    }
+
+    private static Language getOrCreateBeanLanguage(CamelContext camelContext) {
+        if (beanLanguage == null) {
+            beanLanguage = camelContext.resolveLanguage("bean");
+        }
+        return beanLanguage;
+    }
+
+    public static long increment(Exchange exchange, Object number) {
+        Number num = exchange.getContext().getTypeConverter().tryConvertTo(Number.class, exchange, number);
+        if (num != null) {
+            long val = num.longValue();
+            val++;
+            return val;
+        } else {
+            // cannot convert the expression as a number
+            Exception cause = new CamelExchangeException("Cannot evaluate message body as a number", exchange);
+            throw RuntimeCamelException.wrapRuntimeCamelException(cause);
+        }
+    }
+
+    public static long decrement(Exchange exchange, Object number) {
+        Number num = exchange.getContext().getTypeConverter().tryConvertTo(Number.class, exchange, number);
+        if (num != null) {
+            long val = num.longValue();
+            val--;
+            return val;
+        } else {
+            // cannot convert the expression as a number
+            Exception cause = new CamelExchangeException("Cannot evaluate message body as a number", exchange);
+            throw RuntimeCamelException.wrapRuntimeCamelException(cause);
+        }
+    }
+
+    public static int random(Exchange exchange, Object min, Object max) {
+        int num1 = exchange.getContext().getTypeConverter().tryConvertTo(int.class, exchange, min);
+        int num2 = exchange.getContext().getTypeConverter().tryConvertTo(int.class, exchange, max);
+        Random random = new Random();
+        return random.nextInt(num2 - num1) + num1;
+    }
+
+    public static SkipIterator skip(Exchange exchange, Object skip) {
+        int num = exchange.getContext().getTypeConverter().tryConvertTo(int.class, exchange, skip);
+        Iterator<?> it = org.apache.camel.support.ObjectHelper.createIterator(exchange.getMessage().getBody());
+        return new SkipIterator(it, num);
+    }
+
+    public static GroupIterator collate(Exchange exchange, Object group) {
+        int num = exchange.getContext().getTypeConverter().tryConvertTo(int.class, exchange, group);
+        Iterator<?> it = org.apache.camel.support.ObjectHelper.createIterator(exchange.getMessage().getBody());
+        return new GroupIterator(exchange, it, num);
+    }
+
+    public static String messageHistory(Exchange exchange, boolean detailed) {
+        ExchangeFormatter formatter = getOrCreateExchangeFormatter(exchange.getContext());
+        return MessageHelper.dumpMessageHistoryStacktrace(exchange, formatter, detailed);
+    }
+
+    private static ExchangeFormatter getOrCreateExchangeFormatter(CamelContext camelContext) {
+        if (exchangeFormatter == null) {
+            Set<ExchangeFormatter> formatters = camelContext.getRegistry().findByType(ExchangeFormatter.class);
+            if (formatters != null && formatters.size() == 1) {
+                exchangeFormatter = formatters.iterator().next();
+            } else {
+                // setup exchange formatter to be used for message history dump
+                DefaultExchangeFormatter def = new DefaultExchangeFormatter();
+                def.setShowExchangeId(true);
+                def.setMultiline(true);
+                def.setShowHeaders(true);
+                def.setStyle(DefaultExchangeFormatter.OutputStyle.Fixed);
+                try {
+                    Integer maxChars = CamelContextHelper.parseInteger(camelContext,
+                            camelContext.getGlobalOption(Exchange.LOG_DEBUG_BODY_MAX_CHARS));
+                    if (maxChars != null) {
+                        def.setMaxChars(maxChars);
+                    }
+                } catch (Exception e) {
+                    throw RuntimeCamelException.wrapRuntimeCamelException(e);
+                }
+                exchangeFormatter = def;
+            }
+        }
+        return exchangeFormatter;
+    }
+
+    public static boolean isEqualTo(Exchange exchange, Object leftValue, Object rightValue) {
+        return org.apache.camel.support.ObjectHelper.typeCoerceEquals(exchange.getContext().getTypeConverter(), leftValue,
+                rightValue);
+    }
+
+    public static boolean isEqualToIgnoreCase(Exchange exchange, Object leftValue, Object rightValue) {
+        return org.apache.camel.support.ObjectHelper.typeCoerceEquals(exchange.getContext().getTypeConverter(), leftValue,
+                rightValue, true);
+    }
+
+    public static boolean isNotEqualTo(Exchange exchange, Object leftValue, Object rightValue) {
+        return org.apache.camel.support.ObjectHelper.typeCoerceNotEquals(exchange.getContext().getTypeConverter(), leftValue,
+                rightValue);
+    }
+
+    public static boolean isGreaterThan(Exchange exchange, Object leftValue, Object rightValue) {
+        return org.apache.camel.support.ObjectHelper.typeCoerceCompare(exchange.getContext().getTypeConverter(), leftValue,
+                rightValue)
+               > 0;
+    }
+
+    public static boolean isGreaterThanOrEqualTo(Exchange exchange, Object leftValue, Object rightValue) {
+        return org.apache.camel.support.ObjectHelper.typeCoerceCompare(exchange.getContext().getTypeConverter(), leftValue,
+                rightValue)
+               >= 0;
+    }
+
+    public static boolean isLessThan(Exchange exchange, Object leftValue, Object rightValue) {
+        return org.apache.camel.support.ObjectHelper.typeCoerceCompare(exchange.getContext().getTypeConverter(), leftValue,
+                rightValue)
+               < 0;
+    }
+
+    public static boolean isLessThanOrEqualTo(Exchange exchange, Object leftValue, Object rightValue) {
+        return org.apache.camel.support.ObjectHelper.typeCoerceCompare(exchange.getContext().getTypeConverter(), leftValue,
+                rightValue)
+               <= 0;
+    }
+
+    public static boolean contains(Exchange exchange, Object leftValue, Object rightValue) {
+        if (leftValue == null && rightValue == null) {
+            // they are equal
+            return true;
+        } else if (leftValue == null || rightValue == null) {
+            // only one of them is null so they are not equal
+            return false;
+        }
+        return org.apache.camel.support.ObjectHelper.typeCoerceContains(exchange.getContext().getTypeConverter(), leftValue,
+                rightValue, false);
+    }
+
+    public static boolean containsIgnoreCase(Exchange exchange, Object leftValue, Object rightValue) {
+        if (leftValue == null && rightValue == null) {
+            // they are equal
+            return true;
+        } else if (leftValue == null || rightValue == null) {
+            // only one of them is null so they are not equal
+            return false;
+        }
+        return org.apache.camel.support.ObjectHelper.typeCoerceContains(exchange.getContext().getTypeConverter(), leftValue,
+                rightValue, true);
+    }
+
+    public static boolean regexp(Exchange exchange, Object leftValue, Object rightValue) {
+        String text = exchange.getContext().getTypeConverter().convertTo(String.class, exchange, leftValue);
+        String pattern = exchange.getContext().getTypeConverter().convertTo(String.class, exchange, rightValue);
+        return text.matches(pattern);
+    }
+
+    public static boolean in(Exchange exchange, Object leftValue, Object rightValue) {
+        // okay the in operator is a bit more complex as we need to build a list of values
+        // from the right hand side expression.
+        // each element on the right hand side must be separated by comma (default for create iterator)
+        Iterator<?> it = org.apache.camel.support.ObjectHelper.createIterator(rightValue);
+        List<Object> values = new ArrayList<>();
+        while (it.hasNext()) {
+            values.add(it.next());
+        }
+        for (Object value : values) {
+            if (isEqualTo(exchange, leftValue, value)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static boolean range(Exchange exchange, Object leftValue, Object rightValue) {
+        String range = exchange.getContext().getTypeConverter().convertTo(String.class, exchange, rightValue);
+        Matcher matcher = RANGE_PATTERN.matcher(range);
+        if (matcher.matches()) {
+            // wrap as constant expression for the from and to values
+            String from = matcher.group(1);
+            String to = matcher.group(3);
+
+            // build a compound predicate for the range
+            return isGreaterThanOrEqualTo(exchange, leftValue, from) && isLessThanOrEqualTo(exchange, leftValue, to);
+        } else {
+            throw new IllegalArgumentException(
+                    "Range operator is not valid. Valid syntax:'from..to' (where from and to are numbers).");
+        }
+    }
+
+    public static boolean startsWith(Exchange exchange, Object leftValue, Object rightValue) {
+        if (leftValue == null && rightValue == null) {
+            // they are equal
+            return true;
+        } else if (leftValue == null || rightValue == null) {
+            // only one of them is null so they are not equal
+            return false;
+        }
+        String leftStr = exchange.getContext().getTypeConverter().convertTo(String.class, leftValue);
+        String rightStr = exchange.getContext().getTypeConverter().convertTo(String.class, rightValue);
+        if (leftStr != null && rightStr != null) {
+            return leftStr.startsWith(rightStr);
+        } else {
+            return false;
+        }
+    }
+
+    public static boolean endsWith(Exchange exchange, Object leftValue, Object rightValue) {
+        if (leftValue == null && rightValue == null) {
+            // they are equal
+            return true;
+        } else if (leftValue == null || rightValue == null) {
+            // only one of them is null so they are not equal
+            return false;
+        }
+        String leftStr = exchange.getContext().getTypeConverter().convertTo(String.class, leftValue);
+        String rightStr = exchange.getContext().getTypeConverter().convertTo(String.class, rightValue);
+        if (leftStr != null && rightStr != null) {
+            return leftStr.endsWith(rightStr);
+        } else {
+            return false;
+        }
+    }
+
+    public static boolean is(Exchange exchange, Object leftValue, Class<?> type) {
+        return type.isInstance(leftValue);
+    }
+
+}
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
new file mode 100644
index 0000000..50a2007
--- /dev/null
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleLanguage.java
@@ -0,0 +1,245 @@
+/*
+ * 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.csimple;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Expression;
+import org.apache.camel.ExtendedCamelContext;
+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.service.ServiceHelper;
+import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.StringHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Language("csimple")
+public class CSimpleLanguage extends LanguageSupport 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";
+
+    private static final Logger LOG = LoggerFactory.getLogger(CSimpleLanguage.class);
+
+    private final Map<String, CSimpleExpression> compiled = new ConcurrentHashMap<>();
+    private CSimpleCompiler compiler;
+
+    private String configResource = "camel-csimple.properties";
+    private Set<String> imports = new TreeSet<>();
+    private Map<String, String> aliases = new HashMap<>();
+
+    public String getConfigResource() {
+        return configResource;
+    }
+
+    public void setConfigResource(String configResource) {
+        this.configResource = configResource;
+    }
+
+    public Set<String> getImports() {
+        return imports;
+    }
+
+    public void setImports(Set<String> imports) {
+        this.imports = imports;
+    }
+
+    public Map<String, String> getAliases() {
+        return aliases;
+    }
+
+    public void setAliases(Map<String, String> aliases) {
+        this.aliases = aliases;
+    }
+
+    @Override
+    public void init() {
+        // load pre compiled first
+        loadPreCompiled();
+
+        // load optional configuration file
+        loadConfiguration();
+
+        // detect custom compiler (camel-csimple-joor)
+        ExtendedCamelContext ecc = getCamelContext().adapt(ExtendedCamelContext.class);
+        Optional<Class<?>> clazz = ecc.getBootstrapFactoryFinder().findClass(CSimpleCompiler.FACTORY);
+        if (clazz.isPresent()) {
+            compiler = (CSimpleCompiler) ecc.getInjector().newInstance(clazz.get(), false);
+            if (compiler != null) {
+                LOG.info("Detected camel-csimple-joor compiler");
+                if (imports != null) {
+                    imports.forEach(compiler::addImport);
+                }
+                if (aliases != null) {
+                    aliases.forEach(compiler::addAliases);
+                }
+            }
+            ServiceHelper.initService(compiler);
+        }
+    }
+
+    @Override
+    public void start() {
+        ServiceHelper.startService(compiler);
+    }
+
+    @Override
+    public void stop() {
+        ServiceHelper.stopService(compiler);
+    }
+
+    private void loadPreCompiled() {
+        ExtendedCamelContext ecc = getCamelContext().adapt(ExtendedCamelContext.class);
+        InputStream is = ecc.getClassResolver().loadResourceAsStream(PRE_COMPILED_FILE);
+        if (is != null) {
+            try {
+                String text = IOHelper.loadText(is);
+                String[] lines = text.split("\n");
+                for (String fqn : lines) {
+                    // skip comments
+                    fqn = fqn.trim();
+                    if (fqn.startsWith("#") || fqn.isEmpty()) {
+                        continue;
+                    }
+                    // load class
+                    Class<CSimpleExpression> clazz = ecc.getClassResolver().resolveMandatoryClass(fqn, CSimpleExpression.class);
+                    CSimpleExpression ce = clazz.getConstructor(CamelContext.class).newInstance(getCamelContext());
+                    compiled.put(ce.getText(), ce);
+                }
+            } catch (Exception e) {
+                throw new RuntimeCamelException("Error initializing csimple language", e);
+            } finally {
+                IOHelper.close(is);
+            }
+            if (!compiled.isEmpty()) {
+                LOG.info("Loaded and initialized {} csimple expressions from classpath", compiled.size());
+            }
+        }
+    }
+
+    private void loadConfiguration() {
+        InputStream is;
+        String loaded;
+        is = getCamelContext().getClassResolver().loadResourceAsStream(CONFIG_FILE);
+        try {
+            if (is == null) {
+                // load from file system
+                File file = new File(configResource);
+                if (file.exists()) {
+                    is = new FileInputStream(file);
+                }
+            }
+            if (is == null) {
+                return;
+            }
+            loaded = IOHelper.loadText(is);
+        } catch (IOException e) {
+            throw new RuntimeCamelException("Cannot load " + CONFIG_FILE + " from classpath");
+
+        }
+        IOHelper.close(is);
+
+        int counter1 = 0;
+        int counter2 = 0;
+        String[] lines = loaded.split("\n");
+        for (String line : lines) {
+            line = line.trim();
+            // skip comments
+            if (line.startsWith("#")) {
+                continue;
+            }
+            // imports
+            if (line.startsWith("import ")) {
+                imports.add(line);
+                counter1++;
+                continue;
+            }
+            // aliases as key=value
+            String key = StringHelper.before(line, "=");
+            String value = StringHelper.after(line, "=");
+            if (key != null) {
+                key = key.trim();
+            }
+            if (value != null) {
+                value = value.trim();
+            }
+            if (key != null && value != null) {
+                this.aliases.put(key, value);
+                counter2++;
+            }
+        }
+        if (counter1 > 0 || counter2 > 0) {
+            LOG.info("Loaded csimple language imports: {} and aliases: {} from configuration: {}", counter1, counter2,
+                    configResource);
+        }
+    }
+
+    @Override
+    public Predicate createPredicate(String expression) {
+        // text should be single line and trimmed as it can be multi lined
+        String text = expression.replaceAll("\n", "");
+        text = text.trim();
+
+        Predicate answer = compiled.get(text);
+        if (answer == null && compiler != null) {
+            CSimpleExpression exp = compiler.compilePredicate(getCamelContext(), expression);
+            if (exp != null) {
+                compiled.put(text, exp);
+                answer = exp;
+            }
+        }
+        if (answer == null) {
+            throw new CSimpleException("Cannot find compiled csimple language for predicate: " + expression, expression);
+        }
+        return answer;
+    }
+
+    @Override
+    public Expression createExpression(String expression) {
+        // text should be single line and trimmed as it can be multi lined
+        String text = expression.replaceAll("\n", "");
+        text = text.trim();
+
+        Expression answer = compiled.get(text);
+        if (answer == null && compiler != null) {
+            CSimpleExpression exp = compiler.compileExpression(getCamelContext(), expression);
+            if (exp != null) {
+                compiled.put(text, exp);
+                answer = exp;
+            }
+        }
+        if (answer == null) {
+            throw new CSimpleException("Cannot find compiled csimple language for expression: " + expression, expression);
+        }
+        return answer;
+    }
+
+}
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleMethod.java
similarity index 65%
copy from core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
copy to core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleMethod.java
index 03c71fc..2dfa119 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleMethod.java
@@ -14,24 +14,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.language.simple.ast;
+package org.apache.camel.language.csimple;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.language.simple.types.SimpleToken;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
 
 /**
- * Ends a function
+ * Method that will be executed for csimple expressions and which has been source code generated to implement the logic
+ * in Java code.
+ *
+ * @see CSimpleExpression
  */
-public class SimpleFunctionEnd extends BaseSimpleNode implements BlockEnd {
-
-    public SimpleFunctionEnd(SimpleToken token) {
-        super(token);
-    }
+public interface CSimpleMethod {
 
-    @Override
-    public Expression createExpression(CamelContext camelContext, String expression) {
-        return null;
-    }
+    Object evaluate(CamelContext context, Exchange exchange, Message message, Object body)
+            throws Exception;
 
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimplePredicateParser.java
similarity index 63%
copy from core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
copy to core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimplePredicateParser.java
index 03c71fc..5a1b53a 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimplePredicateParser.java
@@ -14,24 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.language.simple.ast;
+package org.apache.camel.language.csimple;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.language.simple.types.SimpleToken;
+import org.apache.camel.language.simple.SimplePredicateParser;
 
 /**
- * Ends a function
+ * Predicate parser for csimple.
  */
-public class SimpleFunctionEnd extends BaseSimpleNode implements BlockEnd {
+public class CSimplePredicateParser {
 
-    public SimpleFunctionEnd(SimpleToken token) {
-        super(token);
-    }
-
-    @Override
-    public Expression createExpression(CamelContext camelContext, String expression) {
-        return null;
+    public String parsePredicate(String predicate) {
+        // reuse simple language parser but output the result as java code
+        SimplePredicateParser parser = new SimplePredicateParser(null, predicate, true, null);
+        String code = parser.parseCode();
+        return code;
     }
 
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleSupport.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleSupport.java
new file mode 100644
index 0000000..4b54c83
--- /dev/null
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleSupport.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.language.csimple;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExpressionEvaluationException;
+import org.apache.camel.ExtendedCamelContext;
+
+/**
+ * Base class for source code generateed csimple expressions.
+ */
+public abstract class CSimpleSupport implements CSimpleExpression, CSimpleMethod {
+
+    private ExtendedCamelContext camelContext;
+
+    @Override
+    public void init(CamelContext context) {
+        this.camelContext = context.adapt(ExtendedCamelContext.class);
+    }
+
+    @Override
+    public <T> T evaluate(Exchange exchange, Class<T> type) {
+        Object body = exchange.getIn().getBody();
+        Object out;
+        try {
+            out = evaluate(exchange.getContext(), exchange, exchange.getIn(), body);
+        } catch (Exception e) {
+            throw new ExpressionEvaluationException(this, exchange, e);
+        }
+        return camelContext.getTypeConverter().convertTo(type, exchange, out);
+    }
+
+    @Override
+    public boolean matches(Exchange exchange) {
+        Object body = exchange.getIn().getBody();
+        Object out;
+        try {
+            out = evaluate(exchange.getContext(), exchange, exchange.getIn(), body);
+        } catch (Exception e) {
+            throw new ExpressionEvaluationException(this, exchange, e);
+        }
+        return camelContext.getTypeConverter().convertTo(boolean.class, exchange, out);
+    }
+
+}
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java
index 6b88e1b..112893c 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java
@@ -34,6 +34,7 @@ import org.apache.camel.language.simple.types.SimpleParserException;
 import org.apache.camel.language.simple.types.SimpleToken;
 import org.apache.camel.language.simple.types.TokenType;
 import org.apache.camel.support.builder.ExpressionBuilder;
+import org.apache.camel.util.StringHelper;
 
 /**
  * A parser to parse simple language as a Camel {@link Expression}
@@ -50,8 +51,8 @@ public class SimpleExpressionParser extends BaseSimpleParser {
     }
 
     public Expression parseExpression() {
-        clear();
         try {
+            parseTokens();
             return doParseExpression();
         } catch (SimpleParserException e) {
             // catch parser exception and turn that into a syntax exceptions
@@ -62,7 +63,27 @@ public class SimpleExpressionParser extends BaseSimpleParser {
         }
     }
 
-    protected Expression doParseExpression() {
+    public String parseCode() {
+        try {
+            parseTokens();
+            return doParseCode();
+        } catch (SimpleParserException e) {
+            // catch parser exception and turn that into a syntax exceptions
+            throw new SimpleIllegalSyntaxException(expression, e.getIndex(), e.getMessage(), e);
+        } catch (Exception e) {
+            // include exception in rethrown exception
+            throw new SimpleIllegalSyntaxException(expression, -1, e.getMessage(), e);
+        }
+    }
+
+    /**
+     * First step parsing into a list of nodes.
+     *
+     * This is used as SPI for camel-csimple to do AST transformation and parse into java source code.
+     */
+    protected List<SimpleNode> parseTokens() {
+        clear();
+
         // parse the expression using the following grammar
         nextToken();
         while (!token.getType().isEol()) {
@@ -84,6 +105,13 @@ public class SimpleExpressionParser extends BaseSimpleParser {
         // compact and stack unary operators
         prepareUnaryExpressions();
 
+        return nodes;
+    }
+
+    /**
+     * Second step parsing into an expression
+     */
+    protected Expression doParseExpression() {
         // create and return as a Camel expression
         List<Expression> expressions = createExpressions();
         if (expressions.isEmpty()) {
@@ -170,6 +198,30 @@ public class SimpleExpressionParser extends BaseSimpleParser {
         return answer;
     }
 
+    /**
+     * Second step parsing into code
+     */
+    protected String doParseCode() {
+        StringBuilder sb = new StringBuilder();
+        for (SimpleNode node : nodes) {
+            String exp = node.createCode(expression);
+            if (exp != null) {
+                if (sb.length() > 0) {
+                    sb.append(" + ");
+                }
+                if (node instanceof LiteralNode) {
+                    exp = StringHelper.removeLeadingAndEndingQuotes(exp);
+                    sb.append("'");
+                    sb.append(exp);
+                    sb.append("'");
+                } else {
+                    sb.append(exp);
+                }
+            }
+        }
+        return sb.toString();
+    }
+
     // --------------------------------------------------------------
     // grammar
     // --------------------------------------------------------------
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java
index 186cda1..a675e85 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimplePredicateParser.java
@@ -70,8 +70,8 @@ public class SimplePredicateParser extends BaseSimpleParser {
     }
 
     public Predicate parsePredicate() {
-        clear();
         try {
+            parseTokens();
             return doParsePredicate();
         } catch (SimpleParserException e) {
             // catch parser exception and turn that into a syntax exceptions
@@ -82,8 +82,26 @@ public class SimplePredicateParser extends BaseSimpleParser {
         }
     }
 
-    protected Predicate doParsePredicate() {
+    public String parseCode() {
+        try {
+            parseTokens();
+            return doParseCode();
+        } catch (SimpleParserException e) {
+            // catch parser exception and turn that into a syntax exceptions
+            throw new SimpleIllegalSyntaxException(expression, e.getIndex(), e.getMessage(), e);
+        } catch (Exception e) {
+            // include exception in rethrown exception
+            throw new SimpleIllegalSyntaxException(expression, -1, e.getMessage(), e);
+        }
+    }
 
+    /**
+     * First step parsing into a list of nodes.
+     *
+     * This is used as SPI for camel-csimple to do AST transformation and parse into java source code.
+     */
+    public List<SimpleNode> parseTokens() {
+        clear();
         // parse using the following grammar
         nextToken();
         while (!token.getType().isEol()) {
@@ -124,6 +142,13 @@ public class SimplePredicateParser extends BaseSimpleParser {
         // compact and stack logical expressions
         prepareLogicalExpressions();
 
+        return nodes;
+    }
+
+    /**
+     * Second step parsing into a predicate
+     */
+    protected Predicate doParsePredicate() {
         // create and return as a Camel predicate
         List<Predicate> predicates = createPredicates();
         if (predicates.isEmpty()) {
@@ -137,6 +162,20 @@ public class SimplePredicateParser extends BaseSimpleParser {
     }
 
     /**
+     * Second step parsing into code
+     */
+    protected String doParseCode() {
+        StringBuilder sb = new StringBuilder();
+        for (SimpleNode node : nodes) {
+            String exp = node.createCode(expression);
+            if (exp != null) {
+                sb.append(exp);
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
      * Parses the tokens and crates the AST nodes.
      * <p/>
      * After the initial parsing of the input (input -> tokens) then we parse again (tokens -> ast).
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/BinaryExpression.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/BinaryExpression.java
index a995946..367bf3e 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/BinaryExpression.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/BinaryExpression.java
@@ -71,6 +71,14 @@ public class BinaryExpression extends BaseSimpleNode {
         return operator;
     }
 
+    public SimpleNode getLeft() {
+        return left;
+    }
+
+    public SimpleNode getRight() {
+        return right;
+    }
+
     @Override
     public Expression createExpression(CamelContext camelContext, String expression) {
         org.apache.camel.util.ObjectHelper.notNull(left, "left node", this);
@@ -263,4 +271,61 @@ public class BinaryExpression extends BaseSimpleNode {
         };
     }
 
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        org.apache.camel.util.ObjectHelper.notNull(left, "left node", this);
+        org.apache.camel.util.ObjectHelper.notNull(right, "right node", this);
+
+        final String leftExp = left.createCode(expression);
+        final String rightExp = right.createCode(expression);
+
+        if (operator == BinaryOperatorType.EQ) {
+            return "isEqualTo(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.EQ_IGNORE) {
+            return "isEqualToIgnoreCase(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.GT) {
+            return "isGreaterThan(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.GTE) {
+            return "isGreaterThanOrEqualTo(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.LT) {
+            return "isLessThan(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.LTE) {
+            return "isLessThanOrEqualTo(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.NOT_EQ) {
+            return "isNotEqualTo(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.NOT_EQ_IGNORE) {
+            return "!isEqualToIgnoreCase(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.CONTAINS) {
+            return "contains(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.CONTAINS_IGNORECASE) {
+            return "containsIgnoreCase(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.NOT_CONTAINS) {
+            return "!contains(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.NOT_CONTAINS_IGNORECASE) {
+            return "!containsIgnoreCase(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.IS) {
+            return "is(exchange, " + leftExp + ", " + rightExp + ".class" + ")";
+        } else if (operator == BinaryOperatorType.NOT_IS) {
+            return "!is(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.REGEX) {
+            return "regexp(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.NOT_REGEX) {
+            return "!regexp(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.IN) {
+            return "in(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.NOT_IN) {
+            return "!in(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.RANGE) {
+            return "range(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.NOT_RANGE) {
+            return "!range(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.STARTS_WITH) {
+            return "startsWith(exchange, " + leftExp + ", " + rightExp + ")";
+        } else if (operator == BinaryOperatorType.ENDS_WITH) {
+            return "endsWith(exchange, " + leftExp + ", " + rightExp + ")";
+        }
+
+        throw new SimpleParserException("Unknown binary operator " + operator, token.getIndex());
+    }
+
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/BooleanExpression.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/BooleanExpression.java
index cf7e3d0..92e575b 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/BooleanExpression.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/BooleanExpression.java
@@ -51,4 +51,9 @@ public class BooleanExpression extends BaseSimpleNode {
             }
         };
     }
+
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        return value ? "true" : "false";
+    }
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/CompositeNodes.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/CompositeNodes.java
index d274b74..61e7a39 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/CompositeNodes.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/CompositeNodes.java
@@ -21,6 +21,7 @@ import java.util.List;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
+import org.apache.camel.language.simple.types.SimpleParserException;
 import org.apache.camel.language.simple.types.SimpleToken;
 import org.apache.camel.support.builder.ExpressionBuilder;
 
@@ -67,4 +68,21 @@ public class CompositeNodes extends BaseSimpleNode {
         }
     }
 
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        if (children.isEmpty()) {
+            return null;
+        } else if (children.size() == 1) {
+            return children.get(0).createCode(expression);
+        } else {
+            StringBuilder sb = new StringBuilder();
+            for (SimpleNode child : children) {
+                String code = child.createCode(expression);
+                if (code != null) {
+                    sb.append(code);
+                }
+            }
+            return sb.toString();
+        }
+    }
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/DoubleQuoteEnd.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/DoubleQuoteEnd.java
index 62b314f..7216520 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/DoubleQuoteEnd.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/DoubleQuoteEnd.java
@@ -18,6 +18,7 @@ package org.apache.camel.language.simple.ast;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
+import org.apache.camel.language.simple.types.SimpleParserException;
 import org.apache.camel.language.simple.types.SimpleToken;
 
 /**
@@ -34,4 +35,8 @@ public class DoubleQuoteEnd extends BaseSimpleNode implements BlockEnd {
         return null;
     }
 
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        return null;
+    }
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/DoubleQuoteStart.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/DoubleQuoteStart.java
index f5a4477..f447f50 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/DoubleQuoteStart.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/DoubleQuoteStart.java
@@ -18,6 +18,7 @@ package org.apache.camel.language.simple.ast;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
+import org.apache.camel.language.simple.types.SimpleParserException;
 import org.apache.camel.language.simple.types.SimpleToken;
 import org.apache.camel.support.builder.ExpressionBuilder;
 
@@ -58,4 +59,17 @@ public class DoubleQuoteStart extends BaseSimpleNode implements BlockStart {
         return true;
     }
 
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        String answer = null;
+        if (block != null) {
+            answer = block.createCode(expression);
+        }
+        if (answer == null) {
+            answer = "\"\"";
+        } else {
+            answer = "\"" + answer + "\"";
+        }
+        return answer;
+    }
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/LiteralExpression.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/LiteralExpression.java
index ca9fc19..30f14a4 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/LiteralExpression.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/LiteralExpression.java
@@ -18,6 +18,7 @@ package org.apache.camel.language.simple.ast;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
+import org.apache.camel.language.simple.types.SimpleParserException;
 import org.apache.camel.language.simple.types.SimpleToken;
 import org.apache.camel.support.builder.ExpressionBuilder;
 
@@ -26,7 +27,7 @@ import org.apache.camel.support.builder.ExpressionBuilder;
  */
 public class LiteralExpression extends BaseSimpleNode implements LiteralNode {
 
-    protected StringBuilder text = new StringBuilder();
+    protected final StringBuilder text = new StringBuilder();
 
     public LiteralExpression(SimpleToken token) {
         super(token);
@@ -59,4 +60,9 @@ public class LiteralExpression extends BaseSimpleNode implements LiteralNode {
     public Expression createExpression(CamelContext camelContext, String expression) {
         return ExpressionBuilder.constantExpression(getText());
     }
+
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        return getText();
+    }
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/LogicalExpression.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/LogicalExpression.java
index 818166c..99caa50 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/LogicalExpression.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/LogicalExpression.java
@@ -32,7 +32,7 @@ import org.apache.camel.util.ObjectHelper;
  */
 public class LogicalExpression extends BaseSimpleNode {
 
-    private LogicalOperatorType operator;
+    private final LogicalOperatorType operator;
     private SimpleNode left;
     private SimpleNode right;
 
@@ -60,6 +60,14 @@ public class LogicalExpression extends BaseSimpleNode {
         return operator;
     }
 
+    public SimpleNode getLeft() {
+        return left;
+    }
+
+    public SimpleNode getRight() {
+        return right;
+    }
+
     @Override
     public Expression createExpression(CamelContext camelContext, String expression) {
         ObjectHelper.notNull(left, "left node", this);
@@ -113,4 +121,20 @@ public class LogicalExpression extends BaseSimpleNode {
         };
     }
 
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        ObjectHelper.notNull(left, "left node", this);
+        ObjectHelper.notNull(right, "right node", this);
+
+        final String leftExp = left.createCode(expression);
+        final String rightExp = right.createCode(expression);
+
+        if (operator == LogicalOperatorType.AND) {
+            return leftExp + " && " + rightExp;
+        } else if (operator == LogicalOperatorType.OR) {
+            return leftExp + " || " + rightExp;
+        }
+
+        throw new SimpleParserException("Unknown logical operator " + operator, token.getIndex());
+    }
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/NullExpression.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/NullExpression.java
index 83c0643..46fb25d 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/NullExpression.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/NullExpression.java
@@ -47,4 +47,9 @@ public class NullExpression extends BaseSimpleNode {
     public Expression createExpression(CamelContext camelContext, String expression) throws SimpleParserException {
         return NULL_EXPRESSION;
     }
+
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        return "null";
+    }
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/NumericExpression.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/NumericExpression.java
index e87692c..4b15a90 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/NumericExpression.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/NumericExpression.java
@@ -47,6 +47,10 @@ public class NumericExpression extends BaseSimpleNode {
         }
     }
 
+    public Object getNumber() {
+        return number;
+    }
+
     @Override
     public Expression createExpression(CamelContext camelContext, String expression) throws SimpleParserException {
         return new Expression() {
@@ -66,4 +70,16 @@ public class NumericExpression extends BaseSimpleNode {
             }
         };
     }
+
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        // Double, Long or Integer
+        if (number instanceof Double) {
+            return number + "d";
+        } else if (number instanceof Long) {
+            return number + "l";
+        } else {
+            return number.toString();
+        }
+    }
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
index 03c71fc..5dac2d2 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
@@ -18,6 +18,7 @@ package org.apache.camel.language.simple.ast;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
+import org.apache.camel.language.simple.types.SimpleParserException;
 import org.apache.camel.language.simple.types.SimpleToken;
 
 /**
@@ -34,4 +35,8 @@ public class SimpleFunctionEnd extends BaseSimpleNode implements BlockEnd {
         return null;
     }
 
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        return null;
+    }
 }
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 5cd551e..000885a 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
@@ -17,6 +17,7 @@
 package org.apache.camel.language.simple.ast;
 
 import java.net.URISyntaxException;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.camel.CamelContext;
@@ -263,7 +264,7 @@ public class SimpleFunctionExpression extends LiteralExpression {
             return ExpressionBuilder.refExpression(remainder);
         }
 
-        // const: prefix
+        // type: prefix
         remainder = ifStartsWithReturnRemainder("type:", function);
         if (remainder != null) {
             Expression exp = SimpleExpressionBuilder.typeExpression(remainder);
@@ -551,4 +552,559 @@ public class SimpleFunctionExpression extends LiteralExpression {
         return null;
     }
 
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        String function = getText();
+
+        // return the function directly if we can create function without analyzing the prefix
+        String answer = createCodeDirectly(function);
+        if (answer != null) {
+            return answer;
+        }
+
+        // body and headers first
+        answer = createCodeBodyOrHeader(function);
+        if (answer != null) {
+            return answer;
+        }
+
+        // camelContext OGNL
+        String remainder = ifStartsWithReturnRemainder("camelContext", function);
+        if (remainder != null) {
+            boolean invalid = OgnlHelper.isInvalidValidOgnlExpression(remainder);
+            if (invalid) {
+                throw new SimpleParserException("Valid syntax: ${camelContext.OGNL} was: " + function, token.getIndex());
+            }
+            return "camelContext" + ognlCodeMethods(remainder);
+        }
+
+        // ExceptionAs OGNL
+        remainder = ifStartsWithReturnRemainder("exceptionAs(", function);
+        if (remainder != null) {
+            String type = StringHelper.before(remainder, ")");
+            remainder = StringHelper.after(remainder, ")");
+            type = StringHelper.removeQuotes(type);
+            if (!type.endsWith(".class")) {
+                type = type + ".class";
+            }
+            type = type.trim();
+            boolean invalid = OgnlHelper.isInvalidValidOgnlExpression(remainder);
+            if (type.isEmpty() || invalid) {
+                throw new SimpleParserException("Valid syntax: ${exceptionAs(type).OGNL} was: " + function, token.getIndex());
+            }
+            return "exceptionAs(exchange, " + type + ")" + ognlCodeMethods(remainder);
+        }
+        // Exception OGNL
+        remainder = ifStartsWithReturnRemainder("exception", function);
+        if (remainder != null) {
+            boolean invalid = OgnlHelper.isInvalidValidOgnlExpression(remainder);
+            if (invalid) {
+                throw new SimpleParserException("Valid syntax: ${exception.OGNL} was: " + function, token.getIndex());
+            }
+            return "exception(exchange)" + ognlCodeMethods(remainder);
+        }
+
+        // exchangePropertyAs
+        remainder = ifStartsWithReturnRemainder("exchangePropertyAs(", function);
+        if (remainder != null) {
+            String keyAndType = StringHelper.before(remainder, ")");
+            if (keyAndType == null) {
+                throw new SimpleParserException(
+                        "Valid syntax: ${exchangePropertyAs(key, type)} was: " + function, token.getIndex());
+            }
+
+            String key = StringHelper.before(keyAndType, ",");
+            String type = StringHelper.after(keyAndType, ",");
+            remainder = StringHelper.after(remainder, ")");
+            if (ObjectHelper.isEmpty(key) || ObjectHelper.isEmpty(type)) {
+                throw new SimpleParserException(
+                        "Valid syntax: ${exchangePropertyAs(key, type)} was: " + function, token.getIndex());
+            }
+            key = StringHelper.removeQuotes(key);
+            key = key.trim();
+            type = StringHelper.removeQuotes(type);
+            if (!type.endsWith(".class")) {
+                type = type + ".class";
+            }
+            type = type.trim();
+            return "exchangePropertyAs(exchange, '" + key + "', " + type + ")" + ognlCodeMethods(remainder);
+        }
+
+        // exchange property
+        remainder = ifStartsWithReturnRemainder("exchangeProperty", function);
+        if (remainder != null) {
+            // remove leading character (dot or ?)
+            if (remainder.startsWith(".") || remainder.startsWith("?")) {
+                remainder = remainder.substring(1);
+            }
+            // remove starting and ending brackets
+            if (remainder.startsWith("[") && remainder.endsWith("]")) {
+                remainder = remainder.substring(1, remainder.length() - 1);
+            }
+
+            // validate syntax
+            boolean invalid = OgnlHelper.isInvalidValidOgnlExpression(remainder);
+            if (invalid) {
+                // must use exchangePropertyAs as we need to be typed
+                throw new SimpleParserException("Valid syntax: ${exchangePropertyAs.OGNL} was: " + function, token.getIndex());
+            }
+
+            if (OgnlHelper.isValidOgnlExpression(remainder)) {
+                // must use exchangePropertyAs as we need to be typed
+                throw new SimpleParserException("Valid syntax: ${exchangePropertyAs.OGNL} was: " + function, token.getIndex());
+            } else {
+                // regular property
+                return "exchangeProperty(exchange, '" + remainder + "')";
+            }
+        }
+
+        // system property
+        remainder = ifStartsWithReturnRemainder("sys.", function);
+        if (remainder != null) {
+            return "sys('" + remainder + "')";
+        }
+        remainder = ifStartsWithReturnRemainder("sysenv.", function);
+        if (remainder == null) {
+            remainder = ifStartsWithReturnRemainder("sysenv:", function);
+        }
+        if (remainder == null) {
+            remainder = ifStartsWithReturnRemainder("env.", function);
+        }
+        if (remainder == null) {
+            remainder = ifStartsWithReturnRemainder("env:", function);
+        }
+        if (remainder != null) {
+            return "sysenv('" + remainder + "')";
+        }
+
+        // exchange OGNL
+        remainder = ifStartsWithReturnRemainder("exchange", function);
+        if (remainder != null) {
+            boolean invalid = OgnlHelper.isInvalidValidOgnlExpression(remainder);
+            if (invalid) {
+                throw new SimpleParserException("Valid syntax: ${exchange.OGNL} was: " + function, token.getIndex());
+            }
+            return "exchange" + ognlCodeMethods(remainder);
+        }
+
+        // file: prefix
+        remainder = ifStartsWithReturnRemainder("file:", function);
+        if (remainder != null) {
+            return createCodeFileExpression(remainder);
+        }
+
+        // date: prefix
+        remainder = ifStartsWithReturnRemainder("date:", function);
+        if (remainder != null) {
+            String[] parts = remainder.split(":", 2);
+            if (parts.length == 1) {
+                return "date(exchange, '" + parts[0] + "')";
+            } else if (parts.length == 2) {
+                return "date(exchange, '" + parts[0] + "', null, '" + parts[1] + "')";
+            }
+        }
+
+        // date-with-timezone: prefix
+        remainder = ifStartsWithReturnRemainder("date-with-timezone:", function);
+        if (remainder != null) {
+            String[] parts = remainder.split(":", 3);
+            if (parts.length < 3) {
+                throw new SimpleParserException(
+                        "Valid syntax: ${date-with-timezone:command:timezone:pattern} was: " + function, token.getIndex());
+            }
+            return "date(exchange, '" + parts[0] + "', '" + parts[1] + "', '" + parts[2] + "')";
+        }
+
+        // bean: prefix
+        remainder = ifStartsWithReturnRemainder("bean:", function);
+        if (remainder != null) {
+            String ref = remainder;
+            Object method = null;
+            Object scope = null;
+
+            // we support different syntax for bean function
+            if (remainder.contains("?method=") || remainder.contains("?scope=")) {
+                ref = StringHelper.before(remainder, "?");
+                String query = StringHelper.after(remainder, "?");
+                try {
+                    Map<String, Object> map = URISupport.parseQuery(query);
+                    method = map.get("method");
+                    scope = map.get("scope");
+                } catch (URISyntaxException e) {
+                    throw RuntimeCamelException.wrapRuntimeException(e);
+                }
+            } else {
+                //first check case :: because of my.own.Bean::method
+                int doubleColonIndex = remainder.indexOf("::");
+                //need to check that not inside params
+                int beginOfParameterDeclaration = remainder.indexOf('(');
+                if (doubleColonIndex > 0 && (!remainder.contains("(") || doubleColonIndex < beginOfParameterDeclaration)) {
+                    ref = remainder.substring(0, doubleColonIndex);
+                    method = remainder.substring(doubleColonIndex + 2);
+                } else {
+                    int idx = remainder.indexOf('.');
+                    if (idx > 0) {
+                        ref = remainder.substring(0, idx);
+                        method = remainder.substring(idx + 1);
+                    }
+                }
+            }
+            ref = ref.trim();
+            if (method != null && scope != null) {
+                return "bean(exchange, '" + ref + "', '" + method.toString() + "', '" + scope.toString() + "')";
+            } else if (method != null) {
+                return "bean(exchange, '" + ref + "', '" + method.toString() + "', null)";
+            } else {
+                return "bean(exchange, '" + ref + "', null, null)";
+            }
+        }
+
+        // properties: prefix
+        remainder = ifStartsWithReturnRemainder("properties:", function);
+        if (remainder != null) {
+            String[] parts = remainder.split(":", 2);
+            if (parts.length > 2) {
+                throw new SimpleParserException("Valid syntax: ${properties:key[:default]} was: " + function, token.getIndex());
+            }
+            String defaultValue = null;
+            if (parts.length >= 2) {
+                defaultValue = parts[1];
+            }
+            String key = parts[0];
+            key = key.trim();
+            if (defaultValue != null) {
+                return "properties(exchange, '" + key + "', '" + defaultValue.trim() + "')";
+            } else {
+                return "properties(exchange, '" + key + "')";
+            }
+        }
+
+        // ref: prefix
+        remainder = ifStartsWithReturnRemainder("ref:", function);
+        if (remainder != null) {
+            return "ref(exchange, '" + remainder + "')";
+        }
+
+        // type: prefix
+        remainder = ifStartsWithReturnRemainder("type:", function);
+        if (remainder != null) {
+            return remainder;
+        }
+
+        // miscellaneous functions
+        String misc = createCodeExpressionMisc(function);
+        if (misc != null) {
+            return misc;
+        }
+
+        throw new SimpleParserException("Unknown file language syntax: " + remainder, token.getIndex());
+    }
+
+    public String createCodeDirectly(String expression) throws SimpleParserException {
+        if (ObjectHelper.isEqualToAny(expression, "body", "in.body")) {
+            return "body";
+        } else if (ObjectHelper.equal(expression, "bodyOneLine")) {
+            return "bodyOneLine(exchange)";
+        } else if (ObjectHelper.equal(expression, "id")) {
+            return "message.getId()";
+        } else if (ObjectHelper.equal(expression, "exchangeId")) {
+            return "exchange.getId()";
+        } else if (ObjectHelper.equal(expression, "exchange")) {
+            return "exchange";
+        } else if (ObjectHelper.equal(expression, "exception")) {
+            return "exception(exchange)";
+        } else if (ObjectHelper.equal(expression, "exception.message")) {
+            return "exceptionMessage(exchange)";
+        } else if (ObjectHelper.equal(expression, "exception.stacktrace")) {
+            return "exceptionStacktrace(exchange)";
+        } else if (ObjectHelper.equal(expression, "threadName")) {
+            return "threadName()";
+        } else if (ObjectHelper.equal(expression, "hostname")) {
+            return "hostName()";
+        } else if (ObjectHelper.equal(expression, "camelId")) {
+            return "camelContext.getName()";
+        } else if (ObjectHelper.equal(expression, "routeId")) {
+            return "routeId(exchange)";
+        } else if (ObjectHelper.equal(expression, "stepId")) {
+            return "stepId(exchange)";
+        } else if (ObjectHelper.equal(expression, "null")) {
+            return "null";
+        }
+
+        return null;
+    }
+
+    private String createCodeBodyOrHeader(String function) {
+        // bodyAs
+        String remainder = ifStartsWithReturnRemainder("bodyAs(", function);
+        if (remainder != null) {
+            String type = StringHelper.before(remainder, ")");
+            if (type == null) {
+                throw new SimpleParserException("Valid syntax: ${bodyAs(type)} was: " + function, token.getIndex());
+            }
+            type = StringHelper.removeQuotes(type);
+            if (!type.endsWith(".class")) {
+                type = type + ".class";
+            }
+            type = type.trim();
+            remainder = StringHelper.after(remainder, ")");
+            if (ObjectHelper.isNotEmpty(remainder)) {
+                boolean invalid = OgnlHelper.isInvalidValidOgnlExpression(remainder);
+                if (invalid) {
+                    throw new SimpleParserException("Valid syntax: ${bodyAs(type).OGNL} was: " + function, token.getIndex());
+                }
+                return "bodyAs(message, " + type + ")" + ognlCodeMethods(remainder);
+            } else {
+                return "bodyAs(message, " + type + ")";
+            }
+        }
+
+        // mandatoryBodyAs
+        remainder = ifStartsWithReturnRemainder("mandatoryBodyAs(", function);
+        if (remainder != null) {
+            String type = StringHelper.before(remainder, ")");
+            if (type == null) {
+                throw new SimpleParserException("Valid syntax: ${mandatoryBodyAs(type)} was: " + function, token.getIndex());
+            }
+            type = StringHelper.removeQuotes(type);
+            if (!type.endsWith(".class")) {
+                type = type + ".class";
+            }
+            type = type.trim();
+            remainder = StringHelper.after(remainder, ")");
+            if (ObjectHelper.isNotEmpty(remainder)) {
+                boolean invalid = OgnlHelper.isInvalidValidOgnlExpression(remainder);
+                if (invalid) {
+                    throw new SimpleParserException(
+                            "Valid syntax: ${mandatoryBodyAs(type).OGNL} was: " + function, token.getIndex());
+                }
+                return "mandatoryBodyAs(message, " + type + ")" + ognlCodeMethods(remainder);
+            } else {
+                return "mandatoryBodyAs(message, " + type + ")";
+            }
+        }
+
+        // body OGNL
+        remainder = ifStartsWithReturnRemainder("body", function);
+        if (remainder == null) {
+            remainder = ifStartsWithReturnRemainder("in.body", function);
+        }
+        if (remainder != null) {
+            // OGNL must start with a . ? or [
+            boolean ognlStart = remainder.startsWith(".") || remainder.startsWith("?") || remainder.startsWith("[");
+            boolean invalid = !ognlStart || OgnlHelper.isInvalidValidOgnlExpression(remainder);
+            if (invalid) {
+                throw new SimpleParserException("Valid syntax: ${body.OGNL} was: " + function, token.getIndex());
+            }
+            return "body" + ognlCodeMethods(remainder);
+        }
+
+        // headerAs
+        remainder = ifStartsWithReturnRemainder("headerAs(", function);
+        if (remainder != null) {
+            String keyAndType = StringHelper.before(remainder, ")");
+            if (keyAndType == null) {
+                throw new SimpleParserException("Valid syntax: ${headerAs(key, type)} was: " + function, token.getIndex());
+            }
+
+            String key = StringHelper.before(keyAndType, ",");
+            String type = StringHelper.after(keyAndType, ",");
+            remainder = StringHelper.after(remainder, ")");
+            if (ObjectHelper.isEmpty(key) || ObjectHelper.isEmpty(type) || ObjectHelper.isNotEmpty(remainder)) {
+                throw new SimpleParserException("Valid syntax: ${headerAs(key, type)} was: " + function, token.getIndex());
+            }
+            key = StringHelper.removeQuotes(key);
+            key = key.trim();
+            type = StringHelper.removeQuotes(type);
+            if (!type.endsWith(".class")) {
+                type = type + ".class";
+            }
+            type = type.trim();
+            return "headerAs(message, '" + key + "', " + type + ")" + ognlCodeMethods(remainder);
+        }
+
+        // headers function
+        if ("in.headers".equals(function) || "headers".equals(function)) {
+            return "message.getHeaders()";
+        }
+
+        // in header function
+        remainder = ifStartsWithReturnRemainder("in.headers", function);
+        if (remainder == null) {
+            remainder = ifStartsWithReturnRemainder("in.header", function);
+        }
+        if (remainder == null) {
+            remainder = ifStartsWithReturnRemainder("headers", function);
+        }
+        if (remainder == null) {
+            remainder = ifStartsWithReturnRemainder("header", function);
+        }
+        if (remainder != null) {
+            // remove leading character (dot, colon or ?)
+            if (remainder.startsWith(".") || remainder.startsWith(":") || remainder.startsWith("?")) {
+                remainder = remainder.substring(1);
+            }
+            // remove starting and ending brackets
+            if (remainder.startsWith("[") && remainder.endsWith("]")) {
+                remainder = remainder.substring(1, remainder.length() - 1);
+            }
+            // remove quotes from key
+            String key = StringHelper.removeLeadingAndEndingQuotes(remainder);
+            key = key.trim();
+
+            // validate syntax
+            boolean invalid = OgnlHelper.isInvalidValidOgnlExpression(key);
+            if (invalid) {
+                throw new SimpleParserException("Valid syntax: ${header.name[key]} was: " + function, token.getIndex());
+            }
+
+            if (OgnlHelper.isValidOgnlExpression(key)) {
+                // ognl based header must be typed
+                throw new SimpleParserException("Valid syntax: ${headerAs(key, type)} was: " + function, token.getIndex());
+            } else {
+                // regular header
+                return "header(message, '" + key + "')";
+            }
+        }
+
+        return null;
+    }
+
+    private String createCodeFileExpression(String remainder) {
+        if (ObjectHelper.equal(remainder, "name")) {
+            return "fileName(message)";
+        } else if (ObjectHelper.equal(remainder, "name.noext")) {
+            return "fileNameNoExt(message)";
+        } else if (ObjectHelper.equal(remainder, "name.noext.single")) {
+            return "fileNameNoExtSingle(message)";
+        } else if (ObjectHelper.equal(remainder, "name.ext") || ObjectHelper.equal(remainder, "ext")) {
+            return "fileNameExt(message)";
+        } else if (ObjectHelper.equal(remainder, "name.ext.single")) {
+            return "fileNameExtSingle(message)";
+        } else if (ObjectHelper.equal(remainder, "onlyname")) {
+            return "fileOnlyName(message)";
+        } else if (ObjectHelper.equal(remainder, "onlyname.noext")) {
+            return "fileOnlyNameNoExt(message)";
+        } else if (ObjectHelper.equal(remainder, "onlyname.noext.single")) {
+            return "fileOnlyNameNoExtSingle(message)";
+        } else if (ObjectHelper.equal(remainder, "parent")) {
+            return "fileParent(message)";
+        } else if (ObjectHelper.equal(remainder, "path")) {
+            return "filePath(message)";
+        } else if (ObjectHelper.equal(remainder, "absolute")) {
+            return "fileAbsolute(message)";
+        } else if (ObjectHelper.equal(remainder, "absolute.path")) {
+            return "fileAbsolutePath(message)";
+        } else if (ObjectHelper.equal(remainder, "length") || ObjectHelper.equal(remainder, "size")) {
+            return "fileSize(message)";
+        } else if (ObjectHelper.equal(remainder, "modified")) {
+            return "fileModified(message)";
+        }
+        throw new SimpleParserException("Unknown file language syntax: " + remainder, token.getIndex());
+    }
+
+    private String createCodeExpressionMisc(String function) {
+        String remainder;
+
+        // random function
+        remainder = ifStartsWithReturnRemainder("random(", function);
+        if (remainder != null) {
+            String values = StringHelper.beforeLast(remainder, ")");
+            if (values == null || ObjectHelper.isEmpty(values)) {
+                throw new SimpleParserException(
+                        "Valid syntax: ${random(min,max)} or ${random(max)} was: " + function, token.getIndex());
+            }
+            if (values.contains(",")) {
+                String before = StringHelper.before(remainder, ",");
+                before = before.trim();
+                String after = StringHelper.after(remainder, ",");
+                after = after.trim();
+                if (after.endsWith(")")) {
+                    after = after.substring(0, after.length() - 1);
+                }
+                return "random(exchange, " + before + ", " + after + ")";
+            } else {
+                return "random(exchange, 0, " + values.trim() + ")";
+            }
+        }
+
+        // skip function
+        remainder = ifStartsWithReturnRemainder("skip(", function);
+        if (remainder != null) {
+            String values = StringHelper.beforeLast(remainder, ")");
+            if (values == null || ObjectHelper.isEmpty(values)) {
+                throw new SimpleParserException("Valid syntax: ${skip(number)} was: " + function, token.getIndex());
+            }
+            return "skip(exchange, " + values.trim() + ")";
+        }
+
+        // collate function
+        remainder = ifStartsWithReturnRemainder("collate(", function);
+        if (remainder != null) {
+            String values = StringHelper.beforeLast(remainder, ")");
+            if (values == null || ObjectHelper.isEmpty(values)) {
+                throw new SimpleParserException("Valid syntax: ${collate(group)} was: " + function, token.getIndex());
+            }
+            return "collate(exchange, " + values.trim() + ")";
+        }
+
+        // messageHistory function
+        remainder = ifStartsWithReturnRemainder("messageHistory", function);
+        if (remainder != null) {
+            boolean detailed;
+            String values = StringHelper.between(remainder, "(", ")");
+            if (values == null || ObjectHelper.isEmpty(values)) {
+                detailed = true;
+            } else {
+                detailed = Boolean.parseBoolean(values);
+            }
+            return "messageHistory(exchange, " + (detailed ? "true" : "false") + ")";
+        } else if (ObjectHelper.equal(function, "messageHistory")) {
+            return "messageHistory(exchange, true)";
+        }
+
+        return null;
+    }
+
+    private static String ognlCodeMethods(String remainder) {
+        StringBuilder sb = new StringBuilder();
+
+        if (remainder != null) {
+            List<String> methods = OgnlHelper.splitOgnl(remainder);
+            for (int i = 0; i < methods.size(); i++) {
+                String m = methods.get(i);
+                if (m.startsWith("(")) {
+                    // its parameters for the function so add as-is and continue
+                    sb.append(m);
+                    continue;
+                }
+                if (m.startsWith(".")) {
+                    m = m.substring(1);
+                }
+                sb.append(".");
+
+                // shorthand getter syntax: .name -> .getName()
+                char ch = m.charAt(m.length() - 1);
+                if (Character.isAlphabetic(ch)) {
+                    if (!m.startsWith("get")) {
+                        sb.append("get");
+                        sb.append(Character.toUpperCase(m.charAt(0)));
+                        sb.append(m.substring(1));
+                    } else {
+                        sb.append(m);
+                    }
+                    sb.append("()");
+                } else {
+                    sb.append(m);
+                }
+            }
+        }
+
+        if (sb.length() > 0) {
+            return sb.toString();
+        } else {
+            return remainder;
+        }
+    }
+
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionStart.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionStart.java
index d10ccdb..3e14ac7 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionStart.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionStart.java
@@ -41,6 +41,10 @@ public class SimpleFunctionStart extends BaseSimpleNode implements BlockStart {
         this.cacheExpression = cacheExpression;
     }
 
+    public CompositeNodes getBlock() {
+        return block;
+    }
+
     public boolean lazyEval(SimpleNode child) {
         String text = child.toString();
         // don't lazy evaluate nested type references as they are static
@@ -144,4 +148,69 @@ public class SimpleFunctionStart extends BaseSimpleNode implements BlockStart {
         }
     }
 
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        String answer;
+        // a function can either be a simple literal function, or contain nested functions
+        if (block.getChildren().size() == 1 && block.getChildren().get(0) instanceof LiteralNode) {
+            answer = doCreateLiteralCode(expression);
+        } else {
+            answer = doCreateCompositeCode(expression);
+        }
+        return answer;
+    }
+
+    private String doCreateLiteralCode(String expression) {
+        SimpleFunctionExpression function = new SimpleFunctionExpression(this.getToken(), cacheExpression);
+        LiteralNode literal = (LiteralNode) block.getChildren().get(0);
+        function.addText(literal.getText());
+        return function.createCode(expression);
+    }
+
+    private String doCreateCompositeCode(String expression) {
+        StringBuilder sb = new StringBuilder();
+        boolean quoteEmbeddedFunctions = false;
+
+        // we need to concat the block so we have the expression
+        for (SimpleNode child : block.getChildren()) {
+            if (child instanceof LiteralNode) {
+                String text = ((LiteralNode) child).getText();
+                sb.append(text);
+                quoteEmbeddedFunctions |= ((LiteralNode) child).quoteEmbeddedNodes();
+                // if its quoted literal then embed that as text
+            } else if (child instanceof SingleQuoteStart || child instanceof DoubleQuoteStart) {
+                try {
+                    // pass in null when we evaluate the nested expressions
+                    String text = child.createCode(null);
+                    if (text != null) {
+                        if (quoteEmbeddedFunctions && !StringHelper.isQuoted(text)) {
+                            sb.append("'").append(text).append("'");
+                        } else {
+                            sb.append(text);
+                        }
+                    }
+                } catch (SimpleParserException e) {
+                    // must rethrow parser exception as illegal syntax with details about the location
+                    throw new SimpleIllegalSyntaxException(expression, e.getIndex(), e.getMessage(), e);
+                }
+            } else if (child instanceof SimpleFunctionStart) {
+                // inlined function
+                String inlined = child.createCode(expression);
+                sb.append(inlined);
+            }
+        }
+
+        // we have now concat the block as a String which contains inlined functions parsed
+        // so now we should reparse as a single function
+        String exp = sb.toString();
+        SimpleFunctionExpression function = new SimpleFunctionExpression(token, cacheExpression);
+        function.addText(exp);
+        try {
+            return function.createCode(exp);
+        } catch (SimpleParserException e) {
+            // must rethrow parser exception as illegal syntax with details about the location
+            throw new SimpleIllegalSyntaxException(expression, e.getIndex(), e.getMessage(), e);
+        }
+    }
+
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleNode.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleNode.java
index 1bef48f..ed79da3 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleNode.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleNode.java
@@ -43,4 +43,13 @@ public interface SimpleNode {
      */
     Expression createExpression(CamelContext camelContext, String expression) throws SimpleParserException;
 
+    /**
+     * Creates Java code based on this model.
+     *
+     * @param  expression                                                   the input string
+     * @return                                                              the created Java code
+     * @throws org.apache.camel.language.simple.types.SimpleParserException should be thrown if error parsing the model
+     */
+    String createCode(String expression) throws SimpleParserException;
+
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SingleQuoteEnd.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SingleQuoteEnd.java
index b0f590b..3e5b97f 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SingleQuoteEnd.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SingleQuoteEnd.java
@@ -18,6 +18,7 @@ package org.apache.camel.language.simple.ast;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
+import org.apache.camel.language.simple.types.SimpleParserException;
 import org.apache.camel.language.simple.types.SimpleToken;
 
 /**
@@ -34,4 +35,8 @@ public class SingleQuoteEnd extends BaseSimpleNode implements BlockEnd {
         return null;
     }
 
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        return null;
+    }
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SingleQuoteStart.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SingleQuoteStart.java
index ad484ca..305c0a1 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SingleQuoteStart.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SingleQuoteStart.java
@@ -18,6 +18,7 @@ package org.apache.camel.language.simple.ast;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
+import org.apache.camel.language.simple.types.SimpleParserException;
 import org.apache.camel.language.simple.types.SimpleToken;
 import org.apache.camel.support.builder.ExpressionBuilder;
 
@@ -33,6 +34,10 @@ public class SingleQuoteStart extends BaseSimpleNode implements BlockStart {
         this.block = new CompositeNodes(token);
     }
 
+    public CompositeNodes getBlock() {
+        return block;
+    }
+
     @Override
     public String toString() {
         // output a nice toString so it makes debugging easier as we can see the entire block
@@ -58,4 +63,17 @@ public class SingleQuoteStart extends BaseSimpleNode implements BlockStart {
         return true;
     }
 
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        String answer = null;
+        if (block != null) {
+            answer = block.createCode(expression);
+        }
+        if (answer == null) {
+            answer = "''";
+        } else {
+            answer = "'" + answer + "'";
+        }
+        return answer;
+    }
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/UnaryExpression.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/UnaryExpression.java
index 6d8dc16..cd86d0e 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/UnaryExpression.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/UnaryExpression.java
@@ -62,6 +62,10 @@ public class UnaryExpression extends BaseSimpleNode {
         return operator;
     }
 
+    public SimpleNode getLeft() {
+        return left;
+    }
+
     @Override
     public Expression createExpression(CamelContext camelContext, String expression) {
         ObjectHelper.notNull(left, "left node", this);
@@ -141,4 +145,18 @@ public class UnaryExpression extends BaseSimpleNode {
         };
     }
 
+    @Override
+    public String createCode(String expression) throws SimpleParserException {
+        ObjectHelper.notNull(left, "left node", this);
+
+        final String number = left.createCode(expression);
+
+        if (operator == UnaryOperatorType.INC) {
+            return "increment(exchange, " + number + ")";
+        } else if (operator == UnaryOperatorType.DEC) {
+            return "decrement(exchange, " + number + ")";
+        }
+
+        throw new SimpleParserException("Unknown unary operator " + operator, token.getIndex());
+    }
 }
diff --git a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties
index 2777089..7d818d97 100644
--- a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties
+++ b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties
@@ -24,6 +24,7 @@ consulServiceDiscovery
 contextScan
 convertBodyTo
 crypto
+csimple
 csv
 customDataFormat
 customLoadBalancer
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/aggregate.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/aggregate.json
index 1cb1022..00c25c3 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/aggregate.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/aggregate.json
@@ -11,10 +11,10 @@
     "output": false
   },
   "properties": {
-    "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "The expression [...]
-    "completionPredicate": { "kind": "expression", "displayName": "Completion Predicate", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description [...]
-    "completionTimeoutExpression": { "kind": "expression", "displayName": "Completion Timeout Expression", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": " [...]
-    "completionSizeExpression": { "kind": "expression", "displayName": "Completion Size Expression", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Number [...]
+    "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "The [...]
+    "completionPredicate": { "kind": "expression", "displayName": "Completion Predicate", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, " [...]
+    "completionTimeoutExpression": { "kind": "expression", "displayName": "Completion Timeout Expression", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "desc [...]
+    "completionSizeExpression": { "kind": "expression", "displayName": "Completion Size Expression", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "descriptio [...]
     "optimisticLockRetryPolicy": { "kind": "element", "displayName": "Optimistic Lock Retry Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.OptimisticLockRetryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure retry settings when using optimistic locking." },
     "parallelProcessing": { "kind": "attribute", "displayName": "Parallel Processing", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "When aggregated are completed they are being send out of the aggregator. This option indicates whether or not Camel should use a thread pool with multiple threads for concurrency. If no custom thread pool has been specified then Camel cr [...]
     "optimisticLocking": { "kind": "attribute", "displayName": "Optimistic Locking", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Turns on using optimistic locking, which requires the aggregationRepository being used, is supporting this by implementing org.apache.camel.spi.OptimisticLockingAggregationRepository ." },
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/delay.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/delay.json
index f9eec8c..d820f1d 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/delay.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/delay.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to define how long time to  [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to define how lo [...]
     "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Refers to a custom Thread Pool if asyncDelay has been enabled." },
     "asyncDelayed": { "kind": "attribute", "displayName": "Async Delayed", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Enables asynchronous delay which means the thread will not block while delaying." },
     "callerRunsWhenRejected": { "kind": "attribute", "displayName": "Caller Runs When Rejected", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not the caller should run the task when it was rejected by the thread pool. Is by default true" },
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/dynamicRouter.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/dynamicRouter.json
index bfc7818..e11f62f 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/dynamicRouter.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/dynamicRouter.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to call that returns the en [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to call that ret [...]
     "uriDelimiter": { "kind": "attribute", "displayName": "Uri Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": ",", "description": "Sets the uri delimiter to use" },
     "ignoreInvalidEndpoints": { "kind": "attribute", "displayName": "Ignore Invalid Endpoints", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Ignore the invalidate endpoint exception when try to create a producer with that endpoint" },
     "cacheSize": { "kind": "attribute", "displayName": "Cache Size", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this dynamic router, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic end [...]
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/enrich.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/enrich.json
index fcb8849..e843859 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/enrich.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/enrich.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that computes the endpoint  [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that computes th [...]
     "strategyRef": { "kind": "attribute", "displayName": "Strategy Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Refers to an AggregationStrategy to be used to merge the reply from the external service, into a single outgoing message. By default Camel will use the reply from the external service as outgoing message." },
     "strategyMethodName": { "kind": "attribute", "displayName": "Strategy Method Name", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy." },
     "strategyMethodAllowNull": { "kind": "attribute", "displayName": "Strategy Method Allow Null", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "If this option is false then the aggregate method is not used if there was no data to enrich. If this option is true then null values is used as the oldExchange (when no data to enrich), when using POJOs as the AggregationStrategy." },
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/filter.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/filter.json
index adb3cb0..9b1d7cc 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/filter.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/filter.json
@@ -11,7 +11,7 @@
     "output": true
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expression to det [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expres [...]
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/idempotentConsumer.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/idempotentConsumer.json
index 4c10899..ce4c874 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/idempotentConsumer.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/idempotentConsumer.json
@@ -11,7 +11,7 @@
     "output": true
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression used to calculate the corre [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression used to calculat [...]
     "messageIdRepositoryRef": { "kind": "attribute", "displayName": "Message Id Repository Ref", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the reference name of the message id repository" },
     "eager": { "kind": "attribute", "displayName": "Eager", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether to eagerly add the key to the idempotent repository or wait until the exchange is complete. Eager is default enabled." },
     "completionEager": { "kind": "attribute", "displayName": "Completion Eager", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets whether to complete the idempotent consumer eager or when the exchange is done. If this option is true to complete eager, then the idempotent consumer will trigger its completion when the exchange reached the end of the block of the idempotent consumer pattern. S [...]
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
new file mode 100644
index 0000000..ede72c6
--- /dev/null
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/csimple.json
@@ -0,0 +1,20 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "csimple",
+    "title": "CSimple",
+    "description": "Evaluate a compile simple expression language.",
+    "deprecated": false,
+    "firstVersion": "3.7.0",
+    "label": "language",
+    "javaType": "org.apache.camel.model.language.CSimpleExpression",
+    "input": false,
+    "output": false
+  },
+  "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)" },
+    "trim": { "kind": "attribute", "displayName": "Trim", "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/jaxb.index b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jaxb.index
index 8d4a935..d16cd77 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jaxb.index
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jaxb.index
@@ -1,4 +1,5 @@
 # Generated by camel build tools - do NOT edit this file!
+CSimpleExpression
 ConstantExpression
 ExchangePropertyExpression
 ExpressionDefinition
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/loadbalancer/sticky.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/loadbalancer/sticky.json
index 8c6d828..407ec4e 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/loadbalancer/sticky.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/loadbalancer/sticky.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "The correlatio [...]
+    "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "The [...]
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
   }
 }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/loop.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/loop.json
index 0777d87..0f80d41 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/loop.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/loop.json
@@ -11,7 +11,7 @@
     "output": true
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to define how many times we [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to define how ma [...]
     "copy": { "kind": "attribute", "displayName": "Copy", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the copy attribute is true, a copy of the input Exchange is used for each iteration. That means each iteration will start from a copy of the same message. By default loop will loop the same exchange all over, so each iteration may have different message content." },
     "doWhile": { "kind": "attribute", "displayName": "Do While", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enables the while loop that loops until the predicate evaluates to false or null." },
     "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/onException.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/onException.json
index b8769da..11faf03 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/onException.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/onException.json
@@ -13,11 +13,11 @@
   "properties": {
     "exception": { "kind": "element", "displayName": "Exception", "required": true, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "description": "A set of exceptions to react upon." },
     "onWhen": { "kind": "element", "displayName": "On When", "required": false, "type": "object", "javaType": "org.apache.camel.model.WhenDefinition", "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Sets an additional predicate that should be true before the onException is triggered. To be used for fine grained controlling whether a thrown exception should be intercepted by this exception type or not." },
-    "retryWhile": { "kind": "expression", "displayName": "Retry While", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Sets the retry [...]
+    "retryWhile": { "kind": "expression", "displayName": "Retry While", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Set [...]
     "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Used for configuring redelivery options" },
     "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to lookup in the org.apache.camel.spi.Registry to be used." },
-    "handled": { "kind": "expression", "displayName": "Handled", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Sets whether the exch [...]
-    "continued": { "kind": "expression", "displayName": "Continued", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Sets whether the  [...]
+    "handled": { "kind": "expression", "displayName": "Handled", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Sets wheth [...]
+    "continued": { "kind": "expression", "displayName": "Continued", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Sets w [...]
     "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
     "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown from this processor will be ign [...]
     "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and the org.apache [...]
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/pollEnrich.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/pollEnrich.json
index fb28e16..eada138 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/pollEnrich.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/pollEnrich.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that computes the endpoint  [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that computes th [...]
     "timeout": { "kind": "attribute", "displayName": "Timeout", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "-1", "description": "Timeout in millis when polling from the external service. The timeout has influence about the poll enrich behavior. It basically operations in three different modes: negative value - Waits until a message is available and then returns it. Warning that this meth [...]
     "strategyRef": { "kind": "attribute", "displayName": "Strategy Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Refers to an AggregationStrategy to be used to merge the reply from the external service, into a single outgoing message. By default Camel will use the reply from the external service as outgoing message." },
     "strategyMethodName": { "kind": "attribute", "displayName": "Strategy Method Name", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy." },
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/recipientList.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/recipientList.json
index 3396a9d..ac0e90b 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/recipientList.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/recipientList.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that returns which endpoint [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that returns whi [...]
     "delimiter": { "kind": "attribute", "displayName": "Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": ",", "description": "Delimiter used if the Expression returned multiple endpoints. Can be turned off using the value false. The default value is ," },
     "parallelProcessing": { "kind": "attribute", "displayName": "Parallel Processing", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If enabled then sending messages to the recipients occurs concurrently. Note the caller thread will still wait until all messages has been fully processed, before it continues. Its only the sending and processing the replies from the rec [...]
     "strategyRef": { "kind": "attribute", "displayName": "Strategy Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to the AggregationStrategy to be used to assemble the replies from the recipients, into a single outgoing message from the RecipientList. By default Camel will use the last reply as the outgoing message. You can also use a POJO as the AggregationStrategy" },
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/resequence.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/resequence.json
index 7596ce1..4ef1c99 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/resequence.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/resequence.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to use for re-ordering the  [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to use for re-or [...]
     "resequencerConfig": { "kind": "element", "displayName": "Resequencer Config", "required": false, "type": "object", "javaType": "org.apache.camel.model.config.ResequencerConfig", "oneOf": [ "batch-config", "stream-config" ], "deprecated": false, "autowired": false, "secret": false, "description": "To configure the resequencer in using either batch or stream configuration. Will by default use batch configuration." },
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/routingSlip.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/routingSlip.json
index 58c1085..8b3687a 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/routingSlip.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/routingSlip.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to define the routing slip, [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to define the ro [...]
     "uriDelimiter": { "kind": "attribute", "displayName": "Uri Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": ",", "description": "Sets the uri delimiter to use" },
     "ignoreInvalidEndpoints": { "kind": "attribute", "displayName": "Ignore Invalid Endpoints", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Ignore the invalidate endpoint exception when try to create a producer with that endpoint" },
     "cacheSize": { "kind": "attribute", "displayName": "Cache Size", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this routing slip, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpo [...]
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/script.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/script.json
index 018ff9a..7059874 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/script.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/script.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the transformed m [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the tr [...]
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/setBody.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/setBody.json
index 15b69dd..8c0d376 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/setBody.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/setBody.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that returns the new body t [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression that returns the [...]
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/setHeader.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/setHeader.json
index 49c4025..004b947 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/setHeader.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/setHeader.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the value of the  [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the va [...]
     "name": { "kind": "attribute", "displayName": "Name", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of message header to set a new value The simple language can be used to define a dynamic evaluated header name to be used. Otherwise a constant name will be used." },
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/setProperty.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/setProperty.json
index a42c5df..0865177 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/setProperty.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/setProperty.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the value of the  [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the va [...]
     "name": { "kind": "attribute", "displayName": "Name", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of exchange property to set a new value. The simple language can be used to define a dynamic evaluated exchange property name to be used. Otherwise a constant name will be used." },
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/sort.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/sort.json
index 5efd011..44b1cb7 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/sort.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/sort.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Optional expression to sort by somethi [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Optional expression to sort [...]
     "comparatorRef": { "kind": "attribute", "displayName": "Comparator Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to lookup for the comparator to use for sorting" },
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/split.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/split.json
index 0c833d7..be7368f 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/split.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/split.json
@@ -11,7 +11,7 @@
     "output": true
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression of how to split the message [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression of how to split  [...]
     "delimiter": { "kind": "attribute", "displayName": "Delimiter", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": ",", "description": "Delimiter used in splitting messages. Can be turned off using the value false. The default value is ," },
     "parallelProcessing": { "kind": "attribute", "displayName": "Parallel Processing", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If enabled then processing each splitted messages occurs concurrently. Note the caller thread will still wait until all messages has been fully processed, before it continues. Its only processing the sub messages from the splitter which  [...]
     "strategyRef": { "kind": "attribute", "displayName": "Strategy Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to the AggregationStrategy to be used to assemble the replies from the splitted messages, into a single outgoing message from the Splitter. By default Camel will use the original incoming message to the splitter (leave it unchanged). You can also use a POJO a [...]
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/throttle.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/throttle.json
index ea33cd9..ee29b33 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/throttle.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/throttle.json
@@ -11,8 +11,8 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to configure the maximum nu [...]
-    "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "The expressio [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to configure the [...]
+    "correlationExpression": { "kind": "expression", "displayName": "Correlation Expression", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Th [...]
     "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom thread pool (ScheduledExecutorService) by the throttler." },
     "timePeriodMillis": { "kind": "attribute", "displayName": "Time Period Millis", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the time period during which the maximum request count is valid for" },
     "asyncDelayed": { "kind": "attribute", "displayName": "Async Delayed", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enables asynchronous delay which means the thread will not block while delaying." },
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/transform.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/transform.json
index 1a7ed52..c6cd847 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/transform.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/transform.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the transformed m [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Expression to return the tr [...]
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/validate.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/validate.json
index 42d99c7..ba37232 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/validate.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/validate.json
@@ -11,7 +11,7 @@
     "output": false
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expression to use [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expres [...]
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/when.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/when.json
index fba1421..a6202fc 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/when.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/when.json
@@ -11,7 +11,7 @@
     "output": true
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expression used a [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expres [...]
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/whenSkipSendToEndpoint.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/whenSkipSendToEndpoint.json
index 5215594..34ce534 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/whenSkipSendToEndpoint.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/whenSkipSendToEndpoint.json
@@ -11,7 +11,7 @@
     "output": true
   },
   "properties": {
-    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expression used a [...]
+    "expression": { "kind": "expression", "displayName": "Expression", "required": true, "type": "object", "javaType": "org.apache.camel.model.language.ExpressionDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "asPredicate": true, "description": "Expres [...]
     "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" },
     "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/wireTap.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/wireTap.json
index 60089b7..70da4d5 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/wireTap.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/wireTap.json
@@ -12,7 +12,7 @@
   },
   "properties": {
     "processorRef": { "kind": "attribute", "displayName": "Processor Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Reference to a Processor to use for creating a new body as the message to use for wire tapping" },
-    "body": { "kind": "expression", "displayName": "Body", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Uses the expression for creating a new body as t [...]
+    "body": { "kind": "expression", "displayName": "Body", "required": false, "type": "object", "javaType": "org.apache.camel.model.ExpressionSubElementDefinition", "oneOf": [ "constant", "csimple", "exchangeProperty", "groovy", "header", "hl7terser", "joor", "jsonpath", "language", "method", "mvel", "ognl", "ref", "simple", "spel", "tokenize", "xpath", "xquery", "xtokenize" ], "deprecated": false, "autowired": false, "secret": false, "description": "Uses the expression for creating a ne [...]
     "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Uses a custom thread pool" },
     "copy": { "kind": "attribute", "displayName": "Copy", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Uses a copy of the original exchange" },
     "dynamicUri": { "kind": "attribute", "displayName": "Dynamic Uri", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the uri is dynamic or static. If the uri is dynamic then the simple language is used to evaluate a dynamic uri to use as the wire-tap destination, for each incoming message. This works similar to how the toD EIP pattern works. If static then the  [...]
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
index 624b32e..ec041bb 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
@@ -25,6 +25,7 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.Expression;
 import org.apache.camel.NoSuchEndpointException;
 import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.model.language.CSimpleExpression;
 import org.apache.camel.model.language.ExchangePropertyExpression;
 import org.apache.camel.model.language.HeaderExpression;
 import org.apache.camel.model.language.JoorExpression;
@@ -132,6 +133,23 @@ public abstract class BuilderSupport {
     }
 
     /**
+     * Returns a compiled simple expression value builder
+     */
+    public ValueBuilder csimple(String value) {
+        CSimpleExpression exp = new CSimpleExpression(value);
+        return new ValueBuilder(exp);
+    }
+
+    /**
+     * Returns a compiled simple expression value builder
+     */
+    public ValueBuilder csimple(String value, Class<?> resultType) {
+        CSimpleExpression exp = new CSimpleExpression(value);
+        exp.setResultType(resultType);
+        return new ValueBuilder(exp);
+    }
+
+    /**
      * Returns a simple expression value builder
      */
     public SimpleBuilder simple(String value) {
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClause.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClause.java
index 0f8d3d3..0dacb5e 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClause.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClause.java
@@ -474,6 +474,20 @@ public class ExpressionClause<T> implements Expression, Predicate {
     }
 
     /**
+     * Returns a compiled simple expression value builder
+     */
+    public T csimple(String value) {
+        return delegate.csimple(value);
+    }
+
+    /**
+     * Returns a compile simple expression value builder
+     */
+    public T csimple(String value, Class<?> resultType) {
+        return delegate.csimple(value, resultType);
+    }
+
+    /**
      * Evaluates a <a href="http://camel.apache.org/simple.html">Simple expression</a>
      *
      * @param  text the expression to be evaluated
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 de3b374..b496134 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
@@ -22,6 +22,7 @@ import org.apache.camel.BeanScope;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
 import org.apache.camel.ExpressionFactory;
+import org.apache.camel.model.language.CSimpleExpression;
 import org.apache.camel.model.language.ConstantExpression;
 import org.apache.camel.model.language.ExchangePropertyExpression;
 import org.apache.camel.model.language.GroovyExpression;
@@ -530,6 +531,29 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware {
     }
 
     /**
+     * Evaluates a compiled simple expression
+     *
+     * @param  text the expression to be evaluated
+     * @return      the builder to continue processing the DSL
+     */
+    public T csimple(String text) {
+        return expression(new CSimpleExpression(text));
+    }
+
+    /**
+     * Evaluates a compiled simple expression
+     *
+     * @param  text       the expression to be evaluated
+     * @param  resultType the return type expected by the expression
+     * @return            the builder to continue processing the DSL
+     */
+    public T csimple(String text, Class<?> resultType) {
+        CSimpleExpression exp = new CSimpleExpression(text);
+        exp.setResultType(resultType);
+        return expression(exp);
+    }
+
+    /**
      * Evaluates a <a href="http://camel.apache.org/simple.html">Simple expression</a>
      *
      * @param  text the expression to be evaluated
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
new file mode 100644
index 0000000..2bac007
--- /dev/null
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/CSimpleExpression.java
@@ -0,0 +1,74 @@
+/*
+ * 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.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;
+
+/**
+ * Evaluate a compile simple expression language.
+ */
+@Metadata(firstVersion = "3.7.0", label = "language", title = "CSimple")
+@XmlRootElement(name = "csimple")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class CSimpleExpression extends ExpressionDefinition {
+
+    @XmlAttribute(name = "resultType")
+    private String resultTypeName;
+    @XmlTransient
+    private Class<?> resultType;
+
+    public CSimpleExpression() {
+    }
+
+    public CSimpleExpression(String expression) {
+        super(expression);
+    }
+
+    @Override
+    public String getLanguage() {
+        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;
+    }
+
+}
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
new file mode 100644
index 0000000..a9c0da3
--- /dev/null
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/CSimpleExpressionReifier.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.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 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;
+    }
+
+    @Override
+    public boolean isResolveOptionalExternalScriptEnabled() {
+        // csimple language will handle to resolve external scripts as they can be dynamic using simple language itself
+        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/ExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/ExpressionReifier.java
index d4c6411..5d1c918 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
@@ -27,6 +27,7 @@ import org.apache.camel.Expression;
 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.ExchangePropertyExpression;
 import org.apache.camel.model.language.ExpressionDefinition;
@@ -108,6 +109,8 @@ public class ExpressionReifier<T extends ExpressionDefinition> extends AbstractR
             CamelContext camelContext, ExpressionDefinition definition) {
         if (definition instanceof ConstantExpression) {
             return new ExpressionReifier<>(camelContext, definition);
+        } else if (definition instanceof CSimpleExpression) {
+            return new CSimpleExpressionReifier(camelContext, definition);
         } else if (definition instanceof ExchangePropertyExpression) {
             return new ExpressionReifier<>(camelContext, definition);
         } else if (definition instanceof GroovyExpression) {
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimpleExpressionParserTest.java b/core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimpleExpressionParserTest.java
new file mode 100644
index 0000000..d6c95ad
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimpleExpressionParserTest.java
@@ -0,0 +1,178 @@
+/*
+ * 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.csimple;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class CSimpleExpressionParserTest {
+
+    @Test
+    public void testParse() throws Exception {
+        CSimpleExpressionParser parser = new CSimpleExpressionParser();
+
+        String code = parser.parseExpression("Hello World");
+        Assertions.assertEquals("'Hello World'", code);
+        code = parser.parseExpression("'Hello World'");
+        Assertions.assertEquals("'Hello World'", code);
+        code = parser.parseExpression("Hello ${body}");
+        Assertions.assertEquals("'Hello ' + body", code);
+        code = parser.parseExpression("Hello ${body} how are you?");
+        Assertions.assertEquals("'Hello ' + body + ' how are you?'", code);
+    }
+
+    @Test
+    public void testIncDec() throws Exception {
+        CSimpleExpressionParser parser = new CSimpleExpressionParser();
+
+        String code = parser.parseExpression("${body}++");
+        Assertions.assertEquals("increment(exchange, body)", code);
+        code = parser.parseExpression("${header.number}--");
+        Assertions.assertEquals("decrement(exchange, header(message, 'number'))", code);
+    }
+
+    @Test
+    public void testMisc() throws Exception {
+        CSimpleExpressionParser parser = new CSimpleExpressionParser();
+
+        String code = parser.parseExpression("${random(10)}");
+        Assertions.assertEquals("random(exchange, 0, 10)", code);
+        code = parser.parseExpression("${random(10, 20)}");
+        Assertions.assertEquals("random(exchange, 10, 20)", code);
+        code = parser.parseExpression("${random(10, ${header.max})}");
+        Assertions.assertEquals("random(exchange, 10, header(message, 'max'))", code);
+        code = parser.parseExpression("${random(${header.min}, ${header.max})}");
+        Assertions.assertEquals("random(exchange, header(message, 'min'), header(message, 'max'))", code);
+
+        code = parser.parseExpression("${skip(10)}");
+        Assertions.assertEquals("skip(exchange, 10)", code);
+        code = parser.parseExpression("${skip(${header.max})}");
+        Assertions.assertEquals("skip(exchange, header(message, 'max'))", code);
+
+        code = parser.parseExpression("${collate(10)}");
+        Assertions.assertEquals("collate(exchange, 10)", code);
+        code = parser.parseExpression("${collate(${header.max})}");
+        Assertions.assertEquals("collate(exchange, header(message, 'max'))", code);
+
+        code = parser.parseExpression("${messageHistory}");
+        Assertions.assertEquals("messageHistory(exchange, true)", code);
+        code = parser.parseExpression("${messageHistory(false)}");
+        Assertions.assertEquals("messageHistory(exchange, false)", code);
+    }
+
+    @Test
+    public void testType() throws Exception {
+        CSimpleExpressionParser parser = new CSimpleExpressionParser();
+
+        String code = parser.parseExpression("${type:org.apache.camel.Exchange.CONTENT_TYPE}");
+        Assertions.assertEquals("org.apache.camel.Exchange.CONTENT_TYPE", code);
+    }
+
+    @Test
+    public void testRef() throws Exception {
+        CSimpleExpressionParser parser = new CSimpleExpressionParser();
+
+        String code = parser.parseExpression("${ref:myUser}");
+        Assertions.assertEquals("ref(exchange, 'myUser')", code);
+    }
+
+    @Test
+    public void testProperties() throws Exception {
+        CSimpleExpressionParser parser = new CSimpleExpressionParser();
+
+        String code = parser.parseExpression("${properties:greeting}");
+        Assertions.assertEquals("properties(exchange, 'greeting')", code);
+        code = parser.parseExpression("${properties:greeting:hi}");
+        Assertions.assertEquals("properties(exchange, 'greeting', 'hi')", code);
+    }
+
+    @Test
+    public void testBean() throws Exception {
+        CSimpleExpressionParser parser = new CSimpleExpressionParser();
+
+        String code = parser.parseExpression("${bean:foo}");
+        Assertions.assertEquals("bean(exchange, 'foo', null, null)", code);
+        code = parser.parseExpression("${bean:foo?method=bar}");
+        Assertions.assertEquals("bean(exchange, 'foo', 'bar', null)", code);
+        code = parser.parseExpression("${bean:foo?method=bar(123, true)}");
+        Assertions.assertEquals("bean(exchange, 'foo', 'bar(123, true)', null)", code);
+        code = parser.parseExpression("${bean:foo::bar}");
+        Assertions.assertEquals("bean(exchange, 'foo', 'bar', null)", code);
+        code = parser.parseExpression("${bean:foo?method=bar&scope=Prototype}");
+        Assertions.assertEquals("bean(exchange, 'foo', 'bar', 'Prototype')", code);
+    }
+
+    @Test
+    public void testDateWithTimezone() throws Exception {
+        CSimpleExpressionParser parser = new CSimpleExpressionParser();
+
+        String code = parser.parseExpression("${date-with-timezone:header.birthday:GMT+8:yyyy-MM-dd'T'HH:mm:ss:SSS}");
+        Assertions.assertEquals("date(exchange, 'header.birthday', 'GMT+8', 'yyyy-MM-dd'T'HH:mm:ss:SSS')", code);
+    }
+
+    @Test
+    public void testDate() throws Exception {
+        CSimpleExpressionParser parser = new CSimpleExpressionParser();
+
+        String code = parser.parseExpression("${date:now:hh:mm:ss a}");
+        Assertions.assertEquals("date(exchange, 'now', null, 'hh:mm:ss a')", code);
+        code = parser.parseExpression("${date:now+60s}");
+        Assertions.assertEquals("date(exchange, 'now+60s')", code);
+    }
+
+    @Test
+    public void testFile() throws Exception {
+        CSimpleExpressionParser parser = new CSimpleExpressionParser();
+
+        String code = parser.parseExpression("${file:name}");
+        Assertions.assertEquals("fileName(message)", code);
+        code = parser.parseExpression("${file:length}");
+        Assertions.assertEquals("fileSize(message)", code);
+    }
+
+    @Test
+    public void testExchange() throws Exception {
+        CSimpleExpressionParser parser = new CSimpleExpressionParser();
+
+        String code = parser.parseExpression("${exchange.pattern}");
+        Assertions.assertEquals("exchange.getPattern()", code);
+    }
+
+    @Test
+    public void testExchangeProperty() throws Exception {
+        CSimpleExpressionParser parser = new CSimpleExpressionParser();
+
+        String code = parser.parseExpression("Hello ${exchangeProperty.foo}");
+        Assertions.assertEquals("'Hello ' + exchangeProperty(exchange, 'foo')", code);
+
+        code = parser.parseExpression("Hello ${exchangePropertyAs(foo, 'com.foo.MyUser').firstName}");
+        Assertions.assertEquals("'Hello ' + exchangePropertyAs(exchange, 'foo', com.foo.MyUser.class).getFirstName()", code);
+    }
+
+    @Test
+    public void testException() throws Exception {
+        CSimpleExpressionParser parser = new CSimpleExpressionParser();
+
+        String code = parser.parseExpression("${exception}");
+        Assertions.assertEquals("exception(exchange)", code);
+        code = parser.parseExpression("${exception.cause}");
+        Assertions.assertEquals("exception(exchange).getCause()", code);
+        code = parser.parseExpression("${exceptionAs(com.foo.MyException).errorCode}");
+        Assertions.assertEquals("exceptionAs(exchange, com.foo.MyException.class).getErrorCode()", code);
+    }
+
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimplePredicateParserTest.java b/core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimplePredicateParserTest.java
new file mode 100644
index 0000000..47fd3c3
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimplePredicateParserTest.java
@@ -0,0 +1,102 @@
+/*
+ * 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.csimple;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class CSimplePredicateParserTest {
+
+    @Test
+    public void testParse() throws Exception {
+        CSimplePredicateParser parser = new CSimplePredicateParser();
+
+        String code = parser.parsePredicate("'bar' != 'foo'");
+        Assertions.assertEquals("'bar' != 'foo'", code);
+
+        code = parser.parsePredicate("${body} == 'foo'");
+        Assertions.assertEquals("body == 'foo'", code);
+
+        code = parser.parsePredicate("${body} != 'foo'");
+        Assertions.assertEquals("body != 'foo'", code);
+
+        code = parser.parsePredicate("${body} == 123");
+        Assertions.assertEquals("body == 123", code); // integer value
+
+        code = parser.parsePredicate("${body} > 9.95");
+        Assertions.assertEquals("body > 9.95d", code); // double value
+
+        code = parser.parsePredicate("${body} > 123456789012345");
+        Assertions.assertEquals("body > 123456789012345l", code); // long value
+
+        code = parser.parsePredicate("${bodyAs(int)} == 123");
+        Assertions.assertEquals("bodyAs(message, int.class) == 123", code);
+
+        code = parser.parsePredicate("${bodyAs(String).length()} == 4");
+        Assertions.assertEquals("bodyAs(message, String.class).length() == 4", code);
+
+        code = parser.parsePredicate("${bodyAs(String).substring(3)} == 'DEF'");
+        Assertions.assertEquals("bodyAs(message, String.class).substring(3) == 'DEF'", code);
+
+        code = parser.parsePredicate("${bodyAs(int)} > ${headerAs('foo', int)}");
+        Assertions.assertEquals("bodyAs(message, int.class) > headerAs(message, 'foo', int.class)", code);
+
+        code = parser.parsePredicate("${camelContext.getName()} == 'myCamel'");
+        Assertions.assertEquals("camelContext.getName() == 'myCamel'", code);
+
+        code = parser.parsePredicate("${camelContext.name} == 'myCamel'");
+        Assertions.assertEquals("camelContext.getName() == 'myCamel'", code);
+
+        code = parser.parsePredicate("${camelContext.inflightRepository.size()} > 0");
+        Assertions.assertEquals("camelContext.getInflightRepository().size() > 0", code);
+    }
+
+    @Test
+    public void testParseEmbeddedFunctions() throws Exception {
+        CSimplePredicateParser parser = new CSimplePredicateParser();
+
+        String code = parser.parsePredicate("${body.substring(1, ${header.max})} == 'foo'");
+        Assertions.assertEquals("body.substring(1, header(message, 'max')) == 'foo'", code);
+    }
+
+    @Test
+    public void testParseSysFunctions() throws Exception {
+        CSimplePredicateParser parser = new CSimplePredicateParser();
+        String code = parser.parsePredicate("${sys.foo} != 'bar'");
+        Assertions.assertEquals("sys('foo') != 'bar'", code);
+        code = parser.parsePredicate("${env.foo} != 'bar'");
+        Assertions.assertEquals("sysenv('foo') != 'bar'", code);
+        code = parser.parsePredicate("${env:FOO} != 'bar'");
+        Assertions.assertEquals("sysenv('FOO') != 'bar'", code);
+    }
+
+    @Test
+    public void testParseExchangeProperty() throws Exception {
+        CSimplePredicateParser parser = new CSimplePredicateParser();
+        String code = parser.parsePredicate("${exchangeProperty.foo} != 'bar'");
+        Assertions.assertEquals("exchangeProperty(exchange, 'foo') != 'bar'", code);
+        code = parser.parsePredicate("${exchangeProperty[foo]} != 'bar'");
+        Assertions.assertEquals("exchangeProperty(exchange, 'foo') != 'bar'", code);
+        code = parser.parsePredicate("${exchangePropertyAs(foo, com.foo.User)} != 'bar'");
+        Assertions.assertEquals("exchangePropertyAs(exchange, 'foo', com.foo.User.class) != 'bar'", code);
+        code = parser.parsePredicate("${exchangePropertyAs(foo, com.foo.User).name} != 'bar'");
+        Assertions.assertEquals("exchangePropertyAs(exchange, 'foo', com.foo.User.class).getName() != 'bar'", code);
+        code = parser.parsePredicate("${exchangePropertyAs(foo, com.foo.User).getName()} != 'bar'");
+        Assertions.assertEquals("exchangePropertyAs(exchange, 'foo', com.foo.User.class).getName() != 'bar'", code);
+    }
+
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimpleTest.java b/core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimpleTest.java
new file mode 100644
index 0000000..dd0f8e6
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/language/csimple/CSimpleTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.csimple;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Test;
+
+public class CSimpleTest extends ContextTestSupport {
+
+    @Test
+    public void testCSimple() throws Exception {
+        getMockEndpoint("mock:high").expectedBodiesReceived("24", "20");
+        getMockEndpoint("mock:med").expectedBodiesReceived("9", "6");
+        getMockEndpoint("mock:low").expectedBodiesReceived("1", "2");
+
+        template.sendBody("direct:start", 9);
+        template.sendBody("direct:start", 1);
+        template.sendBody("direct:start", 24);
+        template.sendBody("direct:start", 2);
+        template.sendBody("direct:start", 6);
+        template.sendBody("direct:start", 20);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .choice()
+                        .when(csimple("${body} > 10")).to("mock:high")
+                        .when(csimple("${body} > 5")).to("mock:med")
+                        .otherwise().to("mock:low");
+            }
+        };
+    }
+}
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java b/core/camel-core/src/test/java/org/apache/camel/language/csimple/HighPredicate.java
similarity index 60%
copy from core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
copy to core/camel-core/src/test/java/org/apache/camel/language/csimple/HighPredicate.java
index 03c71fc..377ce26 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
+++ b/core/camel-core/src/test/java/org/apache/camel/language/csimple/HighPredicate.java
@@ -14,24 +14,28 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.language.simple.ast;
+package org.apache.camel.language.csimple;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.language.simple.types.SimpleToken;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
 
-/**
- * Ends a function
- */
-public class SimpleFunctionEnd extends BaseSimpleNode implements BlockEnd {
+import static org.apache.camel.language.csimple.CSimpleHelper.bodyAs;
+
+public class HighPredicate extends CSimpleSupport {
 
-    public SimpleFunctionEnd(SimpleToken token) {
-        super(token);
+    public HighPredicate(CamelContext context) {
+        init(context);
     }
 
     @Override
-    public Expression createExpression(CamelContext camelContext, String expression) {
-        return null;
+    public String getText() {
+        return "${body} > 10";
     }
 
+    @Override
+    public Object evaluate(CamelContext context, Exchange exchange, Message message, Object body)
+            throws Exception {
+        return bodyAs(message, int.class) > 10;
+    }
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java b/core/camel-core/src/test/java/org/apache/camel/language/csimple/MedPredicate.java
similarity index 60%
copy from core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
copy to core/camel-core/src/test/java/org/apache/camel/language/csimple/MedPredicate.java
index 03c71fc..0be1d42 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
+++ b/core/camel-core/src/test/java/org/apache/camel/language/csimple/MedPredicate.java
@@ -14,24 +14,28 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.language.simple.ast;
+package org.apache.camel.language.csimple;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.language.simple.types.SimpleToken;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
 
-/**
- * Ends a function
- */
-public class SimpleFunctionEnd extends BaseSimpleNode implements BlockEnd {
+import static org.apache.camel.language.csimple.CSimpleHelper.bodyAs;
+
+public class MedPredicate extends CSimpleSupport {
 
-    public SimpleFunctionEnd(SimpleToken token) {
-        super(token);
+    public MedPredicate(CamelContext context) {
+        init(context);
     }
 
     @Override
-    public Expression createExpression(CamelContext camelContext, String expression) {
-        return null;
+    public String getText() {
+        return "${body} > 5";
     }
 
+    @Override
+    public Object evaluate(CamelContext context, Exchange exchange, Message message, Object body)
+            throws Exception {
+        return bodyAs(message, int.class) > 5;
+    }
 }
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleExpressionParserNodesTest.java b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleExpressionParserNodesTest.java
new file mode 100644
index 0000000..831e845
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleExpressionParserNodesTest.java
@@ -0,0 +1,63 @@
+/*
+ * 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.simple;
+
+import java.util.List;
+
+import org.apache.camel.ExchangeTestSupport;
+import org.apache.camel.language.simple.ast.LiteralNode;
+import org.apache.camel.language.simple.ast.SimpleFunctionStart;
+import org.apache.camel.language.simple.ast.SimpleNode;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class SimpleExpressionParserNodesTest extends ExchangeTestSupport {
+
+    @Test
+    public void testParserNodes() throws Exception {
+        exchange.getIn().setBody("foo");
+
+        SimpleExpressionParser parser = new SimpleExpressionParser(null, "Hello ${body}", true, null);
+        List<SimpleNode> nodes = parser.parseTokens();
+        Assertions.assertEquals(2, nodes.size());
+        LiteralNode ln = (LiteralNode) nodes.get(0);
+        Assertions.assertEquals("Hello ", ln.getText());
+        SimpleFunctionStart fe = (SimpleFunctionStart) nodes.get(1);
+        ln = (LiteralNode) fe.getBlock().getChildren().get(0);
+        Assertions.assertEquals("body", ln.toString());
+    }
+
+    @Test
+    public void testParserNodesEmbeddedFunction() throws Exception {
+        exchange.getIn().setBody("foo");
+
+        SimpleExpressionParser parser = new SimpleExpressionParser(null, "Hello ${body} and ${header.bar}", true, null);
+        List<SimpleNode> nodes = parser.parseTokens();
+        Assertions.assertEquals(4, nodes.size());
+        LiteralNode ln = (LiteralNode) nodes.get(0);
+        Assertions.assertEquals("Hello ", ln.getText());
+        SimpleFunctionStart fe = (SimpleFunctionStart) nodes.get(1);
+        ln = (LiteralNode) fe.getBlock().getChildren().get(0);
+        Assertions.assertEquals("body", ln.toString());
+        ln = (LiteralNode) nodes.get(2);
+        Assertions.assertEquals(" and ", ln.getText());
+        fe = (SimpleFunctionStart) nodes.get(3);
+        ln = (LiteralNode) fe.getBlock().getChildren().get(0);
+        Assertions.assertEquals("header.bar", ln.toString());
+    }
+
+}
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimplePredicateParserNodesTest.java b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimplePredicateParserNodesTest.java
new file mode 100644
index 0000000..bcb1437
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimplePredicateParserNodesTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.simple;
+
+import java.util.List;
+
+import org.apache.camel.ExchangeTestSupport;
+import org.apache.camel.language.simple.ast.BinaryExpression;
+import org.apache.camel.language.simple.ast.LiteralNode;
+import org.apache.camel.language.simple.ast.SimpleFunctionStart;
+import org.apache.camel.language.simple.ast.SimpleNode;
+import org.apache.camel.language.simple.ast.SingleQuoteStart;
+import org.apache.camel.language.simple.types.BinaryOperatorType;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class SimplePredicateParserNodesTest extends ExchangeTestSupport {
+
+    @Test
+    public void testParserNodes() throws Exception {
+        exchange.getIn().setBody("foo");
+
+        SimplePredicateParser parser = new SimplePredicateParser(null, "${body} == 'foo'", true, null);
+        List<SimpleNode> nodes = parser.parseTokens();
+        Assertions.assertEquals(1, nodes.size());
+        BinaryExpression be = (BinaryExpression) nodes.get(0);
+
+        Assertions.assertEquals(BinaryOperatorType.EQ, be.getOperator());
+
+        SingleQuoteStart qe = (SingleQuoteStart) be.getRight();
+        LiteralNode ln = (LiteralNode) qe.getBlock().getChildren().get(0);
+        Assertions.assertEquals("foo", ln.getText());
+
+        SimpleFunctionStart fe = (SimpleFunctionStart) be.getLeft();
+        ln = (LiteralNode) fe.getBlock().getChildren().get(0);
+        Assertions.assertEquals("body", ln.toString());
+    }
+
+    @Test
+    public void testParserNodesEmbeddedFunction() throws Exception {
+        exchange.getIn().setBody("foo");
+
+        SimplePredicateParser parser = new SimplePredicateParser(null, "${body} != 'Hello ${header.bar}'", true, null);
+        List<SimpleNode> nodes = parser.parseTokens();
+        Assertions.assertEquals(1, nodes.size());
+        BinaryExpression be = (BinaryExpression) nodes.get(0);
+
+        Assertions.assertEquals(BinaryOperatorType.NOT_EQ, be.getOperator());
+
+        SingleQuoteStart qe = (SingleQuoteStart) be.getRight();
+        LiteralNode ln = (LiteralNode) qe.getBlock().getChildren().get(0);
+        Assertions.assertEquals("Hello ", ln.getText());
+
+        SimpleFunctionStart fe = (SimpleFunctionStart) qe.getBlock().getChildren().get(1);
+        ln = (LiteralNode) fe.getBlock().getChildren().get(0);
+        Assertions.assertEquals("header.bar", ln.toString());
+    }
+
+}
diff --git a/core/camel-core/src/test/resources/META-INF/services/org/apache/camel/csimple.properties b/core/camel-core/src/test/resources/META-INF/services/org/apache/camel/csimple.properties
new file mode 100644
index 0000000..a20e2a9
--- /dev/null
+++ b/core/camel-core/src/test/resources/META-INF/services/org/apache/camel/csimple.properties
@@ -0,0 +1,19 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+org.apache.camel.language.csimple.HighPredicate
+org.apache.camel.language.csimple.MedPredicate
diff --git a/core/camel-util/src/main/java/org/apache/camel/util/ObjectHelper.java b/core/camel-util/src/main/java/org/apache/camel/util/ObjectHelper.java
index 0c050eb..e0354e3 100644
--- a/core/camel-util/src/main/java/org/apache/camel/util/ObjectHelper.java
+++ b/core/camel-util/src/main/java/org/apache/camel/util/ObjectHelper.java
@@ -1104,7 +1104,7 @@ public final class ObjectHelper {
         }
 
         // remove leading dots
-        if (name.startsWith(",")) {
+        if (name.startsWith(".")) {
             name = name.substring(1);
         }
 
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 0e96baf..137221b 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
@@ -2327,6 +2327,15 @@ public class ModelParser extends BaseParser {
             return true;
         }, noElementHandler(), noValueHandler());
     }
+    protected CSimpleExpression doParseCSimpleExpression() throws IOException, XmlPullParserException {
+        return doParse(new CSimpleExpression(), (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(),
             expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
@@ -2973,6 +2982,7 @@ public class ModelParser extends BaseParser {
     protected ExpressionDefinition doParseExpressionDefinitionRef(String key) throws IOException, XmlPullParserException {
         switch (key) {
             case "expressionDefinition": return doParseExpressionDefinition();
+            case "csimple": return doParseCSimpleExpression();
             case "constant": return doParseConstantExpression();
             case "exchangeProperty": return doParseExchangePropertyExpression();
             case "groovy": return doParseGroovyExpression();
diff --git a/docs/components/modules/languages/nav.adoc b/docs/components/modules/languages/nav.adoc
index 91fa306..db1c375 100644
--- a/docs/components/modules/languages/nav.adoc
+++ b/docs/components/modules/languages/nav.adoc
@@ -4,6 +4,7 @@
 * xref:languages:index.adoc[Languages]
 ** xref:languages:bean-language.adoc[Bean method]
 ** xref:languages:constant-language.adoc[Constant]
+** xref:languages:csimple-language.adoc[CSimple]
 ** xref:languages:exchangeProperty-language.adoc[ExchangeProperty]
 ** xref:languages:file-language.adoc[File]
 ** xref:languages:groovy-language.adoc[Groovy]
diff --git a/docs/components/modules/languages/pages/csimple-language.adoc b/docs/components/modules/languages/pages/csimple-language.adoc
new file mode 100644
index 0000000..1f023bd
--- /dev/null
+++ b/docs/components/modules/languages/pages/csimple-language.adoc
@@ -0,0 +1,55 @@
+[[csimple-language]]
+= CSimple Language
+//THIS FILE IS COPIED: EDIT THE SOURCE FILE:
+:page-source: core/camel-core-languages/src/main/docs/modules/languages/pages/csimple-language.adoc
+:docTitle: CSimple
+:artifactId: camel-core-languages
+:description: Evaluate a compile simple expression language.
+:since: 3.7
+:supportLevel: Preview
+include::{cq-version}@camel-quarkus:ROOT:partial$reference/languages/csimple.adoc[opts=optional]
+
+*Since Camel {since}*
+
+The CSimple language is *compiled* xref:simple-language.adoc[Simple] language.
+
+
+== Different between CSimple and Simple
+
+The simple language is a dynamic expression language which is runtime parsed into a set of Camel `Expression`'s or `Predicate`'s.
+
+The csimple language is parsed into regular Java source code and compiled together with all the other source code, or it
+can be compiled once during bootstrap via the `camel-csimple-joor` module.
+
+The simple langauge is generally very lightweight and fast, however for some use-cases with dynamic method calls via OGNL paths,
+then the simple language does runtime introspection and reflection calls. This has an overhead on performance, and one of the reasons
+why csimple was created. However csimple requires to be typesafe and method calls via OGNL paths requires to know the type during parsing.
+This means for csimple languages expressions you would need to provide the class type where as simple could introspect this at runtime.
+
+In other words the simple language is using _duck typing_ (if it looks like a duck, and quacks like a duck, then it is a duck)
+and csimple is using Java type (typesafety). If there is a type error then simple will report this at runtime, and csimple you will see a Java compiler error.
+
+
+== CSimple Language options
+
+// language options: START
+The CSimple language supports 2 options, which are listed below.
+
+
+
+[width="100%",cols="2,1m,1m,6",options="header"]
+|===
+| Name | Default | Java Type | Description
+| resultType |  | String | Sets the class name of the result type (type from output)
+| trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks
+|===
+// language options: END
+
+== More documentation
+
+See the xref:simple-language.adoc[Simple] language as csimple has the same set of functions as simple language.
+
+== Example
+
+See `camel-example-csimple` and `camel-example-csimple-joor` examples at https://github.com/apache/camel-examples[Camel Examples]
+
diff --git a/docs/components/modules/others/nav.adoc b/docs/components/modules/others/nav.adoc
index 9f71268..7050750 100644
--- a/docs/components/modules/others/nav.adoc
+++ b/docs/components/modules/others/nav.adoc
@@ -5,6 +5,7 @@
 ** xref:attachments.adoc[Attachments]
 ** xref:aws-xray.adoc[AWS XRay]
 ** xref:cdi.adoc[CDI]
+** xref:csimple-joor.adoc[CSimple jOOR]
 ** xref:cxf-transport.adoc[CXF Transport]
 ** xref:etcd3.adoc[Etcd3]
 ** xref:headersmap.adoc[Headersmap]
diff --git a/docs/components/modules/others/pages/csimple-joor.adoc b/docs/components/modules/others/pages/csimple-joor.adoc
new file mode 100644
index 0000000..8762da3
--- /dev/null
+++ b/docs/components/modules/others/pages/csimple-joor.adoc
@@ -0,0 +1,48 @@
+[[csimple-joor-other]]
+= CSimple jOOR Component
+//THIS FILE IS COPIED: EDIT THE SOURCE FILE:
+:page-source: components/camel-csimple-joor/src/main/docs/csimple-joor.adoc
+:docTitle: CSimple jOOR
+:artifactId: camel-csimple-joor
+:description: jOOR compiler for csimple language
+:since: 3.7
+:supportLevel: Preview
+include::{cq-version}@camel-quarkus:ROOT:partial$reference/others/csimple-joor.adoc[opts=optional]
+
+*Since Camel {since}*
+
+The csimple (compiled simple) expression language can either be source code generated and compiled together
+with your application using the regular Java compiler. Or compiled at runtime using jOOR during bootstrap.
+
+This module includes the jOOR compiler for the csimple language for runtime compilation.
+
+To use this, just include `camel-csimple-joor` in the classpath.
+
+NOTE: Java 8 is not supported. Java 11 or 14 is required.
+
+
+== Limitations
+
+The supported runtime is intended for Java standalone, Spring Boot, Camel Quarkus and other microservices runtimes.
+It is not supported in OSGi, Camel Karaf or any kind of Java Application Server runtime.
+
+jOOR does not support runtime compilation with Spring Boot using _fat jar_ packaging (https://github.com/jOOQ/jOOR/issues/69),
+it works with exploded classpath.
+
+== Dependencies
+
+To use scripting languages in your camel routes you need to add a
+dependency on *camel-csimple-joor*.
+
+If you use Maven you could just add the following to your `pom.xml`,
+substituting the version number for the latest and greatest release (see
+the download page for the latest versions).
+
+[source,xml]
+---------------------------------------
+<dependency>
+  <groupId>org.apache.camel</groupId>
+  <artifactId>camel-csimple-joor</artifactId>
+  <version>x.x.x</version>
+</dependency>
+---------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 9180392..f6d84a9 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -2642,6 +2642,11 @@
 				<artifactId>camel-zookeeper</artifactId>
 				<version>${project.version}</version>
 			</dependency>
+			<dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-csimple-joor</artifactId>
+                <version>${project.version}</version>
+            </dependency>
 			<!-- camel components: END -->
 
             <!-- NOTE: auto-generated list of starter components when building camel catalog -->
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleOperatorTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleOperatorTest.java
new file mode 100644
index 0000000..3336052
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleOperatorTest.java
@@ -0,0 +1,131 @@
+/*
+ * 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.itest.jmh;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.spi.Language;
+import org.apache.camel.support.DefaultExchange;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Tests a Compiled Compile Simple operator expression
+ */
+public class CSimpleOperatorTest {
+
+    private static final Logger LOG = LoggerFactory.getLogger(CSimpleOperatorTest.class);
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.All)
+                .timeUnit(TimeUnit.MICROSECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(10))
+                .measurementIterations(2)
+                .threads(2)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkState {
+        CamelContext camel;
+        String expression = "${header.gold} == 123";
+        String expression2 = "${header.gold} > 123";
+        String expression3 = "${header.gold} < 123";
+        Exchange exchange;
+        Language csimple;
+
+        @Setup(Level.Trial)
+        public void initialize() {
+            camel = new DefaultCamelContext();
+            try {
+                camel.getTypeConverterRegistry().getStatistics().setStatisticsEnabled(true);
+                camel.start();
+                exchange = new DefaultExchange(camel);
+                exchange.getIn().setBody("World");
+                exchange.getIn().setHeader("gold", "123");
+                csimple = camel.resolveLanguage("csimple");
+
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+        @TearDown(Level.Trial)
+        public void close() {
+            try {
+                LOG.info("" + camel.getTypeConverterRegistry().getStatistics());
+                camel.stop();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000)
+    public void csimplePredicate(BenchmarkState state, Blackhole bh) {
+        boolean out = state.csimple.createPredicate(state.expression).matches(state.exchange);
+        if (!out) {
+            throw new IllegalArgumentException("Evaluation failed");
+        }
+        bh.consume(out);
+        boolean out2 = state.csimple.createPredicate(state.expression2).matches(state.exchange);
+        if (out2) {
+            throw new IllegalArgumentException("Evaluation failed");
+        }
+        bh.consume(out2);
+        boolean out3 = state.csimple.createPredicate(state.expression3).matches(state.exchange);
+        if (out3) {
+            throw new IllegalArgumentException("Evaluation failed");
+        }
+        bh.consume(out3);
+    }
+
+}
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript1.java
similarity index 57%
copy from core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
copy to tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript1.java
index 03c71fc..2ef4440 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript1.java
@@ -14,24 +14,30 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.language.simple.ast;
+package org.apache.camel.itest.jmh;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.language.simple.types.SimpleToken;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.language.csimple.CSimpleSupport;
 
-/**
- * Ends a function
- */
-public class SimpleFunctionEnd extends BaseSimpleNode implements BlockEnd {
+import static org.apache.camel.language.csimple.CSimpleHelper.headerAs;
+
+public class CSimpleScript1 extends CSimpleSupport {
 
-    public SimpleFunctionEnd(SimpleToken token) {
-        super(token);
+    public CSimpleScript1(CamelContext context) {
+        init(context);
+    }
+
+    @Override
+    public String getText() {
+        return "${header.gold} == 123";
     }
 
     @Override
-    public Expression createExpression(CamelContext camelContext, String expression) {
-        return null;
+    public Object evaluate(CamelContext context, Exchange exchange, Message message, Object body)
+            throws Exception {
+        return headerAs(message, "gold", int.class) == 123;
     }
 
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript2.java
similarity index 57%
copy from core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
copy to tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript2.java
index 03c71fc..9d0305a 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript2.java
@@ -14,24 +14,30 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.language.simple.ast;
+package org.apache.camel.itest.jmh;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.language.simple.types.SimpleToken;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.language.csimple.CSimpleSupport;
 
-/**
- * Ends a function
- */
-public class SimpleFunctionEnd extends BaseSimpleNode implements BlockEnd {
+import static org.apache.camel.language.csimple.CSimpleHelper.headerAs;
+
+public class CSimpleScript2 extends CSimpleSupport {
 
-    public SimpleFunctionEnd(SimpleToken token) {
-        super(token);
+    public CSimpleScript2(CamelContext context) {
+        init(context);
+    }
+
+    @Override
+    public String getText() {
+        return "${header.gold} > 123";
     }
 
     @Override
-    public Expression createExpression(CamelContext camelContext, String expression) {
-        return null;
+    public Object evaluate(CamelContext context, Exchange exchange, Message message, Object body)
+            throws Exception {
+        return headerAs(message, "gold", int.class) > 123;
     }
 
 }
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript3.java
similarity index 57%
copy from core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
copy to tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript3.java
index 03c71fc..82f4dd9 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionEnd.java
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript3.java
@@ -14,24 +14,30 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.language.simple.ast;
+package org.apache.camel.itest.jmh;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Expression;
-import org.apache.camel.language.simple.types.SimpleToken;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.language.csimple.CSimpleSupport;
 
-/**
- * Ends a function
- */
-public class SimpleFunctionEnd extends BaseSimpleNode implements BlockEnd {
+import static org.apache.camel.language.csimple.CSimpleHelper.headerAs;
+
+public class CSimpleScript3 extends CSimpleSupport {
 
-    public SimpleFunctionEnd(SimpleToken token) {
-        super(token);
+    public CSimpleScript3(CamelContext context) {
+        init(context);
+    }
+
+    @Override
+    public String getText() {
+        return "${header.gold} < 123";
     }
 
     @Override
-    public Expression createExpression(CamelContext camelContext, String expression) {
-        return null;
+    public Object evaluate(CamelContext context, Exchange exchange, Message message, Object body)
+            throws Exception {
+        return headerAs(message, "gold", int.class) < 123;
     }
 
 }
diff --git a/tests/camel-jmh/src/test/resources/META-INF/services/org/apache/camel/csimple.properties b/tests/camel-jmh/src/test/resources/META-INF/services/org/apache/camel/csimple.properties
new file mode 100644
index 0000000..fc8d8ef
--- /dev/null
+++ b/tests/camel-jmh/src/test/resources/META-INF/services/org/apache/camel/csimple.properties
@@ -0,0 +1,20 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+org.apache.camel.itest.jmh.CSimpleScript1
+org.apache.camel.itest.jmh.CSimpleScript2
+org.apache.camel.itest.jmh.CSimpleScript3