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 2022/01/14 12:35:36 UTC

[camel] branch main updated: Port camel-k-runtime cloudevent and knative components to core camel project (#6749)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new d7d1e6c  Port camel-k-runtime cloudevent and knative components to core camel project (#6749)
d7d1e6c is described below

commit d7d1e6c958335e03d764376c36fc630a61e106a8
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Jan 14 13:35:02 2022 +0100

    Port camel-k-runtime cloudevent and knative components to core camel project (#6749)
    
    CAMEL-15275: Port camel-k-runtime cloudevent and knative components to core camel project.
    CAMEL-17488: camel-cloudevent - Drop old 0.x specs
---
 bom/camel-bom/pom.xml                              |   20 +
 catalog/camel-allcomponents/pom.xml                |   16 +
 .../org/apache/camel/catalog/components.properties |    1 +
 .../apache/camel/catalog/components/knative.json   |   64 +
 .../org/apache/camel/catalog/others.properties     |    1 +
 .../apache/camel/catalog/others/cloudevents.json   |   14 +
 components/camel-cloudevents/pom.xml               |   49 +
 .../cloudevents/CloudEventTypeConverterLoader.java |   52 +
 .../services/org/apache/camel/TypeConverterLoader  |    2 +
 .../services/org/apache/camel/other.properties     |    7 +
 .../src/generated/resources/cloudevents.json       |   14 +
 .../src/main/docs/cloudevents.adoc                 |   17 +
 .../camel/component/cloudevents/CloudEvent.java    |  117 ++
 .../cloudevents/CloudEventAttributes.java          |   42 +
 .../cloudevents/CloudEventTypeConverter.java       |   31 +
 .../camel/component/cloudevents/CloudEvents.java   |   83 +
 components/camel-knative/camel-knative-api/pom.xml |   86 +
 .../knative/spi/KnativeEnvironmentConfigurer.java  |   58 +
 .../knative/spi/KnativeResourceConfigurer.java     |  140 ++
 ....camel.component.knative.spi.KnativeEnvironment |    2 +
 ...che.camel.component.knative.spi.KnativeResource |    2 +
 .../services/org/apache/camel/other.properties     |    7 +
 .../src/generated/resources/knative-api.json       |   15 +
 .../src/main/docs/knative-api.adoc                 |   11 +
 .../camel/component/knative/spi/Knative.java       |   62 +
 .../knative/spi/KnativeConsumerFactory.java        |   38 +
 .../component/knative/spi/KnativeEnvironment.java  |  282 +++
 .../knative/spi/KnativeProducerFactory.java        |   36 +
 .../component/knative/spi/KnativeResource.java     |  306 ++++
 .../component/knative/spi/KnativeSupport.java      |   40 +
 .../knative/spi/KnativeTransportConfiguration.java |   44 +
 .../knative/spi/KnativeEnvironmentTest.java        |   78 +
 .../src/test/resources/log4j2.properties           |   29 +
 .../camel-knative/camel-knative-component/pom.xml  |   80 +
 .../knative/KnativeComponentConfigurer.java        |  158 ++
 .../knative/KnativeEndpointConfigurer.java         |  130 ++
 .../knative/KnativeEndpointUriFactory.java         |   78 +
 .../services/org/apache/camel/component.properties |    7 +
 .../services/org/apache/camel/component/knative    |    2 +
 .../org/apache/camel/configurer/knative-component  |    2 +
 .../org/apache/camel/configurer/knative-endpoint   |    2 +
 .../org/apache/camel/urifactory/knative-endpoint   |    2 +
 .../apache/camel/component/knative/knative.json    |   64 +
 .../src/main/docs/knative-component.adoc           |  167 ++
 .../camel/component/knative/KnativeComponent.java  |  338 ++++
 .../component/knative/KnativeConfiguration.java    |  223 +++
 .../camel/component/knative/KnativeConstants.java  |   25 +
 .../camel/component/knative/KnativeEndpoint.java   |  258 +++
 .../knative/KnativeEnvironmentSupport.java         |  107 ++
 .../camel/component/knative/KnativeProducer.java   |   78 +
 .../knative/ce/AbstractCloudEventProcessor.java    |  139 ++
 .../component/knative/ce/CloudEventProcessor.java  |   30 +
 .../component/knative/ce/CloudEventProcessors.java |  120 ++
 .../component/knative/KnativeComponentTest.java    |  107 ++
 .../component/knative/KnativeTransportNoop.java    |   54 +
 .../src/test/resources/environment.json            |   34 +
 .../src/test/resources/environment_classic.json    |   34 +
 .../src/test/resources/log4j2.properties           |   28 +
 .../camel-knative/camel-knative-http/pom.xml       |  100 ++
 .../services/org/apache/camel/other.properties     |    7 +
 .../src/generated/resources/knative-http.json      |   15 +
 .../src/main/docs/knative-http.adoc                |   11 +
 .../knative/http/KnativeHttpConsumer.java          |  353 ++++
 .../knative/http/KnativeHttpConsumerFactory.java   |   68 +
 .../http/KnativeHttpHeaderFilterStrategy.java      |   48 +
 .../knative/http/KnativeHttpProducer.java          |  205 +++
 .../knative/http/KnativeHttpProducerFactory.java   |   74 +
 .../component/knative/http/KnativeHttpSupport.java |  120 ++
 .../apache/camel/knative/transport/http-consumer   |   18 +
 .../apache/camel/knative/transport/http-producer   |   18 +
 .../component/knative/http/KnativeHttpServer.java  |  237 +++
 .../component/knative/http/KnativeHttpTest.java    | 1857 ++++++++++++++++++++
 .../knative/http/KnativeHttpTestSupport.java       |  112 ++
 .../http/assertions/HttpServerRequestAssert.java   |   64 +
 .../src/test/resources/log4j2.properties           |   28 +
 components/camel-knative/pom.xml                   |   41 +
 components/pom.xml                                 |    6 +-
 .../camel/processor/DefaultProcessorFactory.java   |    4 +
 .../org/apache/camel/main/components.properties    |    1 +
 .../modules/ROOT/examples/json/knative.json        |    1 +
 docs/components/modules/ROOT/nav.adoc              |    1 +
 .../modules/ROOT/pages/knative-component.adoc      |    1 +
 .../modules/others/examples/json/cloudevents.json  |    1 +
 .../modules/others/examples/json/knative-api.json  |    1 +
 .../modules/others/examples/json/knative-http.json |    1 +
 docs/components/modules/others/nav.adoc            |    3 +
 .../modules/others/pages/cloudevents.adoc          |    1 +
 .../modules/others/pages/knative-api.adoc          |    1 +
 .../modules/others/pages/knative-http.adoc         |    1 +
 .../component/ComponentsBuilderFactory.java        |   13 +
 .../dsl/KnativeComponentBuilderFactory.java        |  419 +++++
 .../src/generated/resources/metadata.json          |   22 +
 .../builder/endpoint/EndpointBuilderFactory.java   |    1 +
 .../camel/builder/endpoint/EndpointBuilders.java   |    1 +
 .../builder/endpoint/StaticEndpointBuilders.java   |   51 +
 .../dsl/KnativeEndpointBuilderFactory.java         | 1013 +++++++++++
 .../EndpointConsumerDeserializersResolver.java     |    1 +
 .../EndpointProducerDeserializersResolver.java     |    1 +
 parent/pom.xml                                     |   20 +
 .../apache/camel/maven/packaging/MojoHelper.java   |    2 +
 .../camel/maven/packaging/PrepareCatalogMojo.java  |    1 +
 101 files changed, 8975 insertions(+), 2 deletions(-)

diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index 5804ce7..b62899e 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -443,6 +443,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-cloudevents</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-cluster</artifactId>
         <version>${project.version}</version>
       </dependency>
@@ -1269,6 +1274,21 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-knative</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-knative-api</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-knative-http</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-kotlin-dsl</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/catalog/camel-allcomponents/pom.xml b/catalog/camel-allcomponents/pom.xml
index 48b28ad..3807f81 100644
--- a/catalog/camel-allcomponents/pom.xml
+++ b/catalog/camel-allcomponents/pom.xml
@@ -307,6 +307,10 @@
 		</dependency>
 		<dependency>
 			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-cloudevents</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-cm-sms</artifactId>
 		</dependency>
 		<dependency>
@@ -855,6 +859,18 @@
 		</dependency>
 		<dependency>
 			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-knative-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-knative-http</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-knative</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-kubernetes</artifactId>
 		</dependency>
 		<dependency>
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
index 4c9d4af..5306546 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
@@ -193,6 +193,7 @@ jsonata
 jt400
 kafka
 kamelet
+knative
 kubernetes-config-maps
 kubernetes-custom-resources
 kubernetes-deployments
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/knative.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/knative.json
new file mode 100644
index 0000000..e546a94
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/knative.json
@@ -0,0 +1,64 @@
+{
+  "component": {
+    "kind": "component",
+    "name": "knative",
+    "title": "Knative",
+    "description": "Send and receive events from Knative.",
+    "deprecated": false,
+    "firstVersion": "3.15.0",
+    "label": "cloud",
+    "javaType": "org.apache.camel.component.knative.KnativeComponent",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-knative",
+    "version": "3.15.0-SNAPSHOT",
+    "scheme": "knative",
+    "extendsScheme": "",
+    "syntax": "knative:type\/typeId",
+    "async": false,
+    "api": false,
+    "consumerOnly": false,
+    "producerOnly": false,
+    "lenientProperties": false
+  },
+  "componentProperties": {
+    "ceOverride": { "kind": "property", "displayName": "Ce Override", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.String>", "prefix": "ce.override.", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "CloudEvent headers to override" },
+    "cloudEventsSpecVersion": { "kind": "property", "displayName": "Cloud Events Spec Version", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "1.0", "1.0.1" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1.0", "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the version of the cloudevents spec." },
+    "cloudEventsType": { "kind": "property", "displayName": "Cloud Events Type", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "org.apache.camel.event", "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the event-type information of the produced events." },
+    "configuration": { "kind": "property", "displayName": "Configuration", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.knative.KnativeConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "Set the configuration." },
+    "consumerFactory": { "kind": "property", "displayName": "Consumer Factory", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.knative.spi.KnativeConsumerFactory", "deprecated": false, "autowired": false, "secret": false, "description": "The protocol consumer factory." },
+    "environment": { "kind": "property", "displayName": "Environment", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.knative.spi.KnativeEnvironment", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The environment" },
+    "environmentPath": { "kind": "property", "displayName": "Environment Path", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The path ot the environment definition" },
+    "filters": { "kind": "property", "displayName": "Filters", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.String>", "prefix": "filter.", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the filters." },
+    "producerFactory": { "kind": "property", "displayName": "Producer Factory", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.knative.spi.KnativeProducerFactory", "deprecated": false, "autowired": false, "secret": false, "description": "The protocol producer factory." },
+    "transportOptions": { "kind": "property", "displayName": "Transport Options", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "transport.", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the transport options." },
+    "typeId": { "kind": "property", "displayName": "Type Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The name of the service to lookup from the KnativeEnvironment." },
+    "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a me [...]
+    "replyWithCloudEvent": { "kind": "property", "displayName": "Reply With Cloud Event", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Transforms the reply into a cloud event that will be processed by the caller. When [...]
+    "reply": { "kind": "property", "displayName": "Reply", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "If the consumer should construct a full reply to knative request." },
+    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during star [...]
+    "apiVersion": { "kind": "property", "displayName": "Api Version", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The version of the k8s resource referenced by the endpoint." },
+    "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
+    "kind": { "kind": "property", "displayName": "Kind", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The type of the k8s resource referenced by the endpoint." },
+    "name": { "kind": "property", "displayName": "Name", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The name of the k8s resource referenced by the endpoint." }
+  },
+  "properties": {
+    "type": { "kind": "path", "displayName": "Type", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.knative.spi.Knative.Type", "enum": [ "endpoint", "channel", "event" ], "deprecated": false, "autowired": false, "secret": false, "description": "The Knative resource type" },
+    "typeId": { "kind": "path", "displayName": "Type Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The identifier of the Knative resource" },
+    "ceOverride": { "kind": "parameter", "displayName": "Ce Override", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.String>", "prefix": "ce.override.", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "CloudEvent headers to override" },
+    "cloudEventsSpecVersion": { "kind": "parameter", "displayName": "Cloud Events Spec Version", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "1.0", "1.0.1" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1.0", "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the version of the cloudevents spec." },
+    "cloudEventsType": { "kind": "parameter", "displayName": "Cloud Events Type", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "org.apache.camel.event", "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the event-type information of the produced events." },
+    "environment": { "kind": "parameter", "displayName": "Environment", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.knative.spi.KnativeEnvironment", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The environment" },
+    "filters": { "kind": "parameter", "displayName": "Filters", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.String>", "prefix": "filter.", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the filters." },
+    "transportOptions": { "kind": "parameter", "displayName": "Transport Options", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "transport.", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the transport options." },
+    "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
+    "replyWithCloudEvent": { "kind": "parameter", "displayName": "Reply With Cloud Event", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Transforms the reply into a cloud event that will be processed by the caller. Whe [...]
+    "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the con [...]
+    "exchangePattern": { "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut", "InOptionalOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
+    "reply": { "kind": "parameter", "displayName": "Reply", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "If the consumer should construct a full reply to knative request." },
+    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during sta [...]
+    "apiVersion": { "kind": "parameter", "displayName": "Api Version", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The version of the k8s resource referenced by the endpoint." },
+    "kind": { "kind": "parameter", "displayName": "Kind", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The type of the k8s resource referenced by the endpoint." },
+    "name": { "kind": "parameter", "displayName": "Name", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The name of the k8s resource referenced by the endpoint." }
+  }
+}
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
index b02dc37..bf0f708 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
@@ -4,6 +4,7 @@ caffeine-lrucache
 cdi
 cdi-jta
 cdi-main
+cloudevents
 csimple-joor
 cxf-transport
 debug
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/cloudevents.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/cloudevents.json
new file mode 100644
index 0000000..6f1b912
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/cloudevents.json
@@ -0,0 +1,14 @@
+{
+  "other": {
+    "kind": "other",
+    "name": "cloudevents",
+    "title": "Cloudevents",
+    "description": "Camel support for the CloudEvents specification",
+    "deprecated": false,
+    "firstVersion": "3.15.0",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-cloudevents",
+    "version": "3.15.0-SNAPSHOT"
+  }
+}
diff --git a/components/camel-cloudevents/pom.xml b/components/camel-cloudevents/pom.xml
new file mode 100644
index 0000000..640c5e3
--- /dev/null
+++ b/components/camel-cloudevents/pom.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>3.15.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-cloudevents</artifactId>
+    <packaging>jar</packaging>
+    <name>Camel :: CloudEvents</name>
+    <description>Camel support for the CloudEvents specification</description>
+
+    <properties>
+        <firstVersion>3.15.0</firstVersion>
+        <supportLevel>Preview</supportLevel>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-support</artifactId>
+        </dependency>
+
+    </dependencies>
+
+</project>
diff --git a/components/camel-cloudevents/src/generated/java/org/apache/camel/component/cloudevents/CloudEventTypeConverterLoader.java b/components/camel-cloudevents/src/generated/java/org/apache/camel/component/cloudevents/CloudEventTypeConverterLoader.java
new file mode 100644
index 0000000..a81b371
--- /dev/null
+++ b/components/camel-cloudevents/src/generated/java/org/apache/camel/component/cloudevents/CloudEventTypeConverterLoader.java
@@ -0,0 +1,52 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.cloudevents;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.DeferredContextBinding;
+import org.apache.camel.Exchange;
+import org.apache.camel.TypeConversionException;
+import org.apache.camel.TypeConverterLoaderException;
+import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.support.SimpleTypeConverter;
+import org.apache.camel.support.TypeConverterSupport;
+import org.apache.camel.util.DoubleMap;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+@DeferredContextBinding
+public final class CloudEventTypeConverterLoader implements TypeConverterLoader, CamelContextAware {
+
+    private CamelContext camelContext;
+
+    public CloudEventTypeConverterLoader() {
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void load(TypeConverterRegistry registry) throws TypeConverterLoaderException {
+        registerConverters(registry);
+    }
+
+    private void registerConverters(TypeConverterRegistry registry) {
+        addTypeConverter(registry, org.apache.camel.component.cloudevents.CloudEvent.class, java.lang.String.class, false,
+            (type, exchange, value) -> org.apache.camel.component.cloudevents.CloudEventTypeConverter.fromSpecVersion((java.lang.String) value));
+    }
+
+    private static void addTypeConverter(TypeConverterRegistry registry, Class<?> toType, Class<?> fromType, boolean allowNull, SimpleTypeConverter.ConversionMethod method) { 
+        registry.addTypeConverter(toType, fromType, new SimpleTypeConverter(allowNull, method));
+    }
+
+}
diff --git a/components/camel-cloudevents/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader b/components/camel-cloudevents/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
new file mode 100644
index 0000000..640e235
--- /dev/null
+++ b/components/camel-cloudevents/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+org.apache.camel.component.cloudevents.CloudEventTypeConverterLoader
diff --git a/components/camel-cloudevents/src/generated/resources/META-INF/services/org/apache/camel/other.properties b/components/camel-cloudevents/src/generated/resources/META-INF/services/org/apache/camel/other.properties
new file mode 100644
index 0000000..87d8838
--- /dev/null
+++ b/components/camel-cloudevents/src/generated/resources/META-INF/services/org/apache/camel/other.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+name=cloudevents
+groupId=org.apache.camel
+artifactId=camel-cloudevents
+version=3.15.0-SNAPSHOT
+projectName=Camel :: CloudEvents
+projectDescription=Camel support for the CloudEvents specification
diff --git a/components/camel-cloudevents/src/generated/resources/cloudevents.json b/components/camel-cloudevents/src/generated/resources/cloudevents.json
new file mode 100644
index 0000000..6f1b912
--- /dev/null
+++ b/components/camel-cloudevents/src/generated/resources/cloudevents.json
@@ -0,0 +1,14 @@
+{
+  "other": {
+    "kind": "other",
+    "name": "cloudevents",
+    "title": "Cloudevents",
+    "description": "Camel support for the CloudEvents specification",
+    "deprecated": false,
+    "firstVersion": "3.15.0",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-cloudevents",
+    "version": "3.15.0-SNAPSHOT"
+  }
+}
diff --git a/components/camel-cloudevents/src/main/docs/cloudevents.adoc b/components/camel-cloudevents/src/main/docs/cloudevents.adoc
new file mode 100644
index 0000000..edf85d7
--- /dev/null
+++ b/components/camel-cloudevents/src/main/docs/cloudevents.adoc
@@ -0,0 +1,17 @@
+= Cloudevents Component
+:doctitle: Cloudevents
+:shortname: cloudevents
+:artifactid: camel-cloudevents
+:description: Camel support for the CloudEvents specification
+:since: 3.15
+:supportlevel: Preview
+//Manually maintained attributes
+:camel-spring-boot-name: cloudevents
+
+*Since Camel {since}*
+
+Camel support for the CloudEvents specification.
+
+At the moment the camel-cloudevents component is very limited in functionality
+with mapping between Camel Message headers and the specification.
+
diff --git a/components/camel-cloudevents/src/main/java/org/apache/camel/component/cloudevents/CloudEvent.java b/components/camel-cloudevents/src/main/java/org/apache/camel/component/cloudevents/CloudEvent.java
new file mode 100644
index 0000000..0193549
--- /dev/null
+++ b/components/camel-cloudevents/src/main/java/org/apache/camel/component/cloudevents/CloudEvent.java
@@ -0,0 +1,117 @@
+/*
+ * 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.cloudevents;
+
+import java.util.Collection;
+import java.util.Objects;
+import java.util.Optional;
+
+import org.apache.camel.Exchange;
+
+public interface CloudEvent {
+    String CAMEL_CLOUD_EVENT_ID = "CamelCloudEventID";
+    String CAMEL_CLOUD_EVENT_SOURCE = "CamelCloudEventSource";
+    String CAMEL_CLOUD_EVENT_VERSION = "CamelCloudEventVersion";
+    String CAMEL_CLOUD_EVENT_TYPE = "CamelCloudEventType";
+    String CAMEL_CLOUD_EVENT_TYPE_VERSION = "CamelCloudEventTypeVersion";
+    String CAMEL_CLOUD_EVENT_DATA_CONTENT_TYPE = "CamelCloudEventDataContentType";
+    String CAMEL_CLOUD_EVENT_DATA_CONTENT_ENCODING = "CamelCloudEventDataContentEncoding";
+    String CAMEL_CLOUD_EVENT_SCHEMA_URL = "CamelCloudEventSchemaURL";
+    String CAMEL_CLOUD_EVENT_SUBJECT = "CamelCloudEventSubject";
+    String CAMEL_CLOUD_EVENT_TIME = "CamelCloudEventTime";
+    String CAMEL_CLOUD_EVENT_EXTENSIONS = "CamelCloudEventExtensions";
+    String CAMEL_CLOUD_EVENT_CONTENT_TYPE = Exchange.CONTENT_TYPE;
+
+    /**
+     * The CloudEvent spec version.
+     */
+    String version();
+
+    /**
+     * List of supported attributes.
+     */
+    Collection<Attribute> attributes();
+
+    /**
+     * Find attribute by id.
+     */
+    default Optional<Attribute> attribute(String id) {
+        return attributes().stream()
+                .filter(a -> Objects.equals(id, a.id()))
+                .findFirst();
+    }
+
+    /**
+     * Mandatory find attribute by id.
+     */
+    default Attribute mandatoryAttribute(String id) {
+        return attributes().stream()
+                .filter(a -> Objects.equals(id, a.id()))
+                .findFirst()
+                .orElseThrow(() -> new IllegalArgumentException("Unable to find attribute with id: " + id));
+    }
+
+    /**
+     * Mandatory find http attribute by id.
+     */
+    default String httpAttribute(String id) {
+        return mandatoryAttribute(id).http();
+    }
+
+    /**
+     * Mandatory find json attribute by id.
+     */
+    default String jsonAttribute(String id) {
+        return mandatoryAttribute(id).json();
+    }
+
+    interface Attribute {
+        /**
+         * The ID of the attributes, can be used to look it up.
+         */
+        String id();
+
+        /**
+         * The name of the http header.
+         */
+        String http();
+
+        /**
+         * The name of the json field.
+         */
+        String json();
+
+        static Attribute simple(String id, String http, String json) {
+            return new Attribute() {
+                @Override
+                public String id() {
+                    return id;
+                }
+
+                @Override
+                public String http() {
+                    return http;
+                }
+
+                @Override
+                public String json() {
+                    return json;
+                }
+            };
+        }
+    }
+}
diff --git a/components/camel-cloudevents/src/main/java/org/apache/camel/component/cloudevents/CloudEventAttributes.java b/components/camel-cloudevents/src/main/java/org/apache/camel/component/cloudevents/CloudEventAttributes.java
new file mode 100644
index 0000000..bb05e07
--- /dev/null
+++ b/components/camel-cloudevents/src/main/java/org/apache/camel/component/cloudevents/CloudEventAttributes.java
@@ -0,0 +1,42 @@
+/*
+ * 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.cloudevents;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+/**
+ * Attributes for cloud even specs
+ */
+final class CloudEventAttributes {
+
+    // attributes for all 1.0.x specs
+    public static final Collection<CloudEvent.Attribute> V1_0_ATTRIBUTES = Arrays.asList(
+            CloudEvent.Attribute.simple(CloudEvent.CAMEL_CLOUD_EVENT_ID, "ce-id", "id"),
+            CloudEvent.Attribute.simple(CloudEvent.CAMEL_CLOUD_EVENT_SOURCE, "ce-source", "source"),
+            CloudEvent.Attribute.simple(CloudEvent.CAMEL_CLOUD_EVENT_VERSION, "ce-specversion", "specversion"),
+            CloudEvent.Attribute.simple(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, "ce-type", "type"),
+            CloudEvent.Attribute.simple(CloudEvent.CAMEL_CLOUD_EVENT_DATA_CONTENT_TYPE, "ce-datacontenttype",
+                    "datacontenttype"),
+            CloudEvent.Attribute.simple(CloudEvent.CAMEL_CLOUD_EVENT_SCHEMA_URL, "ce-dataschema", "dataschema"),
+            CloudEvent.Attribute.simple(CloudEvent.CAMEL_CLOUD_EVENT_SUBJECT, "ce-subject", "subject"),
+            CloudEvent.Attribute.simple(CloudEvent.CAMEL_CLOUD_EVENT_TIME, "ce-time", "time"));
+
+    private CloudEventAttributes() {
+    }
+
+}
diff --git a/components/camel-cloudevents/src/main/java/org/apache/camel/component/cloudevents/CloudEventTypeConverter.java b/components/camel-cloudevents/src/main/java/org/apache/camel/component/cloudevents/CloudEventTypeConverter.java
new file mode 100644
index 0000000..1898744
--- /dev/null
+++ b/components/camel-cloudevents/src/main/java/org/apache/camel/component/cloudevents/CloudEventTypeConverter.java
@@ -0,0 +1,31 @@
+/*
+ * 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.cloudevents;
+
+import org.apache.camel.Converter;
+
+@Converter(generateLoader = true)
+public final class CloudEventTypeConverter {
+
+    private CloudEventTypeConverter() {
+    }
+
+    @Converter
+    public static CloudEvent fromSpecVersion(String version) {
+        return CloudEvents.fromSpecVersion(version);
+    }
+}
diff --git a/components/camel-cloudevents/src/main/java/org/apache/camel/component/cloudevents/CloudEvents.java b/components/camel-cloudevents/src/main/java/org/apache/camel/component/cloudevents/CloudEvents.java
new file mode 100644
index 0000000..839167d
--- /dev/null
+++ b/components/camel-cloudevents/src/main/java/org/apache/camel/component/cloudevents/CloudEvents.java
@@ -0,0 +1,83 @@
+/*
+ * 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.cloudevents;
+
+import java.util.Collection;
+import java.util.Objects;
+
+public enum CloudEvents implements CloudEvent {
+
+    //
+    // V1.0 - https://github.com/cloudevents/spec/blob/v1.0/spec.md
+    //
+    v1_0(new CloudEventImpl(
+            "1.0",
+            CloudEventAttributes.V1_0_ATTRIBUTES)),
+
+    //
+    // V1.0.1 - https://github.com/cloudevents/spec/blob/v1.0.1/spec.md
+    //
+    v1_0_1(new CloudEventImpl(
+            "1.0.1",
+            CloudEventAttributes.V1_0_ATTRIBUTES));
+
+    private final CloudEvent instance;
+
+    CloudEvents(CloudEvent instance) {
+        this.instance = instance;
+    }
+
+    @Override
+    public String version() {
+        return instance.version();
+    }
+
+    @Override
+    public Collection<Attribute> attributes() {
+        return instance.attributes();
+    }
+
+    public static CloudEvent fromSpecVersion(String version) {
+        for (CloudEvent event : CloudEvents.values()) {
+            if (Objects.equals(event.version(), version)) {
+                return event;
+            }
+        }
+
+        throw new IllegalArgumentException("Unable to find an implementation fo CloudEvents spec: " + version);
+    }
+
+    private static class CloudEventImpl implements CloudEvent {
+        private final String version;
+        private final Collection<Attribute> attributes;
+
+        public CloudEventImpl(String version, Collection<Attribute> attributes) {
+            this.version = version;
+            this.attributes = attributes;
+        }
+
+        @Override
+        public String version() {
+            return version;
+        }
+
+        @Override
+        public Collection<Attribute> attributes() {
+            return attributes;
+        }
+    }
+}
diff --git a/components/camel-knative/camel-knative-api/pom.xml b/components/camel-knative/camel-knative-api/pom.xml
new file mode 100644
index 0000000..ed3e6fe
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/pom.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-knative-parent</artifactId>
+        <version>3.15.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-knative-api</artifactId>
+    <packaging>jar</packaging>
+    <name>Camel :: Knative API</name>
+    <description>Camel Knative API</description>
+
+    <properties>
+        <firstVersion>3.15.0</firstVersion>
+        <supportLevel>Preview</supportLevel>
+        <label>cloud</label>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-support</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-cloudevents</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>${jackson2-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jdk8</artifactId>
+            <version>${jackson2-version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+</project>
diff --git a/components/camel-knative/camel-knative-api/src/generated/java/org/apache/camel/component/knative/spi/KnativeEnvironmentConfigurer.java b/components/camel-knative/camel-knative-api/src/generated/java/org/apache/camel/component/knative/spi/KnativeEnvironmentConfigurer.java
new file mode 100644
index 0000000..d9098cd
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/generated/java/org/apache/camel/component/knative/spi/KnativeEnvironmentConfigurer.java
@@ -0,0 +1,58 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.knative.spi;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.component.knative.spi.KnativeEnvironment;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class KnativeEnvironmentConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        org.apache.camel.component.knative.spi.KnativeEnvironment target = (org.apache.camel.component.knative.spi.KnativeEnvironment) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "resources":
+        case "Resources": target.setResources(property(camelContext, java.util.List.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "resources":
+        case "Resources": return java.util.List.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        org.apache.camel.component.knative.spi.KnativeEnvironment target = (org.apache.camel.component.knative.spi.KnativeEnvironment) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "resources":
+        case "Resources": return target.getResources();
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "resources":
+        case "Resources": return org.apache.camel.component.knative.spi.KnativeResource.class;
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-knative/camel-knative-api/src/generated/java/org/apache/camel/component/knative/spi/KnativeResourceConfigurer.java b/components/camel-knative/camel-knative-api/src/generated/java/org/apache/camel/component/knative/spi/KnativeResourceConfigurer.java
new file mode 100644
index 0000000..2f66314
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/generated/java/org/apache/camel/component/knative/spi/KnativeResourceConfigurer.java
@@ -0,0 +1,140 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.knative.spi;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.component.knative.spi.KnativeResource;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class KnativeResourceConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        org.apache.camel.component.knative.spi.KnativeResource target = (org.apache.camel.component.knative.spi.KnativeResource) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "ceoverrides":
+        case "CeOverrides": target.setCeOverrides(property(camelContext, java.util.Map.class, value)); return true;
+        case "cloudeventtype":
+        case "CloudEventType": target.setCloudEventType(property(camelContext, java.lang.String.class, value)); return true;
+        case "contenttype":
+        case "ContentType": target.setContentType(property(camelContext, java.lang.String.class, value)); return true;
+        case "endpointkind":
+        case "EndpointKind": target.setEndpointKind(property(camelContext, org.apache.camel.component.knative.spi.Knative.EndpointKind.class, value)); return true;
+        case "filters":
+        case "Filters": target.setFilters(property(camelContext, java.util.Map.class, value)); return true;
+        case "metadata":
+        case "Metadata": target.setMetadata(property(camelContext, java.util.Map.class, value)); return true;
+        case "name":
+        case "Name": target.setName(property(camelContext, java.lang.String.class, value)); return true;
+        case "objectapiversion":
+        case "ObjectApiVersion": target.setObjectApiVersion(property(camelContext, java.lang.String.class, value)); return true;
+        case "objectkind":
+        case "ObjectKind": target.setObjectKind(property(camelContext, java.lang.String.class, value)); return true;
+        case "objectname":
+        case "ObjectName": target.setObjectName(property(camelContext, java.lang.String.class, value)); return true;
+        case "path":
+        case "Path": target.setPath(property(camelContext, java.lang.String.class, value)); return true;
+        case "reply":
+        case "Reply": target.setReply(property(camelContext, java.lang.Boolean.class, value)); return true;
+        case "type":
+        case "Type": target.setType(property(camelContext, org.apache.camel.component.knative.spi.Knative.Type.class, value)); return true;
+        case "url":
+        case "Url": target.setUrl(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "ceoverrides":
+        case "CeOverrides": return java.util.Map.class;
+        case "cloudeventtype":
+        case "CloudEventType": return java.lang.String.class;
+        case "contenttype":
+        case "ContentType": return java.lang.String.class;
+        case "endpointkind":
+        case "EndpointKind": return org.apache.camel.component.knative.spi.Knative.EndpointKind.class;
+        case "filters":
+        case "Filters": return java.util.Map.class;
+        case "metadata":
+        case "Metadata": return java.util.Map.class;
+        case "name":
+        case "Name": return java.lang.String.class;
+        case "objectapiversion":
+        case "ObjectApiVersion": return java.lang.String.class;
+        case "objectkind":
+        case "ObjectKind": return java.lang.String.class;
+        case "objectname":
+        case "ObjectName": return java.lang.String.class;
+        case "path":
+        case "Path": return java.lang.String.class;
+        case "reply":
+        case "Reply": return java.lang.Boolean.class;
+        case "type":
+        case "Type": return org.apache.camel.component.knative.spi.Knative.Type.class;
+        case "url":
+        case "Url": return java.lang.String.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        org.apache.camel.component.knative.spi.KnativeResource target = (org.apache.camel.component.knative.spi.KnativeResource) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "ceoverrides":
+        case "CeOverrides": return target.getCeOverrides();
+        case "cloudeventtype":
+        case "CloudEventType": return target.getCloudEventType();
+        case "contenttype":
+        case "ContentType": return target.getContentType();
+        case "endpointkind":
+        case "EndpointKind": return target.getEndpointKind();
+        case "filters":
+        case "Filters": return target.getFilters();
+        case "metadata":
+        case "Metadata": return target.getMetadata();
+        case "name":
+        case "Name": return target.getName();
+        case "objectapiversion":
+        case "ObjectApiVersion": return target.getObjectApiVersion();
+        case "objectkind":
+        case "ObjectKind": return target.getObjectKind();
+        case "objectname":
+        case "ObjectName": return target.getObjectName();
+        case "path":
+        case "Path": return target.getPath();
+        case "reply":
+        case "Reply": return target.getReply();
+        case "type":
+        case "Type": return target.getType();
+        case "url":
+        case "Url": return target.getUrl();
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "ceoverrides":
+        case "CeOverrides": return java.lang.String.class;
+        case "filters":
+        case "Filters": return java.lang.String.class;
+        case "metadata":
+        case "Metadata": return java.lang.String.class;
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-knative/camel-knative-api/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.knative.spi.KnativeEnvironment b/components/camel-knative/camel-knative-api/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.knative.spi.KnativeEnvironment
new file mode 100644
index 0000000..2e65664
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.knative.spi.KnativeEnvironment
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.knative.spi.KnativeEnvironmentConfigurer
diff --git a/components/camel-knative/camel-knative-api/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.knative.spi.KnativeResource b/components/camel-knative/camel-knative-api/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.knative.spi.KnativeResource
new file mode 100644
index 0000000..dc13513
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.knative.spi.KnativeResource
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.knative.spi.KnativeResourceConfigurer
diff --git a/components/camel-knative/camel-knative-api/src/generated/resources/META-INF/services/org/apache/camel/other.properties b/components/camel-knative/camel-knative-api/src/generated/resources/META-INF/services/org/apache/camel/other.properties
new file mode 100644
index 0000000..ebebfa2
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/generated/resources/META-INF/services/org/apache/camel/other.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+name=knative-api
+groupId=org.apache.camel
+artifactId=camel-knative-api
+version=3.15.0-SNAPSHOT
+projectName=Camel :: Knative API
+projectDescription=Camel Knative API
diff --git a/components/camel-knative/camel-knative-api/src/generated/resources/knative-api.json b/components/camel-knative/camel-knative-api/src/generated/resources/knative-api.json
new file mode 100644
index 0000000..ef5a7a5
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/generated/resources/knative-api.json
@@ -0,0 +1,15 @@
+{
+  "other": {
+    "kind": "other",
+    "name": "knative-api",
+    "title": "Knative Api",
+    "description": "Camel Knative API",
+    "deprecated": false,
+    "firstVersion": "3.15.0",
+    "label": "cloud",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-knative-api",
+    "version": "3.15.0-SNAPSHOT"
+  }
+}
diff --git a/components/camel-knative/camel-knative-api/src/main/docs/knative-api.adoc b/components/camel-knative/camel-knative-api/src/main/docs/knative-api.adoc
new file mode 100644
index 0000000..63cdbec
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/main/docs/knative-api.adoc
@@ -0,0 +1,11 @@
+= Knative Api Component
+:doctitle: Knative Api
+:shortname: knative-api
+:artifactid: camel-knative-api
+:description: Camel Knative API
+:since: 3.15
+:supportlevel: Preview
+
+*Since Camel {since}*
+
+API for camel-knative component.
diff --git a/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/Knative.java b/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/Knative.java
new file mode 100644
index 0000000..57e557d
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/Knative.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.knative.spi;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
+
+public final class Knative {
+    public static final ObjectMapper MAPPER = new ObjectMapper().registerModule(new Jdk8Module());
+
+    public static final String MIME_STRUCTURED_CONTENT_MODE = "application/cloudevents+json";
+    public static final String MIME_BATCH_CONTENT_MODE = "application/cloudevents-batch+json";
+
+    public static final String KNATIVE_TRANSPORT_RESOURCE_PATH = "META-INF/services/org/apache/camel/knative/transport/";
+
+    public static final String KNATIVE_FILTER_PREFIX = "filter.";
+    public static final String KNATIVE_CE_OVERRIDE_PREFIX = "ce.override.";
+    public static final String KNATIVE_TYPE = "knative.type";
+    public static final String KNATIVE_CLOUD_EVENT_TYPE = "knative.event.type";
+    public static final String KNATIVE_REPLY = "knative.reply";
+    public static final String CONTENT_TYPE = "content.type";
+    public static final String CAMEL_ENDPOINT_KIND = "camel.endpoint.kind";
+
+    public static final String SERVICE_META_PATH = "service.path";
+    public static final String SERVICE_META_URL = "service.url";
+
+    public static final String KNATIVE_OBJECT_API_VERSION = "knative.apiVersion";
+    public static final String KNATIVE_OBJECT_KIND = "knative.kind";
+    public static final String KNATIVE_OBJECT_NAME = "knative.name";
+
+    private Knative() {
+    }
+
+    public enum EndpointKind {
+        source,
+        sink,
+    }
+
+    public enum Type {
+        endpoint,
+        channel,
+        event
+    }
+
+    public enum Protocol {
+        http,
+    }
+}
diff --git a/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeConsumerFactory.java b/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeConsumerFactory.java
new file mode 100644
index 0000000..f4dbfe1
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeConsumerFactory.java
@@ -0,0 +1,38 @@
+/*
+ * 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.knative.spi;
+
+import org.apache.camel.Consumer;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Processor;
+import org.apache.camel.Service;
+
+public interface KnativeConsumerFactory extends Service {
+    /**
+     * Create a camel {@link Consumer} in place of the original endpoint for a specific protocol.
+     *
+     * @param  endpoint      the endpoint for which the consumer should be created.
+     * @param  configuration the general transport configuration
+     * @param  service       the service definition containing information about how make the route reachable from
+     *                       knative.
+     * @return
+     */
+    Consumer createConsumer(
+            Endpoint endpoint,
+            KnativeTransportConfiguration configuration,
+            KnativeResource service, Processor processor);
+}
diff --git a/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeEnvironment.java b/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeEnvironment.java
new file mode 100644
index 0000000..edb3015
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeEnvironment.java
@@ -0,0 +1,282 @@
+/*
+ * 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.knative.spi;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Stream;
+
+import com.fasterxml.jackson.annotation.JsonAlias;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.spi.Configurer;
+import org.apache.camel.support.PropertyBindingSupport;
+import org.apache.camel.support.ResourceHelper;
+
+/*
+ * Assuming it is loaded from a json for now
+ */
+@Configurer
+public class KnativeEnvironment {
+    private final List<KnativeResource> resources;
+
+    public KnativeEnvironment() {
+        this.resources = new ArrayList<>();
+    }
+
+    public KnativeEnvironment(Collection<KnativeResource> resources) {
+        this.resources = new ArrayList<>(resources);
+    }
+
+    @JsonAlias("services")
+    @JsonProperty(value = "resources", required = true)
+    public List<KnativeResource> getResources() {
+        return resources;
+    }
+
+    @JsonAlias("services")
+    @JsonProperty(value = "resources", required = true)
+    public void setResources(List<KnativeResource> resources) {
+        this.resources.clear();
+        this.resources.addAll(resources);
+    }
+
+    public Stream<KnativeResource> stream() {
+        return resources.stream();
+    }
+
+    public Stream<KnativeResource> lookup(Knative.Type type, String name) {
+        return stream().filter(definition -> definition.matches(type, name));
+    }
+
+    // ************************
+    //
+    // Helpers
+    //
+    // ************************
+
+    /**
+     * Construct an instance o a {@link KnativeEnvironment} from a json serialized string.
+     * 
+     * <pre>
+     * {@code
+     * {
+     *     "resources": [
+     *         {
+     *              "type": "channel|endpoint|event",
+     *              "name": "",
+     *              "url": "",
+     *              "path": "",
+     *              "eventType": "",
+     *              "objectKind": "",
+     *              "objectApiVersion": "",
+     *              "endpointKind": "source|sink",
+     *              "filters": {
+     *                  "header": "value"
+     *              },
+     *              "ceOverrides": {
+     *                  "ce-type": "something"
+     *              }
+     *         },
+     *     ]
+     * }
+     * }
+     * </pre>
+     *
+     * @param  configuration the serialized representation of the Knative environment
+     * @return               an instance of {@link KnativeEnvironment}
+     * @throws IOException   if an error occur while parsing the file
+     */
+    public static KnativeEnvironment mandatoryLoadFromSerializedString(String configuration) throws IOException {
+        try (Reader reader = new StringReader(configuration)) {
+            return Knative.MAPPER.readValue(reader, KnativeEnvironment.class);
+        }
+    }
+
+    /**
+     * Construct an instance o a {@link KnativeEnvironment} from a properties.
+     * 
+     * <pre>
+     * {@code
+     * resources[0].name = ...
+     * resources[0].type = channel|endpoint|event
+     * resources[0].endpointKind = source|sink
+     * resources[0].url = ...
+     * }
+     * </pre>
+     *
+     * @param  context     the {@link CamelContext}
+     * @param  properties  the properties from which to construct the {@link KnativeEnvironment}
+     * @return             an instance of {@link KnativeEnvironment}
+     * @throws IOException if an error occur while parsing the file
+     */
+    public static KnativeEnvironment mandatoryLoadFromProperties(CamelContext context, Map<String, Object> properties) {
+        final ExtendedCamelContext econtext = context.adapt(ExtendedCamelContext.class);
+        final KnativeEnvironment environment = new KnativeEnvironment();
+
+        PropertyBindingSupport.build()
+                .withIgnoreCase(true)
+                .withCamelContext(context)
+                .withTarget(environment)
+                .withProperties(properties)
+                .withRemoveParameters(true)
+                .withConfigurer(
+                        econtext.getConfigurerResolver().resolvePropertyConfigurer(KnativeEnvironment.class.getName(), context))
+                .withMandatory(true)
+                .bind();
+
+        return environment;
+    }
+
+    /**
+     * Construct an instance o a {@link KnativeEnvironment} from a json file.
+     * 
+     * <pre>
+     * {@code
+     * {
+     *     "resources": [
+     *         {
+     *              "type": "channel|endpoint|event",
+     *              "name": "",
+     *              "url": "",
+     *              "path": "",
+     *              "eventType": "",
+     *              "objectKind": "",
+     *              "objectApiVersion": "",
+     *              "endpointKind": "source|sink",
+     *              "filters": {
+     *                  "header": "value"
+     *              },
+     *              "ceOverrides": {
+     *                  "ce-type": "something"
+     *              }
+     *         },
+     *     ]
+     * }
+     * }
+     * </pre>
+     *
+     * @param  context     the {@link CamelContext}
+     * @param  path        URI of the resource
+     * @return             an instance of {@link KnativeEnvironment}
+     * @throws IOException if an error occur while parsing the file
+     */
+    public static KnativeEnvironment mandatoryLoadFromResource(CamelContext context, String path) throws IOException {
+        try (InputStream is = ResourceHelper.resolveMandatoryResourceAsInputStream(context, path)) {
+            return Knative.MAPPER.readValue(is, KnativeEnvironment.class);
+        }
+    }
+
+    public static KnativeEnvironment on(KnativeResource... definitions) {
+        KnativeEnvironment env = new KnativeEnvironment();
+        for (KnativeResource definition : definitions) {
+            env.getResources().add(definition);
+        }
+
+        return env;
+    }
+
+    public static KnativeServiceBuilder serviceBuilder(Knative.Type type, String name) {
+        return new KnativeServiceBuilder(type, name);
+    }
+
+    // ************************
+    //
+    // Types
+    //
+    // ************************
+
+    public static final class KnativeServiceBuilder {
+        private final Knative.Type type;
+        private final String name;
+        private Knative.EndpointKind endpointKind;
+        private String url;
+        private Map<String, String> metadata;
+
+        public KnativeServiceBuilder(Knative.Type type, String name) {
+            this.type = type;
+            this.name = name;
+        }
+
+        public KnativeServiceBuilder withUrl(String url) {
+            this.url = url;
+            return this;
+        }
+
+        public KnativeServiceBuilder withUrlf(String format, Object... args) {
+            return withUrl(String.format(format, args));
+        }
+
+        public KnativeServiceBuilder withEndpointKind(Knative.EndpointKind endpointKind) {
+            this.endpointKind = endpointKind;
+            return this;
+        }
+
+        public KnativeServiceBuilder withMeta(Map<String, String> metadata) {
+            if (metadata == null) {
+                return this;
+            }
+            if (this.metadata == null) {
+                this.metadata = new HashMap<>();
+            }
+            this.metadata.putAll(metadata);
+            return this;
+        }
+
+        public KnativeServiceBuilder withMeta(String key, String value) {
+            if (key == null || value == null) {
+                return this;
+            }
+            if (this.metadata == null) {
+                this.metadata = new HashMap<>();
+            }
+            this.metadata.put(key, value);
+            return this;
+        }
+
+        public KnativeServiceBuilder withMeta(String key, Enum<?> e) {
+            if (key == null || e == null) {
+                return this;
+            }
+            if (this.metadata == null) {
+                this.metadata = new HashMap<>();
+            }
+            this.metadata.put(key, e.name());
+            return this;
+        }
+
+        public KnativeResource build() {
+            KnativeResource answer = new KnativeResource();
+            answer.setType(type);
+            answer.setEndpointKind(endpointKind);
+            answer.setName(name);
+            answer.setUrl(url);
+            answer.setMetadata(metadata);
+
+            return answer;
+        }
+    }
+
+}
diff --git a/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeProducerFactory.java b/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeProducerFactory.java
new file mode 100644
index 0000000..5a00c03
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeProducerFactory.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.component.knative.spi;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Producer;
+import org.apache.camel.Service;
+
+public interface KnativeProducerFactory extends Service {
+    /**
+     * Create a camel {@link Producer} in place of the original endpoint for a specific protocol.
+     *
+     * @param  endpoint      the endpoint for which the producer should be created
+     * @param  configuration the general transport configuration
+     * @param  service       the service definition containing information about how make reach the target service.
+     * @return
+     */
+    Producer createProducer(
+            Endpoint endpoint,
+            KnativeTransportConfiguration configuration,
+            KnativeResource service);
+}
diff --git a/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeResource.java b/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeResource.java
new file mode 100644
index 0000000..f15c2e5
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeResource.java
@@ -0,0 +1,306 @@
+/*
+ * 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.knative.spi;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.camel.spi.Configurer;
+
+@Configurer
+public final class KnativeResource {
+    private String name;
+    private String url;
+    private Knative.Type type;
+    private Knative.EndpointKind endpointKind;
+    private Boolean reply;
+    private String contentType;
+    private String cloudEventType;
+    private String path;
+    private String objectApiVersion;
+    private String objectKind;
+    private String objectName;
+    private Map<String, String> metadata;
+    private Map<String, String> ceOverrides;
+    private Map<String, String> filters;
+
+    public String getName() {
+        return this.name;
+    }
+
+    @JsonProperty(required = true)
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @JsonProperty(required = true)
+    public Knative.Type getType() {
+        Knative.Type answer = this.type;
+        if (answer == null) {
+            String stringValue = getMetadata(Knative.KNATIVE_TYPE);
+            if (stringValue != null) {
+                answer = Knative.Type.valueOf(stringValue);
+            }
+        }
+
+        return answer;
+    }
+
+    public void setType(Knative.Type type) {
+        this.type = type;
+    }
+
+    public Knative.EndpointKind getEndpointKind() {
+        Knative.EndpointKind answer = this.endpointKind;
+        if (answer == null) {
+            String stringValue = getMetadata(Knative.CAMEL_ENDPOINT_KIND);
+            if (stringValue != null) {
+                answer = Knative.EndpointKind.valueOf(stringValue);
+            }
+        }
+
+        return answer;
+    }
+
+    public void setEndpointKind(Knative.EndpointKind endpointKind) {
+        this.endpointKind = endpointKind;
+    }
+
+    public String getUrl() {
+        return this.url != null ? this.url : getMetadata(Knative.SERVICE_META_URL);
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public Map<String, String> getMetadata() {
+        if (this.metadata == null) {
+            this.metadata = new HashMap<>();
+        }
+
+        return this.metadata;
+    }
+
+    public void setMetadata(Map<String, String> metadata) {
+        this.metadata = metadata;
+    }
+
+    @JsonIgnore
+    public String getMetadata(String key) {
+        return this.metadata != null ? metadata.get(key) : null;
+    }
+
+    public void setMetadata(String key, String value) {
+        if (this.metadata == null) {
+            this.metadata = new HashMap<>();
+        }
+
+        this.metadata.put(key, value);
+    }
+
+    @JsonIgnore
+    public Optional<String> getOptionalMetadata(String key) {
+        return Optional.ofNullable(getMetadata(key));
+    }
+
+    public String getCloudEventType() {
+        return this.cloudEventType != null
+                ? this.cloudEventType
+                : getMetadata(Knative.KNATIVE_CLOUD_EVENT_TYPE);
+    }
+
+    public void setCloudEventType(String cloudEventType) {
+        this.cloudEventType = cloudEventType;
+    }
+
+    public String getPath() {
+        return this.path != null
+                ? this.path
+                : getMetadata(Knative.SERVICE_META_PATH);
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public String getObjectApiVersion() {
+        return this.objectApiVersion != null
+                ? this.objectApiVersion
+                : getMetadata(Knative.KNATIVE_OBJECT_API_VERSION);
+    }
+
+    public void setObjectApiVersion(String objectApiVersion) {
+        this.objectApiVersion = objectApiVersion;
+    }
+
+    public String getObjectKind() {
+        return this.objectKind != null
+                ? this.objectKind
+                : getMetadata(Knative.KNATIVE_OBJECT_KIND);
+    }
+
+    public void setObjectKind(String objectKind) {
+        this.objectKind = objectKind;
+    }
+
+    public String getObjectName() {
+        return this.objectName != null
+                ? this.objectName
+                : getMetadata(Knative.KNATIVE_OBJECT_NAME);
+    }
+
+    public void setObjectName(String objectName) {
+        this.objectName = objectName;
+    }
+
+    public Map<String, String> getCeOverrides() {
+        Map<String, String> answer = new HashMap<>();
+        if (this.ceOverrides != null) {
+            answer.putAll(this.ceOverrides);
+        }
+        if (this.metadata != null) {
+            for (Map.Entry<String, String> entry : this.metadata.entrySet()) {
+                if (entry.getKey().startsWith(Knative.KNATIVE_CE_OVERRIDE_PREFIX)) {
+                    final String key = entry.getKey().substring(Knative.KNATIVE_CE_OVERRIDE_PREFIX.length());
+                    final String val = entry.getValue();
+
+                    answer.put(key, val);
+                }
+            }
+        }
+
+        return answer;
+    }
+
+    public void setCeOverrides(Map<String, String> ceOverride) {
+        this.ceOverrides = ceOverride;
+    }
+
+    public void addCeOverride(String key, String value) {
+        if (this.ceOverrides == null) {
+            this.ceOverrides = new HashMap<>();
+        }
+
+        this.ceOverrides.put(key, value);
+        this.ceOverrides.put(key, value);
+    }
+
+    public Map<String, String> getFilters() {
+        Map<String, String> answer = new HashMap<>();
+        if (this.filters != null) {
+            answer.putAll(this.filters);
+        }
+        if (this.metadata != null) {
+            for (Map.Entry<String, String> entry : this.metadata.entrySet()) {
+                if (entry.getKey().startsWith(Knative.KNATIVE_FILTER_PREFIX)) {
+                    final String key = entry.getKey().substring(Knative.KNATIVE_FILTER_PREFIX.length());
+                    final String val = entry.getValue();
+
+                    answer.put(key, val);
+                }
+            }
+        }
+
+        return answer;
+    }
+
+    public void setFilters(Map<String, String> filters) {
+        this.filters = filters;
+    }
+
+    public void addFilter(String key, String value) {
+        if (this.filters == null) {
+            this.filters = new HashMap<>();
+        }
+
+        this.filters.put(key, value);
+    }
+
+    public Boolean getReply() {
+        return this.reply != null
+                ? this.reply
+                : getOptionalMetadata(Knative.KNATIVE_REPLY).map(Boolean::parseBoolean).orElse(true);
+    }
+
+    public void setReply(Boolean reply) {
+        this.reply = reply;
+    }
+
+    public String getContentType() {
+        return this.contentType != null
+                ? this.contentType
+                : getMetadata(Knative.CONTENT_TYPE);
+    }
+
+    public void setContentType(String contentType) {
+        this.contentType = contentType;
+    }
+
+    public boolean matches(Knative.Type type, String name) {
+        if (type == null || name == null) {
+            return false;
+        }
+
+        return Objects.equals(type, getType())
+                && Objects.equals(name, getName());
+    }
+
+    @Override
+    public String toString() {
+        return "KnativeResource{" +
+               "name='" + name + '\'' +
+               ", url='" + url + '\'' +
+               ", metadata=" + metadata +
+               ", ceOverrides=" + ceOverrides +
+               ", filters=" + filters +
+               ", type=" + type +
+               ", endpointKind=" + endpointKind +
+               ", reply=" + reply +
+               ", contentType='" + contentType + '\'' +
+               '}';
+    }
+
+    public static KnativeResource from(KnativeResource resource) {
+        KnativeResource answer = new KnativeResource();
+
+        answer.name = resource.name;
+        answer.url = resource.url;
+        answer.type = resource.type;
+        answer.endpointKind = resource.endpointKind;
+        answer.reply = resource.reply;
+        answer.contentType = resource.contentType;
+        answer.cloudEventType = resource.cloudEventType;
+        answer.path = resource.path;
+
+        if (resource.metadata != null) {
+            answer.metadata = new HashMap<>(resource.metadata);
+        }
+        if (resource.ceOverrides != null) {
+            answer.ceOverrides = new HashMap<>(resource.ceOverrides);
+        }
+        if (resource.filters != null) {
+            answer.filters = new HashMap<>(resource.filters);
+        }
+
+        return answer;
+    }
+}
diff --git a/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeSupport.java b/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeSupport.java
new file mode 100644
index 0000000..363ecd2
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeSupport.java
@@ -0,0 +1,40 @@
+/*
+ * 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.knative.spi;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public final class KnativeSupport {
+    private KnativeSupport() {
+    }
+
+    @SafeVarargs
+    public static <K, V> Map<K, V> mergeMaps(Map<K, V> map, Map<K, V>... maps) {
+        Map<K, V> answer = new HashMap<>();
+
+        if (map != null) {
+            answer.putAll(map);
+        }
+
+        for (Map<K, V> m : maps) {
+            answer.putAll(m);
+        }
+
+        return answer;
+    }
+}
diff --git a/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeTransportConfiguration.java b/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeTransportConfiguration.java
new file mode 100644
index 0000000..0c9368d
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/main/java/org/apache/camel/component/knative/spi/KnativeTransportConfiguration.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.knative.spi;
+
+import org.apache.camel.component.cloudevents.CloudEvent;
+
+public final class KnativeTransportConfiguration {
+
+    private final CloudEvent cloudEvent;
+    private final boolean removeCloudEventHeadersInReply;
+    private final boolean reply;
+
+    public KnativeTransportConfiguration(CloudEvent cloudEvent, boolean removeCloudEventHeadersInReply, boolean reply) {
+        this.cloudEvent = cloudEvent;
+        this.removeCloudEventHeadersInReply = removeCloudEventHeadersInReply;
+        this.reply = reply;
+    }
+
+    public CloudEvent getCloudEvent() {
+        return cloudEvent;
+    }
+
+    public boolean isRemoveCloudEventHeadersInReply() {
+        return removeCloudEventHeadersInReply;
+    }
+
+    public boolean isReply() {
+        return reply;
+    }
+}
diff --git a/components/camel-knative/camel-knative-api/src/test/java/org/apache/camel/component/knative/spi/KnativeEnvironmentTest.java b/components/camel-knative/camel-knative-api/src/test/java/org/apache/camel/component/knative/spi/KnativeEnvironmentTest.java
new file mode 100644
index 0000000..8fc585e
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/test/java/org/apache/camel/component/knative/spi/KnativeEnvironmentTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.knative.spi;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+import static org.apache.camel.util.CollectionHelper.mapOf;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class KnativeEnvironmentTest {
+
+    @ParameterizedTest
+    @ValueSource(strings = {
+            "{\"services\":[{\"type\":\"endpoint\",\"name\":\"knative3\",\"metadata\":{\"camel.endpoint.kind\":\"source\",\"knative.apiVersion\":\"serving.knative.dev/v1\",\"knative.kind\":\"Service\",\"service.path\":\"/\"}}]}",
+            "{\"resources\":[{\"type\":\"endpoint\",\"name\":\"knative3\",\"metadata\":{\"camel.endpoint.kind\":\"source\",\"knative.apiVersion\":\"serving.knative.dev/v1\",\"knative.kind\":\"Service\",\"service.path\":\"/\"}}]}"
+    })
+    public void testKnativeEnvironmentDeserializationFromString(String content) throws Exception {
+        KnativeEnvironment env = KnativeEnvironment.mandatoryLoadFromSerializedString(content);
+        List<KnativeResource> res = env.lookup(Knative.Type.endpoint, "knative3").collect(Collectors.toList());
+
+        assertThat(res).hasSize(1);
+        assertThat(res).first().satisfies(resource -> {
+            assertThat(resource.getName()).isEqualTo("knative3");
+            assertThat(resource.getEndpointKind()).isEqualTo(Knative.EndpointKind.source);
+            assertThat(resource.getObjectApiVersion()).isEqualTo("serving.knative.dev/v1");
+            assertThat(resource.getObjectKind()).isEqualTo("Service");
+            assertThat(resource.getPath()).isEqualTo("/");
+            assertThat(resource.getMetadata()).isNotEmpty();
+        });
+    }
+
+    @Test
+    public void testKnativeEnvironmentDeserializationFromProperties() {
+        Map<String, Object> properties = mapOf(
+                "resources[0].name", "knative3",
+                "resources[0].type", "endpoint",
+                "resources[0].endpointKind", "source",
+                "resources[0].objectApiVersion", "serving.knative.dev/v1",
+                "resources[0].objectKind", "Service",
+                "resources[0].path", "/");
+
+        CamelContext context = new DefaultCamelContext();
+        KnativeEnvironment env = KnativeEnvironment.mandatoryLoadFromProperties(context, properties);
+        List<KnativeResource> res = env.lookup(Knative.Type.endpoint, "knative3").collect(Collectors.toList());
+
+        assertThat(res).hasSize(1);
+        assertThat(res).first().satisfies(resource -> {
+            assertThat(resource.getName()).isEqualTo("knative3");
+            assertThat(resource.getEndpointKind()).isEqualTo(Knative.EndpointKind.source);
+            assertThat(resource.getObjectApiVersion()).isEqualTo("serving.knative.dev/v1");
+            assertThat(resource.getObjectKind()).isEqualTo("Service");
+            assertThat(resource.getPath()).isEqualTo("/");
+            assertThat(resource.getMetadata()).isEmpty();
+        });
+    }
+}
diff --git a/components/camel-knative/camel-knative-api/src/test/resources/log4j2.properties b/components/camel-knative/camel-knative-api/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..6176c51
--- /dev/null
+++ b/components/camel-knative/camel-knative-api/src/test/resources/log4j2.properties
@@ -0,0 +1,29 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-knative-api-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level = INFO
+rootLogger.appenderRef.file.ref = file
+
diff --git a/components/camel-knative/camel-knative-component/pom.xml b/components/camel-knative/camel-knative-component/pom.xml
new file mode 100644
index 0000000..27929fe
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/pom.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-knative-parent</artifactId>
+        <version>3.15.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-knative</artifactId>
+    <packaging>jar</packaging>
+    <name>Camel :: Knative Component</name>
+    <description>Camel Knative</description>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-support</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-knative-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>${jackson2-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.datatype</groupId>
+            <artifactId>jackson-datatype-jdk8</artifactId>
+            <version>${jackson2-version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+</project>
diff --git a/components/camel-knative/camel-knative-component/src/generated/java/org/apache/camel/component/knative/KnativeComponentConfigurer.java b/components/camel-knative/camel-knative-component/src/generated/java/org/apache/camel/component/knative/KnativeComponentConfigurer.java
new file mode 100644
index 0000000..7834929
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/generated/java/org/apache/camel/component/knative/KnativeComponentConfigurer.java
@@ -0,0 +1,158 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.knative;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class KnativeComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    private org.apache.camel.component.knative.KnativeConfiguration getOrCreateConfiguration(KnativeComponent target) {
+        if (target.getConfiguration() == null) {
+            target.setConfiguration(new org.apache.camel.component.knative.KnativeConfiguration());
+        }
+        return target.getConfiguration();
+    }
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        KnativeComponent target = (KnativeComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "apiversion":
+        case "apiVersion": getOrCreateConfiguration(target).setApiVersion(property(camelContext, java.lang.String.class, value)); return true;
+        case "autowiredenabled":
+        case "autowiredEnabled": target.setAutowiredEnabled(property(camelContext, boolean.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "ceoverride":
+        case "ceOverride": getOrCreateConfiguration(target).setCeOverride(property(camelContext, java.util.Map.class, value)); return true;
+        case "cloudeventsspecversion":
+        case "cloudEventsSpecVersion": getOrCreateConfiguration(target).setCloudEventsSpecVersion(property(camelContext, java.lang.String.class, value)); return true;
+        case "cloudeventstype":
+        case "cloudEventsType": getOrCreateConfiguration(target).setCloudEventsType(property(camelContext, java.lang.String.class, value)); return true;
+        case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.knative.KnativeConfiguration.class, value)); return true;
+        case "consumerfactory":
+        case "consumerFactory": target.setConsumerFactory(property(camelContext, org.apache.camel.component.knative.spi.KnativeConsumerFactory.class, value)); return true;
+        case "environment": getOrCreateConfiguration(target).setEnvironment(property(camelContext, org.apache.camel.component.knative.spi.KnativeEnvironment.class, value)); return true;
+        case "environmentpath":
+        case "environmentPath": target.setEnvironmentPath(property(camelContext, java.lang.String.class, value)); return true;
+        case "filters": getOrCreateConfiguration(target).setFilters(property(camelContext, java.util.Map.class, value)); return true;
+        case "kind": getOrCreateConfiguration(target).setKind(property(camelContext, java.lang.String.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "name": getOrCreateConfiguration(target).setName(property(camelContext, java.lang.String.class, value)); return true;
+        case "producerfactory":
+        case "producerFactory": target.setProducerFactory(property(camelContext, org.apache.camel.component.knative.spi.KnativeProducerFactory.class, value)); return true;
+        case "reply": getOrCreateConfiguration(target).setReply(property(camelContext, java.lang.Boolean.class, value)); return true;
+        case "replywithcloudevent":
+        case "replyWithCloudEvent": getOrCreateConfiguration(target).setReplyWithCloudEvent(property(camelContext, boolean.class, value)); return true;
+        case "transportoptions":
+        case "transportOptions": getOrCreateConfiguration(target).setTransportOptions(property(camelContext, java.util.Map.class, value)); return true;
+        case "typeid":
+        case "typeId": getOrCreateConfiguration(target).setTypeId(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "apiversion":
+        case "apiVersion": return java.lang.String.class;
+        case "autowiredenabled":
+        case "autowiredEnabled": return boolean.class;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return boolean.class;
+        case "ceoverride":
+        case "ceOverride": return java.util.Map.class;
+        case "cloudeventsspecversion":
+        case "cloudEventsSpecVersion": return java.lang.String.class;
+        case "cloudeventstype":
+        case "cloudEventsType": return java.lang.String.class;
+        case "configuration": return org.apache.camel.component.knative.KnativeConfiguration.class;
+        case "consumerfactory":
+        case "consumerFactory": return org.apache.camel.component.knative.spi.KnativeConsumerFactory.class;
+        case "environment": return org.apache.camel.component.knative.spi.KnativeEnvironment.class;
+        case "environmentpath":
+        case "environmentPath": return java.lang.String.class;
+        case "filters": return java.util.Map.class;
+        case "kind": return java.lang.String.class;
+        case "lazystartproducer":
+        case "lazyStartProducer": return boolean.class;
+        case "name": return java.lang.String.class;
+        case "producerfactory":
+        case "producerFactory": return org.apache.camel.component.knative.spi.KnativeProducerFactory.class;
+        case "reply": return java.lang.Boolean.class;
+        case "replywithcloudevent":
+        case "replyWithCloudEvent": return boolean.class;
+        case "transportoptions":
+        case "transportOptions": return java.util.Map.class;
+        case "typeid":
+        case "typeId": return java.lang.String.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        KnativeComponent target = (KnativeComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "apiversion":
+        case "apiVersion": return getOrCreateConfiguration(target).getApiVersion();
+        case "autowiredenabled":
+        case "autowiredEnabled": return target.isAutowiredEnabled();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "ceoverride":
+        case "ceOverride": return getOrCreateConfiguration(target).getCeOverride();
+        case "cloudeventsspecversion":
+        case "cloudEventsSpecVersion": return getOrCreateConfiguration(target).getCloudEventsSpecVersion();
+        case "cloudeventstype":
+        case "cloudEventsType": return getOrCreateConfiguration(target).getCloudEventsType();
+        case "configuration": return target.getConfiguration();
+        case "consumerfactory":
+        case "consumerFactory": return target.getConsumerFactory();
+        case "environment": return getOrCreateConfiguration(target).getEnvironment();
+        case "environmentpath":
+        case "environmentPath": return target.getEnvironmentPath();
+        case "filters": return getOrCreateConfiguration(target).getFilters();
+        case "kind": return getOrCreateConfiguration(target).getKind();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        case "name": return getOrCreateConfiguration(target).getName();
+        case "producerfactory":
+        case "producerFactory": return target.getProducerFactory();
+        case "reply": return getOrCreateConfiguration(target).getReply();
+        case "replywithcloudevent":
+        case "replyWithCloudEvent": return getOrCreateConfiguration(target).isReplyWithCloudEvent();
+        case "transportoptions":
+        case "transportOptions": return getOrCreateConfiguration(target).getTransportOptions();
+        case "typeid":
+        case "typeId": return getOrCreateConfiguration(target).getTypeId();
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "ceoverride":
+        case "ceOverride": return java.lang.String.class;
+        case "filters": return java.lang.String.class;
+        case "transportoptions":
+        case "transportOptions": return java.lang.Object.class;
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-knative/camel-knative-component/src/generated/java/org/apache/camel/component/knative/KnativeEndpointConfigurer.java b/components/camel-knative/camel-knative-component/src/generated/java/org/apache/camel/component/knative/KnativeEndpointConfigurer.java
new file mode 100644
index 0000000..14d0184
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/generated/java/org/apache/camel/component/knative/KnativeEndpointConfigurer.java
@@ -0,0 +1,130 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.knative;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class KnativeEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        KnativeEndpoint target = (KnativeEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "apiversion":
+        case "apiVersion": target.getConfiguration().setApiVersion(property(camelContext, java.lang.String.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "ceoverride":
+        case "ceOverride": target.getConfiguration().setCeOverride(property(camelContext, java.util.Map.class, value)); return true;
+        case "cloudeventsspecversion":
+        case "cloudEventsSpecVersion": target.getConfiguration().setCloudEventsSpecVersion(property(camelContext, java.lang.String.class, value)); return true;
+        case "cloudeventstype":
+        case "cloudEventsType": target.getConfiguration().setCloudEventsType(property(camelContext, java.lang.String.class, value)); return true;
+        case "environment": target.getConfiguration().setEnvironment(property(camelContext, org.apache.camel.component.knative.spi.KnativeEnvironment.class, value)); return true;
+        case "exceptionhandler":
+        case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
+        case "exchangepattern":
+        case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true;
+        case "filters": target.getConfiguration().setFilters(property(camelContext, java.util.Map.class, value)); return true;
+        case "kind": target.getConfiguration().setKind(property(camelContext, java.lang.String.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "name": target.getConfiguration().setName(property(camelContext, java.lang.String.class, value)); return true;
+        case "reply": target.getConfiguration().setReply(property(camelContext, java.lang.Boolean.class, value)); return true;
+        case "replywithcloudevent":
+        case "replyWithCloudEvent": target.getConfiguration().setReplyWithCloudEvent(property(camelContext, boolean.class, value)); return true;
+        case "transportoptions":
+        case "transportOptions": target.getConfiguration().setTransportOptions(property(camelContext, java.util.Map.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "apiversion":
+        case "apiVersion": return java.lang.String.class;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return boolean.class;
+        case "ceoverride":
+        case "ceOverride": return java.util.Map.class;
+        case "cloudeventsspecversion":
+        case "cloudEventsSpecVersion": return java.lang.String.class;
+        case "cloudeventstype":
+        case "cloudEventsType": return java.lang.String.class;
+        case "environment": return org.apache.camel.component.knative.spi.KnativeEnvironment.class;
+        case "exceptionhandler":
+        case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class;
+        case "exchangepattern":
+        case "exchangePattern": return org.apache.camel.ExchangePattern.class;
+        case "filters": return java.util.Map.class;
+        case "kind": return java.lang.String.class;
+        case "lazystartproducer":
+        case "lazyStartProducer": return boolean.class;
+        case "name": return java.lang.String.class;
+        case "reply": return java.lang.Boolean.class;
+        case "replywithcloudevent":
+        case "replyWithCloudEvent": return boolean.class;
+        case "transportoptions":
+        case "transportOptions": return java.util.Map.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        KnativeEndpoint target = (KnativeEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "apiversion":
+        case "apiVersion": return target.getConfiguration().getApiVersion();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "ceoverride":
+        case "ceOverride": return target.getConfiguration().getCeOverride();
+        case "cloudeventsspecversion":
+        case "cloudEventsSpecVersion": return target.getConfiguration().getCloudEventsSpecVersion();
+        case "cloudeventstype":
+        case "cloudEventsType": return target.getConfiguration().getCloudEventsType();
+        case "environment": return target.getConfiguration().getEnvironment();
+        case "exceptionhandler":
+        case "exceptionHandler": return target.getExceptionHandler();
+        case "exchangepattern":
+        case "exchangePattern": return target.getExchangePattern();
+        case "filters": return target.getConfiguration().getFilters();
+        case "kind": return target.getConfiguration().getKind();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        case "name": return target.getConfiguration().getName();
+        case "reply": return target.getConfiguration().getReply();
+        case "replywithcloudevent":
+        case "replyWithCloudEvent": return target.getConfiguration().isReplyWithCloudEvent();
+        case "transportoptions":
+        case "transportOptions": return target.getConfiguration().getTransportOptions();
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "ceoverride":
+        case "ceOverride": return java.lang.String.class;
+        case "filters": return java.lang.String.class;
+        case "transportoptions":
+        case "transportOptions": return java.lang.Object.class;
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-knative/camel-knative-component/src/generated/java/org/apache/camel/component/knative/KnativeEndpointUriFactory.java b/components/camel-knative/camel-knative-component/src/generated/java/org/apache/camel/component/knative/KnativeEndpointUriFactory.java
new file mode 100644
index 0000000..83ea866
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/generated/java/org/apache/camel/component/knative/KnativeEndpointUriFactory.java
@@ -0,0 +1,78 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.knative;
+
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.spi.EndpointUriFactory;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+public class KnativeEndpointUriFactory extends org.apache.camel.support.component.EndpointUriFactorySupport implements EndpointUriFactory {
+
+    private static final String BASE = ":type/typeId";
+
+    private static final Set<String> PROPERTY_NAMES;
+    private static final Set<String> SECRET_PROPERTY_NAMES;
+    static {
+        Set<String> props = new HashSet<>(17);
+        props.add("cloudEventsType");
+        props.add("kind");
+        props.add("replyWithCloudEvent");
+        props.add("exchangePattern");
+        props.add("filters");
+        props.add("type");
+        props.add("transportOptions");
+        props.add("cloudEventsSpecVersion");
+        props.add("environment");
+        props.add("lazyStartProducer");
+        props.add("bridgeErrorHandler");
+        props.add("apiVersion");
+        props.add("ceOverride");
+        props.add("name");
+        props.add("typeId");
+        props.add("reply");
+        props.add("exceptionHandler");
+        PROPERTY_NAMES = Collections.unmodifiableSet(props);
+        SECRET_PROPERTY_NAMES = Collections.emptySet();
+    }
+
+    @Override
+    public boolean isEnabled(String scheme) {
+        return "knative".equals(scheme);
+    }
+
+    @Override
+    public String buildUri(String scheme, Map<String, Object> properties, boolean encode) throws URISyntaxException {
+        String syntax = scheme + BASE;
+        String uri = syntax;
+
+        Map<String, Object> copy = new HashMap<>(properties);
+
+        uri = buildPathParameter(syntax, uri, "type", null, false, copy);
+        uri = buildPathParameter(syntax, uri, "typeId", null, false, copy);
+        uri = buildQueryParameters(uri, copy, encode);
+        return uri;
+    }
+
+    @Override
+    public Set<String> propertyNames() {
+        return PROPERTY_NAMES;
+    }
+
+    @Override
+    public Set<String> secretPropertyNames() {
+        return SECRET_PROPERTY_NAMES;
+    }
+
+    @Override
+    public boolean isLenientProperties() {
+        return false;
+    }
+}
+
diff --git a/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/component.properties
new file mode 100644
index 0000000..17b7702
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+components=knative
+groupId=org.apache.camel
+artifactId=camel-knative
+version=3.15.0-SNAPSHOT
+projectName=Camel :: Knative Component
+projectDescription=Camel Knative
diff --git a/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/component/knative b/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/component/knative
new file mode 100644
index 0000000..ef9a34e
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/component/knative
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.knative.KnativeComponent
diff --git a/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/configurer/knative-component b/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/configurer/knative-component
new file mode 100644
index 0000000..d0fea09
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/configurer/knative-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.knative.KnativeComponentConfigurer
diff --git a/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/configurer/knative-endpoint b/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/configurer/knative-endpoint
new file mode 100644
index 0000000..9aac63b
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/configurer/knative-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.knative.KnativeEndpointConfigurer
diff --git a/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/urifactory/knative-endpoint b/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/urifactory/knative-endpoint
new file mode 100644
index 0000000..5036af3
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/generated/resources/META-INF/services/org/apache/camel/urifactory/knative-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.knative.KnativeEndpointUriFactory
diff --git a/components/camel-knative/camel-knative-component/src/generated/resources/org/apache/camel/component/knative/knative.json b/components/camel-knative/camel-knative-component/src/generated/resources/org/apache/camel/component/knative/knative.json
new file mode 100644
index 0000000..e546a94
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/generated/resources/org/apache/camel/component/knative/knative.json
@@ -0,0 +1,64 @@
+{
+  "component": {
+    "kind": "component",
+    "name": "knative",
+    "title": "Knative",
+    "description": "Send and receive events from Knative.",
+    "deprecated": false,
+    "firstVersion": "3.15.0",
+    "label": "cloud",
+    "javaType": "org.apache.camel.component.knative.KnativeComponent",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-knative",
+    "version": "3.15.0-SNAPSHOT",
+    "scheme": "knative",
+    "extendsScheme": "",
+    "syntax": "knative:type\/typeId",
+    "async": false,
+    "api": false,
+    "consumerOnly": false,
+    "producerOnly": false,
+    "lenientProperties": false
+  },
+  "componentProperties": {
+    "ceOverride": { "kind": "property", "displayName": "Ce Override", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.String>", "prefix": "ce.override.", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "CloudEvent headers to override" },
+    "cloudEventsSpecVersion": { "kind": "property", "displayName": "Cloud Events Spec Version", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "1.0", "1.0.1" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1.0", "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the version of the cloudevents spec." },
+    "cloudEventsType": { "kind": "property", "displayName": "Cloud Events Type", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "org.apache.camel.event", "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the event-type information of the produced events." },
+    "configuration": { "kind": "property", "displayName": "Configuration", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.knative.KnativeConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "Set the configuration." },
+    "consumerFactory": { "kind": "property", "displayName": "Consumer Factory", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.knative.spi.KnativeConsumerFactory", "deprecated": false, "autowired": false, "secret": false, "description": "The protocol consumer factory." },
+    "environment": { "kind": "property", "displayName": "Environment", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.knative.spi.KnativeEnvironment", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The environment" },
+    "environmentPath": { "kind": "property", "displayName": "Environment Path", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The path ot the environment definition" },
+    "filters": { "kind": "property", "displayName": "Filters", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.String>", "prefix": "filter.", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the filters." },
+    "producerFactory": { "kind": "property", "displayName": "Producer Factory", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.knative.spi.KnativeProducerFactory", "deprecated": false, "autowired": false, "secret": false, "description": "The protocol producer factory." },
+    "transportOptions": { "kind": "property", "displayName": "Transport Options", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "transport.", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the transport options." },
+    "typeId": { "kind": "property", "displayName": "Type Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The name of the service to lookup from the KnativeEnvironment." },
+    "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a me [...]
+    "replyWithCloudEvent": { "kind": "property", "displayName": "Reply With Cloud Event", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Transforms the reply into a cloud event that will be processed by the caller. When [...]
+    "reply": { "kind": "property", "displayName": "Reply", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "If the consumer should construct a full reply to knative request." },
+    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during star [...]
+    "apiVersion": { "kind": "property", "displayName": "Api Version", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The version of the k8s resource referenced by the endpoint." },
+    "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
+    "kind": { "kind": "property", "displayName": "Kind", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The type of the k8s resource referenced by the endpoint." },
+    "name": { "kind": "property", "displayName": "Name", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The name of the k8s resource referenced by the endpoint." }
+  },
+  "properties": {
+    "type": { "kind": "path", "displayName": "Type", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.knative.spi.Knative.Type", "enum": [ "endpoint", "channel", "event" ], "deprecated": false, "autowired": false, "secret": false, "description": "The Knative resource type" },
+    "typeId": { "kind": "path", "displayName": "Type Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The identifier of the Knative resource" },
+    "ceOverride": { "kind": "parameter", "displayName": "Ce Override", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.String>", "prefix": "ce.override.", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "CloudEvent headers to override" },
+    "cloudEventsSpecVersion": { "kind": "parameter", "displayName": "Cloud Events Spec Version", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "1.0", "1.0.1" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1.0", "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the version of the cloudevents spec." },
+    "cloudEventsType": { "kind": "parameter", "displayName": "Cloud Events Type", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "org.apache.camel.event", "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the event-type information of the produced events." },
+    "environment": { "kind": "parameter", "displayName": "Environment", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.knative.spi.KnativeEnvironment", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The environment" },
+    "filters": { "kind": "parameter", "displayName": "Filters", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.String>", "prefix": "filter.", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the filters." },
+    "transportOptions": { "kind": "parameter", "displayName": "Transport Options", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "transport.", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Set the transport options." },
+    "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
+    "replyWithCloudEvent": { "kind": "parameter", "displayName": "Reply With Cloud Event", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "Transforms the reply into a cloud event that will be processed by the caller. Whe [...]
+    "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the con [...]
+    "exchangePattern": { "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut", "InOptionalOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
+    "reply": { "kind": "parameter", "displayName": "Reply", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "If the consumer should construct a full reply to knative request." },
+    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during sta [...]
+    "apiVersion": { "kind": "parameter", "displayName": "Api Version", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The version of the k8s resource referenced by the endpoint." },
+    "kind": { "kind": "parameter", "displayName": "Kind", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The type of the k8s resource referenced by the endpoint." },
+    "name": { "kind": "parameter", "displayName": "Name", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.knative.KnativeConfiguration", "configurationField": "configuration", "description": "The name of the k8s resource referenced by the endpoint." }
+  }
+}
diff --git a/components/camel-knative/camel-knative-component/src/main/docs/knative-component.adoc b/components/camel-knative/camel-knative-component/src/main/docs/knative-component.adoc
new file mode 100644
index 0000000..912cdf1
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/main/docs/knative-component.adoc
@@ -0,0 +1,167 @@
+= Knative Component
+:doctitle: Knative
+:shortname: knative
+:artifactid: camel-knative
+:description: Send and receive events from Knative.
+:since: 3.15
+:supportlevel: Preview
+:component-header: Both producer and consumer are supported
+
+*Since Camel {since}*
+
+*{component-header}*
+
+The Knative component provides support for interacting with https://knative.dev/[Knative].
+
+Maven users will need to add the following dependency to their `pom.xml`
+for this component.
+
+[source,xml]
+------------------------------------------------------------
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-knative</artifactId>
+    <version>x.x.x</version>
+    <!-- use the same version as your Camel K version -->
+</dependency>
+------------------------------------------------------------
+
+== URI format
+
+[source,text]
+----
+knative:type/name[?options]
+----
+
+You can append query options to the URI in the following format:
+
+[source,text]
+------------------------------------------------------------
+?option=value&option=value&...
+------------------------------------------------------------
+
+== Options
+
+// component options: START
+include::partial$component-configure-options.adoc[]
+include::partial$component-endpoint-options.adoc[]
+// component options: END
+// component-configure options: START
+// component-configure options: END
+// endpoint options: START
+// endpoint options: END
+
+
+== Supported Knative resources
+
+The component support the following Knative resources you can target or exposes using the `type` path parameter:
+
+- **channel** allow producing or consuming events to or from a https://knative.dev/docs/eventing/channels/[**Knative Channel**]
+- **endpoint** allow exposing or targeting serverless workloads using https://knative.dev/docs/serving/spec/knative-api-specification-1.0/#service[**Knative Services**]
+- **event** allow producing or consuming events to or from a https://knative.dev/docs/eventing/broker[**Knative Broker**]
+
+== Knative Environment
+
+As the Knative component hides the technical details of how to communicate with Knative services to the user (protocols, addresses, etc.), it needs some metadata that describe the Knative environment to set-up the low level transport details. In order to do so, the component needs a so called `Knative Environment` which is essence is a Json document made by a number of `service` elements which looks like the below example:
+
+[source,json]
+------------------------------------------------------------
+{
+    "services": [
+        {
+             "type": "channel|endpoint|event", <1>
+             "name": "", <2>
+             "metadata": {
+                 "service.url": "http://my-service.svc.cluster.local" <3>
+                 "knative.event.type": "", <4>
+                 "camel.endpoint.kind": "source|sink", <5>
+             }
+        }, {
+            ...
+        }
+    ]
+}
+------------------------------------------------------------
+<1> the type of the Knative resource
+<2> the name of the resource
+<3> the url of the service to invoke (for producer only)
+<4> the Knative event type received or produced by the component
+<5> the type of the Camel Endpoint associated to this Knative resource (source=consumer, sink=producer)
+
+The `metadata` fields has some additional advanced fields:
+
+[width="100%",cols="1,5,3",options="header"]
+|===
+| Name | Description | Example
+| *filter.*
+| The prefix to define filters to be applied to the incoming message headers.
+| ```filter.ce.source=my-source```
+
+| *knative.kind*
+| The type of the k8s resource referenced by the endpoint.
+| ```knative.kind=InMemoryChannel```
+
+| *knative.apiVersion*
+| The version of the k8s resource referenced by the endpoint
+| ```knative.apiVersion=messaging.knative.dev/v1beta1```
+
+| *knative.reply*
+| If the consumer should construct a full reply to knative request.
+| ```knative.reply=false```
+
+| *ce.override.*
+| The prefix to define CloudEvents values that have to be overridden.
+| ```ce.override.ce-type=MyType```
+
+|===
+
+== Example
+
+[source,java]
+----
+CamelContext context = new DefaultCamelContext();
+
+KnativeComponent component = context.getComponent("knative", KnativeComponent.class);
+component.getConfiguration().setEnvironmentPath("classpath:knative.json"); // <1>
+
+RouteBuilder.addRoutes(context, b -> {
+    b.from("knative:endpoint/myEndpoint") // <2>
+        .to("log:info");
+});
+----
+<1> set the location of the `Knative Environment` file
+<2> expose knative service
+
+== Using custom Knative Transport
+
+As today the component only support `http` as transport as it is the only supported protocol on Knative side but the transport is pluggable by implementing the following interface:
+
+[source,java]
+----
+
+public interface KnativeTransport extends Service {
+    /**
+     * Create a camel {@link org.apache.camel.Producer} in place of the original endpoint for a specific protocol.
+     *
+     * @param endpoint the endpoint for which the producer should be created
+     * @param configuration the general transport configuration
+     * @param service the service definition containing information about how make reach the target service.
+     */
+    Producer createProducer(
+        Endpoint endpoint,
+        KnativeTransportConfiguration configuration,
+        KnativeEnvironment.KnativeServiceDefinition service);
+
+    /**
+     * Create a camel {@link org.apache.camel.Producer} in place of the original endpoint for a specific protocol.
+     *
+     * @param endpoint the endpoint for which the consumer should be created.
+     * @param configuration the general transport configuration
+     * @param service the service definition containing information about how make the route reachable from knative.
+     */
+    Consumer createConsumer(
+        Endpoint endpoint,
+        KnativeTransportConfiguration configuration,
+        KnativeEnvironment.KnativeServiceDefinition service, Processor processor);
+}
+----
\ No newline at end of file
diff --git a/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeComponent.java b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeComponent.java
new file mode 100644
index 0000000..3f5f415
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeComponent.java
@@ -0,0 +1,338 @@
+/*
+ * 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.knative;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.Endpoint;
+import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.component.knative.spi.Knative;
+import org.apache.camel.component.knative.spi.KnativeConsumerFactory;
+import org.apache.camel.component.knative.spi.KnativeEnvironment;
+import org.apache.camel.component.knative.spi.KnativeProducerFactory;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.CamelContextHelper;
+import org.apache.camel.support.DefaultComponent;
+import org.apache.camel.support.service.ServiceHelper;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.PropertiesHelper;
+import org.apache.camel.util.StringHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Component(KnativeConstants.SCHEME)
+public class KnativeComponent extends DefaultComponent {
+    private static final Logger LOGGER = LoggerFactory.getLogger(KnativeComponent.class);
+
+    @Metadata
+    private KnativeConfiguration configuration;
+
+    @Metadata
+    private String environmentPath;
+
+    @Metadata(defaultValue = "http")
+    private Knative.Protocol protocol = Knative.Protocol.http;
+
+    @Metadata
+    private KnativeProducerFactory producerFactory;
+    @Metadata
+    private KnativeConsumerFactory consumerFactory;
+
+    private boolean managedProducer;
+    private boolean managedConsumer;
+
+    public KnativeComponent() {
+        this(null);
+    }
+
+    public KnativeComponent(CamelContext context) {
+        super(context);
+
+        this.configuration = new KnativeConfiguration();
+        this.configuration.setTransportOptions(new HashMap<>());
+    }
+
+    // ************************
+    //
+    // Properties
+    //
+    // ************************
+
+    public KnativeConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    /**
+     * Set the configuration.
+     */
+    public void setConfiguration(KnativeConfiguration configuration) {
+        this.configuration = ObjectHelper.notNull(configuration, "configuration");
+    }
+
+    public String getEnvironmentPath() {
+        return environmentPath;
+    }
+
+    /**
+     * The path ot the environment definition
+     */
+    public void setEnvironmentPath(String environmentPath) {
+        this.environmentPath = environmentPath;
+    }
+
+    public KnativeEnvironment getEnvironment() {
+        return configuration.getEnvironment();
+    }
+
+    /**
+     * The environment
+     */
+    public void setEnvironment(KnativeEnvironment environment) {
+        configuration.setEnvironment(environment);
+    }
+
+    public String getCloudEventsSpecVersion() {
+        return configuration.getCloudEventsSpecVersion();
+    }
+
+    /**
+     * Set the version of the cloudevents spec.
+     */
+    public void setCloudEventsSpecVersion(String cloudEventSpecVersion) {
+        configuration.setCloudEventsSpecVersion(cloudEventSpecVersion);
+    }
+
+    public Knative.Protocol getProtocol() {
+        return protocol;
+    }
+
+    /**
+     * Protocol.
+     */
+    public KnativeComponent setProtocol(Knative.Protocol protocol) {
+        this.protocol = protocol;
+        return this;
+    }
+
+    public KnativeProducerFactory getProducerFactory() {
+        return producerFactory;
+    }
+
+    /**
+     * The protocol producer factory.
+     */
+    public void setProducerFactory(KnativeProducerFactory producerFactory) {
+        this.producerFactory = producerFactory;
+    }
+
+    public KnativeConsumerFactory getConsumerFactory() {
+        return consumerFactory;
+    }
+
+    /**
+     * The protocol consumer factory.
+     */
+    public void setConsumerFactory(KnativeConsumerFactory consumerFactory) {
+        this.consumerFactory = consumerFactory;
+    }
+
+    public Map<String, Object> getTransportOptions() {
+        return configuration.getTransportOptions();
+    }
+
+    /**
+     * Transport options.
+     */
+    public void setTransportOptions(Map<String, Object> transportOptions) {
+        configuration.setTransportOptions(transportOptions);
+    }
+
+    // ************************
+    //
+    // Lifecycle
+    //
+    // ************************
+
+    @Override
+    protected void doInit() throws Exception {
+        super.doInit();
+
+        setUpProducerFactory();
+        setUpConsumerFactory();
+
+        if (this.producerFactory != null && managedProducer) {
+            ServiceHelper.initService(this.producerFactory);
+        }
+        if (this.consumerFactory != null && managedConsumer) {
+            ServiceHelper.initService(this.consumerFactory);
+        }
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+
+        if (this.producerFactory != null && managedProducer) {
+            ServiceHelper.startService(this.producerFactory);
+        }
+        if (this.consumerFactory != null && managedConsumer) {
+            ServiceHelper.startService(this.consumerFactory);
+        }
+
+        if (this.producerFactory == null && this.consumerFactory == null) {
+            throw new IllegalStateException("No producer or consumer factory has been configured");
+        }
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        super.doStop();
+
+        if (this.producerFactory != null && managedProducer) {
+            ServiceHelper.stopService(this.producerFactory);
+        }
+        if (this.consumerFactory != null && managedConsumer) {
+            ServiceHelper.stopService(this.consumerFactory);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        if (ObjectHelper.isEmpty(remaining)) {
+            throw new IllegalArgumentException("Expecting URI in the form of: 'knative:type/name', got '" + uri + "'");
+        }
+
+        final String type = ObjectHelper.supplyIfEmpty(StringHelper.before(remaining, "/"), () -> remaining);
+        final String name = StringHelper.after(remaining, "/");
+        final KnativeConfiguration conf = getKnativeConfiguration();
+
+        conf.getFilters().putAll(
+                (Map) PropertiesHelper.extractProperties(parameters, "filter.", true));
+        conf.getCeOverride().putAll(
+                (Map) PropertiesHelper.extractProperties(parameters, "ce.override.", true));
+        conf.getTransportOptions().putAll(
+                PropertiesHelper.extractProperties(parameters, "transport.", true));
+
+        KnativeEndpoint endpoint = new KnativeEndpoint(uri, this, Knative.Type.valueOf(type), name, conf);
+        setProperties(endpoint, parameters);
+
+        return endpoint;
+    }
+
+    // ************************
+    //
+    // Helpers
+    //
+    // ************************
+
+    private KnativeConfiguration getKnativeConfiguration() throws Exception {
+        final String envConfig = System.getenv(KnativeConstants.CONFIGURATION_ENV_VARIABLE);
+        final KnativeConfiguration conf = configuration.copy();
+
+        if (conf.getTransportOptions() == null) {
+            conf.setTransportOptions(new HashMap<>());
+        }
+        if (conf.getFilters() == null) {
+            conf.setFilters(new HashMap<>());
+        }
+        if (conf.getCeOverride() == null) {
+            conf.setCeOverride(new HashMap<>());
+        }
+
+        if (conf.getEnvironment() == null) {
+            KnativeEnvironment env;
+
+            if (environmentPath != null) {
+                env = KnativeEnvironment.mandatoryLoadFromResource(getCamelContext(), this.environmentPath);
+            } else if (envConfig != null) {
+                env = envConfig.startsWith("file:") || envConfig.startsWith("classpath:")
+                        ? KnativeEnvironment.mandatoryLoadFromResource(getCamelContext(), envConfig)
+                        : KnativeEnvironment.mandatoryLoadFromSerializedString(envConfig);
+            } else {
+                env = CamelContextHelper.findByType(getCamelContext(), KnativeEnvironment.class);
+            }
+
+            if (env == null) {
+                throw new IllegalStateException("Cannot load Knative configuration from file or env variable");
+            }
+
+            conf.setEnvironment(env);
+        }
+
+        return conf;
+    }
+
+    private void setUpProducerFactory() throws Exception {
+        if (producerFactory == null) {
+            this.producerFactory = CamelContextHelper.lookup(getCamelContext(), protocol.name(), KnativeProducerFactory.class);
+
+            if (this.producerFactory == null) {
+                this.producerFactory = getCamelContext()
+                        .adapt(ExtendedCamelContext.class)
+                        .getBootstrapFactoryFinder(Knative.KNATIVE_TRANSPORT_RESOURCE_PATH)
+                        .newInstance(protocol.name() + "-producer", KnativeProducerFactory.class)
+                        .orElse(null);
+
+                if (this.producerFactory == null) {
+                    return;
+                }
+
+                if (configuration.getTransportOptions() != null) {
+                    setProperties(producerFactory, new HashMap<>(configuration.getTransportOptions()));
+                }
+
+                this.managedProducer = true;
+
+                CamelContextAware.trySetCamelContext(this.producerFactory, getCamelContext());
+            }
+
+            LOGGER.info("Using Knative producer factory: {} for protocol: {}", producerFactory, protocol.name());
+        }
+    }
+
+    private void setUpConsumerFactory() throws Exception {
+        if (consumerFactory == null) {
+            this.consumerFactory = CamelContextHelper.lookup(getCamelContext(), protocol.name(), KnativeConsumerFactory.class);
+
+            if (this.consumerFactory == null) {
+                this.consumerFactory = getCamelContext()
+                        .adapt(ExtendedCamelContext.class)
+                        .getBootstrapFactoryFinder(Knative.KNATIVE_TRANSPORT_RESOURCE_PATH)
+                        .newInstance(protocol.name() + "-consumer", KnativeConsumerFactory.class)
+                        .orElse(null);
+
+                if (this.consumerFactory == null) {
+                    return;
+                }
+                if (configuration.getTransportOptions() != null) {
+                    setProperties(consumerFactory, new HashMap<>(configuration.getTransportOptions()));
+                }
+
+                this.managedConsumer = true;
+
+                CamelContextAware.trySetCamelContext(this.consumerFactory, getCamelContext());
+            }
+
+            LOGGER.info("Using Knative consumer factory: {} for protocol: {}", consumerFactory, protocol.name());
+        }
+    }
+}
diff --git a/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeConfiguration.java b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeConfiguration.java
new file mode 100644
index 0000000..39f404b
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeConfiguration.java
@@ -0,0 +1,223 @@
+/*
+ * 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.knative;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.cloudevents.CloudEvents;
+import org.apache.camel.component.knative.spi.KnativeEnvironment;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+
+@UriParams
+public class KnativeConfiguration implements Cloneable {
+    @UriParam
+    private KnativeEnvironment environment;
+    @UriParam
+    private String typeId;
+    @UriParam(defaultValue = "1.0", enums = "1.0,1.0.1")
+    private String cloudEventsSpecVersion = CloudEvents.v1_0.version();
+    @UriParam(defaultValue = "org.apache.camel.event")
+    private String cloudEventsType = "org.apache.camel.event";
+    @UriParam(prefix = "transport.")
+    private Map<String, Object> transportOptions;
+    @UriParam(prefix = "filter.")
+    private Map<String, String> filters;
+    @UriParam(prefix = "ce.override.")
+    private Map<String, String> ceOverride;
+    @UriParam(label = "advanced")
+    private String apiVersion;
+    @UriParam(label = "advanced")
+    private String kind;
+    @UriParam(label = "advanced")
+    private String name;
+    @UriParam(label = "consumer", defaultValue = "false")
+    private boolean replyWithCloudEvent;
+    @UriParam(label = "consumer,advanced", defaultValue = "true")
+    private Boolean reply;
+
+    // ************************
+    //
+    // Properties
+    //
+    // ************************
+
+    public KnativeEnvironment getEnvironment() {
+        return environment;
+    }
+
+    /**
+     * The environment
+     */
+    public void setEnvironment(KnativeEnvironment environment) {
+        this.environment = environment;
+    }
+
+    public String getTypeId() {
+        return typeId;
+    }
+
+    /**
+     * The name of the service to lookup from the {@link KnativeEnvironment}.
+     */
+    public void setTypeId(String typeId) {
+        this.typeId = typeId;
+    }
+
+    public boolean isReplyWithCloudEvent() {
+        return replyWithCloudEvent;
+    }
+
+    /**
+     * Transforms the reply into a cloud event that will be processed by the caller.
+     *
+     * When listening to events from a Knative Broker, if this flag is enabled, replies will be published to the same
+     * Broker where the request comes from (beware that if you don't change the "type" of the received message, you may
+     * create a loop and receive your same reply).
+     *
+     * When this flag is disabled, CloudEvent headers are removed from the reply.
+     */
+    public void setReplyWithCloudEvent(boolean replyWithCloudEvent) {
+        this.replyWithCloudEvent = replyWithCloudEvent;
+    }
+
+    public String getCloudEventsSpecVersion() {
+        return cloudEventsSpecVersion;
+    }
+
+    /**
+     * Set the version of the cloudevents spec.
+     */
+    public void setCloudEventsSpecVersion(String cloudEventsSpecVersion) {
+        this.cloudEventsSpecVersion = cloudEventsSpecVersion;
+    }
+
+    public String getCloudEventsType() {
+        return cloudEventsType;
+    }
+
+    /**
+     * Set the event-type information of the produced events.
+     */
+    public void setCloudEventsType(String cloudEventsType) {
+        this.cloudEventsType = cloudEventsType;
+    }
+
+    public Map<String, Object> getTransportOptions() {
+        return transportOptions;
+    }
+
+    /**
+     * Set the transport options.
+     */
+    public void setTransportOptions(Map<String, Object> transportOptions) {
+        this.transportOptions = new HashMap<>(transportOptions);
+    }
+
+    /**
+     * Add a transport option.
+     */
+    public void addTransportOptions(String key, Object value) {
+        if (this.transportOptions == null) {
+            this.transportOptions = new HashMap<>();
+        }
+
+        this.transportOptions.put(key, value);
+    }
+
+    public Map<String, String> getFilters() {
+        return filters;
+    }
+
+    /**
+     * Set the filters.
+     */
+    public void setFilters(Map<String, String> filters) {
+        this.filters = new HashMap<>(filters);
+    }
+
+    public Map<String, String> getCeOverride() {
+        return ceOverride;
+    }
+
+    /**
+     * CloudEvent headers to override
+     */
+    public void setCeOverride(Map<String, String> ceOverride) {
+        this.ceOverride = new HashMap<>(ceOverride);
+    }
+
+    public String getApiVersion() {
+        return apiVersion;
+    }
+
+    /**
+     * The version of the k8s resource referenced by the endpoint.
+     */
+    public void setApiVersion(String apiVersion) {
+        this.apiVersion = apiVersion;
+    }
+
+    public String getKind() {
+        return kind;
+    }
+
+    /**
+     * The type of the k8s resource referenced by the endpoint.
+     */
+    public void setKind(String kind) {
+        this.kind = kind;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * The name of the k8s resource referenced by the endpoint.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Boolean getReply() {
+        return reply;
+    }
+
+    /**
+     * If the consumer should construct a full reply to knative request.
+     */
+    public void setReply(Boolean reply) {
+        this.reply = reply;
+    }
+
+    // ************************
+    //
+    // Cloneable
+    //
+    // ************************
+
+    public KnativeConfiguration copy() {
+        try {
+            return (KnativeConfiguration) super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeCamelException(e);
+        }
+    }
+}
diff --git a/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeConstants.java b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeConstants.java
new file mode 100644
index 0000000..2d5e5ce
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeConstants.java
@@ -0,0 +1,25 @@
+/*
+ * 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.knative;
+
+public final class KnativeConstants {
+    public static final String SCHEME = "knative";
+    public static final String CONFIGURATION_ENV_VARIABLE = "CAMEL_KNATIVE_CONFIGURATION";
+
+    private KnativeConstants() {
+    }
+}
diff --git a/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeEndpoint.java b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeEndpoint.java
new file mode 100644
index 0000000..5413075
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeEndpoint.java
@@ -0,0 +1,258 @@
+/*
+ * 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.knative;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+import org.apache.camel.Category;
+import org.apache.camel.Consumer;
+import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.component.cloudevents.CloudEvent;
+import org.apache.camel.component.cloudevents.CloudEvents;
+import org.apache.camel.component.knative.ce.CloudEventProcessor;
+import org.apache.camel.component.knative.ce.CloudEventProcessors;
+import org.apache.camel.component.knative.spi.Knative;
+import org.apache.camel.component.knative.spi.KnativeResource;
+import org.apache.camel.component.knative.spi.KnativeTransportConfiguration;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriPath;
+import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.support.PropertyBindingSupport;
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * Send and receive events from Knative.
+ */
+@UriEndpoint(firstVersion = "3.15.0",
+             scheme = "knative",
+             syntax = "knative:type/typeId",
+             title = "Knative",
+             category = Category.CLOUD)
+public class KnativeEndpoint extends DefaultEndpoint {
+
+    private final CloudEvent cloudEvent;
+    private final CloudEventProcessor cloudEventProcessor;
+
+    @UriPath(description = "The Knative resource type")
+    private final Knative.Type type;
+    @UriPath(description = "The identifier of the Knative resource")
+    private final String typeId;
+    @UriParam
+    private KnativeConfiguration configuration;
+
+    public KnativeEndpoint(String uri, KnativeComponent component, Knative.Type type, String name,
+                           KnativeConfiguration configuration) {
+        super(uri, component);
+        this.type = type;
+        this.typeId = name;
+        this.configuration = configuration;
+        this.cloudEvent = CloudEvents.fromSpecVersion(configuration.getCloudEventsSpecVersion());
+        this.cloudEventProcessor = CloudEventProcessors.fromSpecVersion(configuration.getCloudEventsSpecVersion());
+    }
+
+    @Override
+    public KnativeComponent getComponent() {
+        return (KnativeComponent) super.getComponent();
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        final KnativeResource service = lookupServiceDefinition(Knative.EndpointKind.sink);
+        final Processor ceProcessor = cloudEventProcessor.producer(this, service);
+        final Producer producer
+                = getComponent().getProducerFactory().createProducer(this, createTransportConfiguration(service), service);
+
+        PropertyBindingSupport.build()
+                .withCamelContext(getCamelContext())
+                .withProperties(configuration.getTransportOptions())
+                .withRemoveParameters(false)
+                .withMandatory(false)
+                .withTarget(producer)
+                .bind();
+
+        return new KnativeProducer(this, ceProcessor, e -> e.getMessage().removeHeader("Host"), producer);
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        KnativeResource service = lookupServiceDefinition(Knative.EndpointKind.source);
+        Processor ceProcessor = cloudEventProcessor.consumer(this, service);
+        Processor replyProcessor
+                = configuration.isReplyWithCloudEvent() ? cloudEventProcessor.producer(this, service) : null;
+
+        List<Processor> list = new ArrayList<>();
+        list.add(ceProcessor);
+        list.add(processor);
+        if (replyProcessor != null) {
+            list.add(replyProcessor);
+        }
+        ExtendedCamelContext ecc = getCamelContext().adapt(ExtendedCamelContext.class);
+        Processor pipeline = ecc.getProcessorFactory().createProcessor(ecc, "Pipeline", new Object[] { list });
+
+        Consumer consumer = getComponent().getConsumerFactory().createConsumer(this,
+                createTransportConfiguration(service), service, pipeline);
+
+        PropertyBindingSupport.build()
+                .withCamelContext(getCamelContext())
+                .withProperties(configuration.getTransportOptions())
+                .withRemoveParameters(false)
+                .withMandatory(false)
+                .withTarget(consumer)
+                .bind();
+
+        configureConsumer(consumer);
+
+        return consumer;
+    }
+
+    @Override
+    public boolean isSingleton() {
+        return true;
+    }
+
+    public Knative.Type getType() {
+        return type;
+    }
+
+    public String getTypeId() {
+        return typeId;
+    }
+
+    public CloudEvent getCloudEvent() {
+        return cloudEvent;
+    }
+
+    public KnativeConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    public void setConfiguration(KnativeConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    @Override
+    protected void doInit() {
+        if (ObjectHelper.isEmpty(this.configuration.getTypeId())) {
+            this.configuration.setTypeId(this.typeId);
+        }
+    }
+
+    KnativeResource lookupServiceDefinition(Knative.EndpointKind endpointKind) {
+        final String resourceName;
+        if (type == Knative.Type.event && configuration.getName() != null) {
+            resourceName = configuration.getName();
+        } else {
+            resourceName = configuration.getTypeId();
+        }
+
+        KnativeResource resource = lookupServiceDefinition(resourceName, endpointKind)
+                .or(() -> lookupServiceDefinition("default", endpointKind))
+                .orElseThrow(() -> new IllegalArgumentException(
+                        String.format("Unable to find a resource definition for %s/%s/%s", type, endpointKind, resourceName)));
+
+        //
+        // We need to create a new resource as we need to inject additional data from the component
+        // configuration.
+        //
+        KnativeResource answer = KnativeResource.from(resource);
+
+        //
+        // Set-up filters from config
+        //
+        for (Map.Entry<String, String> entry : configuration.getFilters().entrySet()) {
+            String key = entry.getKey();
+            String val = entry.getValue();
+
+            if (key.startsWith(Knative.KNATIVE_FILTER_PREFIX)) {
+                key = key.substring(Knative.KNATIVE_FILTER_PREFIX.length());
+            }
+
+            answer.addFilter(key, val);
+        }
+
+        //
+        // Set-up overrides from config
+        //
+        for (Map.Entry<String, String> entry : configuration.getCeOverride().entrySet()) {
+            String key = entry.getKey();
+            String val = entry.getValue();
+
+            if (key.startsWith(Knative.KNATIVE_CE_OVERRIDE_PREFIX)) {
+                key = key.substring(Knative.KNATIVE_CE_OVERRIDE_PREFIX.length());
+            }
+
+            answer.addCeOverride(key, val);
+        }
+
+        //
+        // For event type endpoints se need to add a filter to filter out events received
+        // based on the given type.
+        //
+        if (resource.getType() == Knative.Type.event && ObjectHelper.isNotEmpty(configuration.getTypeId())) {
+            answer.setCloudEventType(configuration.getTypeId());
+            answer.addFilter(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, configuration.getTypeId());
+        }
+
+        return answer;
+    }
+
+    Optional<KnativeResource> lookupServiceDefinition(String name, Knative.EndpointKind endpointKind) {
+        return servicesDefinitions()
+                .filter(definition -> definition.matches(this.type, name))
+                .filter(serviceFilter(this.configuration, endpointKind))
+                .findFirst();
+    }
+
+    private KnativeTransportConfiguration createTransportConfiguration(KnativeResource definition) {
+        return new KnativeTransportConfiguration(
+                this.cloudEventProcessor.cloudEvent(),
+                !this.configuration.isReplyWithCloudEvent(),
+                ObjectHelper.supplyIfEmpty(this.configuration.getReply(), definition::getReply));
+    }
+
+    private Stream<KnativeResource> servicesDefinitions() {
+        return Stream.concat(
+                getCamelContext().getRegistry().findByType(KnativeResource.class).stream(),
+                this.configuration.getEnvironment().stream());
+    }
+
+    private static Predicate<KnativeResource> serviceFilter(
+            KnativeConfiguration configuration, Knative.EndpointKind endpointKind) {
+        return resource -> {
+            if (!Objects.equals(endpointKind, resource.getEndpointKind())) {
+                return false;
+            }
+            if (configuration.getApiVersion() != null
+                    && !Objects.equals(resource.getObjectApiVersion(), configuration.getApiVersion())) {
+                return false;
+            }
+            if (configuration.getKind() != null && !Objects.equals(resource.getObjectKind(), configuration.getKind())) {
+                return false;
+            }
+            return configuration.getName() == null || Objects.equals(resource.getObjectName(), configuration.getName());
+        };
+    }
+}
diff --git a/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeEnvironmentSupport.java b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeEnvironmentSupport.java
new file mode 100644
index 0000000..ee84b85
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeEnvironmentSupport.java
@@ -0,0 +1,107 @@
+/*
+ * 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.knative;
+
+import java.util.Map;
+
+import org.apache.camel.component.knative.spi.Knative;
+import org.apache.camel.component.knative.spi.KnativeEnvironment;
+import org.apache.camel.component.knative.spi.KnativeResource;
+
+/**
+ * Support for knative environments.
+ */
+public final class KnativeEnvironmentSupport {
+
+    private KnativeEnvironmentSupport() {
+    }
+
+    public static KnativeResource endpoint(Knative.EndpointKind endpointKind, String name, String url) {
+        return KnativeEnvironment.serviceBuilder(Knative.Type.endpoint, name)
+                .withUrl(url)
+                .withEndpointKind(endpointKind)
+                .build();
+    }
+
+    public static KnativeResource endpoint(
+            Knative.EndpointKind endpointKind, String name, String url, Map<String, String> metadata) {
+        return KnativeEnvironment.serviceBuilder(Knative.Type.endpoint, name)
+                .withUrl(url)
+                .withMeta(metadata)
+                .withEndpointKind(endpointKind)
+                .build();
+    }
+
+    public static KnativeResource sourceEndpoint(String name, Map<String, String> metadata) {
+        return KnativeEnvironment.serviceBuilder(Knative.Type.endpoint, name)
+                .withMeta(metadata)
+                .withEndpointKind(Knative.EndpointKind.source)
+                .build();
+    }
+
+    public static KnativeResource channel(Knative.EndpointKind endpointKind, String name, String url) {
+        return KnativeEnvironment.serviceBuilder(Knative.Type.channel, name)
+                .withUrl(url)
+                .withEndpointKind(endpointKind)
+                .build();
+    }
+
+    public static KnativeResource channel(
+            Knative.EndpointKind endpointKind, String name, String url, Map<String, String> metadata) {
+        return KnativeEnvironment.serviceBuilder(Knative.Type.channel, name)
+                .withUrl(url)
+                .withMeta(metadata)
+                .withEndpointKind(endpointKind)
+                .build();
+    }
+
+    public static KnativeResource sourceChannel(String name, Map<String, String> metadata) {
+        return KnativeEnvironment.serviceBuilder(Knative.Type.channel, name)
+                .withMeta(metadata)
+                .withEndpointKind(Knative.EndpointKind.source)
+                .build();
+    }
+
+    public static KnativeResource event(Knative.EndpointKind endpointKind, String name, String url) {
+        return KnativeEnvironment.serviceBuilder(Knative.Type.event, name)
+                .withUrl(url)
+                .withEndpointKind(endpointKind)
+                .build();
+    }
+
+    public static KnativeResource sourceEvent(String name) {
+        return KnativeEnvironment.serviceBuilder(Knative.Type.event, name)
+                .withEndpointKind(Knative.EndpointKind.source)
+                .build();
+    }
+
+    public static KnativeResource sourceEvent(String name, Map<String, String> metadata) {
+        return KnativeEnvironment.serviceBuilder(Knative.Type.event, name)
+                .withMeta(metadata)
+                .withEndpointKind(Knative.EndpointKind.source)
+                .build();
+    }
+
+    public static KnativeResource event(
+            Knative.EndpointKind endpointKind, String name, String url, Map<String, String> metadata) {
+        return KnativeEnvironment.serviceBuilder(Knative.Type.event, name)
+                .withUrl(url)
+                .withMeta(metadata)
+                .withEndpointKind(endpointKind)
+                .build();
+    }
+}
diff --git a/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeProducer.java b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeProducer.java
new file mode 100644
index 0000000..9667c1c
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/KnativeProducer.java
@@ -0,0 +1,78 @@
+/*
+ * 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.knative;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.AsyncProcessor;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.Processor;
+import org.apache.camel.support.AsyncProcessorConverterHelper;
+import org.apache.camel.support.DefaultAsyncProducer;
+import org.apache.camel.support.service.ServiceHelper;
+
+public class KnativeProducer extends DefaultAsyncProducer {
+    final AsyncProcessor processor;
+
+    public KnativeProducer(Endpoint endpoint, Processor processor, Processor... processors) throws Exception {
+        super(endpoint);
+
+        List<Processor> elements = new ArrayList<>(1 + processors.length);
+        elements.add(processor);
+        Collections.addAll(elements, processors);
+
+        ExtendedCamelContext ecc = getEndpoint().getCamelContext().adapt(ExtendedCamelContext.class);
+        Processor pipeline = ecc.getProcessorFactory().createProcessor(ecc, "Pipeline", new Object[] { elements });
+
+        this.processor = AsyncProcessorConverterHelper.convert(pipeline);
+    }
+
+    @Override
+    public boolean process(Exchange exchange, AsyncCallback callback) {
+        return processor.process(exchange, callback);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        ServiceHelper.startService(processor);
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        ServiceHelper.stopService(processor);
+    }
+
+    @Override
+    protected void doSuspend() throws Exception {
+        ServiceHelper.suspendService(processor);
+    }
+
+    @Override
+    protected void doResume() throws Exception {
+        ServiceHelper.resumeService(processor);
+    }
+
+    @Override
+    protected void doShutdown() throws Exception {
+        ServiceHelper.stopAndShutdownService(processor);
+    }
+}
diff --git a/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/ce/AbstractCloudEventProcessor.java b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/ce/AbstractCloudEventProcessor.java
new file mode 100644
index 0000000..f383cf2
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/ce/AbstractCloudEventProcessor.java
@@ -0,0 +1,139 @@
+/*
+ * 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.knative.ce;
+
+import java.io.InputStream;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Supplier;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.component.cloudevents.CloudEvent;
+import org.apache.camel.component.knative.KnativeEndpoint;
+import org.apache.camel.component.knative.spi.Knative;
+import org.apache.camel.component.knative.spi.KnativeResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+abstract class AbstractCloudEventProcessor implements CloudEventProcessor {
+    private final CloudEvent cloudEvent;
+
+    protected AbstractCloudEventProcessor(CloudEvent cloudEvent) {
+        this.cloudEvent = cloudEvent;
+    }
+
+    @Override
+    public CloudEvent cloudEvent() {
+        return cloudEvent;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public Processor consumer(KnativeEndpoint endpoint, KnativeResource service) {
+        return exchange -> {
+            if (Objects.equals(exchange.getIn().getHeader(Exchange.CONTENT_TYPE), Knative.MIME_BATCH_CONTENT_MODE)) {
+                throw new UnsupportedOperationException("Batched CloudEvents are not yet supported");
+            }
+
+            if (!Objects.equals(exchange.getIn().getHeader(Exchange.CONTENT_TYPE), Knative.MIME_STRUCTURED_CONTENT_MODE)) {
+                final Map<String, Object> headers = exchange.getIn().getHeaders();
+
+                for (CloudEvent.Attribute attribute : cloudEvent.attributes()) {
+                    Object val = headers.remove(attribute.http());
+                    if (val != null) {
+                        headers.put(attribute.id(), val);
+                    }
+                }
+            } else {
+                try (InputStream is = exchange.getIn().getBody(InputStream.class)) {
+                    decodeStructuredContent(exchange, Knative.MAPPER.readValue(is, Map.class));
+                }
+            }
+        };
+    }
+
+    protected abstract void decodeStructuredContent(Exchange exchange, Map<String, Object> content);
+
+    @Override
+    public Processor producer(KnativeEndpoint endpoint, KnativeResource service) {
+        final CloudEvent ce = cloudEvent();
+        final Logger logger = LoggerFactory.getLogger(getClass());
+        final String contentType = service.getContentType();
+
+        return exchange -> {
+            final Map<String, Object> headers = exchange.getMessage().getHeaders();
+
+            for (CloudEvent.Attribute attribute : ce.attributes()) {
+                Object value = headers.get(attribute.id());
+                if (value != null) {
+                    headers.putIfAbsent(attribute.http(), value);
+                }
+            }
+
+            if (contentType != null) {
+                headers.putIfAbsent(Exchange.CONTENT_TYPE, contentType);
+            }
+
+            //
+            // in case of events, if the type of the event is defined as URI param so we need
+            // to override it to avoid the event type be overridden by Messages's headers
+            //
+            if (endpoint.getType() == Knative.Type.event && endpoint.getTypeId() != null) {
+                final Object eventType = headers.get(CloudEvent.CAMEL_CLOUD_EVENT_TYPE);
+                if (eventType != null) {
+                    logger.debug(
+                            "Detected the presence of {} header with value {}: it will be ignored and replaced by value set as uri parameter {}",
+                            CloudEvent.CAMEL_CLOUD_EVENT_TYPE,
+                            eventType,
+                            endpoint.getTypeId());
+                }
+
+                headers.put(cloudEvent().mandatoryAttribute(CloudEvent.CAMEL_CLOUD_EVENT_TYPE).http(), endpoint.getTypeId());
+            } else {
+                setCloudEventHeader(headers, CloudEvent.CAMEL_CLOUD_EVENT_TYPE, () -> {
+                    String eventType = service.getCloudEventType();
+                    if (eventType == null) {
+                        eventType = endpoint.getConfiguration().getCloudEventsType();
+                    }
+                    return eventType;
+                });
+            }
+
+            setCloudEventHeader(headers, CloudEvent.CAMEL_CLOUD_EVENT_ID, exchange::getExchangeId);
+            setCloudEventHeader(headers, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE, exchange::getFromRouteId);
+            setCloudEventHeader(headers, CloudEvent.CAMEL_CLOUD_EVENT_VERSION, ce::version);
+            setCloudEventHeader(headers, CloudEvent.CAMEL_CLOUD_EVENT_TIME, () -> {
+                final ZonedDateTime created
+                        = ZonedDateTime.ofInstant(Instant.ofEpochMilli(exchange.getCreated()), ZoneId.systemDefault());
+                final String eventTime = DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(created);
+
+                return eventTime;
+            });
+
+            headers.putAll(service.getCeOverrides());
+        };
+    }
+
+    protected void setCloudEventHeader(Map<String, Object> headers, String id, Supplier<Object> supplier) {
+        headers.putIfAbsent(cloudEvent().mandatoryAttribute(id).http(), supplier.get());
+    }
+}
diff --git a/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/ce/CloudEventProcessor.java b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/ce/CloudEventProcessor.java
new file mode 100644
index 0000000..8a96085
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/ce/CloudEventProcessor.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.knative.ce;
+
+import org.apache.camel.Processor;
+import org.apache.camel.component.cloudevents.CloudEvent;
+import org.apache.camel.component.knative.KnativeEndpoint;
+import org.apache.camel.component.knative.spi.KnativeResource;
+
+public interface CloudEventProcessor {
+    CloudEvent cloudEvent();
+
+    Processor consumer(KnativeEndpoint endpoint, KnativeResource service);
+
+    Processor producer(KnativeEndpoint endpoint, KnativeResource service);
+}
diff --git a/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/ce/CloudEventProcessors.java b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/ce/CloudEventProcessors.java
new file mode 100644
index 0000000..10dfff8
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/main/java/org/apache/camel/component/knative/ce/CloudEventProcessors.java
@@ -0,0 +1,120 @@
+/*
+ * 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.knative.ce;
+
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.component.cloudevents.CloudEvent;
+import org.apache.camel.component.cloudevents.CloudEvents;
+import org.apache.camel.component.knative.KnativeEndpoint;
+import org.apache.camel.component.knative.spi.KnativeResource;
+
+import static org.apache.camel.util.ObjectHelper.ifNotEmpty;
+
+public enum CloudEventProcessors implements CloudEventProcessor {
+
+    v1_0(new AbstractCloudEventProcessor(CloudEvents.v1_0) {
+        @Override
+        protected void decodeStructuredContent(Exchange exchange, Map<String, Object> content) {
+            final CloudEvent ce = cloudEvent();
+            final Message message = exchange.getIn();
+
+            // body
+            ifNotEmpty(content.remove("data"), message::setBody);
+
+            ifNotEmpty(content.remove(ce.mandatoryAttribute(CloudEvent.CAMEL_CLOUD_EVENT_DATA_CONTENT_TYPE).json()), val -> {
+                message.setHeader(Exchange.CONTENT_TYPE, val);
+            });
+
+            for (CloudEvent.Attribute attribute : ce.attributes()) {
+                ifNotEmpty(content.remove(attribute.json()), val -> {
+                    message.setHeader(attribute.id(), val);
+                });
+            }
+
+            //
+            // Map every remaining field as it is (extensions).
+            //
+            content.forEach((key, val) -> {
+                message.setHeader(key.toLowerCase(Locale.US), val);
+            });
+        }
+    }),
+    v1_0_1(new AbstractCloudEventProcessor(CloudEvents.v1_0_1) {
+        @Override
+        protected void decodeStructuredContent(Exchange exchange, Map<String, Object> content) {
+            final CloudEvent ce = cloudEvent();
+            final Message message = exchange.getIn();
+
+            // body
+            ifNotEmpty(content.remove("data"), message::setBody);
+
+            ifNotEmpty(content.remove(ce.mandatoryAttribute(CloudEvent.CAMEL_CLOUD_EVENT_DATA_CONTENT_TYPE).json()), val -> {
+                message.setHeader(Exchange.CONTENT_TYPE, val);
+            });
+
+            for (CloudEvent.Attribute attribute : ce.attributes()) {
+                ifNotEmpty(content.remove(attribute.json()), val -> {
+                    message.setHeader(attribute.id(), val);
+                });
+            }
+
+            //
+            // Map every remaining field as it is (extensions).
+            //
+            content.forEach((key, val) -> {
+                message.setHeader(key.toLowerCase(Locale.US), val);
+            });
+        }
+    });
+
+    private final CloudEventProcessor instance;
+
+    CloudEventProcessors(CloudEventProcessor instance) {
+        this.instance = instance;
+    }
+
+    @Override
+    public CloudEvent cloudEvent() {
+        return instance.cloudEvent();
+    }
+
+    @Override
+    public Processor consumer(KnativeEndpoint endpoint, KnativeResource service) {
+        return instance.consumer(endpoint, service);
+    }
+
+    @Override
+    public Processor producer(KnativeEndpoint endpoint, KnativeResource service) {
+        return instance.producer(endpoint, service);
+    }
+
+    public static CloudEventProcessor fromSpecVersion(String version) {
+        for (CloudEventProcessor processor : CloudEventProcessors.values()) {
+            if (Objects.equals(processor.cloudEvent().version(), version)) {
+                return processor;
+            }
+        }
+
+        throw new IllegalArgumentException("Unable to find an implementation fo CloudEvents spec: " + version);
+    }
+}
diff --git a/components/camel-knative/camel-knative-component/src/test/java/org/apache/camel/component/knative/KnativeComponentTest.java b/components/camel-knative/camel-knative-component/src/test/java/org/apache/camel/component/knative/KnativeComponentTest.java
new file mode 100644
index 0000000..cd55f78
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/test/java/org/apache/camel/component/knative/KnativeComponentTest.java
@@ -0,0 +1,107 @@
+/*
+ * 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.knative;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.knative.spi.Knative;
+import org.apache.camel.component.knative.spi.KnativeEnvironment;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+import static org.apache.camel.component.knative.spi.KnativeEnvironment.mandatoryLoadFromResource;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class KnativeComponentTest {
+
+    private CamelContext context;
+
+    // **************************
+    //
+    // Setup
+    //
+    // **************************
+
+    @BeforeEach
+    public void before() {
+        this.context = new DefaultCamelContext();
+    }
+
+    @AfterEach
+    public void after() throws Exception {
+        if (this.context != null) {
+            this.context.stop();
+        }
+    }
+
+    // **************************
+    //
+    // Common Tests
+    //
+    // **************************
+
+    @ParameterizedTest
+    @ValueSource(strings = { "classpath:/environment.json", "classpath:/environment_classic.json" })
+    void testLoadEnvironment(String resource) throws Exception {
+        KnativeEnvironment env = mandatoryLoadFromResource(context, resource);
+
+        assertThat(env.stream()).hasSize(3);
+        assertThat(env.stream()).anyMatch(s -> s.getType() == Knative.Type.channel);
+        assertThat(env.stream()).anyMatch(s -> s.getType() == Knative.Type.endpoint);
+
+        KnativeComponent component = new KnativeComponent();
+        component.setEnvironment(env);
+        component.setConsumerFactory(new KnativeTransportNoop());
+        component.setProducerFactory(new KnativeTransportNoop());
+
+        context.getRegistry().bind("ereg", KnativeEnvironmentSupport.endpoint(Knative.EndpointKind.source, "ereg", null));
+        context.getRegistry().bind("creg", KnativeEnvironmentSupport.channel(Knative.EndpointKind.source, "creg", null));
+        context.addComponent("knative", component);
+
+        //
+        // Channels
+        //
+        {
+            KnativeEndpoint endpoint = context.getEndpoint("knative:channel/c1", KnativeEndpoint.class);
+            assertThat(endpoint.lookupServiceDefinition("c1", Knative.EndpointKind.source)).isPresent();
+            assertThat(endpoint.lookupServiceDefinition("e1", Knative.EndpointKind.source)).isNotPresent();
+            assertThat(endpoint.lookupServiceDefinition("c1", Knative.EndpointKind.source)).isPresent().get()
+                    .hasFieldOrPropertyWithValue("url", "http://localhost:8081");
+        }
+        {
+            KnativeEndpoint endpoint = context.getEndpoint("knative:channel/creg", KnativeEndpoint.class);
+            assertThat(endpoint.lookupServiceDefinition("creg", Knative.EndpointKind.source)).isPresent();
+        }
+
+        //
+        // Endpoints
+        //
+        {
+            KnativeEndpoint endpoint = context.getEndpoint("knative:endpoint/e1", KnativeEndpoint.class);
+            assertThat(endpoint.lookupServiceDefinition("e1", Knative.EndpointKind.source)).isPresent();
+            assertThat(endpoint.lookupServiceDefinition("c1", Knative.EndpointKind.source)).isNotPresent();
+            assertThat(endpoint.lookupServiceDefinition("e1", Knative.EndpointKind.source)).isPresent().get()
+                    .hasFieldOrPropertyWithValue("url", "http://localhost:9001");
+        }
+        {
+            KnativeEndpoint endpoint = context.getEndpoint("knative:endpoint/ereg", KnativeEndpoint.class);
+            assertThat(endpoint.lookupServiceDefinition("ereg", Knative.EndpointKind.source)).isPresent();
+        }
+    }
+}
diff --git a/components/camel-knative/camel-knative-component/src/test/java/org/apache/camel/component/knative/KnativeTransportNoop.java b/components/camel-knative/camel-knative-component/src/test/java/org/apache/camel/component/knative/KnativeTransportNoop.java
new file mode 100644
index 0000000..90af413
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/test/java/org/apache/camel/component/knative/KnativeTransportNoop.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.knative;
+
+import org.apache.camel.Consumer;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.component.knative.spi.KnativeConsumerFactory;
+import org.apache.camel.component.knative.spi.KnativeProducerFactory;
+import org.apache.camel.component.knative.spi.KnativeResource;
+import org.apache.camel.component.knative.spi.KnativeTransportConfiguration;
+import org.apache.camel.support.DefaultConsumer;
+import org.apache.camel.support.DefaultProducer;
+
+public class KnativeTransportNoop implements KnativeConsumerFactory, KnativeProducerFactory {
+    @Override
+    public void start() {
+    }
+
+    @Override
+    public void stop() {
+    }
+
+    @Override
+    public Producer createProducer(Endpoint endpoint, KnativeTransportConfiguration configuration, KnativeResource service) {
+        return new DefaultProducer(endpoint) {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+            }
+        };
+    }
+
+    @Override
+    public Consumer createConsumer(
+            Endpoint endpoint, KnativeTransportConfiguration configuration, KnativeResource service, Processor processor) {
+        return new DefaultConsumer(endpoint, processor);
+    }
+}
diff --git a/components/camel-knative/camel-knative-component/src/test/resources/environment.json b/components/camel-knative/camel-knative-component/src/test/resources/environment.json
new file mode 100644
index 0000000..2c634e4
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/test/resources/environment.json
@@ -0,0 +1,34 @@
+{
+  "resources": [
+    {
+      "type": "channel",
+      "name": "c1",
+      "url": "http://localhost:8081",
+      "metadata": {
+        "service.path": "",
+        "knative.event.type": "",
+        "camel.endpoint.kind": "source"
+      }
+    },
+    {
+      "type": "endpoint",
+      "name": "e1",
+      "url": "http://localhost:9001",
+      "metadata": {
+        "service.path": "",
+        "knative.event.type": "",
+        "camel.endpoint.kind": "source"
+      }
+    },
+    {
+      "type": "endpoint",
+      "name": "default",
+      "url": "http://0.0.0.0:8080",
+      "metadata": {
+        "service.path": "",
+        "knative.event.type": "",
+        "camel.endpoint.kind": "source"
+      }
+    }
+  ]
+}
diff --git a/components/camel-knative/camel-knative-component/src/test/resources/environment_classic.json b/components/camel-knative/camel-knative-component/src/test/resources/environment_classic.json
new file mode 100644
index 0000000..683df58
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/test/resources/environment_classic.json
@@ -0,0 +1,34 @@
+{
+  "services": [
+    {
+      "type": "channel",
+      "name": "c1",
+      "url": "http://localhost:8081",
+      "metadata": {
+        "service.path": "",
+        "knative.event.type": "",
+        "camel.endpoint.kind": "source"
+      }
+    },
+    {
+      "type": "endpoint",
+      "name": "e1",
+      "url": "http://localhost:9001",
+      "metadata": {
+        "service.path": "",
+        "knative.event.type": "",
+        "camel.endpoint.kind": "source"
+      }
+    },
+    {
+      "type": "endpoint",
+      "name": "default",
+      "url": "http://0.0.0.0:8080",
+      "metadata": {
+        "service.path": "",
+        "knative.event.type": "",
+        "camel.endpoint.kind": "source"
+      }
+    }
+  ]
+}
diff --git a/components/camel-knative/camel-knative-component/src/test/resources/log4j2.properties b/components/camel-knative/camel-knative-component/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..570848d
--- /dev/null
+++ b/components/camel-knative/camel-knative-component/src/test/resources/log4j2.properties
@@ -0,0 +1,28 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-knative-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level = INFO
+rootLogger.appenderRef.file.ref = file
diff --git a/components/camel-knative/camel-knative-http/pom.xml b/components/camel-knative/camel-knative-http/pom.xml
new file mode 100644
index 0000000..17bf6fc
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/pom.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-knative-parent</artifactId>
+        <version>3.15.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-knative-http</artifactId>
+    <packaging>jar</packaging>
+    <name>Camel :: Knative HTTP</name>
+    <description>Camel Knative HTTP</description>
+
+    <properties>
+        <firstVersion>3.15.0</firstVersion>
+        <supportLevel>Preview</supportLevel>
+        <label>cloud</label>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-knative</artifactId>
+        </dependency>
+
+        <!-- http client -->
+        <dependency>
+            <groupId>io.vertx</groupId>
+            <artifactId>vertx-web-client</artifactId>
+            <version>${vertx-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.vertx</groupId>
+            <artifactId>vertx-web</artifactId>
+            <version>${vertx-version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-platform-http-vertx</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-http</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.rest-assured</groupId>
+            <artifactId>rest-assured</artifactId>
+            <version>${rest-assured-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+</project>
diff --git a/components/camel-knative/camel-knative-http/src/generated/resources/META-INF/services/org/apache/camel/other.properties b/components/camel-knative/camel-knative-http/src/generated/resources/META-INF/services/org/apache/camel/other.properties
new file mode 100644
index 0000000..0b7dd42
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/generated/resources/META-INF/services/org/apache/camel/other.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+name=knative-http
+groupId=org.apache.camel
+artifactId=camel-knative-http
+version=3.15.0-SNAPSHOT
+projectName=Camel :: Knative HTTP
+projectDescription=Camel Knative HTTP
diff --git a/components/camel-knative/camel-knative-http/src/generated/resources/knative-http.json b/components/camel-knative/camel-knative-http/src/generated/resources/knative-http.json
new file mode 100644
index 0000000..51dd430
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/generated/resources/knative-http.json
@@ -0,0 +1,15 @@
+{
+  "other": {
+    "kind": "other",
+    "name": "knative-http",
+    "title": "Knative Http",
+    "description": "Camel Knative HTTP",
+    "deprecated": false,
+    "firstVersion": "3.15.0",
+    "label": "cloud",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-knative-http",
+    "version": "3.15.0-SNAPSHOT"
+  }
+}
diff --git a/components/camel-knative/camel-knative-http/src/main/docs/knative-http.adoc b/components/camel-knative/camel-knative-http/src/main/docs/knative-http.adoc
new file mode 100644
index 0000000..786fed6
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/main/docs/knative-http.adoc
@@ -0,0 +1,11 @@
+= Knative Http Component
+:doctitle: Knative Http
+:shortname: knative-http
+:artifactid: camel-knative-http
+:description: Camel Knative HTTP
+:since: 3.15
+:supportlevel: Preview
+
+*Since Camel {since}*
+
+HTTP transport for camel-knative component.
diff --git a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpConsumer.java b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpConsumer.java
new file mode 100644
index 0000000..86c2c01
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpConsumer.java
@@ -0,0 +1,353 @@
+/*
+ * 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.knative.http;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
+import java.util.Locale;
+import java.util.Map;
+import java.util.function.Predicate;
+
+import io.vertx.core.Handler;
+import io.vertx.core.buffer.Buffer;
+import io.vertx.core.http.HttpMethod;
+import io.vertx.core.http.HttpServerRequest;
+import io.vertx.core.http.HttpServerResponse;
+import io.vertx.ext.web.Route;
+import io.vertx.ext.web.Router;
+import io.vertx.ext.web.RoutingContext;
+import io.vertx.ext.web.handler.BodyHandler;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.NoTypeConversionAvailableException;
+import org.apache.camel.Processor;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.component.knative.spi.KnativeResource;
+import org.apache.camel.component.knative.spi.KnativeTransportConfiguration;
+import org.apache.camel.spi.HeaderFilterStrategy;
+import org.apache.camel.support.DefaultConsumer;
+import org.apache.camel.support.ExchangeHelper;
+import org.apache.camel.support.MessageHelper;
+import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class KnativeHttpConsumer extends DefaultConsumer {
+    private static final Logger LOGGER = LoggerFactory.getLogger(KnativeHttpConsumer.class);
+
+    private final KnativeTransportConfiguration configuration;
+    private final Predicate<HttpServerRequest> filter;
+    private final KnativeResource resource;
+    private final Router router;
+    private final HeaderFilterStrategy headerFilterStrategy;
+
+    private String basePath;
+    private Route route;
+    private BigInteger maxBodySize;
+    private boolean preallocateBodyBuffer;
+
+    public KnativeHttpConsumer(KnativeTransportConfiguration configuration,
+                               Endpoint endpoint,
+                               KnativeResource resource,
+                               Router router,
+                               Processor processor) {
+        super(endpoint, processor);
+        this.configuration = configuration;
+        this.resource = resource;
+        this.router = router;
+        this.headerFilterStrategy = new KnativeHttpHeaderFilterStrategy();
+        this.filter = KnativeHttpSupport.createFilter(this.configuration.getCloudEvent(), resource);
+        this.preallocateBodyBuffer = true;
+    }
+
+    public String getBasePath() {
+        return basePath;
+    }
+
+    public void setBasePath(String basePath) {
+        this.basePath = basePath;
+    }
+
+    public BigInteger getMaxBodySize() {
+        return maxBodySize;
+    }
+
+    public void setMaxBodySize(BigInteger maxBodySize) {
+        this.maxBodySize = maxBodySize;
+    }
+
+    public boolean isPreallocateBodyBuffer() {
+        return preallocateBodyBuffer;
+    }
+
+    public void setPreallocateBodyBuffer(boolean preallocateBodyBuffer) {
+        this.preallocateBodyBuffer = preallocateBodyBuffer;
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        if (route == null) {
+            String path = resource.getPath();
+            if (ObjectHelper.isEmpty(path)) {
+                path = "/";
+            }
+            if (ObjectHelper.isNotEmpty(basePath)) {
+                path = basePath + path;
+            }
+
+            LOGGER.debug("Creating route for path: {}", path);
+
+            route = router.route(
+                    HttpMethod.POST,
+                    path);
+
+            BodyHandler bodyHandler = BodyHandler.create();
+            bodyHandler.setPreallocateBodyBuffer(this.preallocateBodyBuffer);
+            if (this.maxBodySize != null) {
+                bodyHandler.setBodyLimit(this.maxBodySize.longValueExact());
+            }
+
+            // add body handler
+            route.handler(new Handler<RoutingContext>() {
+                @Override
+                public void handle(RoutingContext event) {
+                    event.request().resume();
+                    bodyHandler.handle(event);
+                }
+            });
+
+            // add knative handler
+            route.handler(routingContext -> {
+                LOGGER.debug("Handling {}", routingContext);
+
+                if (filter.test(routingContext.request())) {
+                    handleRequest(routingContext);
+                } else {
+                    LOGGER.debug("Cannot handle request on {}, next", getEndpoint().getEndpointUri());
+                    routingContext.next();
+                }
+            });
+        }
+
+        super.doStart();
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        if (route != null) {
+            route.remove();
+        }
+
+        super.doStop();
+    }
+
+    @Override
+    protected void doSuspend() throws Exception {
+        if (route != null) {
+            route.disable();
+        }
+    }
+
+    @Override
+    protected void doResume() throws Exception {
+        if (route != null) {
+            route.enable();
+        }
+    }
+
+    private void handleRequest(RoutingContext routingContext) {
+        final HttpServerRequest request = routingContext.request();
+        final Exchange exchange = getEndpoint().createExchange();
+        final Message message = toMessage(request, exchange);
+
+        Buffer payload = routingContext.getBody();
+        if (payload != null) {
+            message.setBody(payload.getBytes());
+        } else {
+            message.setBody(null);
+        }
+
+        // We do not know if any of the processing logic of the route is synchronous or not so we
+        // need to process the request on a thread on the Vert.x worker pool.
+        //
+        // As example the following route may block the Vert.x event loop as the camel-http component
+        // is not async so if the service is scaled-down, the it may take a while to become ready and
+        // the camel-http component blocks until the service becomes available.
+        //
+        // from("knative:event/my.event")
+        //        .to("http://{{env:PROJECT}}.{{env:NAMESPACE}}.svc.cluster.local/service");
+        //
+        routingContext.vertx().executeBlocking(
+                promise -> {
+                    try {
+                        createUoW(exchange);
+                    } catch (Exception e) {
+                        promise.fail(e);
+                        return;
+                    }
+
+                    getAsyncProcessor().process(exchange, c -> {
+                        if (!exchange.isFailed()) {
+                            promise.complete();
+                        } else {
+                            promise.fail(exchange.getException());
+                        }
+                    });
+                },
+                false,
+                result -> {
+                    try {
+                        Throwable failure = null;
+
+                        if (result.succeeded()) {
+                            try {
+                                HttpServerResponse response = toHttpResponse(request, exchange.getMessage());
+                                Buffer body = null;
+
+                                if (request.response().getStatusCode() != 204 && configuration.isReply()) {
+                                    body = computeResponseBody(exchange.getMessage());
+
+                                    String contentType = MessageHelper.getContentType(exchange.getMessage());
+                                    if (contentType != null) {
+                                        response.putHeader(Exchange.CONTENT_TYPE, contentType);
+                                    }
+                                }
+
+                                if (body != null) {
+                                    request.response().end(body);
+                                } else {
+                                    request.response().setStatusCode(204);
+                                    request.response().end();
+                                }
+                            } catch (Exception e) {
+                                failure = e;
+                            }
+                        } else if (result.failed()) {
+                            failure = result.cause();
+                        }
+
+                        if (failure != null) {
+                            getExceptionHandler().handleException(failure);
+                            routingContext.fail(failure);
+                        }
+                    } finally {
+                        doneUoW(exchange);
+                    }
+                });
+    }
+
+    private Message toMessage(HttpServerRequest request, Exchange exchange) {
+        Message message = exchange.getMessage();
+        String path = request.path();
+
+        if (resource.getPath() != null) {
+            String endpointPath = resource.getPath();
+            String matchPath = path.toLowerCase(Locale.US);
+            String match = endpointPath.toLowerCase(Locale.US);
+
+            if (matchPath.startsWith(match)) {
+                path = path.substring(endpointPath.length());
+            }
+        }
+
+        for (Map.Entry<String, String> entry : request.headers().entries()) {
+            if (!headerFilterStrategy.applyFilterToExternalHeaders(entry.getKey(), entry.getValue(), exchange)) {
+                KnativeHttpSupport.appendHeader(message.getHeaders(), entry.getKey(), entry.getValue());
+            }
+        }
+        for (Map.Entry<String, String> entry : request.params().entries()) {
+            if (!headerFilterStrategy.applyFilterToExternalHeaders(entry.getKey(), entry.getValue(), exchange)) {
+                KnativeHttpSupport.appendHeader(message.getHeaders(), entry.getKey(), entry.getValue());
+            }
+        }
+
+        message.setHeader(Exchange.HTTP_PATH, path);
+        message.setHeader(Exchange.HTTP_METHOD, request.method());
+        message.setHeader(Exchange.HTTP_URI, request.uri());
+        message.setHeader(Exchange.HTTP_QUERY, request.query());
+
+        return message;
+    }
+
+    private HttpServerResponse toHttpResponse(HttpServerRequest request, Message message) {
+        final HttpServerResponse response = request.response();
+        final boolean failed = message.getExchange().isFailed();
+        final int defaultCode = failed ? 500 : 200;
+        final int code = message.getHeader(Exchange.HTTP_RESPONSE_CODE, defaultCode, int.class);
+        final TypeConverter tc = message.getExchange().getContext().getTypeConverter();
+
+        response.setStatusCode(code);
+
+        if (configuration.isReply()) {
+            for (Map.Entry<String, Object> entry : message.getHeaders().entrySet()) {
+                final String key = entry.getKey();
+                final Object value = entry.getValue();
+
+                for (Object it : org.apache.camel.support.ObjectHelper.createIterable(value, null)) {
+                    String headerValue = tc.convertTo(String.class, it);
+                    if (headerValue == null) {
+                        continue;
+                    }
+                    if (!headerFilterStrategy.applyFilterToCamelHeaders(key, headerValue, message.getExchange())) {
+                        response.putHeader(key, headerValue);
+                    }
+                }
+            }
+
+            KnativeHttpSupport.remapCloudEventHeaders(configuration.getCloudEvent(), message);
+            if (configuration.isRemoveCloudEventHeadersInReply()) {
+                KnativeHttpSupport.removeCloudEventHeaders(configuration.getCloudEvent(), message);
+            }
+        }
+
+        return response;
+    }
+
+    private Buffer computeResponseBody(Message message) throws NoTypeConversionAvailableException {
+        Object body = message.getBody();
+        Exception exception = message.getExchange().getException();
+
+        if (exception != null) {
+            // we failed due an exception so print it as plain text
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+
+            try {
+                exception.printStackTrace(pw);
+
+                // the body should then be the stacktrace
+                body = sw.toString().getBytes(StandardCharsets.UTF_8);
+                // force content type to be text/plain as that is what the stacktrace is
+                message.setHeader(Exchange.CONTENT_TYPE, "text/plain");
+
+                // and mark the exception as failure handled, as we handled it by returning
+                // it as the response
+                ExchangeHelper.setFailureHandled(message.getExchange());
+            } finally {
+                IOHelper.close(pw, sw);
+            }
+        }
+
+        return body != null
+                ? Buffer.buffer(message.getExchange().getContext().getTypeConverter().mandatoryConvertTo(byte[].class, body))
+                : null;
+    }
+}
diff --git a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpConsumerFactory.java b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpConsumerFactory.java
new file mode 100644
index 0000000..7797c21
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpConsumerFactory.java
@@ -0,0 +1,68 @@
+/*
+ * 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.knative.http;
+
+import java.util.Objects;
+
+import io.vertx.ext.web.Router;
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.Consumer;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Processor;
+import org.apache.camel.component.knative.spi.KnativeConsumerFactory;
+import org.apache.camel.component.knative.spi.KnativeResource;
+import org.apache.camel.component.knative.spi.KnativeTransportConfiguration;
+import org.apache.camel.support.service.ServiceSupport;
+
+public class KnativeHttpConsumerFactory extends ServiceSupport implements CamelContextAware, KnativeConsumerFactory {
+    private Router router;
+    private CamelContext camelContext;
+
+    public Router getRouter() {
+        return router;
+    }
+
+    public KnativeHttpConsumerFactory setRouter(Router router) {
+        this.router = router;
+        return this;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public Consumer createConsumer(
+            Endpoint endpoint, KnativeTransportConfiguration config, KnativeResource service, Processor processor) {
+        Objects.requireNonNull(this.router, "router");
+
+        return new KnativeHttpConsumer(
+                config,
+                endpoint,
+                service,
+                this.router,
+                processor);
+    }
+
+}
diff --git a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpHeaderFilterStrategy.java b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpHeaderFilterStrategy.java
new file mode 100644
index 0000000..db3d165
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpHeaderFilterStrategy.java
@@ -0,0 +1,48 @@
+/*
+ * 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.knative.http;
+
+import org.apache.camel.support.DefaultHeaderFilterStrategy;
+
+public class KnativeHttpHeaderFilterStrategy extends DefaultHeaderFilterStrategy {
+    public KnativeHttpHeaderFilterStrategy() {
+        initialize();
+    }
+
+    protected final void initialize() {
+        getOutFilter().add("content-length");
+        getOutFilter().add("content-type");
+        getOutFilter().add("host");
+        // Add the filter for the Generic Message header
+        // http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.5
+        getOutFilter().add("cache-control");
+        getOutFilter().add("connection");
+        getOutFilter().add("date");
+        getOutFilter().add("pragma");
+        getOutFilter().add("trailer");
+        getOutFilter().add("transfer-encoding");
+        getOutFilter().add("upgrade");
+        getOutFilter().add("via");
+        getOutFilter().add("warning");
+
+        setLowerCase(true);
+
+        // filter headers begin with "Camel" or "org.apache.camel"
+        // must ignore case for Http based transports
+        setOutFilterPattern("(?i)(Camel|org\\.apache\\.camel)[\\.|a-z|A-z|0-9]*");
+    }
+}
diff --git a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducer.java b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducer.java
new file mode 100644
index 0000000..abdeb3e
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducer.java
@@ -0,0 +1,205 @@
+/*
+ * 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.knative.http;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Map;
+
+import io.vertx.core.MultiMap;
+import io.vertx.core.Vertx;
+import io.vertx.core.buffer.Buffer;
+import io.vertx.core.http.HttpHeaders;
+import io.vertx.ext.web.client.HttpResponse;
+import io.vertx.ext.web.client.WebClient;
+import io.vertx.ext.web.client.WebClientOptions;
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.CamelException;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.InvalidPayloadException;
+import org.apache.camel.Message;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.knative.spi.KnativeResource;
+import org.apache.camel.spi.HeaderFilterStrategy;
+import org.apache.camel.support.DefaultAsyncProducer;
+import org.apache.camel.support.MessageHelper;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.URISupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class KnativeHttpProducer extends DefaultAsyncProducer {
+    private static final Logger LOGGER = LoggerFactory.getLogger(KnativeHttpProducer.class);
+
+    private final KnativeResource serviceDefinition;
+    private final Vertx vertx;
+    private final WebClientOptions clientOptions;
+    private final HeaderFilterStrategy headerFilterStrategy;
+
+    private String uri;
+    private String host;
+    private WebClient client;
+
+    public KnativeHttpProducer(
+                               Endpoint endpoint,
+                               KnativeResource serviceDefinition,
+                               Vertx vertx,
+                               WebClientOptions clientOptions) {
+        super(endpoint);
+
+        this.serviceDefinition = serviceDefinition;
+        this.vertx = ObjectHelper.notNull(vertx, "vertx");
+        this.clientOptions = ObjectHelper.supplyIfEmpty(clientOptions, WebClientOptions::new);
+        this.headerFilterStrategy = new KnativeHttpHeaderFilterStrategy();
+    }
+
+    @Override
+    public boolean process(Exchange exchange, AsyncCallback callback) {
+        if (exchange.getMessage().getBody() == null) {
+            exchange.setException(new IllegalArgumentException("body must not be null"));
+            callback.done(true);
+
+            return true;
+        }
+
+        final byte[] payload;
+
+        try {
+            payload = exchange.getMessage().getMandatoryBody(byte[].class);
+        } catch (InvalidPayloadException e) {
+            exchange.setException(e);
+            callback.done(true);
+
+            return true;
+        }
+
+        MultiMap headers = MultiMap.caseInsensitiveMultiMap();
+        headers.add(HttpHeaders.CONTENT_LENGTH, Integer.toString(payload.length));
+        headers.add(HttpHeaders.HOST, this.host);
+
+        String contentType = MessageHelper.getContentType(exchange.getMessage());
+        if (contentType != null) {
+            headers.add(HttpHeaders.CONTENT_TYPE, contentType);
+        }
+
+        for (Map.Entry<String, Object> entry : exchange.getMessage().getHeaders().entrySet()) {
+            if (!headerFilterStrategy.applyFilterToCamelHeaders(entry.getKey(), entry.getValue(), exchange)) {
+                headers.add(entry.getKey(), entry.getValue().toString());
+            }
+        }
+
+        client.postAbs(this.uri)
+                .putHeaders(headers)
+                .sendBuffer(Buffer.buffer(payload), response -> {
+                    if (response.succeeded()) {
+                        HttpResponse<Buffer> result = response.result();
+                        Message answer = exchange.getMessage();
+
+                        answer.setHeader(Exchange.HTTP_RESPONSE_CODE, result.statusCode());
+
+                        for (Map.Entry<String, String> entry : result.headers().entries()) {
+                            if (!headerFilterStrategy.applyFilterToExternalHeaders(entry.getKey(), entry.getValue(),
+                                    exchange)) {
+                                answer.setHeader(entry.getKey(), entry.getValue());
+                            }
+                        }
+
+                        if (result.body() != null) {
+                            answer.setBody(result.body().getBytes());
+                        } else {
+                            answer.setBody(null);
+                        }
+
+                        if (result.statusCode() < 200 || result.statusCode() >= 300) {
+                            String exceptionMessage = String.format(
+                                    "HTTP operation failed invoking %s with statusCode: %d, statusMessage: %s",
+                                    URISupport.sanitizeUri(this.uri),
+                                    result.statusCode(),
+                                    result.statusMessage());
+
+                            exchange.setException(new CamelException(exceptionMessage));
+                        }
+
+                        answer.setHeader(Exchange.HTTP_RESPONSE_CODE, result.statusCode());
+                    } else if (response.failed()) {
+                        String exceptionMessage = "HTTP operation failed invoking " + URISupport.sanitizeUri(this.uri);
+                        if (response.result() != null) {
+                            exceptionMessage += " with statusCode: " + response.result().statusCode();
+                        }
+
+                        exchange.setException(new CamelException(exceptionMessage));
+                    }
+
+                    callback.done(false);
+                });
+
+        return false;
+    }
+
+    @Override
+    protected void doInit() throws Exception {
+        this.uri = getUrl(serviceDefinition);
+        this.host = getHost(serviceDefinition);
+        this.client = WebClient.create(vertx, clientOptions);
+
+        super.doInit();
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        super.doStop();
+
+        if (this.client != null) {
+            LOGGER.debug("Shutting down client: {}", client);
+            this.client.close();
+            this.client = null;
+        }
+    }
+
+    private String getUrl(KnativeResource definition) {
+        String url = definition.getUrl();
+        if (url == null) {
+            throw new RuntimeCamelException("Unable to determine the `url` for definition: " + definition);
+        }
+
+        String path = definition.getPath();
+        if (path != null) {
+            if (path.charAt(0) != '/') {
+                path = "/" + path;
+            }
+            if (url.endsWith("/")) {
+                url = url.substring(0, url.length() - 1);
+            }
+
+            url += path;
+        }
+
+        return getEndpoint().getCamelContext().resolvePropertyPlaceholders(url);
+    }
+
+    private String getHost(KnativeResource definition) {
+        String url = getUrl(definition);
+
+        try {
+            return new URL(url).getHost();
+        } catch (MalformedURLException e) {
+            throw new RuntimeCamelException("Unable to determine `host` for definition: " + definition, e);
+        }
+    }
+
+}
diff --git a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducerFactory.java b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducerFactory.java
new file mode 100644
index 0000000..ec5e907
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducerFactory.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.knative.http;
+
+import java.util.Objects;
+
+import io.vertx.core.Vertx;
+import io.vertx.ext.web.client.WebClientOptions;
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Producer;
+import org.apache.camel.component.knative.spi.KnativeProducerFactory;
+import org.apache.camel.component.knative.spi.KnativeResource;
+import org.apache.camel.component.knative.spi.KnativeTransportConfiguration;
+import org.apache.camel.support.service.ServiceSupport;
+
+public class KnativeHttpProducerFactory extends ServiceSupport implements CamelContextAware, KnativeProducerFactory {
+    private Vertx vertx;
+    private WebClientOptions vertxHttpClientOptions;
+    private CamelContext camelContext;
+
+    public Vertx getVertx() {
+        return vertx;
+    }
+
+    public KnativeHttpProducerFactory setVertx(Vertx vertx) {
+        this.vertx = vertx;
+        return this;
+    }
+
+    public WebClientOptions getClientOptions() {
+        return vertxHttpClientOptions;
+    }
+
+    public void setClientOptions(WebClientOptions vertxHttpClientOptions) {
+        this.vertxHttpClientOptions = vertxHttpClientOptions;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public Producer createProducer(Endpoint endpoint, KnativeTransportConfiguration config, KnativeResource service) {
+        Objects.requireNonNull(this.vertx, "vertx");
+
+        return new KnativeHttpProducer(
+                endpoint,
+                service,
+                this.vertx,
+                this.vertxHttpClientOptions);
+    }
+}
diff --git a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpSupport.java b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpSupport.java
new file mode 100644
index 0000000..706bf83
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpSupport.java
@@ -0,0 +1,120 @@
+/*
+ * 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.knative.http;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Predicate;
+
+import io.vertx.core.http.HttpServerRequest;
+import org.apache.camel.Message;
+import org.apache.camel.component.cloudevents.CloudEvent;
+import org.apache.camel.component.knative.spi.KnativeResource;
+
+public final class KnativeHttpSupport {
+    private KnativeHttpSupport() {
+    }
+
+    @SuppressWarnings("unchecked")
+    public static void appendHeader(Map<String, Object> headers, String key, Object value) {
+        if (headers.containsKey(key)) {
+            Object existing = headers.get(key);
+            List<Object> list;
+            if (existing instanceof List) {
+                list = (List<Object>) existing;
+            } else {
+                list = new ArrayList<>();
+                list.add(existing);
+            }
+            list.add(value);
+            value = list;
+        }
+
+        headers.put(key, value);
+    }
+
+    public static Predicate<HttpServerRequest> createFilter(CloudEvent cloudEvent, KnativeResource resource) {
+        final Map<String, String> filters = new HashMap<>();
+
+        for (Map.Entry<String, String> entry : resource.getFilters().entrySet()) {
+            cloudEvent.attribute(entry.getKey())
+                    .map(CloudEvent.Attribute::http)
+                    .ifPresentOrElse(
+                            k -> filters.put(k, entry.getValue()),
+                            () -> filters.put(entry.getKey(), entry.getValue()));
+        }
+
+        return new Predicate<HttpServerRequest>() {
+            @Override
+            public boolean test(HttpServerRequest request) {
+                if (filters.isEmpty()) {
+                    return true;
+                }
+
+                for (Map.Entry<String, String> entry : filters.entrySet()) {
+                    final List<String> values = request.headers().getAll(entry.getKey());
+                    if (values.isEmpty()) {
+                        return false;
+                    }
+
+                    String val = values.get(values.size() - 1);
+                    int idx = val.lastIndexOf(',');
+
+                    if (values.size() == 1 && idx != -1) {
+                        val = val.substring(idx + 1);
+                        val = val.trim();
+                    }
+
+                    boolean matches = Objects.equals(entry.getValue(), val) || val.matches(entry.getValue());
+                    if (!matches) {
+                        return false;
+                    }
+                }
+
+                return true;
+            }
+        };
+    }
+
+    /**
+     * Removes cloud event headers at the end of the processing.
+     */
+    public static void removeCloudEventHeaders(CloudEvent ce, Message message) {
+        // remove CloudEvent headers
+        for (CloudEvent.Attribute attr : ce.attributes()) {
+            message.removeHeader(attr.http());
+            message.removeHeader(attr.id());
+        }
+    }
+
+    /**
+     * Remap camel headers to cloud event http headers.
+     */
+    public static void remapCloudEventHeaders(CloudEvent ce, Message message) {
+        // remap CloudEvent camel --> http
+        for (CloudEvent.Attribute attr : ce.attributes()) {
+            Object value = message.getHeader(attr.id());
+            if (value != null) {
+                message.setHeader(attr.http(), value);
+            }
+        }
+    }
+
+}
diff --git a/components/camel-knative/camel-knative-http/src/main/resources/META-INF/services/org/apache/camel/knative/transport/http-consumer b/components/camel-knative/camel-knative-http/src/main/resources/META-INF/services/org/apache/camel/knative/transport/http-consumer
new file mode 100644
index 0000000..431636f
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/main/resources/META-INF/services/org/apache/camel/knative/transport/http-consumer
@@ -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.knative.http.KnativeHttpConsumerFactory
\ No newline at end of file
diff --git a/components/camel-knative/camel-knative-http/src/main/resources/META-INF/services/org/apache/camel/knative/transport/http-producer b/components/camel-knative/camel-knative-http/src/main/resources/META-INF/services/org/apache/camel/knative/transport/http-producer
new file mode 100644
index 0000000..897220c
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/main/resources/META-INF/services/org/apache/camel/knative/transport/http-producer
@@ -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.knative.http.KnativeHttpProducerFactory
\ No newline at end of file
diff --git a/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpServer.java b/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpServer.java
new file mode 100644
index 0000000..e368406
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpServer.java
@@ -0,0 +1,237 @@
+/*
+ * 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.knative.http;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import io.vertx.core.Handler;
+import io.vertx.core.Vertx;
+import io.vertx.core.http.HttpServer;
+import io.vertx.core.http.HttpServerRequest;
+import io.vertx.ext.web.Router;
+import io.vertx.ext.web.RoutingContext;
+import io.vertx.ext.web.handler.BodyHandler;
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.platform.http.PlatformHttpConstants;
+import org.apache.camel.support.service.ServiceSupport;
+import org.apache.camel.test.AvailablePortFinder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class KnativeHttpServer extends ServiceSupport {
+    private static final Logger LOGGER = LoggerFactory.getLogger(KnativeHttpServer.class);
+
+    private final CamelContext context;
+    private final String host;
+    private final int port;
+    private final String path;
+    private final BlockingQueue<HttpServerRequest> requests;
+    private final Handler<RoutingContext> handler;
+
+    private Vertx vertx;
+    private Router router;
+    private ExecutorService executor;
+    private HttpServer server;
+
+    public KnativeHttpServer(CamelContext context) {
+        this(context, "localhost", AvailablePortFinder.getNextAvailable(), "/", null);
+    }
+
+    public KnativeHttpServer(CamelContext context, int port) {
+        this(context, "localhost", port, "/", null);
+    }
+
+    public KnativeHttpServer(CamelContext context, int port, Handler<RoutingContext> handler) {
+        this(context, "localhost", port, "/", handler);
+    }
+
+    public KnativeHttpServer(CamelContext context, Handler<RoutingContext> handler) {
+        this(context, "localhost", AvailablePortFinder.getNextAvailable(), "/", handler);
+    }
+
+    public KnativeHttpServer(CamelContext context, String host, int port, String path) {
+        this(context, host, port, path, null);
+    }
+
+    public KnativeHttpServer(CamelContext context, String host, String path) {
+        this(context, host, AvailablePortFinder.getNextAvailable(), path, null);
+    }
+
+    public KnativeHttpServer(CamelContext context, String host, String path, Handler<RoutingContext> handler) {
+        this(context, host, AvailablePortFinder.getNextAvailable(), path, handler);
+    }
+
+    public KnativeHttpServer(CamelContext context, String host, int port, String path, Handler<RoutingContext> handler) {
+        this.context = context;
+        this.host = host;
+        this.port = port;
+        this.path = path;
+        this.requests = new LinkedBlockingQueue<>();
+        this.handler = handler != null
+                ? handler
+                : event -> {
+                    event.response().setStatusCode(200);
+                    event.response().end();
+                };
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public HttpServerRequest poll(int timeout, TimeUnit unit) throws InterruptedException {
+        return requests.poll(timeout, unit);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        this.executor = context.getExecutorServiceManager().newSingleThreadExecutor(this, "knative-http-server");
+        this.vertx = Vertx.vertx();
+        this.server = vertx.createHttpServer();
+        this.router = Router.router(vertx);
+        this.router.route(path)
+                .handler(event -> {
+                    event.request().resume();
+                    BodyHandler.create().handle(event);
+                })
+                .handler(event -> {
+                    this.requests.offer(event.request());
+                    event.next();
+                })
+                .handler(handler);
+
+        CompletableFuture.runAsync(
+                () -> {
+                    CountDownLatch latch = new CountDownLatch(1);
+                    server.requestHandler(router).listen(port, host, result -> {
+                        try {
+                            if (result.failed()) {
+                                LOGGER.warn("Failed to start Vert.x HttpServer on {}:{}, reason: {}",
+                                        host,
+                                        port,
+                                        result.cause().getMessage());
+
+                                throw new RuntimeException(result.cause());
+                            }
+
+                            LOGGER.info("Vert.x HttpServer started on {}:{}", host, port);
+                        } finally {
+                            latch.countDown();
+                        }
+                    });
+
+                    try {
+                        latch.await();
+                    } catch (InterruptedException e) {
+                        throw new RuntimeException(e);
+                    }
+                },
+                executor).toCompletableFuture().join();
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        try {
+            if (server != null) {
+                CompletableFuture.runAsync(
+                        () -> {
+                            CountDownLatch latch = new CountDownLatch(1);
+
+                            // remove the platform-http component
+                            context.removeComponent(PlatformHttpConstants.PLATFORM_HTTP_COMPONENT_NAME);
+
+                            server.close(result -> {
+                                try {
+                                    if (result.failed()) {
+                                        LOGGER.warn("Failed to close Vert.x HttpServer reason: {}",
+                                                result.cause().getMessage());
+
+                                        throw new RuntimeException(result.cause());
+                                    }
+
+                                    LOGGER.info("Vert.x HttpServer stopped");
+                                } finally {
+                                    latch.countDown();
+                                }
+                            });
+
+                            try {
+                                latch.await();
+                            } catch (InterruptedException e) {
+                                throw new RuntimeException(e);
+                            }
+                        },
+                        executor).toCompletableFuture().join();
+            }
+        } finally {
+            this.server = null;
+        }
+
+        if (vertx != null) {
+            Future<?> future = executor.submit(
+                    () -> {
+                        CountDownLatch latch = new CountDownLatch(1);
+
+                        vertx.close(result -> {
+                            try {
+                                if (result.failed()) {
+                                    LOGGER.warn("Failed to close Vert.x reason: {}",
+                                            result.cause().getMessage());
+
+                                    throw new RuntimeException(result.cause());
+                                }
+
+                                LOGGER.info("Vert.x stopped");
+                            } finally {
+                                latch.countDown();
+                            }
+                        });
+
+                        try {
+                            latch.await();
+                        } catch (InterruptedException e) {
+                            throw new RuntimeException(e);
+                        }
+                    });
+
+            try {
+                future.get();
+            } finally {
+                vertx = null;
+            }
+        }
+
+        if (executor != null) {
+            context.getExecutorServiceManager().shutdown(executor);
+            executor = null;
+        }
+    }
+}
diff --git a/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpTest.java b/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpTest.java
new file mode 100644
index 0000000..89d153a
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpTest.java
@@ -0,0 +1,1857 @@
+/*
+ * 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.knative.http;
+
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Map;
+import java.util.Objects;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+import io.restassured.RestAssured;
+import io.restassured.mapper.ObjectMapperType;
+import io.vertx.core.http.HttpServerRequest;
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelException;
+import org.apache.camel.Exchange;
+import org.apache.camel.FailedToStartRouteException;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cloudevents.CloudEvent;
+import org.apache.camel.component.cloudevents.CloudEvents;
+import org.apache.camel.component.knative.KnativeComponent;
+import org.apache.camel.component.knative.KnativeEndpoint;
+import org.apache.camel.component.knative.spi.Knative;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.http.base.HttpOperationFailedException;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.support.service.ServiceHelper;
+import org.apache.camel.test.AvailablePortFinder;
+import org.apache.camel.util.ObjectHelper;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
+
+import static io.restassured.RestAssured.config;
+import static io.restassured.RestAssured.given;
+import static io.restassured.config.EncoderConfig.encoderConfig;
+import static org.apache.camel.component.knative.KnativeEnvironmentSupport.channel;
+import static org.apache.camel.component.knative.KnativeEnvironmentSupport.endpoint;
+import static org.apache.camel.component.knative.KnativeEnvironmentSupport.event;
+import static org.apache.camel.component.knative.KnativeEnvironmentSupport.sourceChannel;
+import static org.apache.camel.component.knative.KnativeEnvironmentSupport.sourceEndpoint;
+import static org.apache.camel.component.knative.KnativeEnvironmentSupport.sourceEvent;
+import static org.apache.camel.component.knative.http.KnativeHttpTestSupport.configureKnativeComponent;
+import static org.apache.camel.component.knative.http.KnativeHttpTestSupport.configurePlatformHttpComponent;
+import static org.apache.camel.component.knative.http.KnativeHttpTestSupport.httpAttribute;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+import static org.hamcrest.Matchers.emptyOrNullString;
+import static org.hamcrest.Matchers.is;
+
+public class KnativeHttpTest {
+
+    private CamelContext context;
+    private ProducerTemplate template;
+    private int platformHttpPort;
+    private String platformHttpHost;
+
+    // **************************
+    //
+    // Setup
+    //
+    // **************************
+
+    @BeforeEach
+    public void before() {
+        this.context = new DefaultCamelContext();
+        this.template = this.context.createProducerTemplate();
+        this.platformHttpHost = "localhost";
+        this.platformHttpPort = AvailablePortFinder.getNextAvailable();
+
+        configurePlatformHttpComponent(context, this.platformHttpPort);
+
+        RestAssured.port = platformHttpPort;
+        RestAssured.config = config().encoderConfig(encoderConfig().appendDefaultContentCharsetToContentTypeIfUndefined(false));
+    }
+
+    @AfterEach
+    public void after() {
+        ServiceHelper.stopService(template);
+
+        if (this.context != null) {
+            this.context.stop();
+        }
+    }
+
+    // **************************
+    //
+    // Tests
+    //
+    // **************************
+
+    @Test
+    void testCreateComponent() {
+        context.start();
+
+        assertThat(context.getComponent("knative")).isInstanceOfSatisfying(KnativeComponent.class, c -> {
+            assertThat(c.getProducerFactory()).isInstanceOf(KnativeHttpProducerFactory.class);
+            assertThat(c.getConsumerFactory()).isInstanceOf(KnativeHttpConsumerFactory.class);
+        });
+    }
+
+    void doTestKnativeSource(CloudEvent ce, String basePath, String path) throws Exception {
+        KnativeComponent component = configureKnativeComponent(
+                context,
+                ce,
+                sourceEndpoint(
+                        "myEndpoint",
+                        Map.of(
+                                Knative.SERVICE_META_PATH, ObjectHelper.supplyIfEmpty(path, () -> "/"),
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        if (ObjectHelper.isNotEmpty(basePath)) {
+            component.getConfiguration().addTransportOptions("basePath", basePath);
+        }
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:endpoint/myEndpoint")
+                    .to("mock:ce");
+        });
+
+        context.start();
+
+        MockEndpoint mock = context.getEndpoint("mock:ce", MockEndpoint.class);
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_VERSION, ce.version());
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, "org.apache.camel.event");
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_SOURCE, "/somewhere");
+        mock.expectedHeaderReceived(Exchange.CONTENT_TYPE, "text/plain");
+        mock.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_TIME));
+        mock.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_ID));
+        mock.expectedBodiesReceived("test");
+        mock.expectedMessageCount(1);
+
+        String targetPath = ObjectHelper.supplyIfEmpty(path, () -> "/");
+        if (ObjectHelper.isNotEmpty(basePath)) {
+            targetPath = basePath + targetPath;
+        }
+
+        given()
+                .body("test")
+                .header(Exchange.CONTENT_TYPE, "text/plain")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                        DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "/somewhere")
+                .when()
+                .post(targetPath)
+                .then()
+                .statusCode(200);
+
+        mock.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testKnativeSource(CloudEvent ce) throws Exception {
+        doTestKnativeSource(ce, null, null);
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testKnativeSourceWithPath(CloudEvent ce) throws Exception {
+        doTestKnativeSource(ce, null, "/a/path");
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testKnativeSourceWithBasePath(CloudEvent ce) throws Exception {
+        doTestKnativeSource(ce, "/base", null);
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testKnativeSourceWithBasePathAndPath(CloudEvent ce) throws Exception {
+        doTestKnativeSource(ce, "/base", "/a/path");
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testInvokeEndpoint(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "myEndpoint",
+                        String.format("http://%s:%d/a/path", platformHttpHost, platformHttpPort),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:source")
+                    .routeId("my-source")
+                    .to("knative:endpoint/myEndpoint");
+            b.from("platform-http:/a/path")
+                    .convertBodyTo(String.class)
+                    .to("mock:ce");
+        });
+
+        context.start();
+
+        MockEndpoint mock = context.getEndpoint("mock:ce", MockEndpoint.class);
+        mock.expectedHeaderReceived(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version());
+        mock.expectedHeaderReceived(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event");
+        mock.expectedHeaderReceived(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "my-source");
+        mock.expectedHeaderReceived(Exchange.CONTENT_TYPE, "text/plain");
+        mock.expectedMessagesMatches(
+                e -> e.getMessage().getHeaders().containsKey(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME)));
+        mock.expectedMessagesMatches(
+                e -> e.getMessage().getHeaders().containsKey(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID)));
+        mock.expectedBodiesReceived("test");
+        mock.expectedMessageCount(1);
+
+        template.sendBody("direct:source", "test");
+
+        mock.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testInvokeEndpointByUrl(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "myEndpoint",
+                        null,
+                        Map.of(
+                                Knative.SERVICE_META_URL, String.format("http://localhost:%d/a/path", platformHttpPort),
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:source")
+                    .routeId("my-source")
+                    .to("knative:endpoint/myEndpoint");
+            b.from("platform-http:/a/path")
+                    .convertBodyTo(String.class)
+                    .to("mock:ce");
+        });
+
+        context.start();
+
+        MockEndpoint mock = context.getEndpoint("mock:ce", MockEndpoint.class);
+        mock.expectedHeaderReceived(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version());
+        mock.expectedHeaderReceived(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event");
+        mock.expectedHeaderReceived(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "my-source");
+        mock.expectedHeaderReceived(Exchange.CONTENT_TYPE, "text/plain");
+        mock.expectedMessagesMatches(
+                e -> e.getMessage().getHeaders().containsKey(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME)));
+        mock.expectedMessagesMatches(
+                e -> e.getMessage().getHeaders().containsKey(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID)));
+        mock.expectedBodiesReceived("test");
+        mock.expectedMessageCount(1);
+
+        template.sendBody("direct:source", "test");
+
+        mock.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testInvokeEndpointByUrlAndPath(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "myEndpoint",
+                        null,
+                        Map.of(
+                                Knative.SERVICE_META_PATH, "/with/subpath",
+                                Knative.SERVICE_META_URL, String.format("http://localhost:%d/a/path", platformHttpPort),
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:source")
+                    .routeId("my-source")
+                    .to("knative:endpoint/myEndpoint");
+            b.from("platform-http:/a/path/with/subpath")
+                    .convertBodyTo(String.class)
+                    .to("mock:ce");
+        });
+
+        context.start();
+
+        MockEndpoint mock = context.getEndpoint("mock:ce", MockEndpoint.class);
+        mock.expectedHeaderReceived(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version());
+        mock.expectedHeaderReceived(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event");
+        mock.expectedHeaderReceived(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "my-source");
+        mock.expectedHeaderReceived(Exchange.CONTENT_TYPE, "text/plain");
+        mock.expectedMessagesMatches(
+                e -> e.getMessage().getHeaders().containsKey(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME)));
+        mock.expectedMessagesMatches(
+                e -> e.getMessage().getHeaders().containsKey(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID)));
+        mock.expectedBodiesReceived("test");
+        mock.expectedMessageCount(1);
+
+        template.sendBody("direct:source", "test");
+
+        mock.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testConsumeStructuredContent(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceEndpoint(
+                        "myEndpoint",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:endpoint/myEndpoint")
+                    .to("mock:ce");
+        });
+
+        context.start();
+
+        MockEndpoint mock = context.getEndpoint("mock:ce", MockEndpoint.class);
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_VERSION, ce.version());
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, "org.apache.camel.event");
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_ID, "myEventID");
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_SOURCE, "/somewhere");
+        mock.expectedHeaderReceived(Exchange.CONTENT_TYPE, "text/plain");
+        mock.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_TIME));
+        mock.expectedBodiesReceived("test");
+        mock.expectedMessageCount(1);
+
+        if (Objects.equals(CloudEvents.v1_0.version(), ce.version())
+                || Objects.equals(CloudEvents.v1_0_1.version(), ce.version())) {
+            given()
+                    .contentType(Knative.MIME_STRUCTURED_CONTENT_MODE)
+                    .body(
+                            Map.of(
+                                    "specversion", ce.version(),
+                                    "type", "org.apache.camel.event",
+                                    "id", "myEventID",
+                                    "time", DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()),
+                                    "source", "/somewhere",
+                                    "datacontenttype", "text/plain",
+                                    "data", "test"),
+                            ObjectMapperType.JACKSON_2)
+                    .when()
+                    .post()
+                    .then()
+                    .statusCode(200);
+        } else {
+            throw new IllegalArgumentException("Unknown CloudEvent spec: " + ce.version());
+        }
+
+        mock.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testConsumeContent(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceEndpoint(
+                        "myEndpoint",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:endpoint/myEndpoint")
+                    .to("mock:ce");
+        });
+
+        context.start();
+
+        MockEndpoint mock = context.getEndpoint("mock:ce", MockEndpoint.class);
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_VERSION, ce.version());
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, "org.apache.camel.event");
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_ID, "myEventID");
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_SOURCE, "/somewhere");
+        mock.expectedHeaderReceived(Exchange.CONTENT_TYPE, "text/plain");
+        mock.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_TIME));
+        mock.expectedBodiesReceived("test");
+        mock.expectedMessageCount(1);
+
+        given()
+                .body("test")
+                .header(Exchange.CONTENT_TYPE, "text/plain")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                        DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "/somewhere")
+                .when()
+                .post()
+                .then()
+                .statusCode(200);
+
+        mock.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testConsumeContentWithFilter(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceEndpoint(
+                        "ep1",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_FILTER_PREFIX + httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "CE1")),
+                sourceEndpoint(
+                        "ep2",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_FILTER_PREFIX + httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE),
+                                "CE2")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:endpoint/ep1")
+                    .convertBodyTo(String.class)
+                    .to("log:ce1?showAll=true&multiline=true")
+                    .to("mock:ce1");
+            b.from("knative:endpoint/ep2")
+                    .convertBodyTo(String.class)
+                    .to("log:ce2?showAll=true&multiline=true")
+                    .to("mock:ce2");
+        });
+
+        context.start();
+
+        MockEndpoint mock1 = context.getEndpoint("mock:ce1", MockEndpoint.class);
+        mock1.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_TIME));
+        mock1.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_VERSION, ce.version());
+        mock1.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, "org.apache.camel.event");
+        mock1.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_ID, "myEventID1");
+        mock1.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_SOURCE, "CE1");
+        mock1.expectedBodiesReceived("test");
+        mock1.expectedMessageCount(1);
+
+        MockEndpoint mock2 = context.getEndpoint("mock:ce2", MockEndpoint.class);
+        mock2.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_TIME));
+        mock2.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_VERSION, ce.version());
+        mock2.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, "org.apache.camel.event");
+        mock2.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_ID, "myEventID2");
+        mock2.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_SOURCE, "CE2");
+        mock2.expectedBodiesReceived("test");
+        mock2.expectedMessageCount(1);
+
+        given()
+                .body("test")
+                .header(Exchange.CONTENT_TYPE, "text/plain")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID1")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                        DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "CE1")
+                .when()
+                .post()
+                .then()
+                .statusCode(200);
+
+        given()
+                .body("test")
+                .header(Exchange.CONTENT_TYPE, "text/plain")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID2")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                        DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "CE2")
+                .when()
+                .post()
+                .then()
+                .statusCode(200);
+
+        mock1.assertIsSatisfied();
+        mock2.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testConsumeContentWithRegExFilter(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceEndpoint(
+                        "ep1",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_FILTER_PREFIX + httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE),
+                                "CE[01234]")),
+                sourceEndpoint(
+                        "ep2",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_FILTER_PREFIX + httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE),
+                                "CE[56789]")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:endpoint/ep1")
+                    .convertBodyTo(String.class)
+                    .to("log:ce1?showAll=true&multiline=true")
+                    .to("mock:ce1");
+            b.from("knative:endpoint/ep2")
+                    .convertBodyTo(String.class)
+                    .to("log:ce2?showAll=true&multiline=true")
+                    .to("mock:ce2");
+        });
+
+        context.start();
+
+        MockEndpoint mock1 = context.getEndpoint("mock:ce1", MockEndpoint.class);
+        mock1.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_TIME));
+        mock1.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_VERSION, ce.version());
+        mock1.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, "org.apache.camel.event");
+        mock1.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_ID, "myEventID1");
+        mock1.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_SOURCE, "CE0");
+        mock1.expectedBodiesReceived("test");
+        mock1.expectedMessageCount(1);
+
+        MockEndpoint mock2 = context.getEndpoint("mock:ce2", MockEndpoint.class);
+        mock2.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_TIME));
+        mock2.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_VERSION, ce.version());
+        mock2.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, "org.apache.camel.event");
+        mock2.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_ID, "myEventID2");
+        mock2.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_SOURCE, "CE5");
+        mock2.expectedBodiesReceived("test");
+        mock2.expectedMessageCount(1);
+
+        given()
+                .body("test")
+                .header(Exchange.CONTENT_TYPE, "text/plain")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID1")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                        DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "CE0")
+                .when()
+                .post()
+                .then()
+                .statusCode(200);
+
+        given()
+                .body("test")
+                .header(Exchange.CONTENT_TYPE, "text/plain")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID2")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                        DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "CE5")
+                .when()
+                .post()
+                .then()
+                .statusCode(200);
+
+        mock1.assertIsSatisfied();
+        mock2.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testConsumeEventContent(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceEvent("default"));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:event/event1")
+                    .convertBodyTo(String.class)
+                    .to("log:ce1?showAll=true&multiline=true")
+                    .to("mock:ce1");
+            b.from("knative:event/event2")
+                    .convertBodyTo(String.class)
+                    .to("log:ce2?showAll=true&multiline=true")
+                    .to("mock:ce2");
+        });
+
+        context.start();
+
+        MockEndpoint mock1 = context.getEndpoint("mock:ce1", MockEndpoint.class);
+        mock1.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_TIME));
+        mock1.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_VERSION, ce.version());
+        mock1.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, "event1");
+        mock1.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_ID, "myEventID1");
+        mock1.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_SOURCE, "CE1");
+        mock1.expectedBodiesReceived("test");
+        mock1.expectedMessageCount(1);
+
+        MockEndpoint mock2 = context.getEndpoint("mock:ce2", MockEndpoint.class);
+        mock2.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_TIME));
+        mock2.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_VERSION, ce.version());
+        mock2.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, "event2");
+        mock2.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_ID, "myEventID2");
+        mock2.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_SOURCE, "CE2");
+        mock2.expectedBodiesReceived("test");
+        mock2.expectedMessageCount(1);
+
+        given()
+                .body("test")
+                .header(Exchange.CONTENT_TYPE, "text/plain")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "event1")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID1")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                        DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "CE1")
+                .when()
+                .post()
+                .then()
+                .statusCode(200);
+
+        given()
+                .body("test")
+                .header(Exchange.CONTENT_TYPE, "text/plain")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "event2")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID2")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                        DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "CE2")
+                .when()
+                .post()
+                .then()
+                .statusCode(200);
+
+        mock1.assertIsSatisfied();
+        mock2.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testReply(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceEndpoint(
+                        "from",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event.from",
+                                Knative.CONTENT_TYPE, "text/plain")),
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "to",
+                        String.format("http://%s:%d", platformHttpHost, platformHttpPort),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event.to",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:endpoint/from")
+                    .convertBodyTo(String.class)
+                    .setBody()
+                    .constant("consumer")
+                    .setHeader(CloudEvent.CAMEL_CLOUD_EVENT_TYPE)
+                    .constant("custom");
+            b.from("direct:source")
+                    .to("knative://endpoint/to")
+                    .log("${body}")
+                    .to("mock:to");
+        });
+
+        MockEndpoint mock = context.getEndpoint("mock:to", MockEndpoint.class);
+        mock.expectedBodiesReceived("consumer");
+        mock.expectedHeaderReceived(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event.to");
+        mock.expectedMessageCount(1);
+
+        context.start();
+        template.sendBody("direct:source", "");
+
+        mock.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testReplyCloudEventHeaders(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceEndpoint(
+                        "from",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")),
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "to",
+                        String.format("http://%s:%d", platformHttpHost, platformHttpPort),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:endpoint/from?replyWithCloudEvent=true")
+                    .convertBodyTo(String.class)
+                    .setBody()
+                    .constant("consumer")
+                    .setHeader(CloudEvent.CAMEL_CLOUD_EVENT_TYPE)
+                    .constant("custom");
+            b.from("direct:source")
+                    .to("knative://endpoint/to")
+                    .log("${body}")
+                    .to("mock:to");
+        });
+
+        MockEndpoint mock = context.getEndpoint("mock:to", MockEndpoint.class);
+        mock.expectedBodiesReceived("consumer");
+        mock.expectedHeaderReceived(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "custom");
+        mock.expectedMessageCount(1);
+
+        context.start();
+        template.sendBody("direct:source", "");
+
+        mock.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testInvokeServiceWithoutUrl(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "test",
+                        null,
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:start")
+                    .to("knative:endpoint/test")
+                    .to("mock:start");
+        });
+
+        assertThatExceptionOfType(FailedToStartRouteException.class)
+                .isThrownBy(context::start)
+                .withCauseExactlyInstanceOf(RuntimeCamelException.class);
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testInvokeNotExistingEndpoint(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "test",
+                        String.format("http://%s:%d", platformHttpHost, platformHttpPort),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:start")
+                    .to("knative:endpoint/test")
+                    .to("mock:start");
+        });
+
+        context.start();
+
+        Exchange exchange = template.request("direct:start", e -> e.getMessage().setBody(""));
+        assertThat(exchange.isFailed()).isTrue();
+        assertThat(exchange.getException()).isInstanceOf(CamelException.class);
+        assertThat(exchange.getException())
+                .hasMessageStartingWith("HTTP operation failed invoking http://localhost:" + platformHttpPort);
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testRemoveConsumer(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceEndpoint(
+                        "ep1",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_FILTER_PREFIX + "h", "h1")),
+                sourceEndpoint(
+                        "ep2",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_FILTER_PREFIX + "h", "h2")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:endpoint/ep1")
+                    .routeId("r1")
+                    .setBody().simple("${routeId}");
+            b.from("knative:endpoint/ep2")
+                    .routeId("r2")
+                    .setBody().simple("${routeId}");
+        });
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:start")
+                    .setHeader("h").body()
+                    .toF("http://localhost:%d", platformHttpPort);
+        });
+
+        context.start();
+
+        assertThat(template.requestBody("direct:start", "h1", String.class)).isEqualTo("r1");
+        assertThat(template.requestBody("direct:start", "h2", String.class)).isEqualTo("r2");
+
+        context.getRouteController().stopRoute("r2");
+
+        assertThat(template.request("direct:start", e -> e.getMessage().setBody("h2"))).satisfies(e -> {
+            assertThat(e.isFailed()).isTrue();
+            assertThat(e.getException()).isInstanceOf(HttpOperationFailedException.class);
+        });
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testAddConsumer(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceEndpoint(
+                        "ep1",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_FILTER_PREFIX + "h", "h1")),
+                sourceEndpoint(
+                        "ep2",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_FILTER_PREFIX + "h", "h2")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:endpoint/ep1")
+                    .routeId("r1")
+                    .setBody().simple("${routeId}");
+        });
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:start")
+                    .setHeader("h").body()
+                    .toF("http://localhost:%d", platformHttpPort);
+        });
+
+        context.start();
+
+        assertThat(template.requestBody("direct:start", "h1", String.class)).isEqualTo("r1");
+        assertThat(template.request("direct:start", e -> e.getMessage().setBody("h2"))).satisfies(e -> {
+            assertThat(e.isFailed()).isTrue();
+            assertThat(e.getException()).isInstanceOf(HttpOperationFailedException.class);
+        });
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:endpoint/ep2")
+                    .routeId("r2")
+                    .setBody().simple("${routeId}");
+        });
+
+        assertThat(template.requestBody("direct:start", "h1", String.class)).isEqualTo("r1");
+        assertThat(template.requestBody("direct:start", "h2", String.class)).isEqualTo("r2");
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testInvokeEndpointWithError(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "ep",
+                        String.format("http://%s:%d", platformHttpHost, platformHttpPort),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:start")
+                    .to("knative:endpoint/ep")
+                    .to("mock:start");
+            b.fromF("platform-http:/")
+                    .routeId("endpoint")
+                    .process(e -> {
+                        throw new RuntimeException("endpoint error");
+                    });
+        });
+
+        context.start();
+
+        Exchange exchange = template.request("direct:start", e -> e.getMessage().setBody(""));
+        assertThat(exchange.isFailed()).isTrue();
+        assertThat(exchange.getException()).isInstanceOf(CamelException.class);
+        assertThat(exchange.getException()).hasMessageStartingWith("HTTP operation failed invoking");
+        assertThat(exchange.getException()).hasMessageContaining("with statusCode: 500, statusMessage: Internal Server Error");
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testEvents(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                event(
+                        Knative.EndpointKind.sink,
+                        "default",
+                        String.format("http://%s:%d", platformHttpHost, platformHttpPort),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")),
+                sourceEvent(
+                        "default",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:source")
+                    .to("knative:event/myEvent");
+            b.from("knative:event/myEvent")
+                    .to("mock:ce");
+        });
+
+        context.start();
+
+        MockEndpoint mock = context.getEndpoint("mock:ce", MockEndpoint.class);
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_VERSION, ce.version());
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, "myEvent");
+        mock.expectedHeaderReceived(Exchange.CONTENT_TYPE, "text/plain");
+        mock.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_TIME));
+        mock.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_ID));
+        mock.expectedBodiesReceived("test");
+        mock.expectedMessageCount(1);
+
+        template.sendBody("direct:source", "test");
+
+        mock.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testEventsNoName(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                event(
+                        Knative.EndpointKind.sink,
+                        "default",
+                        String.format("http://%s:%d", platformHttpHost, platformHttpPort),
+                        Map.of(
+                                Knative.CONTENT_TYPE, "text/plain")),
+                sourceEvent(
+                        "default",
+                        Map.of(
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:source")
+                    .to("knative:event");
+            b.from("knative:event")
+                    .to("mock:ce");
+        });
+
+        context.start();
+
+        MockEndpoint mock = context.getEndpoint("mock:ce", MockEndpoint.class);
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_VERSION, ce.version());
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, "org.apache.camel.event");
+        mock.expectedHeaderReceived(Exchange.CONTENT_TYPE, "text/plain");
+        mock.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_TIME));
+        mock.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_ID));
+        mock.expectedBodiesReceived("test");
+        mock.expectedMessageCount(1);
+
+        template.sendBody("direct:source", "test");
+
+        mock.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testEventsWithResourceRef(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                event(
+                        Knative.EndpointKind.sink,
+                        "default",
+                        String.format("http://%s:%d", platformHttpHost, platformHttpPort),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_OBJECT_KIND, "MyObject",
+                                Knative.KNATIVE_OBJECT_API_VERSION, "v1",
+                                Knative.KNATIVE_OBJECT_NAME, "myName1")),
+                sourceEvent(
+                        "default",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_OBJECT_KIND, "MyOtherObject",
+                                Knative.KNATIVE_OBJECT_API_VERSION, "v2",
+                                Knative.KNATIVE_OBJECT_NAME, "myName2")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:source")
+                    .to("knative:event/myEvent?kind=MyObject&apiVersion=v1&name=myName1");
+            b.from("knative:event/myEvent?kind=MyOtherObject&apiVersion=v2&name=myName2")
+                    .to("mock:ce");
+        });
+
+        context.start();
+
+        assertThat(context.getEndpoint("knative:event/myEvent?kind=MyObject&apiVersion=v1&name=myName1", KnativeEndpoint.class))
+                .satisfies(e -> {
+                    assertThat(e.getType()).isEqualTo(Knative.Type.event);
+                    assertThat(e.getTypeId()).isEqualTo("myEvent");
+                    assertThat(e.getConfiguration().getTypeId()).isEqualTo("myEvent");
+                    assertThat(e.getConfiguration().getName()).isEqualTo("myName1");
+                });
+        assertThat(context.getEndpoint("knative:event/myEvent?kind=MyOtherObject&apiVersion=v2&name=myName2",
+                KnativeEndpoint.class)).satisfies(e -> {
+                    assertThat(e.getType()).isEqualTo(Knative.Type.event);
+                    assertThat(e.getTypeId()).isEqualTo("myEvent");
+                    assertThat(e.getConfiguration().getTypeId()).isEqualTo("myEvent");
+                    assertThat(e.getConfiguration().getName()).isEqualTo("myName2");
+                });
+
+        MockEndpoint mock = context.getEndpoint("mock:ce", MockEndpoint.class);
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_VERSION, ce.version());
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, "myEvent");
+        mock.expectedHeaderReceived(Exchange.CONTENT_TYPE, "text/plain");
+        mock.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_TIME));
+        mock.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_ID));
+        mock.expectedBodiesReceived("test");
+        mock.expectedMessageCount(1);
+
+        template.sendBody("direct:source", "test");
+
+        mock.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testConsumeContentWithResourceRef(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceEndpoint(
+                        "myEndpoint",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_OBJECT_KIND, "MyObject",
+                                Knative.KNATIVE_OBJECT_API_VERSION, "v1",
+                                Knative.KNATIVE_OBJECT_NAME, "myName1")),
+                sourceEndpoint(
+                        "myEndpoint",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_OBJECT_KIND, "MyObject",
+                                Knative.KNATIVE_OBJECT_API_VERSION, "v2",
+                                Knative.KNATIVE_OBJECT_NAME, "myName2")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:endpoint/myEndpoint?kind=MyObject&apiVersion=v2&name=myName2")
+                    .to("mock:ce");
+        });
+
+        context.start();
+
+        assertThat(context.getEndpoint("knative:endpoint/myEndpoint?kind=MyObject&apiVersion=v2&name=myName2",
+                KnativeEndpoint.class)).satisfies(e -> {
+                    assertThat(e.getType()).isEqualTo(Knative.Type.endpoint);
+                    assertThat(e.getTypeId()).isEqualTo("myEndpoint");
+                    assertThat(e.getConfiguration().getTypeId()).isEqualTo("myEndpoint");
+                    assertThat(e.getConfiguration().getName()).isEqualTo("myName2");
+                });
+
+        MockEndpoint mock = context.getEndpoint("mock:ce", MockEndpoint.class);
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_VERSION, ce.version());
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_TYPE, "org.apache.camel.event");
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_ID, "myEventID");
+        mock.expectedHeaderReceived(CloudEvent.CAMEL_CLOUD_EVENT_SOURCE, "/somewhere");
+        mock.expectedHeaderReceived(Exchange.CONTENT_TYPE, "text/plain");
+        mock.expectedMessagesMatches(e -> e.getMessage().getHeaders().containsKey(CloudEvent.CAMEL_CLOUD_EVENT_TIME));
+        mock.expectedBodiesReceived("test");
+        mock.expectedMessageCount(1);
+
+        given()
+                .body("test")
+                .header(Exchange.CONTENT_TYPE, "text/plain")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                        DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "/somewhere")
+                .when()
+                .post()
+                .then()
+                .statusCode(200);
+
+        mock.assertIsSatisfied();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testWrongMethod(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceEndpoint(
+                        "myEndpoint",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:endpoint/myEndpoint")
+                    .to("mock:ce");
+        });
+
+        context.start();
+
+        given()
+                .body("test")
+                .header(Exchange.CONTENT_TYPE, "text/plain")
+                .when()
+                .get()
+                .then()
+                .statusCode(405);
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testNoBody(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "myEndpoint",
+                        String.format("http://%s:%d", platformHttpHost, platformHttpPort),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:start")
+                    .to("knative:endpoint/myEndpoint");
+        });
+
+        context.start();
+
+        Exchange exchange = template.request("direct:start", e -> e.getMessage().setBody(null));
+        assertThat(exchange.isFailed()).isTrue();
+        assertThat(exchange.getException()).isInstanceOf(IllegalArgumentException.class);
+        assertThat(exchange.getException()).hasMessage("body must not be null");
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testNoContent(CloudEvent ce) throws Exception {
+        final KnativeHttpServer server = new KnativeHttpServer(context, event -> {
+            event.response().setStatusCode(204);
+            event.response().end("");
+        });
+
+        configureKnativeComponent(
+                context,
+                ce,
+                channel(
+                        Knative.EndpointKind.source,
+                        "messages",
+                        null,
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")),
+                channel(
+                        Knative.EndpointKind.sink,
+                        "messages",
+                        String.format("http://%s:%d", platformHttpHost, platformHttpPort),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")),
+                channel(
+                        Knative.EndpointKind.sink,
+                        "words",
+                        String.format("http://%s:%d", server.getHost(), server.getPort()),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        try {
+            server.start();
+
+            RouteBuilder.addRoutes(context, b -> {
+                b.from("knative:channel/messages")
+                        .transform().simple("transformed ${body}")
+                        .log("${body}")
+                        .to("knative:channel/words");
+            });
+
+            context.start();
+
+            Exchange exchange = template.request("knative:channel/messages", e -> e.getMessage().setBody("message"));
+            assertThat(exchange.getMessage().getHeaders()).containsEntry(Exchange.HTTP_RESPONSE_CODE, 204);
+            assertThat(exchange.getMessage().getBody()).isNull();
+        } finally {
+            server.stop();
+        }
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testNoReply(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceChannel(
+                        "channel",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:channel/channel?reply=false")
+                    .setBody().constant(Map.of());
+        });
+
+        context.start();
+
+        given()
+                .body("test")
+                .header(Exchange.CONTENT_TYPE, "text/plain")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                        DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "/somewhere")
+                .when()
+                .post()
+                .then()
+                .statusCode(204)
+                .body(is(emptyOrNullString()));
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testNoReplyMeta(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceChannel(
+                        "channel",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_REPLY, "false")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:channel/channel")
+                    .setBody().constant(Map.of());
+        });
+
+        context.start();
+
+        given()
+                .body("test")
+                .header(Exchange.CONTENT_TYPE, "text/plain")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                        DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "/somewhere")
+                .when()
+                .post()
+                .then()
+                .statusCode(204)
+                .body(is(emptyOrNullString()));
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testNoReplyMetaOverride(CloudEvent ce) throws Exception {
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceChannel(
+                        "channel",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_REPLY, "true")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:channel/channel?reply=false")
+                    .setBody().constant(Map.of());
+        });
+
+        context.start();
+
+        given()
+                .body("test")
+                .header(Exchange.CONTENT_TYPE, "text/plain")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID")
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                        DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "/somewhere")
+                .when()
+                .post()
+                .then()
+                .statusCode(204)
+                .body(is(emptyOrNullString()));
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testHeaders(CloudEvent ce) throws Exception {
+        final int port = AvailablePortFinder.getNextAvailable();
+        final KnativeHttpServer server = new KnativeHttpServer(context);
+
+        configureKnativeComponent(
+                context,
+                ce,
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "ep",
+                        String.format("http://%s:%d", server.getHost(), server.getPort()),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:start")
+                    .setHeader("CamelDummyHeader").constant("test")
+                    .to("knative:endpoint/ep")
+                    .to("direct:mock");
+            b.from("direct:mock")
+                    .to("mock:ep");
+        });
+
+        context.start();
+
+        try {
+            MockEndpoint mock = context.getEndpoint("mock:ep", MockEndpoint.class);
+            mock.expectedHeaderReceived("CamelDummyHeader", "test");
+            mock.expectedMessageCount(1);
+
+            server.start();
+
+            template.sendBody("direct:start", "");
+
+            mock.assertIsSatisfied();
+
+            HttpServerRequest request = server.poll(30, TimeUnit.SECONDS);
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION))).isEqualTo(ce.version());
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE)))
+                    .isEqualTo("org.apache.camel.event");
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID))).isNotNull();
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE))).isNotNull();
+            assertThat(request.getHeader(Exchange.CONTENT_TYPE)).isEqualTo("text/plain");
+        } finally {
+            server.stop();
+        }
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testHeadersInReply(CloudEvent ce) throws Exception {
+        final KnativeHttpServer server = new KnativeHttpServer(context);
+
+        configureKnativeComponent(
+                context,
+                ce,
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "ep",
+                        String.format("http://%s:%d", server.getHost(), server.getPort()),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:start")
+                    .setHeader("CamelDummyHeader").constant("test")
+                    .to("knative:endpoint/ep");
+        });
+
+        context.start();
+
+        try {
+            MockEndpoint mock = context.getEndpoint("mock:ep", MockEndpoint.class);
+            mock.expectedHeaderReceived("CamelDummyHeader", "test");
+            mock.expectedMessageCount(1);
+
+            server.start();
+
+            Exchange exchange = template.request("direct:start", e -> e.getMessage().setBody("test"));
+            assertThat(exchange.getMessage().getHeaders()).containsEntry("CamelDummyHeader", "test");
+        } finally {
+            server.stop();
+        }
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testHeadersOverrideFromEnv(CloudEvent ce) throws Exception {
+        final KnativeHttpServer server = new KnativeHttpServer(context);
+        final String typeHeaderKey = httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE);
+        final String typeHeaderVal = UUID.randomUUID().toString();
+        final String sourceHeaderKey = httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE);
+        final String sourceHeaderVal = UUID.randomUUID().toString();
+
+        configureKnativeComponent(
+                context,
+                ce,
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "ep",
+                        String.format("http://%s:%d", server.getHost(), server.getPort()),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain",
+                                Knative.KNATIVE_CE_OVERRIDE_PREFIX + typeHeaderKey, typeHeaderVal,
+                                Knative.KNATIVE_CE_OVERRIDE_PREFIX + sourceHeaderKey, sourceHeaderVal)));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:start")
+                    .to("knative:endpoint/ep");
+        });
+
+        context.start();
+        try {
+            server.start();
+            template.sendBody("direct:start", "");
+
+            HttpServerRequest request = server.poll(30, TimeUnit.SECONDS);
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION))).isEqualTo(ce.version());
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE))).isEqualTo(typeHeaderVal);
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID))).isNotNull();
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE))).isEqualTo(sourceHeaderVal);
+            assertThat(request.getHeader(Exchange.CONTENT_TYPE)).isEqualTo("text/plain");
+        } finally {
+            server.stop();
+        }
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testHeadersOverrideFromURI(CloudEvent ce) throws Exception {
+        final KnativeHttpServer server = new KnativeHttpServer(context);
+        final String typeHeaderKey = httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE);
+        final String typeHeaderVal = UUID.randomUUID().toString();
+        final String sourceHeaderKey = httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE);
+        final String sourceHeaderVal = UUID.randomUUID().toString();
+
+        configureKnativeComponent(
+                context,
+                ce,
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "ep",
+                        String.format("http://%s:%d", server.getHost(), server.getPort()),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:start")
+                    .toF("knative:endpoint/ep?%s=%s&%s=%s",
+                            Knative.KNATIVE_CE_OVERRIDE_PREFIX + typeHeaderKey, typeHeaderVal,
+                            Knative.KNATIVE_CE_OVERRIDE_PREFIX + sourceHeaderKey, sourceHeaderVal);
+        });
+
+        context.start();
+        try {
+            server.start();
+            template.sendBody("direct:start", "");
+
+            HttpServerRequest request = server.poll(30, TimeUnit.SECONDS);
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION))).isEqualTo(ce.version());
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE))).isEqualTo(typeHeaderVal);
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID))).isNotNull();
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE))).isEqualTo(sourceHeaderVal);
+            assertThat(request.getHeader(Exchange.CONTENT_TYPE)).isEqualTo("text/plain");
+        } finally {
+            server.stop();
+        }
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testHeadersOverrideFromConf(CloudEvent ce) throws Exception {
+        final KnativeHttpServer server = new KnativeHttpServer(context);
+        final String typeHeaderKey = httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE);
+        final String typeHeaderVal = UUID.randomUUID().toString();
+        final String sourceHeaderKey = httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE);
+        final String sourceHeaderVal = UUID.randomUUID().toString();
+
+        KnativeComponent component = configureKnativeComponent(
+                context,
+                ce,
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "ep",
+                        String.format("http://%s:%d", server.getHost(), server.getPort()),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        component.getConfiguration().setCeOverride(Map.of(
+                Knative.KNATIVE_CE_OVERRIDE_PREFIX + typeHeaderKey, typeHeaderVal,
+                Knative.KNATIVE_CE_OVERRIDE_PREFIX + sourceHeaderKey, sourceHeaderVal));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:start")
+                    .to("knative:endpoint/ep");
+        });
+
+        context.start();
+        try {
+            server.start();
+            template.sendBody("direct:start", "");
+
+            HttpServerRequest request = server.poll(30, TimeUnit.SECONDS);
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION))).isEqualTo(ce.version());
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE))).isEqualTo(typeHeaderVal);
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID))).isNotNull();
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE))).isEqualTo(sourceHeaderVal);
+            assertThat(request.getHeader(Exchange.CONTENT_TYPE)).isEqualTo("text/plain");
+        } finally {
+            server.stop();
+        }
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testHeadersOverrideFromRouteWithCamelHeader(CloudEvent ce) throws Exception {
+        final KnativeHttpServer server = new KnativeHttpServer(context);
+
+        configureKnativeComponent(
+                context,
+                ce,
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "ep",
+                        String.format("http://%s:%d", server.getHost(), server.getPort()),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:start")
+                    .routeId("my-source")
+                    .setHeader(CloudEvent.CAMEL_CLOUD_EVENT_TYPE).constant("myType")
+                    .to("knative:endpoint/ep");
+        });
+
+        context.start();
+        try {
+            server.start();
+            template.sendBody("direct:start", "");
+
+            HttpServerRequest request = server.poll(30, TimeUnit.SECONDS);
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION))).isEqualTo(ce.version());
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE))).isEqualTo("myType");
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID))).isNotNull();
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE))).isEqualTo("my-source");
+            assertThat(request.getHeader(Exchange.CONTENT_TYPE)).isEqualTo("text/plain");
+        } finally {
+            server.stop();
+        }
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testHeadersOverrideFromRouteWithCEHeader(CloudEvent ce) throws Exception {
+        final KnativeHttpServer server = new KnativeHttpServer(context);
+
+        configureKnativeComponent(
+                context,
+                ce,
+                endpoint(
+                        Knative.EndpointKind.sink,
+                        "ep",
+                        String.format("http://%s:%d", server.getHost(), server.getPort()),
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:start")
+                    .routeId("my-source-x")
+                    .setHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE)).constant("fromCEHeader")
+                    .setHeader(CloudEvent.CAMEL_CLOUD_EVENT_TYPE).constant("fromCamelHeader")
+                    .to("knative:endpoint/ep");
+        });
+
+        context.start();
+        try {
+            server.start();
+            template.sendBody("direct:start", "");
+
+            HttpServerRequest request = server.poll(30, TimeUnit.SECONDS);
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION))).isEqualTo(ce.version());
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE))).isEqualTo("fromCEHeader");
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID))).isNotNull();
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE))).isEqualTo("my-source-x");
+            assertThat(request.getHeader(Exchange.CONTENT_TYPE)).isEqualTo("text/plain");
+        } finally {
+            server.stop();
+        }
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testEventBridge(CloudEvent ce) throws Exception {
+        final KnativeHttpServer server = new KnativeHttpServer(context);
+
+        configureKnativeComponent(
+                context,
+                ce,
+                event(
+                        Knative.EndpointKind.sink,
+                        "event.sink",
+                        String.format("http://%s:%d", server.getHost(), server.getPort()),
+                        Map.of(
+                                Knative.CONTENT_TYPE, "text/plain")),
+                sourceEvent(
+                        "event.source",
+                        Map.of(
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:event/event.source")
+                    .to("knative:event/event.sink");
+        });
+
+        context.start();
+
+        try {
+            server.start();
+
+            given()
+                    .body("test")
+                    .header(Exchange.CONTENT_TYPE, "text/plain")
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "event.source")
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID")
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                            DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "/somewhere")
+                    .when()
+                    .post()
+                    .then()
+                    .statusCode(204);
+
+            HttpServerRequest request = server.poll(30, TimeUnit.SECONDS);
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION))).isEqualTo(ce.version());
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE))).isEqualTo("event.sink");
+            assertThat(request.getHeader(Exchange.CONTENT_TYPE)).isEqualTo("text/plain");
+        } finally {
+            server.stop();
+        }
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testDynamicEventBridge(CloudEvent ce) throws Exception {
+        final KnativeHttpServer server = new KnativeHttpServer(context);
+
+        configureKnativeComponent(
+                context,
+                ce,
+                event(
+                        Knative.EndpointKind.sink,
+                        "default",
+                        String.format("http://%s:%d", server.getHost(), server.getPort()),
+                        Map.of(
+                                Knative.CONTENT_TYPE, "text/plain")),
+                sourceEvent(
+                        "event.source",
+                        Map.of(
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("knative:event/event.source")
+                    .setHeader(CloudEvent.CAMEL_CLOUD_EVENT_TYPE).constant("event.sink")
+                    .to("knative:event");
+        });
+
+        context.start();
+
+        try {
+            server.start();
+
+            given()
+                    .body("test")
+                    .header(Exchange.CONTENT_TYPE, "text/plain")
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "event.source")
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID")
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                            DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "/somewhere")
+                    .when()
+                    .post()
+                    .then()
+                    .statusCode(204);
+
+            HttpServerRequest request = server.poll(30, TimeUnit.SECONDS);
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION))).isEqualTo(ce.version());
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE))).isEqualTo("event.sink");
+            assertThat(request.getHeader(Exchange.CONTENT_TYPE)).isEqualTo("text/plain");
+        } finally {
+            server.stop();
+        }
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testEventDefaultType(CloudEvent ce) throws Exception {
+        final KnativeHttpServer server = new KnativeHttpServer(context);
+
+        configureKnativeComponent(
+                context,
+                ce,
+                event(
+                        Knative.EndpointKind.sink,
+                        "default",
+                        String.format("http://%s:%d", server.getHost(), server.getPort()),
+                        Map.of(
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        RouteBuilder.addRoutes(context, b -> {
+            b.from("direct:start")
+                    .to("knative:event");
+        });
+
+        context.start();
+        try {
+            server.start();
+            template.sendBody("direct:start", "");
+
+            HttpServerRequest request = server.poll(30, TimeUnit.SECONDS);
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION))).isEqualTo(ce.version());
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE)))
+                    .isEqualTo("org.apache.camel.event");
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID))).isNotNull();
+            assertThat(request.getHeader(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE))).isNotNull();
+            assertThat(request.getHeader(Exchange.CONTENT_TYPE)).isEqualTo("text/plain");
+        } finally {
+            server.stop();
+        }
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloudEvents.class)
+    void testSlowConsumer(CloudEvent ce) throws Exception {
+        final KnativeHttpServer server = new KnativeHttpServer(context, event -> {
+            event.vertx().executeBlocking(
+                    promise -> {
+                        try {
+                            Thread.sleep(5000);
+                            promise.complete();
+                        } catch (InterruptedException e) {
+                            promise.fail(e);
+                        }
+                    },
+                    false,
+                    result -> {
+                        event.response().setStatusCode(200);
+                        event.response().end("");
+                    });
+        });
+
+        configureKnativeComponent(
+                context,
+                ce,
+                sourceEndpoint(
+                        "start",
+                        Map.of(
+                                Knative.KNATIVE_CLOUD_EVENT_TYPE, "org.apache.camel.event",
+                                Knative.CONTENT_TYPE, "text/plain")));
+
+        try {
+            server.start();
+
+            RouteBuilder.addRoutes(context, b -> {
+                b.from("knative:endpoint/start")
+                        .removeHeaders("Camel*")
+                        .toF("http://%s:%d", server.getHost(), server.getPort());
+            });
+
+            context.start();
+
+            given()
+                    .body("test")
+                    .header(Exchange.CONTENT_TYPE, "text/plain")
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_VERSION), ce.version())
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TYPE), "org.apache.camel.event")
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_ID), "myEventID")
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_TIME),
+                            DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+                    .header(httpAttribute(ce, CloudEvent.CAMEL_CLOUD_EVENT_SOURCE), "/somewhere")
+                    .when()
+                    .post()
+                    .then()
+                    .statusCode(200);
+        } finally {
+            server.stop();
+        }
+    }
+}
diff --git a/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpTestSupport.java b/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpTestSupport.java
new file mode 100644
index 0000000..2a714b3
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/KnativeHttpTestSupport.java
@@ -0,0 +1,112 @@
+/*
+ * 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.knative.http;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Consumer;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.component.cloudevents.CloudEvent;
+import org.apache.camel.component.knative.KnativeComponent;
+import org.apache.camel.component.knative.spi.KnativeEnvironment;
+import org.apache.camel.component.knative.spi.KnativeResource;
+import org.apache.camel.component.knative.spi.KnativeTransportConfiguration;
+import org.apache.camel.component.platform.http.PlatformHttpComponent;
+import org.apache.camel.component.platform.http.PlatformHttpConstants;
+import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpEngine;
+import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpRouter;
+import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpServer;
+import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpServerConfiguration;
+
+public final class KnativeHttpTestSupport {
+    private KnativeHttpTestSupport() {
+    }
+
+    public static KnativeComponent configureKnativeComponent(
+            CamelContext context, CloudEvent ce, KnativeResource... definitions) {
+        return configureKnativeComponent(context, ce, Arrays.asList(definitions));
+    }
+
+    public static KnativeComponent configureKnativeComponent(
+            CamelContext context, CloudEvent ce, Map<String, Object> properties) {
+        return configureKnativeComponent(context, ce, KnativeEnvironment.mandatoryLoadFromProperties(context, properties));
+    }
+
+    public static KnativeComponent configureKnativeComponent(
+            CamelContext context, CloudEvent ce, List<KnativeResource> definitions) {
+        return configureKnativeComponent(context, ce, new KnativeEnvironment(definitions));
+    }
+
+    public static KnativeComponent configureKnativeComponent(
+            CamelContext context, CloudEvent ce, KnativeEnvironment environment) {
+        KnativeComponent component = context.getComponent("knative", KnativeComponent.class);
+        component.setCloudEventsSpecVersion(ce.version());
+        component.setEnvironment(environment);
+        component.setConsumerFactory(new KnativeHttpConsumerFactory() {
+            @Override
+            public Consumer createConsumer(
+                    Endpoint endpoint, KnativeTransportConfiguration config, KnativeResource service, Processor processor) {
+                this.setRouter(VertxPlatformHttpRouter.lookup(context));
+                return super.createConsumer(endpoint, config, service, processor);
+            }
+        });
+        component.setProducerFactory(new KnativeHttpProducerFactory() {
+            @Override
+            public Producer createProducer(Endpoint endpoint, KnativeTransportConfiguration config, KnativeResource service) {
+                this.setVertx(VertxPlatformHttpRouter.lookup(context).vertx());
+                return super.createProducer(endpoint, config, service);
+            }
+        });
+
+        return component;
+    }
+
+    public static String httpAttribute(CloudEvent ce, String name) {
+        return ce.mandatoryAttribute(name).http();
+    }
+
+    public static void configurePlatformHttpComponent(CamelContext camelContext, int bindPort) {
+        VertxPlatformHttpServerConfiguration configuration = new VertxPlatformHttpServerConfiguration();
+        configuration.setBindPort(bindPort);
+
+        try {
+            camelContext.addService(new VertxPlatformHttpServer(configuration) {
+                @Override
+                protected void doInit() throws Exception {
+                    initializeServer();
+                }
+
+                @Override
+                protected void doStart() throws Exception {
+                    startServer();
+                }
+            });
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        PlatformHttpComponent component = new PlatformHttpComponent(camelContext);
+        component.setEngine(new VertxPlatformHttpEngine());
+
+        camelContext.getRegistry().bind(PlatformHttpConstants.PLATFORM_HTTP_COMPONENT_NAME, component);
+    }
+}
diff --git a/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/assertions/HttpServerRequestAssert.java b/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/assertions/HttpServerRequestAssert.java
new file mode 100644
index 0000000..3666e5e
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/test/java/org/apache/camel/component/knative/http/assertions/HttpServerRequestAssert.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.knative.http.assertions;
+
+import java.util.Objects;
+
+import io.vertx.core.http.HttpServerRequest;
+import org.assertj.core.api.AbstractAssert;
+import org.assertj.core.api.AbstractStringAssert;
+import org.assertj.core.api.AssertionsForClassTypes;
+
+public class HttpServerRequestAssert extends AbstractAssert<HttpServerRequestAssert, HttpServerRequest> {
+    public HttpServerRequestAssert(HttpServerRequest request) {
+        super(request, HttpServerRequest.class);
+    }
+
+    public static HttpServerRequestAssert assertThat(HttpServerRequest actual) {
+        return new HttpServerRequestAssert(actual);
+    }
+
+    public AbstractStringAssert<?> header(String name) {
+        isNotNull();
+
+        return AssertionsForClassTypes.assertThat(actual.getHeader(name));
+    }
+
+    public HttpServerRequestAssert hasHeader(String name) {
+        isNotNull();
+
+        if (Objects.isNull(actual.getHeader(name))) {
+            failWithMessage("Expected header %s not present", name);
+        }
+
+        return this;
+    }
+
+    public HttpServerRequestAssert hasHeader(String name, String value) {
+        isNotNull();
+
+        if (Objects.isNull(actual.getHeader(name))) {
+            failWithMessage("Expected header %s not present", name);
+        }
+
+        if (Objects.equals(actual.getHeader(name), value)) {
+            failWithMessage("Expected header %s to be <%s> but was <%s>", name, value, actual.getHeader(name));
+        }
+
+        return this;
+    }
+}
diff --git a/components/camel-knative/camel-knative-http/src/test/resources/log4j2.properties b/components/camel-knative/camel-knative-http/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..b6b3467
--- /dev/null
+++ b/components/camel-knative/camel-knative-http/src/test/resources/log4j2.properties
@@ -0,0 +1,28 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-knative-http-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level = INFO
+rootLogger.appenderRef.file.ref = file
diff --git a/components/camel-knative/pom.xml b/components/camel-knative/pom.xml
new file mode 100644
index 0000000..5afe98d
--- /dev/null
+++ b/components/camel-knative/pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>3.15.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-knative-parent</artifactId>
+    <packaging>pom</packaging>
+    <name>Camel :: Knative :: Parent</name>
+    <description>Camel Knative parent</description>
+
+    <modules>
+        <module>camel-knative-api</module>
+        <module>camel-knative-component</module>
+        <module>camel-knative-http</module>
+    </modules>
+
+</project>
diff --git a/components/pom.xml b/components/pom.xml
index 3471c86..e1301d6 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -118,6 +118,7 @@
         <module>camel-cdi-jta</module>
         <module>camel-chatscript</module>
         <module>camel-chunk</module>
+        <module>camel-cloudevents</module>
         <module>camel-cm-sms</module>
         <module>camel-cmis</module>
         <module>camel-coap</module>
@@ -139,8 +140,8 @@
         <module>camel-docker</module>
         <module>camel-dozer</module>
         <module>camel-drill</module>
-	<module>camel-dropbox</module>
-	<module>camel-dynamic-router</module>
+	    <module>camel-dropbox</module>
+	    <module>camel-dynamic-router</module>
         <module>camel-ehcache</module>
         <module>camel-elasticsearch-rest</module>
         <module>camel-elsql</module>
@@ -218,6 +219,7 @@
         <module>camel-jta</module>
         <module>camel-kafka</module>
         <module>camel-kamelet</module>
+        <module>camel-knative</module>
         <module>camel-kubernetes</module>
         <module>camel-kudu</module>
         <module>camel-ldap</module>
diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/DefaultProcessorFactory.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/DefaultProcessorFactory.java
index bab084b..da2687a 100644
--- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/DefaultProcessorFactory.java
+++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/DefaultProcessorFactory.java
@@ -18,6 +18,7 @@ package org.apache.camel.processor;
 
 import java.io.IOException;
 import java.util.Collection;
+import java.util.List;
 import java.util.concurrent.ExecutorService;
 
 import org.apache.camel.CamelContext;
@@ -129,6 +130,9 @@ public class DefaultProcessorFactory implements ProcessorFactory, BootstrapClose
             return new MulticastProcessor(
                     camelContext, null, processors, null, true, executor, shutdownExecutorService, false, false, 0,
                     null, false, false);
+        } else if ("Pipeline".equals(definitionName)) {
+            List<Processor> processors = (List<Processor>) args[0];
+            return Pipeline.newInstance(camelContext, processors);
         }
 
         return null;
diff --git a/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties b/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
index 4c9d4af..5306546 100644
--- a/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
+++ b/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
@@ -193,6 +193,7 @@ jsonata
 jt400
 kafka
 kamelet
+knative
 kubernetes-config-maps
 kubernetes-custom-resources
 kubernetes-deployments
diff --git a/docs/components/modules/ROOT/examples/json/knative.json b/docs/components/modules/ROOT/examples/json/knative.json
new file mode 120000
index 0000000..ba4f9cc
--- /dev/null
+++ b/docs/components/modules/ROOT/examples/json/knative.json
@@ -0,0 +1 @@
+../../../../../../components/camel-knative/camel-knative-component/src/generated/resources/org/apache/camel/component/knative/knative.json
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/nav.adoc b/docs/components/modules/ROOT/nav.adoc
index 8e3e0f0..a432179 100644
--- a/docs/components/modules/ROOT/nav.adoc
+++ b/docs/components/modules/ROOT/nav.adoc
@@ -198,6 +198,7 @@
 ** xref:jt400-component.adoc[JT400]
 ** xref:kafka-component.adoc[Kafka]
 ** xref:kamelet-component.adoc[Kamelet]
+** xref:knative-component.adoc[Knative]
 ** xref:kubernetes-summary.adoc[Kubernetes]
 *** xref:kubernetes-config-maps-component.adoc[Kubernetes ConfigMap]
 *** xref:kubernetes-custom-resources-component.adoc[Kubernetes Custom Resources]
diff --git a/docs/components/modules/ROOT/pages/knative-component.adoc b/docs/components/modules/ROOT/pages/knative-component.adoc
new file mode 120000
index 0000000..7b0c1d6
--- /dev/null
+++ b/docs/components/modules/ROOT/pages/knative-component.adoc
@@ -0,0 +1 @@
+../../../../../components/camel-knative/camel-knative-component/src/main/docs/knative-component.adoc
\ No newline at end of file
diff --git a/docs/components/modules/others/examples/json/cloudevents.json b/docs/components/modules/others/examples/json/cloudevents.json
new file mode 120000
index 0000000..7b83ed4
--- /dev/null
+++ b/docs/components/modules/others/examples/json/cloudevents.json
@@ -0,0 +1 @@
+../../../../../../components/camel-cloudevents/src/generated/resources/cloudevents.json
\ No newline at end of file
diff --git a/docs/components/modules/others/examples/json/knative-api.json b/docs/components/modules/others/examples/json/knative-api.json
new file mode 120000
index 0000000..07146c3
--- /dev/null
+++ b/docs/components/modules/others/examples/json/knative-api.json
@@ -0,0 +1 @@
+../../../../../../components/camel-knative/camel-knative-api/src/generated/resources/knative-api.json
\ No newline at end of file
diff --git a/docs/components/modules/others/examples/json/knative-http.json b/docs/components/modules/others/examples/json/knative-http.json
new file mode 120000
index 0000000..464cd92
--- /dev/null
+++ b/docs/components/modules/others/examples/json/knative-http.json
@@ -0,0 +1 @@
+../../../../../../components/camel-knative/camel-knative-http/src/generated/resources/knative-http.json
\ No newline at end of file
diff --git a/docs/components/modules/others/nav.adoc b/docs/components/modules/others/nav.adoc
index 9126502..d4130a2 100644
--- a/docs/components/modules/others/nav.adoc
+++ b/docs/components/modules/others/nav.adoc
@@ -8,6 +8,7 @@
 ** xref:cdi.adoc[CDI]
 ** xref:cdi-jta.adoc[CDI JTA]
 ** xref:cdi-main.adoc[CDI Main]
+** xref:cloudevents.adoc[Cloudevents]
 ** xref:csimple-joor.adoc[CSimple jOOR]
 ** xref:cxf-transport.adoc[CXF Transport]
 ** xref:debug.adoc[Debug]
@@ -28,6 +29,8 @@
 ** xref:jasypt.adoc[Jasypt]
 ** xref:jfr.adoc[Jfr]
 ** xref:jta.adoc[JTA]
+** xref:knative-api.adoc[Knative Api]
+** xref:knative-http.adoc[Knative Http]
 ** xref:leveldb.adoc[LevelDB]
 ** xref:leveldb-legacy.adoc[LevelDB-legacy]
 ** xref:lra.adoc[LRA]
diff --git a/docs/components/modules/others/pages/cloudevents.adoc b/docs/components/modules/others/pages/cloudevents.adoc
new file mode 120000
index 0000000..0c360d3
--- /dev/null
+++ b/docs/components/modules/others/pages/cloudevents.adoc
@@ -0,0 +1 @@
+../../../../../components/camel-cloudevents/src/main/docs/cloudevents.adoc
\ No newline at end of file
diff --git a/docs/components/modules/others/pages/knative-api.adoc b/docs/components/modules/others/pages/knative-api.adoc
new file mode 120000
index 0000000..01233ba
--- /dev/null
+++ b/docs/components/modules/others/pages/knative-api.adoc
@@ -0,0 +1 @@
+../../../../../components/camel-knative/camel-knative-api/src/main/docs/knative-api.adoc
\ No newline at end of file
diff --git a/docs/components/modules/others/pages/knative-http.adoc b/docs/components/modules/others/pages/knative-http.adoc
new file mode 120000
index 0000000..013abb2
--- /dev/null
+++ b/docs/components/modules/others/pages/knative-http.adoc
@@ -0,0 +1 @@
+../../../../../components/camel-knative/camel-knative-http/src/main/docs/knative-http.adoc
\ No newline at end of file
diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
index 43b2625..d4fe38e 100644
--- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
+++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
@@ -2642,6 +2642,19 @@ public interface ComponentsBuilderFactory {
         return org.apache.camel.builder.component.dsl.KameletComponentBuilderFactory.kamelet();
     }
     /**
+     * Knative (camel-knative)
+     * Send and receive events from Knative.
+     * 
+     * Category: cloud
+     * Since: 3.15
+     * Maven coordinates: org.apache.camel:camel-knative
+     * 
+     * @return the dsl builder
+     */
+    static org.apache.camel.builder.component.dsl.KnativeComponentBuilderFactory.KnativeComponentBuilder knative() {
+        return org.apache.camel.builder.component.dsl.KnativeComponentBuilderFactory.knative();
+    }
+    /**
      * Kubernetes ConfigMap (camel-kubernetes)
      * Perform operations on Kubernetes ConfigMaps and get notified on
      * ConfigMaps changes.
diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/KnativeComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/KnativeComponentBuilderFactory.java
new file mode 100644
index 0000000..4bbbc31
--- /dev/null
+++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/KnativeComponentBuilderFactory.java
@@ -0,0 +1,419 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder.component.dsl;
+
+import javax.annotation.Generated;
+import org.apache.camel.Component;
+import org.apache.camel.builder.component.AbstractComponentBuilder;
+import org.apache.camel.builder.component.ComponentBuilder;
+import org.apache.camel.component.knative.KnativeComponent;
+
+/**
+ * Send and receive events from Knative.
+ * 
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.ComponentDslMojo")
+public interface KnativeComponentBuilderFactory {
+
+    /**
+     * Knative (camel-knative)
+     * Send and receive events from Knative.
+     * 
+     * Category: cloud
+     * Since: 3.15
+     * Maven coordinates: org.apache.camel:camel-knative
+     * 
+     * @return the dsl builder
+     */
+    static KnativeComponentBuilder knative() {
+        return new KnativeComponentBuilderImpl();
+    }
+
+    /**
+     * Builder for the Knative component.
+     */
+    interface KnativeComponentBuilder
+            extends
+                ComponentBuilder<KnativeComponent> {
+        /**
+         * CloudEvent headers to override.
+         * 
+         * The option is a: &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.String&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param ceOverride the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder ceOverride(
+                java.util.Map<java.lang.String, java.lang.String> ceOverride) {
+            doSetProperty("ceOverride", ceOverride);
+            return this;
+        }
+        /**
+         * Set the version of the cloudevents spec.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Default: 1.0
+         * Group: common
+         * 
+         * @param cloudEventsSpecVersion the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder cloudEventsSpecVersion(
+                java.lang.String cloudEventsSpecVersion) {
+            doSetProperty("cloudEventsSpecVersion", cloudEventsSpecVersion);
+            return this;
+        }
+        /**
+         * Set the event-type information of the produced events.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Default: org.apache.camel.event
+         * Group: common
+         * 
+         * @param cloudEventsType the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder cloudEventsType(
+                java.lang.String cloudEventsType) {
+            doSetProperty("cloudEventsType", cloudEventsType);
+            return this;
+        }
+        /**
+         * Set the configuration.
+         * 
+         * The option is a:
+         * &lt;code&gt;org.apache.camel.component.knative.KnativeConfiguration&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param configuration the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder configuration(
+                org.apache.camel.component.knative.KnativeConfiguration configuration) {
+            doSetProperty("configuration", configuration);
+            return this;
+        }
+        /**
+         * The protocol consumer factory.
+         * 
+         * The option is a:
+         * &lt;code&gt;org.apache.camel.component.knative.spi.KnativeConsumerFactory&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param consumerFactory the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder consumerFactory(
+                org.apache.camel.component.knative.spi.KnativeConsumerFactory consumerFactory) {
+            doSetProperty("consumerFactory", consumerFactory);
+            return this;
+        }
+        /**
+         * The environment.
+         * 
+         * The option is a:
+         * &lt;code&gt;org.apache.camel.component.knative.spi.KnativeEnvironment&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param environment the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder environment(
+                org.apache.camel.component.knative.spi.KnativeEnvironment environment) {
+            doSetProperty("environment", environment);
+            return this;
+        }
+        /**
+         * The path ot the environment definition.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param environmentPath the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder environmentPath(
+                java.lang.String environmentPath) {
+            doSetProperty("environmentPath", environmentPath);
+            return this;
+        }
+        /**
+         * Set the filters.
+         * 
+         * The option is a: &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.String&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param filters the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder filters(
+                java.util.Map<java.lang.String, java.lang.String> filters) {
+            doSetProperty("filters", filters);
+            return this;
+        }
+        /**
+         * The protocol producer factory.
+         * 
+         * The option is a:
+         * &lt;code&gt;org.apache.camel.component.knative.spi.KnativeProducerFactory&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param producerFactory the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder producerFactory(
+                org.apache.camel.component.knative.spi.KnativeProducerFactory producerFactory) {
+            doSetProperty("producerFactory", producerFactory);
+            return this;
+        }
+        /**
+         * Set the transport options.
+         * 
+         * The option is a: &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.Object&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param transportOptions the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder transportOptions(
+                java.util.Map<java.lang.String, java.lang.Object> transportOptions) {
+            doSetProperty("transportOptions", transportOptions);
+            return this;
+        }
+        /**
+         * The name of the service to lookup from the KnativeEnvironment.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param typeId the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder typeId(java.lang.String typeId) {
+            doSetProperty("typeId", typeId);
+            return this;
+        }
+        /**
+         * Allows for bridging the consumer to the Camel routing Error Handler,
+         * which mean any exceptions occurred while the consumer is trying to
+         * pickup incoming messages, or the likes, will now be processed as a
+         * message and handled by the routing Error Handler. By default the
+         * consumer will use the org.apache.camel.spi.ExceptionHandler to deal
+         * with exceptions, that will be logged at WARN or ERROR level and
+         * ignored.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: consumer
+         * 
+         * @param bridgeErrorHandler the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder bridgeErrorHandler(
+                boolean bridgeErrorHandler) {
+            doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
+            return this;
+        }
+        /**
+         * Transforms the reply into a cloud event that will be processed by the
+         * caller. When listening to events from a Knative Broker, if this flag
+         * is enabled, replies will be published to the same Broker where the
+         * request comes from (beware that if you don't change the type of the
+         * received message, you may create a loop and receive your same reply).
+         * When this flag is disabled, CloudEvent headers are removed from the
+         * reply.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: consumer
+         * 
+         * @param replyWithCloudEvent the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder replyWithCloudEvent(
+                boolean replyWithCloudEvent) {
+            doSetProperty("replyWithCloudEvent", replyWithCloudEvent);
+            return this;
+        }
+        /**
+         * If the consumer should construct a full reply to knative request.
+         * 
+         * The option is a: &lt;code&gt;java.lang.Boolean&lt;/code&gt; type.
+         * 
+         * Default: true
+         * Group: consumer (advanced)
+         * 
+         * @param reply the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder reply(java.lang.Boolean reply) {
+            doSetProperty("reply", reply);
+            return this;
+        }
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param lazyStartProducer the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder lazyStartProducer(
+                boolean lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * The version of the k8s resource referenced by the endpoint.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param apiVersion the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder apiVersion(java.lang.String apiVersion) {
+            doSetProperty("apiVersion", apiVersion);
+            return this;
+        }
+        /**
+         * Whether autowiring is enabled. This is used for automatic autowiring
+         * options (the option must be marked as autowired) by looking up in the
+         * registry to find if there is a single instance of matching type,
+         * which then gets configured on the component. This can be used for
+         * automatic configuring JDBC data sources, JMS connection factories,
+         * AWS Clients, etc.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: true
+         * Group: advanced
+         * 
+         * @param autowiredEnabled the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder autowiredEnabled(
+                boolean autowiredEnabled) {
+            doSetProperty("autowiredEnabled", autowiredEnabled);
+            return this;
+        }
+        /**
+         * The type of the k8s resource referenced by the endpoint.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param kind the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder kind(java.lang.String kind) {
+            doSetProperty("kind", kind);
+            return this;
+        }
+        /**
+         * The name of the k8s resource referenced by the endpoint.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param name the value to set
+         * @return the dsl builder
+         */
+        default KnativeComponentBuilder name(java.lang.String name) {
+            doSetProperty("name", name);
+            return this;
+        }
+    }
+
+    class KnativeComponentBuilderImpl
+            extends
+                AbstractComponentBuilder<KnativeComponent>
+            implements
+                KnativeComponentBuilder {
+        @Override
+        protected KnativeComponent buildConcreteComponent() {
+            return new KnativeComponent();
+        }
+        private org.apache.camel.component.knative.KnativeConfiguration getOrCreateConfiguration(
+                org.apache.camel.component.knative.KnativeComponent component) {
+            if (component.getConfiguration() == null) {
+                component.setConfiguration(new org.apache.camel.component.knative.KnativeConfiguration());
+            }
+            return component.getConfiguration();
+        }
+        @Override
+        protected boolean setPropertyOnComponent(
+                Component component,
+                String name,
+                Object value) {
+            switch (name) {
+            case "ceOverride": getOrCreateConfiguration((KnativeComponent) component).setCeOverride((java.util.Map) value); return true;
+            case "cloudEventsSpecVersion": getOrCreateConfiguration((KnativeComponent) component).setCloudEventsSpecVersion((java.lang.String) value); return true;
+            case "cloudEventsType": getOrCreateConfiguration((KnativeComponent) component).setCloudEventsType((java.lang.String) value); return true;
+            case "configuration": ((KnativeComponent) component).setConfiguration((org.apache.camel.component.knative.KnativeConfiguration) value); return true;
+            case "consumerFactory": ((KnativeComponent) component).setConsumerFactory((org.apache.camel.component.knative.spi.KnativeConsumerFactory) value); return true;
+            case "environment": getOrCreateConfiguration((KnativeComponent) component).setEnvironment((org.apache.camel.component.knative.spi.KnativeEnvironment) value); return true;
+            case "environmentPath": ((KnativeComponent) component).setEnvironmentPath((java.lang.String) value); return true;
+            case "filters": getOrCreateConfiguration((KnativeComponent) component).setFilters((java.util.Map) value); return true;
+            case "producerFactory": ((KnativeComponent) component).setProducerFactory((org.apache.camel.component.knative.spi.KnativeProducerFactory) value); return true;
+            case "transportOptions": getOrCreateConfiguration((KnativeComponent) component).setTransportOptions((java.util.Map) value); return true;
+            case "typeId": getOrCreateConfiguration((KnativeComponent) component).setTypeId((java.lang.String) value); return true;
+            case "bridgeErrorHandler": ((KnativeComponent) component).setBridgeErrorHandler((boolean) value); return true;
+            case "replyWithCloudEvent": getOrCreateConfiguration((KnativeComponent) component).setReplyWithCloudEvent((boolean) value); return true;
+            case "reply": getOrCreateConfiguration((KnativeComponent) component).setReply((java.lang.Boolean) value); return true;
+            case "lazyStartProducer": ((KnativeComponent) component).setLazyStartProducer((boolean) value); return true;
+            case "apiVersion": getOrCreateConfiguration((KnativeComponent) component).setApiVersion((java.lang.String) value); return true;
+            case "autowiredEnabled": ((KnativeComponent) component).setAutowiredEnabled((boolean) value); return true;
+            case "kind": getOrCreateConfiguration((KnativeComponent) component).setKind((java.lang.String) value); return true;
+            case "name": getOrCreateConfiguration((KnativeComponent) component).setName((java.lang.String) value); return true;
+            default: return false;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/dsl/camel-componentdsl/src/generated/resources/metadata.json b/dsl/camel-componentdsl/src/generated/resources/metadata.json
index b5e91a2..82b9f75 100644
--- a/dsl/camel-componentdsl/src/generated/resources/metadata.json
+++ b/dsl/camel-componentdsl/src/generated/resources/metadata.json
@@ -4324,6 +4324,28 @@
     "producerOnly": false,
     "lenientProperties": true
   },
+  "KnativeComponentBuilderFactory": {
+    "kind": "component",
+    "name": "knative",
+    "title": "Knative",
+    "description": "Send and receive events from Knative.",
+    "deprecated": false,
+    "firstVersion": "3.15.0",
+    "label": "cloud",
+    "javaType": "org.apache.camel.component.knative.KnativeComponent",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-knative",
+    "version": "3.15.0-SNAPSHOT",
+    "scheme": "knative",
+    "extendsScheme": "",
+    "syntax": "knative:type\/typeId",
+    "async": false,
+    "api": false,
+    "consumerOnly": false,
+    "producerOnly": false,
+    "lenientProperties": false
+  },
   "KubernetesConfigMapsComponentBuilderFactory": {
     "kind": "component",
     "name": "kubernetes-config-maps",
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
index 37fb94c..00661a9 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
@@ -206,6 +206,7 @@ public interface EndpointBuilderFactory
             org.apache.camel.builder.endpoint.dsl.KeystoneEndpointBuilderFactory.KeystoneBuilders,
             org.apache.camel.builder.endpoint.dsl.Kinesis2EndpointBuilderFactory.Kinesis2Builders,
             org.apache.camel.builder.endpoint.dsl.KinesisFirehose2EndpointBuilderFactory.KinesisFirehose2Builders,
+            org.apache.camel.builder.endpoint.dsl.KnativeEndpointBuilderFactory.KnativeBuilders,
             org.apache.camel.builder.endpoint.dsl.KubernetesConfigMapsEndpointBuilderFactory.KubernetesConfigMapsBuilders,
             org.apache.camel.builder.endpoint.dsl.KubernetesCustomResourcesEndpointBuilderFactory.KubernetesCustomResourcesBuilders,
             org.apache.camel.builder.endpoint.dsl.KubernetesDeploymentsEndpointBuilderFactory.KubernetesDeploymentsBuilders,
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
index e5e64ea..ea0834c 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
@@ -203,6 +203,7 @@ public interface EndpointBuilders
             org.apache.camel.builder.endpoint.dsl.KeystoneEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.Kinesis2EndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.KinesisFirehose2EndpointBuilderFactory,
+            org.apache.camel.builder.endpoint.dsl.KnativeEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.KubernetesConfigMapsEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.KubernetesCustomResourcesEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.KubernetesDeploymentsEndpointBuilderFactory,
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
index 019d572..03924e8 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
@@ -8974,6 +8974,57 @@ public class StaticEndpointBuilders {
         return org.apache.camel.builder.endpoint.dsl.KameletEndpointBuilderFactory.endpointBuilder(componentName, path);
     }
     /**
+     * Knative (camel-knative)
+     * Send and receive events from Knative.
+     * 
+     * Category: cloud
+     * Since: 3.15
+     * Maven coordinates: org.apache.camel:camel-knative
+     * 
+     * Syntax: <code>knative:type/typeId</code>
+     * 
+     * Path parameter: type
+     * The Knative resource type
+     * There are 3 enums and the value can be one of: endpoint, channel, event
+     * 
+     * Path parameter: typeId
+     * The identifier of the Knative resource
+     * 
+     * @param path type/typeId
+     * @return the dsl builder
+     */
+    public static org.apache.camel.builder.endpoint.dsl.KnativeEndpointBuilderFactory.KnativeEndpointBuilder knative(
+            String path) {
+        return org.apache.camel.builder.endpoint.dsl.KnativeEndpointBuilderFactory.endpointBuilder("knative", path);
+    }
+    /**
+     * Knative (camel-knative)
+     * Send and receive events from Knative.
+     * 
+     * Category: cloud
+     * Since: 3.15
+     * Maven coordinates: org.apache.camel:camel-knative
+     * 
+     * Syntax: <code>knative:type/typeId</code>
+     * 
+     * Path parameter: type
+     * The Knative resource type
+     * There are 3 enums and the value can be one of: endpoint, channel, event
+     * 
+     * Path parameter: typeId
+     * The identifier of the Knative resource
+     * 
+     * @param componentName to use a custom component name for the endpoint
+     * instead of the default name
+     * @param path type/typeId
+     * @return the dsl builder
+     */
+    public static org.apache.camel.builder.endpoint.dsl.KnativeEndpointBuilderFactory.KnativeEndpointBuilder knative(
+            String componentName,
+            String path) {
+        return org.apache.camel.builder.endpoint.dsl.KnativeEndpointBuilderFactory.endpointBuilder(componentName, path);
+    }
+    /**
      * Kubernetes ConfigMap (camel-kubernetes)
      * Perform operations on Kubernetes ConfigMaps and get notified on
      * ConfigMaps changes.
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KnativeEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KnativeEndpointBuilderFactory.java
new file mode 100644
index 0000000..060e12e
--- /dev/null
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/KnativeEndpointBuilderFactory.java
@@ -0,0 +1,1013 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder.endpoint.dsl;
+
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.function.*;
+import java.util.stream.*;
+import javax.annotation.Generated;
+import org.apache.camel.builder.EndpointConsumerBuilder;
+import org.apache.camel.builder.EndpointProducerBuilder;
+import org.apache.camel.builder.endpoint.AbstractEndpointBuilder;
+
+/**
+ * Send and receive events from Knative.
+ * 
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.EndpointDslMojo")
+public interface KnativeEndpointBuilderFactory {
+
+
+    /**
+     * Builder for endpoint consumers for the Knative component.
+     */
+    public interface KnativeEndpointConsumerBuilder
+            extends
+                EndpointConsumerBuilder {
+        default AdvancedKnativeEndpointConsumerBuilder advanced() {
+            return (AdvancedKnativeEndpointConsumerBuilder) this;
+        }
+        /**
+         * CloudEvent headers to override.
+         * 
+         * The option is a: &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.String&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param ceOverride the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointConsumerBuilder ceOverride(
+                Map<java.lang.String, java.lang.String> ceOverride) {
+            doSetProperty("ceOverride", ceOverride);
+            return this;
+        }
+        /**
+         * CloudEvent headers to override.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.String&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param ceOverride the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointConsumerBuilder ceOverride(String ceOverride) {
+            doSetProperty("ceOverride", ceOverride);
+            return this;
+        }
+        /**
+         * Set the version of the cloudevents spec.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Default: 1.0
+         * Group: common
+         * 
+         * @param cloudEventsSpecVersion the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointConsumerBuilder cloudEventsSpecVersion(
+                String cloudEventsSpecVersion) {
+            doSetProperty("cloudEventsSpecVersion", cloudEventsSpecVersion);
+            return this;
+        }
+        /**
+         * Set the event-type information of the produced events.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Default: org.apache.camel.event
+         * Group: common
+         * 
+         * @param cloudEventsType the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointConsumerBuilder cloudEventsType(
+                String cloudEventsType) {
+            doSetProperty("cloudEventsType", cloudEventsType);
+            return this;
+        }
+        /**
+         * The environment.
+         * 
+         * The option is a:
+         * &lt;code&gt;org.apache.camel.component.knative.spi.KnativeEnvironment&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param environment the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointConsumerBuilder environment(
+                org.apache.camel.component.knative.spi.KnativeEnvironment environment) {
+            doSetProperty("environment", environment);
+            return this;
+        }
+        /**
+         * The environment.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;org.apache.camel.component.knative.spi.KnativeEnvironment&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param environment the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointConsumerBuilder environment(String environment) {
+            doSetProperty("environment", environment);
+            return this;
+        }
+        /**
+         * Set the filters.
+         * 
+         * The option is a: &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.String&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param filters the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointConsumerBuilder filters(
+                Map<java.lang.String, java.lang.String> filters) {
+            doSetProperty("filters", filters);
+            return this;
+        }
+        /**
+         * Set the filters.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.String&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param filters the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointConsumerBuilder filters(String filters) {
+            doSetProperty("filters", filters);
+            return this;
+        }
+        /**
+         * Set the transport options.
+         * 
+         * The option is a: &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.Object&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param transportOptions the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointConsumerBuilder transportOptions(
+                Map<java.lang.String, java.lang.Object> transportOptions) {
+            doSetProperty("transportOptions", transportOptions);
+            return this;
+        }
+        /**
+         * Set the transport options.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.Object&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param transportOptions the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointConsumerBuilder transportOptions(
+                String transportOptions) {
+            doSetProperty("transportOptions", transportOptions);
+            return this;
+        }
+        /**
+         * Allows for bridging the consumer to the Camel routing Error Handler,
+         * which mean any exceptions occurred while the consumer is trying to
+         * pickup incoming messages, or the likes, will now be processed as a
+         * message and handled by the routing Error Handler. By default the
+         * consumer will use the org.apache.camel.spi.ExceptionHandler to deal
+         * with exceptions, that will be logged at WARN or ERROR level and
+         * ignored.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: consumer
+         * 
+         * @param bridgeErrorHandler the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointConsumerBuilder bridgeErrorHandler(
+                boolean bridgeErrorHandler) {
+            doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
+            return this;
+        }
+        /**
+         * Allows for bridging the consumer to the Camel routing Error Handler,
+         * which mean any exceptions occurred while the consumer is trying to
+         * pickup incoming messages, or the likes, will now be processed as a
+         * message and handled by the routing Error Handler. By default the
+         * consumer will use the org.apache.camel.spi.ExceptionHandler to deal
+         * with exceptions, that will be logged at WARN or ERROR level and
+         * ignored.
+         * 
+         * The option will be converted to a &lt;code&gt;boolean&lt;/code&gt;
+         * type.
+         * 
+         * Default: false
+         * Group: consumer
+         * 
+         * @param bridgeErrorHandler the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointConsumerBuilder bridgeErrorHandler(
+                String bridgeErrorHandler) {
+            doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
+            return this;
+        }
+        /**
+         * Transforms the reply into a cloud event that will be processed by the
+         * caller. When listening to events from a Knative Broker, if this flag
+         * is enabled, replies will be published to the same Broker where the
+         * request comes from (beware that if you don't change the type of the
+         * received message, you may create a loop and receive your same reply).
+         * When this flag is disabled, CloudEvent headers are removed from the
+         * reply.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: consumer
+         * 
+         * @param replyWithCloudEvent the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointConsumerBuilder replyWithCloudEvent(
+                boolean replyWithCloudEvent) {
+            doSetProperty("replyWithCloudEvent", replyWithCloudEvent);
+            return this;
+        }
+        /**
+         * Transforms the reply into a cloud event that will be processed by the
+         * caller. When listening to events from a Knative Broker, if this flag
+         * is enabled, replies will be published to the same Broker where the
+         * request comes from (beware that if you don't change the type of the
+         * received message, you may create a loop and receive your same reply).
+         * When this flag is disabled, CloudEvent headers are removed from the
+         * reply.
+         * 
+         * The option will be converted to a &lt;code&gt;boolean&lt;/code&gt;
+         * type.
+         * 
+         * Default: false
+         * Group: consumer
+         * 
+         * @param replyWithCloudEvent the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointConsumerBuilder replyWithCloudEvent(
+                String replyWithCloudEvent) {
+            doSetProperty("replyWithCloudEvent", replyWithCloudEvent);
+            return this;
+        }
+    }
+
+    /**
+     * Advanced builder for endpoint consumers for the Knative component.
+     */
+    public interface AdvancedKnativeEndpointConsumerBuilder
+            extends
+                EndpointConsumerBuilder {
+        default KnativeEndpointConsumerBuilder basic() {
+            return (KnativeEndpointConsumerBuilder) this;
+        }
+        /**
+         * To let the consumer use a custom ExceptionHandler. Notice if the
+         * option bridgeErrorHandler is enabled then this option is not in use.
+         * By default the consumer will deal with exceptions, that will be
+         * logged at WARN or ERROR level and ignored.
+         * 
+         * The option is a:
+         * &lt;code&gt;org.apache.camel.spi.ExceptionHandler&lt;/code&gt; type.
+         * 
+         * Group: consumer (advanced)
+         * 
+         * @param exceptionHandler the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointConsumerBuilder exceptionHandler(
+                org.apache.camel.spi.ExceptionHandler exceptionHandler) {
+            doSetProperty("exceptionHandler", exceptionHandler);
+            return this;
+        }
+        /**
+         * To let the consumer use a custom ExceptionHandler. Notice if the
+         * option bridgeErrorHandler is enabled then this option is not in use.
+         * By default the consumer will deal with exceptions, that will be
+         * logged at WARN or ERROR level and ignored.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;org.apache.camel.spi.ExceptionHandler&lt;/code&gt; type.
+         * 
+         * Group: consumer (advanced)
+         * 
+         * @param exceptionHandler the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointConsumerBuilder exceptionHandler(
+                String exceptionHandler) {
+            doSetProperty("exceptionHandler", exceptionHandler);
+            return this;
+        }
+        /**
+         * Sets the exchange pattern when the consumer creates an exchange.
+         * 
+         * The option is a:
+         * &lt;code&gt;org.apache.camel.ExchangePattern&lt;/code&gt; type.
+         * 
+         * Group: consumer (advanced)
+         * 
+         * @param exchangePattern the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointConsumerBuilder exchangePattern(
+                org.apache.camel.ExchangePattern exchangePattern) {
+            doSetProperty("exchangePattern", exchangePattern);
+            return this;
+        }
+        /**
+         * Sets the exchange pattern when the consumer creates an exchange.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;org.apache.camel.ExchangePattern&lt;/code&gt; type.
+         * 
+         * Group: consumer (advanced)
+         * 
+         * @param exchangePattern the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointConsumerBuilder exchangePattern(
+                String exchangePattern) {
+            doSetProperty("exchangePattern", exchangePattern);
+            return this;
+        }
+        /**
+         * If the consumer should construct a full reply to knative request.
+         * 
+         * The option is a: &lt;code&gt;java.lang.Boolean&lt;/code&gt; type.
+         * 
+         * Default: true
+         * Group: consumer (advanced)
+         * 
+         * @param reply the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointConsumerBuilder reply(Boolean reply) {
+            doSetProperty("reply", reply);
+            return this;
+        }
+        /**
+         * If the consumer should construct a full reply to knative request.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;java.lang.Boolean&lt;/code&gt; type.
+         * 
+         * Default: true
+         * Group: consumer (advanced)
+         * 
+         * @param reply the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointConsumerBuilder reply(String reply) {
+            doSetProperty("reply", reply);
+            return this;
+        }
+        /**
+         * The version of the k8s resource referenced by the endpoint.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param apiVersion the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointConsumerBuilder apiVersion(
+                String apiVersion) {
+            doSetProperty("apiVersion", apiVersion);
+            return this;
+        }
+        /**
+         * The type of the k8s resource referenced by the endpoint.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param kind the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointConsumerBuilder kind(String kind) {
+            doSetProperty("kind", kind);
+            return this;
+        }
+        /**
+         * The name of the k8s resource referenced by the endpoint.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param name the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointConsumerBuilder name(String name) {
+            doSetProperty("name", name);
+            return this;
+        }
+    }
+
+    /**
+     * Builder for endpoint producers for the Knative component.
+     */
+    public interface KnativeEndpointProducerBuilder
+            extends
+                EndpointProducerBuilder {
+        default AdvancedKnativeEndpointProducerBuilder advanced() {
+            return (AdvancedKnativeEndpointProducerBuilder) this;
+        }
+        /**
+         * CloudEvent headers to override.
+         * 
+         * The option is a: &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.String&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param ceOverride the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointProducerBuilder ceOverride(
+                Map<java.lang.String, java.lang.String> ceOverride) {
+            doSetProperty("ceOverride", ceOverride);
+            return this;
+        }
+        /**
+         * CloudEvent headers to override.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.String&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param ceOverride the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointProducerBuilder ceOverride(String ceOverride) {
+            doSetProperty("ceOverride", ceOverride);
+            return this;
+        }
+        /**
+         * Set the version of the cloudevents spec.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Default: 1.0
+         * Group: common
+         * 
+         * @param cloudEventsSpecVersion the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointProducerBuilder cloudEventsSpecVersion(
+                String cloudEventsSpecVersion) {
+            doSetProperty("cloudEventsSpecVersion", cloudEventsSpecVersion);
+            return this;
+        }
+        /**
+         * Set the event-type information of the produced events.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Default: org.apache.camel.event
+         * Group: common
+         * 
+         * @param cloudEventsType the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointProducerBuilder cloudEventsType(
+                String cloudEventsType) {
+            doSetProperty("cloudEventsType", cloudEventsType);
+            return this;
+        }
+        /**
+         * The environment.
+         * 
+         * The option is a:
+         * &lt;code&gt;org.apache.camel.component.knative.spi.KnativeEnvironment&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param environment the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointProducerBuilder environment(
+                org.apache.camel.component.knative.spi.KnativeEnvironment environment) {
+            doSetProperty("environment", environment);
+            return this;
+        }
+        /**
+         * The environment.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;org.apache.camel.component.knative.spi.KnativeEnvironment&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param environment the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointProducerBuilder environment(String environment) {
+            doSetProperty("environment", environment);
+            return this;
+        }
+        /**
+         * Set the filters.
+         * 
+         * The option is a: &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.String&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param filters the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointProducerBuilder filters(
+                Map<java.lang.String, java.lang.String> filters) {
+            doSetProperty("filters", filters);
+            return this;
+        }
+        /**
+         * Set the filters.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.String&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param filters the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointProducerBuilder filters(String filters) {
+            doSetProperty("filters", filters);
+            return this;
+        }
+        /**
+         * Set the transport options.
+         * 
+         * The option is a: &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.Object&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param transportOptions the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointProducerBuilder transportOptions(
+                Map<java.lang.String, java.lang.Object> transportOptions) {
+            doSetProperty("transportOptions", transportOptions);
+            return this;
+        }
+        /**
+         * Set the transport options.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.Object&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param transportOptions the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointProducerBuilder transportOptions(
+                String transportOptions) {
+            doSetProperty("transportOptions", transportOptions);
+            return this;
+        }
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param lazyStartProducer the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointProducerBuilder lazyStartProducer(
+                boolean lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option will be converted to a &lt;code&gt;boolean&lt;/code&gt;
+         * type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param lazyStartProducer the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointProducerBuilder lazyStartProducer(
+                String lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+    }
+
+    /**
+     * Advanced builder for endpoint producers for the Knative component.
+     */
+    public interface AdvancedKnativeEndpointProducerBuilder
+            extends
+                EndpointProducerBuilder {
+        default KnativeEndpointProducerBuilder basic() {
+            return (KnativeEndpointProducerBuilder) this;
+        }
+        /**
+         * The version of the k8s resource referenced by the endpoint.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param apiVersion the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointProducerBuilder apiVersion(
+                String apiVersion) {
+            doSetProperty("apiVersion", apiVersion);
+            return this;
+        }
+        /**
+         * The type of the k8s resource referenced by the endpoint.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param kind the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointProducerBuilder kind(String kind) {
+            doSetProperty("kind", kind);
+            return this;
+        }
+        /**
+         * The name of the k8s resource referenced by the endpoint.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param name the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointProducerBuilder name(String name) {
+            doSetProperty("name", name);
+            return this;
+        }
+    }
+
+    /**
+     * Builder for endpoint for the Knative component.
+     */
+    public interface KnativeEndpointBuilder
+            extends
+                KnativeEndpointConsumerBuilder,
+                KnativeEndpointProducerBuilder {
+        default AdvancedKnativeEndpointBuilder advanced() {
+            return (AdvancedKnativeEndpointBuilder) this;
+        }
+        /**
+         * CloudEvent headers to override.
+         * 
+         * The option is a: &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.String&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param ceOverride the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointBuilder ceOverride(
+                Map<java.lang.String, java.lang.String> ceOverride) {
+            doSetProperty("ceOverride", ceOverride);
+            return this;
+        }
+        /**
+         * CloudEvent headers to override.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.String&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param ceOverride the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointBuilder ceOverride(String ceOverride) {
+            doSetProperty("ceOverride", ceOverride);
+            return this;
+        }
+        /**
+         * Set the version of the cloudevents spec.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Default: 1.0
+         * Group: common
+         * 
+         * @param cloudEventsSpecVersion the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointBuilder cloudEventsSpecVersion(
+                String cloudEventsSpecVersion) {
+            doSetProperty("cloudEventsSpecVersion", cloudEventsSpecVersion);
+            return this;
+        }
+        /**
+         * Set the event-type information of the produced events.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Default: org.apache.camel.event
+         * Group: common
+         * 
+         * @param cloudEventsType the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointBuilder cloudEventsType(String cloudEventsType) {
+            doSetProperty("cloudEventsType", cloudEventsType);
+            return this;
+        }
+        /**
+         * The environment.
+         * 
+         * The option is a:
+         * &lt;code&gt;org.apache.camel.component.knative.spi.KnativeEnvironment&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param environment the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointBuilder environment(
+                org.apache.camel.component.knative.spi.KnativeEnvironment environment) {
+            doSetProperty("environment", environment);
+            return this;
+        }
+        /**
+         * The environment.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;org.apache.camel.component.knative.spi.KnativeEnvironment&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param environment the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointBuilder environment(String environment) {
+            doSetProperty("environment", environment);
+            return this;
+        }
+        /**
+         * Set the filters.
+         * 
+         * The option is a: &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.String&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param filters the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointBuilder filters(
+                Map<java.lang.String, java.lang.String> filters) {
+            doSetProperty("filters", filters);
+            return this;
+        }
+        /**
+         * Set the filters.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.String&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param filters the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointBuilder filters(String filters) {
+            doSetProperty("filters", filters);
+            return this;
+        }
+        /**
+         * Set the transport options.
+         * 
+         * The option is a: &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.Object&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param transportOptions the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointBuilder transportOptions(
+                Map<java.lang.String, java.lang.Object> transportOptions) {
+            doSetProperty("transportOptions", transportOptions);
+            return this;
+        }
+        /**
+         * Set the transport options.
+         * 
+         * The option will be converted to a
+         * &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.Object&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: common
+         * 
+         * @param transportOptions the value to set
+         * @return the dsl builder
+         */
+        default KnativeEndpointBuilder transportOptions(String transportOptions) {
+            doSetProperty("transportOptions", transportOptions);
+            return this;
+        }
+    }
+
+    /**
+     * Advanced builder for endpoint for the Knative component.
+     */
+    public interface AdvancedKnativeEndpointBuilder
+            extends
+                AdvancedKnativeEndpointConsumerBuilder,
+                AdvancedKnativeEndpointProducerBuilder {
+        default KnativeEndpointBuilder basic() {
+            return (KnativeEndpointBuilder) this;
+        }
+        /**
+         * The version of the k8s resource referenced by the endpoint.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param apiVersion the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointBuilder apiVersion(String apiVersion) {
+            doSetProperty("apiVersion", apiVersion);
+            return this;
+        }
+        /**
+         * The type of the k8s resource referenced by the endpoint.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param kind the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointBuilder kind(String kind) {
+            doSetProperty("kind", kind);
+            return this;
+        }
+        /**
+         * The name of the k8s resource referenced by the endpoint.
+         * 
+         * The option is a: &lt;code&gt;java.lang.String&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param name the value to set
+         * @return the dsl builder
+         */
+        default AdvancedKnativeEndpointBuilder name(String name) {
+            doSetProperty("name", name);
+            return this;
+        }
+    }
+
+    public interface KnativeBuilders {
+        /**
+         * Knative (camel-knative)
+         * Send and receive events from Knative.
+         * 
+         * Category: cloud
+         * Since: 3.15
+         * Maven coordinates: org.apache.camel:camel-knative
+         * 
+         * Syntax: <code>knative:type/typeId</code>
+         * 
+         * Path parameter: type
+         * The Knative resource type
+         * There are 3 enums and the value can be one of: endpoint, channel,
+         * event
+         * 
+         * Path parameter: typeId
+         * The identifier of the Knative resource
+         * 
+         * @param path type/typeId
+         * @return the dsl builder
+         */
+        default KnativeEndpointBuilder knative(String path) {
+            return KnativeEndpointBuilderFactory.endpointBuilder("knative", path);
+        }
+        /**
+         * Knative (camel-knative)
+         * Send and receive events from Knative.
+         * 
+         * Category: cloud
+         * Since: 3.15
+         * Maven coordinates: org.apache.camel:camel-knative
+         * 
+         * Syntax: <code>knative:type/typeId</code>
+         * 
+         * Path parameter: type
+         * The Knative resource type
+         * There are 3 enums and the value can be one of: endpoint, channel,
+         * event
+         * 
+         * Path parameter: typeId
+         * The identifier of the Knative resource
+         * 
+         * @param componentName to use a custom component name for the endpoint
+         * instead of the default name
+         * @param path type/typeId
+         * @return the dsl builder
+         */
+        default KnativeEndpointBuilder knative(String componentName, String path) {
+            return KnativeEndpointBuilderFactory.endpointBuilder(componentName, path);
+        }
+    }
+    static KnativeEndpointBuilder endpointBuilder(
+            String componentName,
+            String path) {
+        class KnativeEndpointBuilderImpl extends AbstractEndpointBuilder implements KnativeEndpointBuilder, AdvancedKnativeEndpointBuilder {
+            public KnativeEndpointBuilderImpl(String path) {
+                super(componentName, path);
+            }
+        }
+        return new KnativeEndpointBuilderImpl(path);
+    }
+}
\ No newline at end of file
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointConsumerDeserializersResolver.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointConsumerDeserializersResolver.java
index 30869d2..9d6535a 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointConsumerDeserializersResolver.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointConsumerDeserializersResolver.java
@@ -133,6 +133,7 @@ public final class EndpointConsumerDeserializersResolver implements YamlDeserial
             case "jt400":
             case "kafka":
             case "kamelet":
+            case "knative":
             case "kubernetes-custom-resources":
             case "kubernetes-deployments":
             case "kubernetes-hpa":
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointProducerDeserializersResolver.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointProducerDeserializersResolver.java
index e60adbe..a494a9c 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointProducerDeserializersResolver.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/EndpointProducerDeserializersResolver.java
@@ -194,6 +194,7 @@ public final class EndpointProducerDeserializersResolver implements YamlDeserial
             case "jt400":
             case "kafka":
             case "kamelet":
+            case "knative":
             case "kubernetes-config-maps":
             case "kubernetes-custom-resources":
             case "kubernetes-deployments":
diff --git a/parent/pom.xml b/parent/pom.xml
index 93e08f7..12f7d69 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -1142,6 +1142,11 @@
 			</dependency>
 			<dependency>
 				<groupId>org.apache.camel</groupId>
+				<artifactId>camel-cloudevents</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.camel</groupId>
 				<artifactId>camel-cm-sms</artifactId>
 				<version>${project.version}</version>
 			</dependency>
@@ -1862,6 +1867,21 @@
 			</dependency>
 			<dependency>
 				<groupId>org.apache.camel</groupId>
+				<artifactId>camel-knative-api</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.camel</groupId>
+				<artifactId>camel-knative-http</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.camel</groupId>
+				<artifactId>camel-knative</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.camel</groupId>
 				<artifactId>camel-kubernetes</artifactId>
 				<version>${project.version}</version>
 			</dependency>
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java
index 1c7ece6..6c747f7 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/MojoHelper.java
@@ -92,6 +92,8 @@ public final class MojoHelper {
                         dir.resolve("camel-huaweicloud-dms"),
                         dir.resolve("camel-huaweicloud-imagerecognition"),
                         dir.resolve("camel-huaweicloud-obs"));
+            case "camel-knative":
+                return Collections.singletonList(dir.resolve("camel-knative-component"));
             default:
                 return Collections.singletonList(dir);
         }
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java
index f082089..5722960 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java
@@ -583,6 +583,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
                 case "camel-test":
                 case "camel-aws":
                 case "camel-huawei":
+                case "camel-kantive":
                     return false;
                 default:
                     return true;