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 2021/04/14 08:47:48 UTC

[camel] branch master updated: Kamelet EIP (#5350)

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


The following commit(s) were added to refs/heads/master by this push:
     new 4384e60  Kamelet EIP (#5350)
4384e60 is described below

commit 4384e609093a4720a9f4af53e9816e7889fecd63
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Apr 14 10:47:17 2021 +0200

    Kamelet EIP (#5350)
    
    CAMEL-16493: Kamelet EIP
---
 .../apache/camel/catalog/components/kamelet.json   |   2 +-
 .../org/apache/camel/catalog/docs.properties       |   1 +
 .../org/apache/camel/catalog/docs/enrich-eip.adoc  |   3 +-
 .../camel/catalog/docs/kamelet-component.adoc      |   2 +-
 .../org/apache/camel/catalog/docs/kamelet-eip.adoc |  68 +++++++++
 .../org/apache/camel/catalog/docs/log-eip.adoc     |   2 +-
 .../org/apache/camel/catalog/docs/loop-eip.adoc    |   3 +-
 .../org/apache/camel/catalog/docs/nav.adoc         |   1 +
 .../apache/camel/catalog/docs/resequence-eip.adoc  |   2 +-
 .../apache/camel/catalog/docs/serviceCall-eip.adoc |   5 +-
 .../org/apache/camel/catalog/docs/split-eip.adoc   |   3 +-
 .../org/apache/camel/catalog/docs/toD-eip.adoc     |   2 +-
 .../org/apache/camel/catalog/models.properties     |   1 +
 .../org/apache/camel/catalog/models/kamelet.json   |  17 +++
 .../apache/camel/catalog/schemas/camel-spring.xsd  |  49 +++++++
 components/camel-kamelet/pom.xml                   |   5 +-
 .../services/org/apache/camel/component.properties |   2 +-
 .../apache/camel/component/kamelet/kamelet.json    |   2 +-
 .../src/main/docs/kamelet-component.adoc           |   2 +-
 .../apache/camel/component/kamelet/Kamelet.java    |  11 +-
 .../camel/component/kamelet/KameletComponent.java  |  20 ++-
 .../camel/component/kamelet/KameletEndpoint.java   |   9 +-
 .../camel/component/kamelet/KameletProcessor.java  | 154 +++++++++++++++++++++
 .../component/kamelet/KameletProcessorFactory.java |  35 +++++
 .../camel/component/kamelet/KameletProducer.java   |  38 ++++-
 .../camel/component/kamelet/KameletReifier.java    |  35 +++++
 .../org/apache/camel/model/KameletDefinition       |  18 +++
 .../component/kamelet/KameletAggregateTest.java    |  72 ++++++++++
 .../camel/component/kamelet/KameletBasicTest.java  |   1 +
 ...tBasicTest.java => KameletConsumeOnlyTest.java} |  38 +----
 .../component/kamelet/KameletEipAggregateTest.java |  67 +++++++++
 .../camel/component/kamelet/KameletEipTest.java    |  67 +++++++++
 .../component/ComponentsBuilderFactory.java        |   3 +-
 .../dsl/KameletComponentBuilderFactory.java        |   6 +-
 .../src/generated/resources/metadata.json          |   2 +-
 .../src/main/docs/modules/eips/nav.adoc            |   1 +
 .../main/docs/modules/eips/pages/enrich-eip.adoc   |   3 +-
 .../main/docs/modules/eips/pages/kamelet-eip.adoc  |  60 ++++++++
 .../src/main/docs/modules/eips/pages/log-eip.adoc  |   2 +-
 .../src/main/docs/modules/eips/pages/loop-eip.adoc |   3 +-
 .../docs/modules/eips/pages/resequence-eip.adoc    |   2 +-
 .../docs/modules/eips/pages/serviceCall-eip.adoc   |   5 +-
 .../main/docs/modules/eips/pages/split-eip.adoc    |   3 +-
 .../src/main/docs/modules/eips/pages/toD-eip.adoc  |   2 +-
 .../services/org/apache/camel/model.properties     |   1 +
 .../resources/org/apache/camel/model/jaxb.index    |   1 +
 .../resources/org/apache/camel/model/kamelet.json  |  18 +++
 .../org/apache/camel/model/KameletDefinition.java  |  67 +++++++++
 .../apache/camel/model/ProcessorDefinition.java    |  14 ++
 .../org/apache/camel/reifier/KameletReifier.java   |  36 +++++
 .../org/apache/camel/reifier/ProcessorReifier.java |   3 +
 .../builder/endpoint/StaticEndpointBuilders.java   |   6 +-
 .../dsl/KameletEndpointBuilderFactory.java         |   9 +-
 .../java/org/apache/camel/xml/in/ModelParser.java  |  10 ++
 .../modules/ROOT/pages/kamelet-component.adoc      |   2 +-
 .../dsl/yaml/deserializers/ModelDeserializers.java |  49 +++++++
 .../deserializers/ModelDeserializersResolver.java  |   2 +
 .../src/generated/resources/camel-yaml-dsl.json    |  21 +++
 .../camel/maven/packaging/UpdateReadmeMojo.java    |  12 +-
 59 files changed, 985 insertions(+), 95 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kamelet.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kamelet.json
index 4922233..36dd720 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kamelet.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/kamelet.json
@@ -3,7 +3,7 @@
     "kind": "component",
     "name": "kamelet",
     "title": "Kamelet",
-    "description": "The Kamelet Component provides support for interacting with the Camel Route Template engine",
+    "description": "To call Kamelets",
     "deprecated": false,
     "firstVersion": "3.8.0",
     "label": "core",
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 7c6bfe6..0249ddd 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
@@ -269,6 +269,7 @@ jt400-component
 jta
 kafka-component
 kamelet-component
+kamelet-eip
 kubernetes-config-maps-component
 kubernetes-custom-resources-component
 kubernetes-deployments-component
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/enrich-eip.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/enrich-eip.adoc
index 8334443..2b3b3b9 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/enrich-eip.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/enrich-eip.adoc
@@ -12,7 +12,7 @@ image::eip/DataEnricher.gif[image]
 TIP: See the `cacheSize` option for more details on _how much cache_ to use depending on how many or few unique endpoints are used.
 
 // eip options: START
-The Enrich EIP supports 7 options which are listed below:
+The Enrich EIP supports 8 options which are listed below:
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
@@ -24,6 +24,7 @@ The Enrich EIP supports 7 options which are listed below:
 | *shareUnitOfWork* | Shares the org.apache.camel.spi.UnitOfWork with the parent and the resource exchange. Enrich will by default not share unit of work between the parent exchange and the resource exchange. This means the resource exchange has its own individual unit of work. | false | Boolean
 | *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producer when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped and discarded after use. This reduc [...]
 | *ignoreInvalidEndpoint* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint | false | Boolean
+| *allowOptimisedComponents* | Whether to allow components to optimise enricher if they are org.apache.camel.spi.SendDynamicAware . | true | Boolean
 |===
 // eip options: END
 
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/kamelet-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/kamelet-component.adoc
index ef448b7..40ad18a 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/kamelet-component.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/kamelet-component.adoc
@@ -2,7 +2,7 @@
 = Kamelet Component
 :docTitle: Kamelet
 :artifactId: camel-kamelet
-:description: The Kamelet Component provides support for interacting with the Camel Route Template engine
+:description: To call Kamelets
 :since: 3.8
 :supportLevel: Stable
 :component-header: Both producer and consumer are supported
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/kamelet-eip.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/kamelet-eip.adoc
new file mode 100644
index 0000000..4a850f6
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/kamelet-eip.adoc
@@ -0,0 +1,68 @@
+[[kamelet-eip]]
+= Kamelet EIP
+:docTitle: Kamelet
+:description: To call Kamelets
+:since: 
+:supportLevel: Stable
+
+Kamelets (Kamel route snippets) allow users to connect to external systems via a simplified interface,
+hiding all the low level details about how those connections are implemented.
+
+The Kamelet EIP allows to call Kamelets (route templates).
+When calling a Kamelet you may just refer to the name (template id) of the Kamelet in the EIP as shown below:
+
+[source,java]
+----
+from("direct:start")
+    .kamelet("foo")
+    .to("mock:result");
+----
+
+[source,xml]
+----
+<camelContext xmlns="http://camel.apache.org/schema/spring">
+  <route>
+    <from uri="direct:start"/>
+    <kamelet name="foo"/>
+    <to uri="mock:result"/>
+  </route>
+</camelContext>
+----
+
+Camel will then, when starting:
+
+* lookup the route template with the given id (i.e. foo) from the Camel context
+* create a new route based on the route template
+
+== Options
+// eip options: START
+The Kamelet EIP supports 1 options which are listed below:
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *name* | *Required* Name of the Kamelet (templateId/routeId) to call. Options for the kamelet can be specified using uri syntax, eg mynamecount=4&type=gold. |  | String
+|===
+// eip options: END
+
+== Dependency
+
+The implementation of the Kamelet EIP is located in the `camel-kamelet` JAR, so you should add the following dependency:
+
+[source,xml]
+----
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-kamelet</artifactId>
+    <!-- use the same version as your Camel core version -->
+    <version>x.y.z</version>
+</dependency>
+----
+
+== More details
+
+- xref:components::kamelet-component.adoc[Kamelet component]
+- xref:manual:route-tepmplate.adoc[Route Template]
+- xref:latest@camel-k:ROOT::kamelets-user.adoc[Kamelets user guide]
+
+We also provided a small https://github.com/apache/camel-examples/tree/master/examples/kamelet[Kamelet example].
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/log-eip.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/log-eip.adoc
index 26b5073..7fde239 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/log-eip.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/log-eip.adoc
@@ -2,7 +2,7 @@
 = Log EIP
 :docTitle: Log
 :description: Logs the defined message to the logger
-:since:
+:since: 
 :supportLevel: Stable
 
 How can I log the processing of a xref:message.adoc[Message]?
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/loop-eip.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/loop-eip.adoc
index 3cdc608..8dae0ca 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/loop-eip.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/loop-eip.adoc
@@ -16,13 +16,14 @@ Notice by default the loop uses the same exchange throughout the looping. So the
 == Options
 
 // eip options: START
-The Loop EIP supports 2 options which are listed below:
+The Loop EIP supports 3 options which are listed below:
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
 | *copy* | 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. | false | Boolean
 | *doWhile* | Enables the while loop that loops until the predicate evaluates to false or null. | false | Boolean
+| *breakOnShutdown* | If the breakOnShutdown attribute is true, then the loop will not iterate until it reaches the end when Camel is shut down. | false | Boolean
 |===
 // eip options: END
 
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/nav.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/nav.adoc
index 7471262..f4d3d11 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/nav.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/nav.adoc
@@ -37,6 +37,7 @@
  ** xref:eips:inOnly-eip.adoc[In Only]
  ** xref:eips:inOut-eip.adoc[In Out]
  ** xref:eips:intercept.adoc[Intercept]
+ ** xref:eips:kamelet-eip.adoc[Kamelet]
  ** xref:eips:loadBalance-eip.adoc[Load Balance]
  ** xref:eips:log-eip.adoc[Log]
  ** xref:eips:loop-eip.adoc[Loop]
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/resequence-eip.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/resequence-eip.adoc
index 62789e5..953b394 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/resequence-eip.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/resequence-eip.adoc
@@ -2,7 +2,7 @@
 = Resequence EIP
 :docTitle: Resequence
 :description: Resequences (re-order) messages based on an expression
-:since:
+:since: 
 :supportLevel: Stable
 
 The http://www.enterpriseintegrationpatterns.com/Resequencer.html[Resequencer] from the xref:components:eips:enterprise-integration-patterns.adoc[EIP patterns] allows you to reorganise messages based on some comparator. +
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/serviceCall-eip.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/serviceCall-eip.adoc
index ef4fd2c..19c1a73 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/serviceCall-eip.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/serviceCall-eip.adoc
@@ -96,7 +96,7 @@ from("direct:start")
 
 == Options
 // eip options: START
-The Service Call EIP supports 14 options which are listed below:
+The Service Call EIP supports 13 options which are listed below:
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
@@ -104,7 +104,7 @@ The Service Call EIP supports 14 options which are listed below:
 | *name* | *Required* Sets the name of the service to use |  | String
 | *uri* | The uri of the endpoint to send to. The uri can be dynamic computed using the org.apache.camel.language.simple.SimpleLanguage expression. |  | String
 | *component* | The component to use. | http | String
-| *pattern* | *Required* Sets the optional ExchangePattern used to invoke this endpoint |  | ExchangePattern
+| *pattern* | Sets the optional ExchangePattern used to invoke this endpoint |  | ExchangePattern
 | *configurationRef* | Refers to a ServiceCall configuration to use |  | String
 | *serviceDiscoveryRef* | Sets a reference to a custom ServiceDiscovery to use. |  | String
 | *serviceFilterRef* | Sets a reference to a custom ServiceFilter to use. |  | String
@@ -114,7 +114,6 @@ The Service Call EIP supports 14 options which are listed below:
 | *serviceDiscoveryConfiguration* | *Required* Configures the ServiceDiscovery using the given configuration. |  | ServiceCallServiceDiscoveryConfiguration
 | *serviceFilterConfiguration* | *Required* Configures the ServiceFilter using the given configuration. |  | ServiceCallServiceFilterConfiguration
 | *loadBalancerConfiguration* | *Required* Configures the LoadBalancer using the given configuration. |  | ServiceCallServiceLoadBalancerConfiguration
-| *expressionConfiguration* | *Required* Configures the Expression using the given configuration. |  | ServiceCallExpressionConfiguration
 |===
 // eip options: END
 
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/split-eip.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/split-eip.adoc
index 7449165..e984f95 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/split-eip.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/split-eip.adoc
@@ -13,11 +13,12 @@ You need to specify a Splitter as `split()`. In earlier versions of Camel, you n
 
 
 // eip options: START
-The Split EIP supports 12 options which are listed below:
+The Split EIP supports 13 options which are listed below:
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
+| *delimiter* | Delimiter used in splitting messages. Can be turned off using the value false. The default value is , | , | String
 | *parallelProcessing* | 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 happens concurrently. | false | Boolean
 | *strategyRef* | 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 as the AggregationStrategy |  | String
 | *strategyMethodName* | This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy. |  | String
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/toD-eip.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/toD-eip.adoc
index 54997f8..1589429 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/toD-eip.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/toD-eip.adoc
@@ -1,7 +1,7 @@
 [[toD-eip]]
 = To D EIP
 :docTitle: To D
-:description: Sends the message to a single dynamic endpoint. For more dynamic behavior use Recipient List or Dynamic Router EIP instead.
+:description: Sends the message to a dynamic endpoint You can specify multiple languages in the uri separated by the plus sign, such as mock:language:xpath:/order/uri where mock: would be a prefix to a xpath expression. For more dynamic behavior use Recipient List or Dynamic Router EIP instead.
 :since: 
 :supportLevel: Stable
 
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 7b05bcb..a939487 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
@@ -82,6 +82,7 @@ joor
 json
 jsonApi
 jsonpath
+kamelet
 keyStoreParameters
 kubernetesServiceDiscovery
 language
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/kamelet.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/kamelet.json
new file mode 100644
index 0000000..bf50894
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/kamelet.json
@@ -0,0 +1,17 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "kamelet",
+    "title": "Kamelet",
+    "deprecated": false,
+    "label": "eip,routing,kamelet",
+    "javaType": "org.apache.camel.model.KameletDefinition",
+    "input": true,
+    "output": false
+  },
+  "properties": {
+    "name": { "kind": "attribute", "displayName": "Name", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the Kamelet (templateId\/routeId) to call. Options for the kamelet can be specified using uri syntax, eg mynamecount=4&type=gold." },
+    "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/schemas/camel-spring.xsd b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
index fc6c345..eaffec3 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
@@ -715,6 +715,14 @@ Evaluate a JsonPath expression against a JSON message body.
     </xs:annotation>
   </xs:element>
 
+  <xs:element name="kamelet" type="tns:kameletDefinition">
+    <xs:annotation>
+      <xs:documentation xml:lang="en"><![CDATA[
+null
+      ]]></xs:documentation>
+    </xs:annotation>
+  </xs:element>
+
   <xs:element name="keyStoreParameters" type="tns:keyStoreParametersFactoryBean">
     <xs:annotation>
       <xs:documentation xml:lang="en"><![CDATA[
@@ -2986,6 +2994,7 @@ Language, such as en for english.
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -3436,6 +3445,7 @@ implementation. Default value: Singleton
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -3535,6 +3545,7 @@ implementation. Default value: Singleton
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -3625,6 +3636,7 @@ implementation. Default value: Singleton
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -3704,6 +3716,7 @@ implementation. Default value: Singleton
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -4727,6 +4740,7 @@ org.apache.camel.spi.SendDynamicAware . Default value: true
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -4803,6 +4817,7 @@ org.apache.camel.spi.SendDynamicAware . Default value: true
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -4941,6 +4956,7 @@ Global option value.
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -5119,6 +5135,7 @@ Set if validation is required for this input type. Default value: false
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -5211,6 +5228,7 @@ configured, then all incoming messages is intercepted.
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -5285,6 +5303,22 @@ process its result.
     </xs:complexContent>
   </xs:complexType>
 
+  <xs:complexType name="kameletDefinition">
+    <xs:complexContent>
+      <xs:extension base="tns:output">
+        <xs:sequence/>
+        <xs:attribute name="name" type="xs:string" use="required">
+          <xs:annotation>
+            <xs:documentation xml:lang="en"><![CDATA[
+Name of the Kamelet (route template id) to call Options for the kamelet can be
+specified using uri syntax, eg mynamecount=4&type=gold.
+            ]]></xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
   <xs:complexType name="loadBalanceDefinition">
     <xs:complexContent>
       <xs:extension base="tns:output">
@@ -5319,6 +5353,7 @@ process its result.
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -5599,6 +5634,7 @@ To refer to a custom logger instance to lookup from the registry.
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -8249,6 +8285,7 @@ decompressed size. Default value: 1073741824
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -8452,6 +8489,7 @@ backward compatibility. Default value: false
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -8585,6 +8623,7 @@ this on completion. By default this feature is off. Default value: false
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -8946,6 +8985,7 @@ generate the log message from exchange.
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -9064,6 +9104,7 @@ Set if validation is required for this output type. Default value: false
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -9140,6 +9181,7 @@ Set if validation is required for this output type. Default value: false
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -9657,6 +9699,7 @@ Name of property to remove.
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -9905,6 +9948,7 @@ Reference to the routes in the xml dsl.
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -10213,6 +10257,7 @@ producers.
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -10607,6 +10652,7 @@ Sets a reference to lookup for the comparator to use for sorting.
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -10826,6 +10872,7 @@ backward compatibility. Default value: false
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -11242,6 +11289,7 @@ Whether to auto startup components when toD is starting up. Default value: true
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
@@ -11355,6 +11403,7 @@ Sets a reference to use for lookup the policy in the registry.
             <xs:element ref="tns:intercept"/>
             <xs:element ref="tns:interceptFrom"/>
             <xs:element ref="tns:interceptSendToEndpoint"/>
+            <xs:element ref="tns:kamelet"/>
             <xs:element ref="tns:loadBalance"/>
             <xs:element ref="tns:log"/>
             <xs:element ref="tns:loop"/>
diff --git a/components/camel-kamelet/pom.xml b/components/camel-kamelet/pom.xml
index e799bac..846c1d02 100644
--- a/components/camel-kamelet/pom.xml
+++ b/components/camel-kamelet/pom.xml
@@ -30,12 +30,13 @@
     <packaging>jar</packaging>
 
     <name>Camel :: Kamelet</name>
-    <description>The Kamelet Component provides support for interacting with the Camel Route Template engine</description>
+    <description>To call Kamelets</description>
 
     <dependencies>
+
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-support</artifactId>
+            <artifactId>camel-core-reifier</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
diff --git a/components/camel-kamelet/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-kamelet/src/generated/resources/META-INF/services/org/apache/camel/component.properties
index 779359a..ba9eea2 100644
--- a/components/camel-kamelet/src/generated/resources/META-INF/services/org/apache/camel/component.properties
+++ b/components/camel-kamelet/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -4,4 +4,4 @@ groupId=org.apache.camel
 artifactId=camel-kamelet
 version=3.10.0-SNAPSHOT
 projectName=Camel :: Kamelet
-projectDescription=The Kamelet Component provides support for interacting with the Camel Route Template engine
+projectDescription=To call Kamelets
diff --git a/components/camel-kamelet/src/generated/resources/org/apache/camel/component/kamelet/kamelet.json b/components/camel-kamelet/src/generated/resources/org/apache/camel/component/kamelet/kamelet.json
index 4922233..36dd720 100644
--- a/components/camel-kamelet/src/generated/resources/org/apache/camel/component/kamelet/kamelet.json
+++ b/components/camel-kamelet/src/generated/resources/org/apache/camel/component/kamelet/kamelet.json
@@ -3,7 +3,7 @@
     "kind": "component",
     "name": "kamelet",
     "title": "Kamelet",
-    "description": "The Kamelet Component provides support for interacting with the Camel Route Template engine",
+    "description": "To call Kamelets",
     "deprecated": false,
     "firstVersion": "3.8.0",
     "label": "core",
diff --git a/components/camel-kamelet/src/main/docs/kamelet-component.adoc b/components/camel-kamelet/src/main/docs/kamelet-component.adoc
index ef448b7..40ad18a 100644
--- a/components/camel-kamelet/src/main/docs/kamelet-component.adoc
+++ b/components/camel-kamelet/src/main/docs/kamelet-component.adoc
@@ -2,7 +2,7 @@
 = Kamelet Component
 :docTitle: Kamelet
 :artifactId: camel-kamelet
-:description: The Kamelet Component provides support for interacting with the Camel Route Template engine
+:description: To call Kamelets
 :since: 3.8
 :supportLevel: Stable
 :component-header: Both producer and consumer are supported
diff --git a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/Kamelet.java b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/Kamelet.java
index d5bd8ca..10ba82e 100644
--- a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/Kamelet.java
+++ b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/Kamelet.java
@@ -124,16 +124,23 @@ public final class Kamelet {
         if (def.getInput().getEndpointUri().startsWith("kamelet:source")
                 || def.getInput().getEndpointUri().startsWith("kamelet://source")) {
             def.setInput(null);
-            def.setInput(new FromDefinition("kamelet:source?" + PARAM_ROUTE_ID + "=" + rid));
+            def.setInput(new FromDefinition("kamelet://source?" + PARAM_ROUTE_ID + "=" + rid));
         }
 
+        // there must be at least one sink
+        boolean sink = false;
         Iterator<ToDefinition> it = filterTypeInOutputs(def.getOutputs(), ToDefinition.class);
         while (it.hasNext()) {
             ToDefinition to = it.next();
             if (to.getEndpointUri().startsWith("kamelet:sink") || to.getEndpointUri().startsWith("kamelet://sink")) {
-                to.setUri("kamelet:sink?" + PARAM_ROUTE_ID + "=" + rid);
+                to.setUri("kamelet://sink?" + PARAM_ROUTE_ID + "=" + rid);
+                sink = true;
             }
         }
+        if (!sink) {
+            ToDefinition to = new ToDefinition("kamelet://sink?" + PARAM_ROUTE_ID + "=" + rid);
+            def.getOutputs().add(to);
+        }
 
         return def;
     }
diff --git a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletComponent.java b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletComponent.java
index 65b9524..7f3aaeb 100644
--- a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletComponent.java
+++ b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletComponent.java
@@ -22,10 +22,12 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
+import org.apache.camel.Processor;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.VetoCamelContextStartException;
 import org.apache.camel.model.ModelCamelContext;
@@ -49,9 +51,12 @@ import static org.apache.camel.component.kamelet.Kamelet.PARAM_TEMPLATE_ID;
 public class KameletComponent extends DefaultComponent {
     private static final Logger LOGGER = LoggerFactory.getLogger(KameletComponent.class);
 
+    private final LifecycleHandler lifecycleHandler = new LifecycleHandler();
+
     // active consumers
     private final Map<String, KameletConsumer> consumers = new HashMap<>();
-    private final LifecycleHandler lifecycleHandler = new LifecycleHandler();
+    // active kamelet EIPs
+    private final Map<String, Processor> kameletEips = new ConcurrentHashMap<>();
 
     // counter that is used for producers to keep track if any consumer was added/removed since they last checked
     // this is used for optimization to avoid each producer to get consumer for each message processed
@@ -72,6 +77,18 @@ public class KameletComponent extends DefaultComponent {
     public KameletComponent() {
     }
 
+    public void addKameletEip(String key, Processor callback) {
+        kameletEips.put(key, callback);
+    }
+
+    public Processor removeKameletEip(String key) {
+        return kameletEips.remove(key);
+    }
+
+    public Processor getKameletEip(String key) {
+        return kameletEips.get(key);
+    }
+
     @Override
     protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
         final String templateId = Kamelet.extractTemplateId(getCamelContext(), remaining, parameters);
@@ -310,6 +327,7 @@ public class KameletComponent extends DefaultComponent {
 
         ServiceHelper.stopAndShutdownService(consumers);
         consumers.clear();
+        kameletEips.clear();
         super.doShutdown();
     }
 
diff --git a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletEndpoint.java b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletEndpoint.java
index 1cc9e43..c0ff0fe 100644
--- a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletEndpoint.java
+++ b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletEndpoint.java
@@ -31,13 +31,8 @@ import org.apache.camel.spi.UriPath;
 import org.apache.camel.support.DefaultEndpoint;
 import org.apache.camel.util.ObjectHelper;
 
-@UriEndpoint(
-             firstVersion = "3.8.0",
-             scheme = "kamelet",
-             syntax = "kamelet:templateId/routeId",
-             title = "Kamelet",
-             lenientProperties = true,
-             category = Category.CORE)
+@UriEndpoint(firstVersion = "3.8.0", scheme = "kamelet", syntax = "kamelet:templateId/routeId", title = "Kamelet",
+             lenientProperties = true, category = Category.CORE)
 public class KameletEndpoint extends DefaultEndpoint {
     private final String key;
     private final Map<String, Object> kameletProperties;
diff --git a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletProcessor.java b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletProcessor.java
new file mode 100644
index 0000000..be68447
--- /dev/null
+++ b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletProcessor.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.component.kamelet;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.AsyncProcessor;
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.Exchange;
+import org.apache.camel.Navigate;
+import org.apache.camel.Processor;
+import org.apache.camel.api.management.ManagedAttribute;
+import org.apache.camel.api.management.ManagedResource;
+import org.apache.camel.spi.IdAware;
+import org.apache.camel.spi.RouteIdAware;
+import org.apache.camel.support.AsyncProcessorConverterHelper;
+import org.apache.camel.support.AsyncProcessorSupport;
+import org.apache.camel.support.service.ServiceHelper;
+
+/**
+ * Kamelet EIP implementation.
+ */
+@ManagedResource(description = "Managed Kamelet Processor")
+public class KameletProcessor extends AsyncProcessorSupport
+        implements CamelContextAware, Navigate<Processor>, org.apache.camel.Traceable, IdAware, RouteIdAware {
+
+    private final String name;
+    private final AsyncProcessor processor;
+    private KameletProducer producer;
+    private KameletComponent component;
+    private CamelContext camelContext;
+    private String id;
+    private String routeId;
+
+    public KameletProcessor(CamelContext camelContext, String name, Processor processor) {
+        this.camelContext = camelContext;
+        this.name = name;
+        this.processor = AsyncProcessorConverterHelper.convert(processor);
+    }
+
+    @ManagedAttribute(description = "Kamelet name (templateId/routeId?options)")
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getRouteId() {
+        return routeId;
+    }
+
+    @Override
+    public void setRouteId(String routeId) {
+        this.routeId = routeId;
+    }
+
+    @Override
+    public boolean process(Exchange exchange, final AsyncCallback callback) {
+        return producer.process(exchange, callback);
+    }
+
+    @Override
+    public List<Processor> next() {
+        if (!hasNext()) {
+            return null;
+        }
+        List<Processor> answer = new ArrayList<>();
+        answer.add(processor);
+        return answer;
+    }
+
+    @Override
+    public boolean hasNext() {
+        return true;
+    }
+
+    @Override
+    public String getTraceLabel() {
+        return "kamelet";
+    }
+
+    @Override
+    protected void doBuild() throws Exception {
+        if (component == null) {
+            component = camelContext.getComponent("kamelet", KameletComponent.class);
+        }
+        if (producer == null) {
+            producer = (KameletProducer) camelContext.getEndpoint("kamelet://" + name).createAsyncProducer();
+        }
+        ServiceHelper.buildService(processor, producer);
+
+        // we use the kamelet component (producer) to call the kamelet
+        // and to receive the reply we register ourselves to the kamelet component
+        // with our child processor it should call
+        component.addKameletEip(producer.getKey(), processor);
+    }
+
+    @Override
+    protected void doInit() throws Exception {
+        ServiceHelper.initService(processor, producer);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        ServiceHelper.startService(processor, producer);
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        ServiceHelper.stopService(processor, producer);
+    }
+
+    @Override
+    protected void doShutdown() throws Exception {
+        ServiceHelper.stopAndShutdownServices(processor, producer);
+        component.removeKameletEip(producer.getKey());
+    }
+}
diff --git a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletProcessorFactory.java b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletProcessorFactory.java
new file mode 100644
index 0000000..0acadcb
--- /dev/null
+++ b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletProcessorFactory.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.kamelet;
+
+import org.apache.camel.Processor;
+import org.apache.camel.Route;
+import org.apache.camel.model.KameletDefinition;
+import org.apache.camel.support.TypedProcessorFactory;
+
+public class KameletProcessorFactory extends TypedProcessorFactory<KameletDefinition> {
+
+    public KameletProcessorFactory() {
+        super(KameletDefinition.class);
+    }
+
+    @Override
+    public Processor doCreateProcessor(Route route, KameletDefinition definition) throws Exception {
+        return new KameletReifier(route, definition).createProcessor();
+    }
+
+}
diff --git a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletProducer.java b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletProducer.java
index 726c22d..8762f85 100644
--- a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletProducer.java
+++ b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletProducer.java
@@ -17,8 +17,11 @@
 package org.apache.camel.component.kamelet;
 
 import org.apache.camel.AsyncCallback;
+import org.apache.camel.AsyncProcessor;
 import org.apache.camel.Exchange;
+import org.apache.camel.Route;
 import org.apache.camel.support.DefaultAsyncProducer;
+import org.apache.camel.support.ExchangeHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,6 +37,7 @@ final class KameletProducer extends DefaultAsyncProducer {
     private final String key;
     private final boolean block;
     private final long timeout;
+    private final boolean sink;
 
     public KameletProducer(KameletEndpoint endpoint, String key) {
         super(endpoint);
@@ -42,6 +46,7 @@ final class KameletProducer extends DefaultAsyncProducer {
         this.key = key;
         this.block = endpoint.isBlock();
         this.timeout = endpoint.getTimeout();
+        this.sink = getEndpoint().getEndpointKey().startsWith("kamelet://sink");
     }
 
     @Override
@@ -73,11 +78,38 @@ final class KameletProducer extends DefaultAsyncProducer {
                     exchange.setException(new KameletConsumerNotAvailableException(
                             "No consumers available on endpoint: " + endpoint, exchange));
                 } else {
-                    LOG.debug("message ignored, no consumers available on endpoint: {}", endpoint);
+                    LOG.debug("Exchange ignored, no consumers available on endpoint: {}", endpoint);
                 }
                 callback.done(true);
                 return true;
             } else {
+                // the kamelet producer has multiple purposes at this point
+                // it is capable of linking the kamelet component with the kamelet EIP
+                // to ensure the EIP and the component are wired together with their
+                // kamelet:source and kamelet:sink endpoints so when calling the sink
+                // then we continue processing the EIP child processors
+
+                // if no EIP is in use, then its _just_ a regular camel component
+                // with producer and consumers linked together via the component
+
+                if (sink) {
+                    // when calling a kamelet:sink then lookup any waiting processor
+                    // from the Kamelet EIP to continue routing
+                    AsyncProcessor eip = (AsyncProcessor) component.getKameletEip(key);
+                    if (eip != null) {
+                        return eip.process(exchange, callback);
+                    } else {
+                        // if the current route is from a kamelet source then we should
+                        // break out as otherwise we would end up calling ourselves again
+                        Route route = ExchangeHelper.getRoute(exchange);
+                        boolean source = route != null && route.getConsumer() instanceof KameletConsumer;
+                        if (source) {
+                            callback.done(true);
+                            return true;
+                        }
+                    }
+                }
+                // kamelet producer that calls its kamelet consumer to process the incoming exchange
                 return consumer.getAsyncProcessor().process(exchange, callback);
             }
         } catch (Exception e) {
@@ -87,4 +119,8 @@ final class KameletProducer extends DefaultAsyncProducer {
         }
     }
 
+    public String getKey() {
+        return key;
+    }
+
 }
diff --git a/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletReifier.java b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletReifier.java
new file mode 100644
index 0000000..1a7083b
--- /dev/null
+++ b/components/camel-kamelet/src/main/java/org/apache/camel/component/kamelet/KameletReifier.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.kamelet;
+
+import org.apache.camel.Processor;
+import org.apache.camel.Route;
+import org.apache.camel.model.KameletDefinition;
+import org.apache.camel.reifier.ProcessorReifier;
+
+public class KameletReifier extends ProcessorReifier<KameletDefinition> {
+
+    public KameletReifier(Route route, KameletDefinition definition) {
+        super(route, definition);
+    }
+
+    @Override
+    public Processor createProcessor() throws Exception {
+        Processor processor = createChildProcessor(true);
+        return new KameletProcessor(camelContext, parseString(definition.getName()), processor);
+    }
+}
diff --git a/components/camel-kamelet/src/main/resources/META-INF/services/org/apache/camel/model/KameletDefinition b/components/camel-kamelet/src/main/resources/META-INF/services/org/apache/camel/model/KameletDefinition
new file mode 100644
index 0000000..3cf1471
--- /dev/null
+++ b/components/camel-kamelet/src/main/resources/META-INF/services/org/apache/camel/model/KameletDefinition
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+class=org.apache.camel.component.kamelet.KameletProcessorFactory
diff --git a/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletAggregateTest.java b/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletAggregateTest.java
new file mode 100644
index 0000000..4f23055
--- /dev/null
+++ b/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletAggregateTest.java
@@ -0,0 +1,72 @@
+/*
+ * 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.component.kamelet;
+
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.AggregationStrategies;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.apache.http.annotation.Obsolete;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+@Disabled
+public class KameletAggregateTest extends CamelTestSupport {
+
+    @Test
+    public void testAggregate() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("A,B,C,D,E");
+
+        template.sendBody("direct:start", "A");
+        template.sendBody("direct:start", "B");
+        template.sendBody("direct:start", "C");
+        template.sendBody("direct:start", "D");
+        template.sendBody("direct:start", "E");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    // **********************************************
+    //
+    // test set-up
+    //
+    // **********************************************
+
+    @Obsolete
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                routeTemplate("my-aggregate")
+                        .templateParameter("count")
+                        .from("kamelet:source")
+                    .aggregate(constant(true))
+                        .completionSize("{{count}}")
+                        .aggregationStrategy(AggregationStrategies.string(","))
+                        .to("log:aggregate")
+                        .to("kamelet:sink")
+                    .end();
+
+                from("direct:start")
+                        // this is not possible, you must use kamelet EIP instead
+                        .to("kamelet:my-aggregate?count=5")
+                        .to("log:info")
+                        .to("mock:result");
+            }
+        };
+    }
+}
diff --git a/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletBasicTest.java b/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletBasicTest.java
index ea17c30..0920161 100644
--- a/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletBasicTest.java
+++ b/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletBasicTest.java
@@ -27,6 +27,7 @@ import org.junit.jupiter.api.Test;
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class KameletBasicTest extends CamelTestSupport {
+
     @Test
     public void canProduceToKamelet() {
         String body = UUID.randomUUID().toString();
diff --git a/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletBasicTest.java b/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletConsumeOnlyTest.java
similarity index 59%
copy from components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletBasicTest.java
copy to components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletConsumeOnlyTest.java
index ea17c30..065e7bb 100644
--- a/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletBasicTest.java
+++ b/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletConsumeOnlyTest.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.component.kamelet;
 
-import java.util.UUID;
-
 import org.apache.camel.Exchange;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
@@ -26,14 +24,7 @@ import org.junit.jupiter.api.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-public class KameletBasicTest extends CamelTestSupport {
-    @Test
-    public void canProduceToKamelet() {
-        String body = UUID.randomUUID().toString();
-
-        assertThat(
-                fluentTemplate.toF("kamelet:setBody/test?bodyValue=%s", body).request(String.class)).isEqualTo(body);
-    }
+public class KameletConsumeOnlyTest extends CamelTestSupport {
 
     @Test
     public void canConsumeFromKamelet() {
@@ -41,25 +32,6 @@ public class KameletBasicTest extends CamelTestSupport {
                 consumer.receiveBody("kamelet:tick", Integer.class)).isEqualTo(1);
     }
 
-    @Test
-    public void kameletCanBeCreatedWhileContextIsStarting() {
-        assertThat(
-                fluentTemplate.to("direct:templateEmbedded").request(String.class)).isEqualTo("embedded");
-    }
-
-    @Test
-    public void kameletCanBeCreatedAfterContextIsStarted() throws Exception {
-        String body = UUID.randomUUID().toString();
-
-        RouteBuilder.addRoutes(context, b -> {
-            b.from("direct:templateAfter")
-                    .toF("kamelet:setBody/test?bodyValue=%s", body);
-        });
-
-        assertThat(
-                fluentTemplate.to("direct:templateAfter").request(String.class)).isEqualTo(body);
-    }
-
     // **********************************************
     //
     // test set-up
@@ -71,18 +43,10 @@ public class KameletBasicTest extends CamelTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                routeTemplate("setBody")
-                        .templateParameter("bodyValue")
-                        .from("kamelet:source")
-                        .setBody().constant("{{bodyValue}}");
-
                 routeTemplate("tick")
                         .from("timer:{{routeId}}?repeatCount=1&delay=-1")
                         .setBody().exchangeProperty(Exchange.TIMER_COUNTER)
                         .to("kamelet:sink");
-
-                from("direct:templateEmbedded")
-                        .toF("kamelet:setBody/embedded?bodyValue=embedded");
             }
         };
     }
diff --git a/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletEipAggregateTest.java b/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletEipAggregateTest.java
new file mode 100644
index 0000000..ae1eb8f
--- /dev/null
+++ b/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletEipAggregateTest.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.component.kamelet;
+
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.AggregationStrategies;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+public class KameletEipAggregateTest extends CamelTestSupport {
+
+    @Test
+    public void testAggregate() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("A,B,C,D,E");
+
+        template.sendBody("direct:start", "A");
+        template.sendBody("direct:start", "B");
+        template.sendBody("direct:start", "C");
+        template.sendBody("direct:start", "D");
+        template.sendBody("direct:start", "E");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    // **********************************************
+    //
+    // test set-up
+    //
+    // **********************************************
+
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                routeTemplate("my-aggregate")
+                        .templateParameter("count")
+                        .from("kamelet:source")
+                        .aggregate(constant(true))
+                            .completionSize("{{count}}")
+                            .aggregationStrategy(AggregationStrategies.string(","))
+                            .to("log:aggregate")
+                            .to("kamelet:sink")
+                        .end();
+
+                from("direct:start")
+                        .kamelet("my-aggregate?count=5")
+                        .to("log:info")
+                        .to("mock:result");
+            }
+        };
+    }
+}
diff --git a/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletEipTest.java b/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletEipTest.java
new file mode 100644
index 0000000..e9c69a9
--- /dev/null
+++ b/components/camel-kamelet/src/test/java/org/apache/camel/component/kamelet/KameletEipTest.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.component.kamelet;
+
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.apache.http.annotation.Obsolete;
+import org.junit.jupiter.api.Test;
+
+public class KameletEipTest extends CamelTestSupport {
+
+    @Test
+    public void testOne() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("AA");
+
+        template.sendBody("direct:start", "A");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testTwo() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("AA", "BB");
+
+        template.sendBody("direct:start", "A");
+        template.sendBody("direct:start", "B");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    // **********************************************
+    //
+    // test set-up
+    //
+    // **********************************************
+
+    @Obsolete
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                routeTemplate("echo")
+                        .from("kamelet:source")
+                        .setBody(body().append(body()));
+
+                from("direct:start")
+                        .kamelet("echo")
+                        .to("mock:result");
+            }
+        };
+    }
+}
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
index 4d9c905..997d1ce 100644
--- a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
@@ -2525,8 +2525,7 @@ public interface ComponentsBuilderFactory {
     }
     /**
      * Kamelet (camel-kamelet)
-     * The Kamelet Component provides support for interacting with the Camel
-     * Route Template engine
+     * To call Kamelets
      * 
      * Category: core
      * Since: 3.8
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/KameletComponentBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/KameletComponentBuilderFactory.java
index 47b8acf..d62f9bb 100644
--- a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/KameletComponentBuilderFactory.java
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/KameletComponentBuilderFactory.java
@@ -23,8 +23,7 @@ import org.apache.camel.builder.component.ComponentBuilder;
 import org.apache.camel.component.kamelet.KameletComponent;
 
 /**
- * The Kamelet Component provides support for interacting with the Camel Route
- * Template engine
+ * To call Kamelets
  * 
  * Generated by camel-package-maven-plugin - do not edit this file!
  */
@@ -33,8 +32,7 @@ public interface KameletComponentBuilderFactory {
 
     /**
      * Kamelet (camel-kamelet)
-     * The Kamelet Component provides support for interacting with the Camel
-     * Route Template engine
+     * To call Kamelets
      * 
      * Category: core
      * Since: 3.8
diff --git a/core/camel-componentdsl/src/generated/resources/metadata.json b/core/camel-componentdsl/src/generated/resources/metadata.json
index 467b521..fc9706d 100644
--- a/core/camel-componentdsl/src/generated/resources/metadata.json
+++ b/core/camel-componentdsl/src/generated/resources/metadata.json
@@ -4153,7 +4153,7 @@
     "kind": "component",
     "name": "kamelet",
     "title": "Kamelet",
-    "description": "The Kamelet Component provides support for interacting with the Camel Route Template engine",
+    "description": "To call Kamelets",
     "deprecated": false,
     "firstVersion": "3.8.0",
     "label": "core",
diff --git a/core/camel-core-engine/src/main/docs/modules/eips/nav.adoc b/core/camel-core-engine/src/main/docs/modules/eips/nav.adoc
index 7471262..f4d3d11 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/nav.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/nav.adoc
@@ -37,6 +37,7 @@
  ** xref:eips:inOnly-eip.adoc[In Only]
  ** xref:eips:inOut-eip.adoc[In Out]
  ** xref:eips:intercept.adoc[Intercept]
+ ** xref:eips:kamelet-eip.adoc[Kamelet]
  ** xref:eips:loadBalance-eip.adoc[Load Balance]
  ** xref:eips:log-eip.adoc[Log]
  ** xref:eips:loop-eip.adoc[Loop]
diff --git a/core/camel-core-engine/src/main/docs/modules/eips/pages/enrich-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/enrich-eip.adoc
index 8334443..2b3b3b9 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/enrich-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/enrich-eip.adoc
@@ -12,7 +12,7 @@ image::eip/DataEnricher.gif[image]
 TIP: See the `cacheSize` option for more details on _how much cache_ to use depending on how many or few unique endpoints are used.
 
 // eip options: START
-The Enrich EIP supports 7 options which are listed below:
+The Enrich EIP supports 8 options which are listed below:
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
@@ -24,6 +24,7 @@ The Enrich EIP supports 7 options which are listed below:
 | *shareUnitOfWork* | Shares the org.apache.camel.spi.UnitOfWork with the parent and the resource exchange. Enrich will by default not share unit of work between the parent exchange and the resource exchange. This means the resource exchange has its own individual unit of work. | false | Boolean
 | *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producer when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped and discarded after use. This reduc [...]
 | *ignoreInvalidEndpoint* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint | false | Boolean
+| *allowOptimisedComponents* | Whether to allow components to optimise enricher if they are org.apache.camel.spi.SendDynamicAware . | true | Boolean
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/modules/eips/pages/kamelet-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/kamelet-eip.adoc
new file mode 100644
index 0000000..25e7f08
--- /dev/null
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/kamelet-eip.adoc
@@ -0,0 +1,60 @@
+[[kamelet-eip]]
+= Kamelet EIP
+:docTitle: Kamelet
+:description: To call Kamelets
+:since: 
+:supportLevel: Stable
+
+Kamelets (Kamel route snippets) allow users to connect to external systems via a simplified interface,
+hiding all the low level details about how those connections are implemented.
+
+The Kamelet EIP allows to call Kamelets (route templates).
+When calling a Kamelet you may just refer to the name (template id) of the Kamelet in the EIP as shown below:
+
+[source,java]
+----
+from("direct:start")
+    .kamelet("foo")
+    .to("mock:result");
+----
+
+[source,xml]
+----
+<camelContext xmlns="http://camel.apache.org/schema/spring">
+  <route>
+    <from uri="direct:start"/>
+    <kamelet name="foo"/>
+    <to uri="mock:result"/>
+  </route>
+</camelContext>
+----
+
+Camel will then, when starting:
+
+* lookup the route template with the given id (i.e. foo) from the Camel context
+* create a new route based on the route template
+
+== Options
+// eip options: START
+The Kamelet EIP supports 1 options which are listed below:
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *name* | *Required* Name of the Kamelet (templateId/routeId) to call. Options for the kamelet can be specified using uri syntax, eg mynamecount=4&type=gold. |  | String
+|===
+// eip options: END
+
+== Dependency
+
+The implementation of the Kamelet EIP is located in the `camel-kamelet` JAR, so you should add the following dependency:
+
+[source,xml]
+----
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-kamelet</artifactId>
+    <!-- use the same version as your Camel core version -->
+    <version>x.y.z</version>
+</dependency>
+----
diff --git a/core/camel-core-engine/src/main/docs/modules/eips/pages/log-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/log-eip.adoc
index 26b5073..7fde239 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/log-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/log-eip.adoc
@@ -2,7 +2,7 @@
 = Log EIP
 :docTitle: Log
 :description: Logs the defined message to the logger
-:since:
+:since: 
 :supportLevel: Stable
 
 How can I log the processing of a xref:message.adoc[Message]?
diff --git a/core/camel-core-engine/src/main/docs/modules/eips/pages/loop-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/loop-eip.adoc
index 3cdc608..8dae0ca 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/loop-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/loop-eip.adoc
@@ -16,13 +16,14 @@ Notice by default the loop uses the same exchange throughout the looping. So the
 == Options
 
 // eip options: START
-The Loop EIP supports 2 options which are listed below:
+The Loop EIP supports 3 options which are listed below:
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
 | *copy* | 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. | false | Boolean
 | *doWhile* | Enables the while loop that loops until the predicate evaluates to false or null. | false | Boolean
+| *breakOnShutdown* | If the breakOnShutdown attribute is true, then the loop will not iterate until it reaches the end when Camel is shut down. | false | Boolean
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/modules/eips/pages/resequence-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/resequence-eip.adoc
index 62789e5..953b394 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/resequence-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/resequence-eip.adoc
@@ -2,7 +2,7 @@
 = Resequence EIP
 :docTitle: Resequence
 :description: Resequences (re-order) messages based on an expression
-:since:
+:since: 
 :supportLevel: Stable
 
 The http://www.enterpriseintegrationpatterns.com/Resequencer.html[Resequencer] from the xref:components:eips:enterprise-integration-patterns.adoc[EIP patterns] allows you to reorganise messages based on some comparator. +
diff --git a/core/camel-core-engine/src/main/docs/modules/eips/pages/serviceCall-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/serviceCall-eip.adoc
index ef4fd2c..19c1a73 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/serviceCall-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/serviceCall-eip.adoc
@@ -96,7 +96,7 @@ from("direct:start")
 
 == Options
 // eip options: START
-The Service Call EIP supports 14 options which are listed below:
+The Service Call EIP supports 13 options which are listed below:
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
@@ -104,7 +104,7 @@ The Service Call EIP supports 14 options which are listed below:
 | *name* | *Required* Sets the name of the service to use |  | String
 | *uri* | The uri of the endpoint to send to. The uri can be dynamic computed using the org.apache.camel.language.simple.SimpleLanguage expression. |  | String
 | *component* | The component to use. | http | String
-| *pattern* | *Required* Sets the optional ExchangePattern used to invoke this endpoint |  | ExchangePattern
+| *pattern* | Sets the optional ExchangePattern used to invoke this endpoint |  | ExchangePattern
 | *configurationRef* | Refers to a ServiceCall configuration to use |  | String
 | *serviceDiscoveryRef* | Sets a reference to a custom ServiceDiscovery to use. |  | String
 | *serviceFilterRef* | Sets a reference to a custom ServiceFilter to use. |  | String
@@ -114,7 +114,6 @@ The Service Call EIP supports 14 options which are listed below:
 | *serviceDiscoveryConfiguration* | *Required* Configures the ServiceDiscovery using the given configuration. |  | ServiceCallServiceDiscoveryConfiguration
 | *serviceFilterConfiguration* | *Required* Configures the ServiceFilter using the given configuration. |  | ServiceCallServiceFilterConfiguration
 | *loadBalancerConfiguration* | *Required* Configures the LoadBalancer using the given configuration. |  | ServiceCallServiceLoadBalancerConfiguration
-| *expressionConfiguration* | *Required* Configures the Expression using the given configuration. |  | ServiceCallExpressionConfiguration
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/modules/eips/pages/split-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/split-eip.adoc
index 7449165..e984f95 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/split-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/split-eip.adoc
@@ -13,11 +13,12 @@ You need to specify a Splitter as `split()`. In earlier versions of Camel, you n
 
 
 // eip options: START
-The Split EIP supports 12 options which are listed below:
+The Split EIP supports 13 options which are listed below:
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
+| *delimiter* | Delimiter used in splitting messages. Can be turned off using the value false. The default value is , | , | String
 | *parallelProcessing* | 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 happens concurrently. | false | Boolean
 | *strategyRef* | 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 as the AggregationStrategy |  | String
 | *strategyMethodName* | This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy. |  | String
diff --git a/core/camel-core-engine/src/main/docs/modules/eips/pages/toD-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/toD-eip.adoc
index 54997f8..1589429 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/toD-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/toD-eip.adoc
@@ -1,7 +1,7 @@
 [[toD-eip]]
 = To D EIP
 :docTitle: To D
-:description: Sends the message to a single dynamic endpoint. For more dynamic behavior use Recipient List or Dynamic Router EIP instead.
+:description: Sends the message to a dynamic endpoint You can specify multiple languages in the uri separated by the plus sign, such as mock:language:xpath:/order/uri where mock: would be a prefix to a xpath expression. For more dynamic behavior use Recipient List or Dynamic Router EIP instead.
 :since: 
 :supportLevel: Stable
 
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 74a0127..73ac79f 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
@@ -77,6 +77,7 @@ joor
 json
 jsonApi
 jsonpath
+kamelet
 kubernetesServiceDiscovery
 language
 loadBalance
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index b/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index
index 6f74115..916509a 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index
@@ -29,6 +29,7 @@ InputTypeDefinition
 InterceptDefinition
 InterceptFromDefinition
 InterceptSendToEndpointDefinition
+KameletDefinition
 LoadBalanceDefinition
 LoadBalancerDefinition
 LogDefinition
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/kamelet.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/kamelet.json
new file mode 100644
index 0000000..6b5e06e
--- /dev/null
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/kamelet.json
@@ -0,0 +1,18 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "kamelet",
+    "title": "Kamelet",
+    "description": "To call Kamelets",
+    "deprecated": false,
+    "label": "eip,routing,kamelet",
+    "javaType": "org.apache.camel.model.KameletDefinition",
+    "input": true,
+    "output": false
+  },
+  "properties": {
+    "name": { "kind": "attribute", "displayName": "Name", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the Kamelet (templateId\/routeId) to call. Options for the kamelet can be specified using uri syntax, eg mynamecount=4&type=gold." },
+    "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/main/java/org/apache/camel/model/KameletDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/KameletDefinition.java
new file mode 100644
index 0000000..f4c1625
--- /dev/null
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/KameletDefinition.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.model;
+
+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 org.apache.camel.spi.Metadata;
+
+/**
+ * To call Kamelets
+ */
+@Metadata(label = "eip,routing,kamelet")
+@XmlRootElement(name = "kamelet")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class KameletDefinition extends OutputDefinition<KameletDefinition> {
+
+    @XmlAttribute(required = true)
+    private String name;
+
+    public KameletDefinition() {
+    }
+
+    @Override
+    public String toString() {
+        return "Kamelet[" + getOutputs() + "]";
+    }
+
+    @Override
+    public String getShortName() {
+        return "kamelet";
+    }
+
+    @Override
+    public String getLabel() {
+        return "kamelet";
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Name of the Kamelet (templateId/routeId) to call.
+     *
+     * Options for the kamelet can be specified using uri syntax, eg myname?count=4&type=gold.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java
index 8820308..0743a44 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java
@@ -1282,6 +1282,20 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type>
     }
 
     /**
+     * Creates a Kamelet EIP.
+     * <p/>
+     * This requires having camel-kamelet on the classpath.
+     *
+     * @return the builder
+     */
+    public KameletDefinition kamelet(String name) {
+        KameletDefinition answer = new KameletDefinition();
+        answer.setName(name);
+        addOutput(answer);
+        return answer;
+    }
+
+    /**
      * <a href="http://camel.apache.org/load-balancer.html">Load Balancer EIP:</a> Creates a loadbalance
      *
      * @return the builder
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/KameletReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/KameletReifier.java
new file mode 100644
index 0000000..68d4850
--- /dev/null
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/KameletReifier.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.reifier;
+
+import org.apache.camel.Processor;
+import org.apache.camel.Route;
+import org.apache.camel.model.KameletDefinition;
+import org.apache.camel.model.ProcessorDefinition;
+
+public class KameletReifier extends ProcessorReifier<KameletDefinition> {
+
+    public KameletReifier(Route route, ProcessorDefinition<?> definition) {
+        super(route, KameletDefinition.class.cast(definition));
+    }
+
+    @Override
+    public Processor createProcessor() throws Exception {
+        throw new IllegalStateException(
+                "Cannot find camel-kamelet on the classpath.");
+    }
+
+}
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
index 0c95252..047eaa8 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
@@ -51,6 +51,7 @@ import org.apache.camel.model.InOutDefinition;
 import org.apache.camel.model.InterceptDefinition;
 import org.apache.camel.model.InterceptFromDefinition;
 import org.apache.camel.model.InterceptSendToEndpointDefinition;
+import org.apache.camel.model.KameletDefinition;
 import org.apache.camel.model.LoadBalanceDefinition;
 import org.apache.camel.model.LogDefinition;
 import org.apache.camel.model.LoopDefinition;
@@ -207,6 +208,8 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> extends
             return new InterceptReifier<>(route, definition);
         } else if (definition instanceof InterceptSendToEndpointDefinition) {
             return new InterceptSendToEndpointReifier(route, definition);
+        } else if (definition instanceof KameletDefinition) {
+            return new KameletReifier(route, definition);
         } else if (definition instanceof LoadBalanceDefinition) {
             return new LoadBalanceReifier(route, definition);
         } else if (definition instanceof LogDefinition) {
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
index 2982e7d..e05b0ac 100644
--- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
@@ -8581,8 +8581,7 @@ public class StaticEndpointBuilders {
     }
     /**
      * Kamelet (camel-kamelet)
-     * The Kamelet Component provides support for interacting with the Camel
-     * Route Template engine
+     * To call Kamelets
      * 
      * Category: core
      * Since: 3.8
@@ -8606,8 +8605,7 @@ public class StaticEndpointBuilders {
     }
     /**
      * Kamelet (camel-kamelet)
-     * The Kamelet Component provides support for interacting with the Camel
-     * Route Template engine
+     * To call Kamelets
      * 
      * Category: core
      * Since: 3.8
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KameletEndpointBuilderFactory.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KameletEndpointBuilderFactory.java
index 76b652e..d07b2da 100644
--- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KameletEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KameletEndpointBuilderFactory.java
@@ -24,8 +24,7 @@ import org.apache.camel.builder.endpoint.AbstractEndpointBuilder;
 import org.apache.camel.spi.ExceptionHandler;
 
 /**
- * The Kamelet Component provides support for interacting with the Camel Route
- * Template engine
+ * To call Kamelets
  * 
  * Generated by camel build tools - do NOT edit this file!
  */
@@ -368,8 +367,7 @@ public interface KameletEndpointBuilderFactory {
     public interface KameletBuilders {
         /**
          * Kamelet (camel-kamelet)
-         * The Kamelet Component provides support for interacting with the Camel
-         * Route Template engine
+         * To call Kamelets
          * 
          * Category: core
          * Since: 3.8
@@ -392,8 +390,7 @@ public interface KameletEndpointBuilderFactory {
         }
         /**
          * Kamelet (camel-kamelet)
-         * The Kamelet Component provides support for interacting with the Camel
-         * Route Template engine
+         * To call Kamelets
          * 
          * Category: core
          * Since: 3.8
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 c8c9b03..bc4a6d6 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
@@ -540,6 +540,15 @@ public class ModelParser extends BaseParser {
             return true;
         }, outputDefinitionElementHandler(), noValueHandler());
     }
+    protected KameletDefinition doParseKameletDefinition() throws IOException, XmlPullParserException {
+        return doParse(new KameletDefinition(), (def, key, val) -> {
+            if ("name".equals(key)) {
+                def.setName(val);
+                return true;
+            }
+            return processorDefinitionAttributeHandler().accept(def, key, val);
+        }, outputDefinitionElementHandler(), noValueHandler());
+    }
     protected LoadBalanceDefinition doParseLoadBalanceDefinition() throws IOException, XmlPullParserException {
         return doParse(new LoadBalanceDefinition(),
             processorDefinitionAttributeHandler(), (def, key) -> {
@@ -2937,6 +2946,7 @@ public class ModelParser extends BaseParser {
             case "intercept": return doParseInterceptDefinition();
             case "interceptFrom": return doParseInterceptFromDefinition();
             case "interceptSendToEndpoint": return doParseInterceptSendToEndpointDefinition();
+            case "kamelet": return doParseKameletDefinition();
             case "loadBalance": return doParseLoadBalanceDefinition();
             case "log": return doParseLogDefinition();
             case "loop": return doParseLoopDefinition();
diff --git a/docs/components/modules/ROOT/pages/kamelet-component.adoc b/docs/components/modules/ROOT/pages/kamelet-component.adoc
index 184c4d0..26a21ff 100644
--- a/docs/components/modules/ROOT/pages/kamelet-component.adoc
+++ b/docs/components/modules/ROOT/pages/kamelet-component.adoc
@@ -4,7 +4,7 @@
 :page-source: components/camel-kamelet/src/main/docs/kamelet-component.adoc
 :docTitle: Kamelet
 :artifactId: camel-kamelet
-:description: The Kamelet Component provides support for interacting with the Camel Route Template engine
+:description: To call Kamelets
 :since: 3.8
 :supportLevel: Stable
 :component-header: Both producer and consumer are supported
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
index b21ffb1..643afa5 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
@@ -35,6 +35,7 @@ import org.apache.camel.model.InputTypeDefinition;
 import org.apache.camel.model.InterceptDefinition;
 import org.apache.camel.model.InterceptFromDefinition;
 import org.apache.camel.model.InterceptSendToEndpointDefinition;
+import org.apache.camel.model.KameletDefinition;
 import org.apache.camel.model.LoadBalanceDefinition;
 import org.apache.camel.model.LoadBalancerDefinition;
 import org.apache.camel.model.LogDefinition;
@@ -6856,6 +6857,54 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
     }
 
     @YamlType(
+            types = org.apache.camel.model.KameletDefinition.class,
+            order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
+            nodes = "kamelet",
+            properties = {
+                    @YamlProperty(name = "inherit-error-handler", type = "boolean"),
+                    @YamlProperty(name = "name", type = "string", required = true),
+                    @YamlProperty(name = "steps", type = "array:org.apache.camel.model.ProcessorDefinition")
+            }
+    )
+    public static class KameletDefinitionDeserializer extends YamlDeserializerBase<KameletDefinition> {
+        public KameletDefinitionDeserializer() {
+            super(KameletDefinition.class);
+        }
+
+        @Override
+        protected KameletDefinition newInstance() {
+            return new KameletDefinition();
+        }
+
+        @Override
+        protected boolean setProperty(KameletDefinition target, String propertyKey,
+                String propertyName, Node node) {
+            switch(propertyKey) {
+                case "inherit-error-handler": {
+                    String val = asText(node);
+                    target.setInheritErrorHandler(java.lang.Boolean.valueOf(val));
+                    break;
+                }
+                case "name": {
+                    String val = asText(node);
+                    target.setName(val);
+                    break;
+                }
+                case "steps": {
+                    for (ProcessorDefinition<?> definition: asFlatList(node, ProcessorDefinition.class)) {
+                        target.addOutput(definition);
+                    }
+                    break;
+                }
+                default: {
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+
+    @YamlType(
             types = org.apache.camel.model.cloud.KubernetesServiceCallServiceDiscoveryConfiguration.class,
             order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
             nodes = "kubernetes-service-discovery",
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
index 0a1741b..513a1a9 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
@@ -167,6 +167,8 @@ public final class ModelDeserializersResolver implements YamlDeserializerResolve
             case "org.apache.camel.model.dataformat.JsonDataFormat": return new ModelDeserializers.JsonDataFormatDeserializer();
             case "jsonpath": return new ModelDeserializers.JsonPathExpressionDeserializer();
             case "org.apache.camel.model.language.JsonPathExpression": return new ModelDeserializers.JsonPathExpressionDeserializer();
+            case "kamelet": return new ModelDeserializers.KameletDefinitionDeserializer();
+            case "org.apache.camel.model.KameletDefinition": return new ModelDeserializers.KameletDefinitionDeserializer();
             case "kubernetes-service-discovery": return new ModelDeserializers.KubernetesServiceCallServiceDiscoveryConfigurationDeserializer();
             case "org.apache.camel.model.cloud.KubernetesServiceCallServiceDiscoveryConfiguration": return new ModelDeserializers.KubernetesServiceCallServiceDiscoveryConfigurationDeserializer();
             case "lzf": return new ModelDeserializers.LZFDataFormatDeserializer();
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
index 31b288c..5aa0842 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
@@ -62,6 +62,9 @@
           "intercept-send-to-endpoint" : {
             "$ref" : "#/items/definitions/org.apache.camel.model.InterceptSendToEndpointDefinition"
           },
+          "kamelet" : {
+            "$ref" : "#/items/definitions/org.apache.camel.model.KameletDefinition"
+          },
           "load-balance" : {
             "$ref" : "#/items/definitions/org.apache.camel.model.LoadBalanceDefinition"
           },
@@ -1032,6 +1035,24 @@
         } ],
         "required" : [ "uri" ]
       },
+      "org.apache.camel.model.KameletDefinition" : {
+        "type" : "object",
+        "properties" : {
+          "inherit-error-handler" : {
+            "type" : "boolean"
+          },
+          "name" : {
+            "type" : "string"
+          },
+          "steps" : {
+            "type" : "array",
+            "items" : {
+              "$ref" : "#/items/definitions/org.apache.camel.model.ProcessorDefinition"
+            }
+          }
+        },
+        "required" : [ "name" ]
+      },
       "org.apache.camel.model.LoadBalanceDefinition" : {
         "type" : "object",
         "properties" : {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateReadmeMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateReadmeMojo.java
index 92ce6c2..bc3da7e 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateReadmeMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateReadmeMojo.java
@@ -118,7 +118,8 @@ public class UpdateReadmeMojo extends AbstractGeneratorMojo {
         dataformatDocDir = new File(project.getBasedir(), "src/main/docs");
         languageDocDir = new File(project.getBasedir(), "/src/main/docs");
         languageDocDir2 = new File(project.getBasedir(), "/src/main/docs/modules/languages/pages");
-        eipDocDir = new File(project.getBasedir(), "src/main/docs/modules/eips/pages");
+        File engine = findCamelDirectory(project.getBasedir(), "camel-core-engine");
+        eipDocDir = new File(engine, "/src/main/docs/modules/eips/pages");
         super.execute(project, projectHelper, buildContext);
     }
 
@@ -655,9 +656,12 @@ public class UpdateReadmeMojo extends AbstractGeneratorMojo {
                 }
             }
 
-            newLines.add(
-                    "include::{cq-version}@camel-quarkus:ROOT:partial$reference/" + kind + "s/" + name
-                         + ".adoc[opts=optional]");
+            // quarkus include pages should not be for EIP models
+            if (!"model".equals(model.getKind())) {
+                newLines.add(
+                        "include::{cq-version}@camel-quarkus:ROOT:partial$reference/" + kind + "s/" + name
+                             + ".adoc[opts=optional]");
+            }
 
             if (!manualAttributes.isEmpty()) {
                 newLines.add("//Manually maintained attributes");