You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2020/09/25 10:04:20 UTC

[camel-k-runtime] 01/02: Create a wrap component to wrap single tenant component

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

lburgazzoli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k-runtime.git

commit 6eeb8dd3ae9cf44f3ea0e0d9f1a81e74d036f006
Author: Luca Burgazzoli <lb...@gmail.com>
AuthorDate: Thu Sep 24 15:47:45 2020 +0200

    Create a wrap component to wrap single tenant component
---
 .github/workflows/ci-build.yml                     |   1 +
 .../camel-k-quarkus-itests-wrap/pom.xml            | 201 +++++++++++++++++++++
 .../camel/k/quarkus/wrap/WrapApplication.java      |  83 +++++++++
 .../src/main/resources/application.properties      |  23 +++
 .../org/apache/camel/k/quarkus/wrap/WrapIT.java    |  23 +++
 .../org/apache/camel/k/quarkus/wrap/WrapTest.java  |  78 ++++++++
 .../camel/k/quarkus/wrap/WrapTestResource.java     |  70 +++++++
 .../src/test/resources/routes.properties           |  16 ++
 .../src/test/resources/routes.yaml                 |  25 +++
 camel-k-quarkus/camel-k-quarkus-itests/pom.xml     |   3 +-
 .../deployment}/pom.xml                            |  53 +++---
 .../camel/k/quarkus/wrap/deployment/Feature.java   |  29 +++
 .../pom.xml                                        |  18 +-
 .../camel-k-quarkus-wrap/runtime/pom.xml           |  86 +++++++++
 camel-k-quarkus/pom.xml                            |   1 +
 camel-k-runtime-bom/pom.xml                        |  15 ++
 camel-wrap/pom.xml                                 | 145 +++++++++++++++
 .../component/wrap/WrapComponentConfigurer.java    |  55 ++++++
 .../component/wrap/WrapEndpointConfigurer.java     |  68 +++++++
 .../services/org/apache/camel/component/wrap       |   2 +
 .../org/apache/camel/configurer/wrap-component     |   2 +
 .../org/apache/camel/configurer/wrap-endpoint      |   2 +
 .../org/apache/camel/component/wrap/wrap.json      |  37 ++++
 .../java/org/apache/camel/component/wrap/Wrap.java |  45 +++++
 .../apache/camel/component/wrap/WrapComponent.java |  91 ++++++++++
 .../apache/camel/component/wrap/WrapEndpoint.java  | 163 +++++++++++++++++
 .../apache/camel/component/wrap/WrapBasicTest.java | 116 ++++++++++++
 camel-wrap/src/test/resources/log4j2-test.xml      |  42 +++++
 pom.xml                                            |  16 ++
 .../src/it/generate-catalog-main/verify.groovy     |   6 +
 .../src/it/generate-catalog-quarkus/verify.groovy  |   6 +
 .../maven/processors/CatalogProcessor3x.java       |  16 ++
 32 files changed, 1500 insertions(+), 37 deletions(-)

diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml
index f7e591d..a63863a 100644
--- a/.github/workflows/ci-build.yml
+++ b/.github/workflows/ci-build.yml
@@ -115,6 +115,7 @@ jobs:
           - :camel-k-quarkus-itests-master
           - :camel-k-quarkus-itests-kamelet
           - :camel-k-quarkus-itests-knative
+          - :camel-k-quarkus-itests-wrap
           - :camel-k-quarkus-itests-loader-xml
           - :camel-k-quarkus-itests-loader-yaml
           - :camel-k-quarkus-itests-loader-js
diff --git a/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/pom.xml b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/pom.xml
new file mode 100644
index 0000000..27ccd38
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/pom.xml
@@ -0,0 +1,201 @@
+<?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">
+    <parent>
+        <groupId>org.apache.camel.k</groupId>
+        <artifactId>camel-k-quarkus-itests</artifactId>
+        <version>1.5.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>camel-k-quarkus-itests-wrap</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-runtime-quarkus</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-quarkus-wrap</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-quarkus-loader-yaml</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-activemq</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-direct</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-log</artifactId>
+        </dependency>
+
+        <!-- quarkus dependencies -->
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-jsonb</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-resteasy</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-resteasy-jsonb</artifactId>
+        </dependency>
+
+        <!-- test dependencies -->
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.rest-assured</groupId>
+            <artifactId>rest-assured</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.awaitility</groupId>
+            <artifactId>awaitility</artifactId>
+            <version>${awaitility-version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-integration-testcontainers-support</artifactId>
+            <version>${camel-quarkus-version}</version>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <version>${build-helper-maven-plugin-version}</version>
+                <executions>
+                    <execution>
+                        <id>reserve-network-port</id>
+                        <goals>
+                            <goal>reserve-network-port</goal>
+                        </goals>
+                        <phase>process-resources</phase>
+                        <configuration>
+                            <portNames>
+                                <portName>test.http.port.jvm</portName>
+                                <portName>test.http.port.native</portName>
+                            </portNames>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>io.quarkus</groupId>
+                <artifactId>quarkus-maven-plugin</artifactId>
+                <version>${quarkus-version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>build</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <environmentVariables>
+                        <CAMEL_K_ROUTES>file:${project.basedir}/src/test/resources/routes.yaml</CAMEL_K_ROUTES>
+                        <CAMEL_K_CONF>${project.basedir}/src/test/resources/routes.properties</CAMEL_K_CONF>
+                    </environmentVariables>
+                    <systemProperties>
+                        <quarkus.http.test-port>${test.http.port.jvm}</quarkus.http.test-port>
+                        <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
+                    </systemProperties>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>native</id>
+            <activation>
+                <property>
+                    <name>native</name>
+                </property>
+            </activation>
+            <properties>
+                <quarkus.package.type>native</quarkus.package.type>
+                <quarkus.native.additional-build-args>--language:js</quarkus.native.additional-build-args>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-failsafe-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>integration-test</goal>
+                                    <goal>verify</goal>
+                                </goals>
+                                <configuration>
+                                    <environmentVariables>
+                                        <CAMEL_K_ROUTES>file:${project.basedir}/src/test/resources/routes.yaml</CAMEL_K_ROUTES>
+                                        <CAMEL_K_CONF>${project.basedir}/src/test/resources/routes.properties</CAMEL_K_CONF>
+                                    </environmentVariables>
+                                    <systemProperties>
+                                        <quarkus.http.test-port>${test.http.port.native}</quarkus.http.test-port>
+                                        <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
+                                    </systemProperties>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+
+</project>
diff --git a/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/main/java/org/apache/camel/k/quarkus/wrap/WrapApplication.java b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/main/java/org/apache/camel/k/quarkus/wrap/WrapApplication.java
new file mode 100644
index 0000000..f250eb3
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/main/java/org/apache/camel/k/quarkus/wrap/WrapApplication.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.k.quarkus.wrap;
+
+import java.util.stream.Collectors;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.jms.ConnectionFactory;
+import javax.json.Json;
+import javax.json.JsonObject;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import io.quarkus.arc.Unremovable;
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ConsumerTemplate;
+import org.apache.camel.Endpoint;
+import org.apache.camel.FluentProducerTemplate;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
+
+@Path("/test")
+@ApplicationScoped
+public class WrapApplication {
+    @Inject
+    CamelContext context;
+    @Inject
+    FluentProducerTemplate producerTemplate;
+    @Inject
+    ConsumerTemplate consumerTemplate;
+
+    @GET
+    @Path("/inspect")
+    @Produces(MediaType.APPLICATION_JSON)
+    public JsonObject inspect() {
+        var components = context.getComponentNames();
+        var endpoints = context.getEndpoints().stream().map(Endpoint::getEndpointUri).collect(Collectors.toList());
+
+        return Json.createObjectBuilder()
+            .add("components", Json.createArrayBuilder(components))
+            .add("endpoints", Json.createArrayBuilder(endpoints))
+            .build();
+    }
+    @POST
+    @Path("/request")
+    @Consumes(MediaType.TEXT_PLAIN)
+    public void request(String payload) {
+        producerTemplate.to("direct:request").withBody(payload).asyncRequest();
+    }
+
+    @GET
+    @Path("/receive")
+    @Produces(MediaType.TEXT_PLAIN)
+    public String receive() {
+        return consumerTemplate.receiveBody("direct:response", 5000, String.class);
+    }
+
+    @Unremovable
+    @Named("amqcf")
+    public ConnectionFactory activeMQConnectionFactory(@ConfigProperty(name = "amqBrokerUrl") String brokerUrl) {
+        return new ActiveMQConnectionFactory(brokerUrl);
+    }
+}
diff --git a/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/main/resources/application.properties b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/main/resources/application.properties
new file mode 100644
index 0000000..3ce5493
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/main/resources/application.properties
@@ -0,0 +1,23 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+#
+# Quarkus
+#
+quarkus.log.console.enable = false
+quarkus.banner.enabled     = false
+
diff --git a/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/java/org/apache/camel/k/quarkus/wrap/WrapIT.java b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/java/org/apache/camel/k/quarkus/wrap/WrapIT.java
new file mode 100644
index 0000000..a5f866b
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/java/org/apache/camel/k/quarkus/wrap/WrapIT.java
@@ -0,0 +1,23 @@
+/*
+ * 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.k.quarkus.wrap;
+
+import io.quarkus.test.junit.NativeImageTest;
+
+@NativeImageTest
+public class WrapIT extends WrapTest {
+}
\ No newline at end of file
diff --git a/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/java/org/apache/camel/k/quarkus/wrap/WrapTest.java b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/java/org/apache/camel/k/quarkus/wrap/WrapTest.java
new file mode 100644
index 0000000..1f8a81b
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/java/org/apache/camel/k/quarkus/wrap/WrapTest.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.k.quarkus.wrap;
+
+import java.util.UUID;
+
+import javax.ws.rs.core.MediaType;
+
+import io.quarkus.test.common.QuarkusTestResource;
+import io.quarkus.test.junit.QuarkusTest;
+import io.restassured.RestAssured;
+import io.restassured.path.json.JsonPath;
+import org.junit.jupiter.api.Test;
+
+import static io.restassured.RestAssured.given;
+import static io.restassured.RestAssured.when;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.Matchers.is;
+
+@QuarkusTest
+@QuarkusTestResource(WrapTestResource.class)
+public class WrapTest {
+
+    @Test
+    public void inspect() {
+        JsonPath p = RestAssured.given()
+            .contentType(MediaType.TEXT_PLAIN)
+            .accept(MediaType.APPLICATION_JSON)
+            .get("/test/inspect")
+            .then()
+                .statusCode(200)
+                .extract()
+                    .body()
+                    .jsonPath();
+
+        assertThat(p.getList("components", String.class))
+            .filteredOn(n -> n.startsWith("activemq-"))
+            .hasSize(2);
+        assertThat(p.getList("endpoints", String.class))
+            .filteredOn(e ->  e.startsWith("activemq-"))
+            .hasSize(2);
+        assertThat(p.getList("endpoints", String.class))
+            .filteredOn(e ->  e.startsWith("activemq:"))
+            .isEmpty();
+    }
+
+    @Test
+    public void tests() {
+        final String body = UUID.randomUUID().toString();
+
+        given()
+            .body(body)
+            .post("/test/request")
+        .then()
+            .statusCode(204);
+
+        when()
+            .get("/test/receive")
+            .then()
+                .statusCode(200)
+                .body(is(body));
+
+    }
+}
diff --git a/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/java/org/apache/camel/k/quarkus/wrap/WrapTestResource.java b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/java/org/apache/camel/k/quarkus/wrap/WrapTestResource.java
new file mode 100644
index 0000000..6b54836
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/java/org/apache/camel/k/quarkus/wrap/WrapTestResource.java
@@ -0,0 +1,70 @@
+/*
+ * 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.k.quarkus.wrap;
+
+import java.util.Map;
+
+import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.output.Slf4jLogConsumer;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.utility.TestcontainersConfiguration;
+
+
+public class WrapTestResource implements QuarkusTestResourceLifecycleManager {
+    private static final Logger LOGGER = LoggerFactory.getLogger(WrapTestResource.class);
+
+    private static final String ACTIVEMQ_IMAGE = "rmohr/activemq:5.15.9-alpine";
+    private static final int TCP_PORT = 61616;
+
+    private GenericContainer<?> container;
+
+    @Override
+    public Map<String, String> start() {
+        LOGGER.info(TestcontainersConfiguration.getInstance().toString());
+
+        try {
+            container = new GenericContainer<>(ACTIVEMQ_IMAGE)
+                .withExposedPorts(TCP_PORT)
+                .withLogConsumer(new Slf4jLogConsumer(LOGGER))
+                .waitingFor(Wait.forListeningPort());
+
+            container.start();
+
+            return Map.of(
+                "amqBrokerUrl", String.format("tcp://%s:%d", container.getContainerIpAddress(), container.getMappedPort(TCP_PORT)),
+                "amqQueueName", "my-queue"
+            );
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void stop() {
+        try {
+            if (container != null) {
+                container.stop();
+            }
+        } catch (Exception e) {
+            // ignored
+        }
+    }
+}
+
diff --git a/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/resources/routes.properties b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/resources/routes.properties
new file mode 100644
index 0000000..fa7a54b
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/resources/routes.properties
@@ -0,0 +1,16 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
diff --git a/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/resources/routes.yaml b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/resources/routes.yaml
new file mode 100644
index 0000000..f7dfe59
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-itests/camel-k-quarkus-itests-wrap/src/test/resources/routes.yaml
@@ -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.
+#
+
+- from:
+    uri: "direct:request"
+    steps:
+      - to: "wrap:activemq:{{amqQueueName}}?brokerURL={{amqBrokerUrl}}"
+- from:
+    uri: "wrap:activemq:{{amqQueueName}}?connectionFactory=#amqcf"
+    steps:
+      - to: "direct:response"
\ No newline at end of file
diff --git a/camel-k-quarkus/camel-k-quarkus-itests/pom.xml b/camel-k-quarkus/camel-k-quarkus-itests/pom.xml
index 53742d7..166879f 100644
--- a/camel-k-quarkus/camel-k-quarkus-itests/pom.xml
+++ b/camel-k-quarkus/camel-k-quarkus-itests/pom.xml
@@ -38,11 +38,12 @@
         <module>camel-k-quarkus-itests-loader-xml</module>
         <module>camel-k-quarkus-itests-loader-yaml</module>
         <module>camel-k-quarkus-itests-polyglot</module>
+        <module>camel-k-quarkus-itests-runtime</module>
         <module>camel-k-quarkus-itests-cron</module>
         <module>camel-k-quarkus-itests-master</module>
         <module>camel-k-quarkus-itests-knative</module>
         <module>camel-k-quarkus-itests-kamelet</module>
-        <module>camel-k-quarkus-itests-runtime</module>
+        <module>camel-k-quarkus-itests-wrap</module>
     </modules>
 
 </project>
diff --git a/camel-k-quarkus/camel-k-quarkus-itests/pom.xml b/camel-k-quarkus/camel-k-quarkus-wrap/deployment/pom.xml
similarity index 52%
copy from camel-k-quarkus/camel-k-quarkus-itests/pom.xml
copy to camel-k-quarkus/camel-k-quarkus-wrap/deployment/pom.xml
index 53742d7..c75097d 100644
--- a/camel-k-quarkus/camel-k-quarkus-itests/pom.xml
+++ b/camel-k-quarkus/camel-k-quarkus-wrap/deployment/pom.xml
@@ -20,29 +20,40 @@
 <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">
     <parent>
         <groupId>org.apache.camel.k</groupId>
-        <artifactId>camel-k-quarkus</artifactId>
+        <artifactId>camel-k-quarkus-wrap-parent</artifactId>
         <version>1.5.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
-    <packaging>pom</packaging>
-
-    <artifactId>camel-k-quarkus-itests</artifactId>
-
-    <modules>
-        <module>camel-k-quarkus-itests-core</module>
-        <module>camel-k-quarkus-itests-loader-support</module>
-        <module>camel-k-quarkus-itests-loader-groovy</module>
-        <module>camel-k-quarkus-itests-loader-kotlin</module>
-        <module>camel-k-quarkus-itests-loader-java</module>
-        <module>camel-k-quarkus-itests-loader-js</module>
-        <module>camel-k-quarkus-itests-loader-xml</module>
-        <module>camel-k-quarkus-itests-loader-yaml</module>
-        <module>camel-k-quarkus-itests-polyglot</module>
-        <module>camel-k-quarkus-itests-cron</module>
-        <module>camel-k-quarkus-itests-master</module>
-        <module>camel-k-quarkus-itests-knative</module>
-        <module>camel-k-quarkus-itests-kamelet</module>
-        <module>camel-k-quarkus-itests-runtime</module>
-    </modules>
+
+    <artifactId>camel-k-quarkus-wrap-deployment</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-quarkus-core-deployment</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-quarkus-wrap</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>io.quarkus</groupId>
+                            <artifactId>quarkus-extension-processor</artifactId>
+                            <version>${quarkus-version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>
diff --git a/camel-k-quarkus/camel-k-quarkus-wrap/deployment/src/main/java/org/apache/camel/k/quarkus/wrap/deployment/Feature.java b/camel-k-quarkus/camel-k-quarkus-wrap/deployment/src/main/java/org/apache/camel/k/quarkus/wrap/deployment/Feature.java
new file mode 100644
index 0000000..cb32078
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-wrap/deployment/src/main/java/org/apache/camel/k/quarkus/wrap/deployment/Feature.java
@@ -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.
+ */
+package org.apache.camel.k.quarkus.wrap.deployment;
+
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.builditem.FeatureBuildItem;
+
+public class Feature {
+    private static final String FEATURE = "camel-k-runtime-wrap";
+
+    @BuildStep
+    FeatureBuildItem feature() {
+        return new FeatureBuildItem(FEATURE);
+    }
+}
diff --git a/camel-k-quarkus/camel-k-quarkus-itests/pom.xml b/camel-k-quarkus/camel-k-quarkus-wrap/pom.xml
similarity index 60%
copy from camel-k-quarkus/camel-k-quarkus-itests/pom.xml
copy to camel-k-quarkus/camel-k-quarkus-wrap/pom.xml
index 53742d7..31e2c5d 100644
--- a/camel-k-quarkus/camel-k-quarkus-itests/pom.xml
+++ b/camel-k-quarkus/camel-k-quarkus-wrap/pom.xml
@@ -26,23 +26,11 @@
     <modelVersion>4.0.0</modelVersion>
     <packaging>pom</packaging>
 
-    <artifactId>camel-k-quarkus-itests</artifactId>
+    <artifactId>camel-k-quarkus-wrap-parent</artifactId>
 
     <modules>
-        <module>camel-k-quarkus-itests-core</module>
-        <module>camel-k-quarkus-itests-loader-support</module>
-        <module>camel-k-quarkus-itests-loader-groovy</module>
-        <module>camel-k-quarkus-itests-loader-kotlin</module>
-        <module>camel-k-quarkus-itests-loader-java</module>
-        <module>camel-k-quarkus-itests-loader-js</module>
-        <module>camel-k-quarkus-itests-loader-xml</module>
-        <module>camel-k-quarkus-itests-loader-yaml</module>
-        <module>camel-k-quarkus-itests-polyglot</module>
-        <module>camel-k-quarkus-itests-cron</module>
-        <module>camel-k-quarkus-itests-master</module>
-        <module>camel-k-quarkus-itests-knative</module>
-        <module>camel-k-quarkus-itests-kamelet</module>
-        <module>camel-k-quarkus-itests-runtime</module>
+        <module>runtime</module>
+        <module>deployment</module>
     </modules>
 
 </project>
diff --git a/camel-k-quarkus/camel-k-quarkus-wrap/runtime/pom.xml b/camel-k-quarkus/camel-k-quarkus-wrap/runtime/pom.xml
new file mode 100644
index 0000000..b20ce32
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-wrap/runtime/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">
+    <parent>
+        <groupId>org.apache.camel.k</groupId>
+        <artifactId>camel-k-quarkus-wrap-parent</artifactId>
+        <version>1.5.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>camel-k-quarkus-wrap</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-quarkus-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-wrap</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>io.quarkus</groupId>
+                <artifactId>quarkus-bootstrap-maven-plugin</artifactId>
+                <version>${quarkus-version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>extension-descriptor</goal>
+                        </goals>
+                        <configuration>
+                            <deployment>${project.groupId}:${project.artifactId}-deployment:${project.version}</deployment>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>io.quarkus</groupId>
+                            <artifactId>quarkus-extension-processor</artifactId>
+                            <version>${quarkus-version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.jboss.jandex</groupId>
+                <artifactId>jandex-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>make-index</id>
+                        <goals>
+                            <goal>jandex</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/camel-k-quarkus/pom.xml b/camel-k-quarkus/pom.xml
index 2919325..5f57132 100644
--- a/camel-k-quarkus/pom.xml
+++ b/camel-k-quarkus/pom.xml
@@ -60,6 +60,7 @@
         <module>camel-k-quarkus-knative</module>
         <module>camel-k-quarkus-cron</module>
         <module>camel-k-quarkus-master</module>
+        <module>camel-k-quarkus-wrap</module>
 
         <module>camel-k-runtime-quarkus</module>
 
diff --git a/camel-k-runtime-bom/pom.xml b/camel-k-runtime-bom/pom.xml
index 3803eb9..3fa9123 100644
--- a/camel-k-runtime-bom/pom.xml
+++ b/camel-k-runtime-bom/pom.xml
@@ -141,6 +141,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel.k</groupId>
+                <artifactId>camel-wrap</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel.k</groupId>
                 <artifactId>camel-k-maven-plugin</artifactId>
                 <version>${project.version}</version>
             </dependency>
@@ -316,6 +321,16 @@
                 <artifactId>camel-k-quarkus-master-deployment</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.camel.k</groupId>
+                <artifactId>camel-k-quarkus-wrap</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel.k</groupId>
+                <artifactId>camel-k-quarkus-wrap-deployment</artifactId>
+                <version>${project.version}</version>
+            </dependency>
 
             <!-- loaders -->
             <dependency>
diff --git a/camel-wrap/pom.xml b/camel-wrap/pom.xml
new file mode 100644
index 0000000..af467d2
--- /dev/null
+++ b/camel-wrap/pom.xml
@@ -0,0 +1,145 @@
+<?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">
+    <parent>
+        <groupId>org.apache.camel.k</groupId>
+        <artifactId>camel-k-runtime-parent</artifactId>
+        <version>1.5.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>camel-wrap</artifactId>
+    <description>The Wrap Component provides support for configuring component options from the URI</description>
+
+    <dependencies>
+
+        <!-- ****************************** -->
+        <!--                                -->
+        <!-- RUNTIME                        -->
+        <!--                                -->
+        <!-- ****************************** -->
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core-engine</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core-catalog</artifactId>
+        </dependency>
+
+        <!-- ****************************** -->
+        <!--                                -->
+        <!-- TESTS                          -->
+        <!--                                -->
+        <!-- ****************************** -->
+
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core-languages</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-timer</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-log</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-activemq</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-mock</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-testcontainers-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.jboss.jandex</groupId>
+                <artifactId>jandex-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>make-index</id>
+                        <goals>
+                            <goal>jandex</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-component-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>generate</id>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>add-source</goal>
+                            <goal>add-resource</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src/generated/java</source>
+                            </sources>
+                            <resources>
+                                <resource>
+                                    <directory>src/generated/resources</directory>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/camel-wrap/src/generated/java/org/apache/camel/component/wrap/WrapComponentConfigurer.java b/camel-wrap/src/generated/java/org/apache/camel/component/wrap/WrapComponentConfigurer.java
new file mode 100644
index 0000000..39d4f46
--- /dev/null
+++ b/camel-wrap/src/generated/java/org/apache/camel/component/wrap/WrapComponentConfigurer.java
@@ -0,0 +1,55 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.wrap;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+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 WrapComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        WrapComponent target = (WrapComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Map<String, Object> getAllOptions(Object target) {
+        Map<String, Object> answer = new CaseInsensitiveMap();
+        answer.put("basicPropertyBinding", boolean.class);
+        answer.put("bridgeErrorHandler", boolean.class);
+        answer.put("lazyStartProducer", boolean.class);
+        return answer;
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        WrapComponent target = (WrapComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "basicpropertybinding":
+        case "basicPropertyBinding": return target.isBasicPropertyBinding();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        default: return null;
+        }
+    }
+}
+
diff --git a/camel-wrap/src/generated/java/org/apache/camel/component/wrap/WrapEndpointConfigurer.java b/camel-wrap/src/generated/java/org/apache/camel/component/wrap/WrapEndpointConfigurer.java
new file mode 100644
index 0000000..97940e9
--- /dev/null
+++ b/camel-wrap/src/generated/java/org/apache/camel/component/wrap/WrapEndpointConfigurer.java
@@ -0,0 +1,68 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.wrap;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+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 WrapEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        WrapEndpoint target = (WrapEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.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 "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "synchronous": target.setSynchronous(property(camelContext, boolean.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Map<String, Object> getAllOptions(Object target) {
+        Map<String, Object> answer = new CaseInsensitiveMap();
+        answer.put("basicPropertyBinding", boolean.class);
+        answer.put("bridgeErrorHandler", boolean.class);
+        answer.put("exceptionHandler", org.apache.camel.spi.ExceptionHandler.class);
+        answer.put("exchangePattern", org.apache.camel.ExchangePattern.class);
+        answer.put("lazyStartProducer", boolean.class);
+        answer.put("synchronous", boolean.class);
+        return answer;
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        WrapEndpoint target = (WrapEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "basicpropertybinding":
+        case "basicPropertyBinding": return target.isBasicPropertyBinding();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "exceptionhandler":
+        case "exceptionHandler": return target.getExceptionHandler();
+        case "exchangepattern":
+        case "exchangePattern": return target.getExchangePattern();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        case "synchronous": return target.isSynchronous();
+        default: return null;
+        }
+    }
+}
+
diff --git a/camel-wrap/src/generated/resources/META-INF/services/org/apache/camel/component/wrap b/camel-wrap/src/generated/resources/META-INF/services/org/apache/camel/component/wrap
new file mode 100644
index 0000000..e4985d6
--- /dev/null
+++ b/camel-wrap/src/generated/resources/META-INF/services/org/apache/camel/component/wrap
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.wrap.WrapComponent
diff --git a/camel-wrap/src/generated/resources/META-INF/services/org/apache/camel/configurer/wrap-component b/camel-wrap/src/generated/resources/META-INF/services/org/apache/camel/configurer/wrap-component
new file mode 100644
index 0000000..333db57
--- /dev/null
+++ b/camel-wrap/src/generated/resources/META-INF/services/org/apache/camel/configurer/wrap-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.wrap.WrapComponentConfigurer
diff --git a/camel-wrap/src/generated/resources/META-INF/services/org/apache/camel/configurer/wrap-endpoint b/camel-wrap/src/generated/resources/META-INF/services/org/apache/camel/configurer/wrap-endpoint
new file mode 100644
index 0000000..1f8b89c
--- /dev/null
+++ b/camel-wrap/src/generated/resources/META-INF/services/org/apache/camel/configurer/wrap-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.wrap.WrapEndpointConfigurer
diff --git a/camel-wrap/src/generated/resources/org/apache/camel/component/wrap/wrap.json b/camel-wrap/src/generated/resources/org/apache/camel/component/wrap/wrap.json
new file mode 100644
index 0000000..35e25de
--- /dev/null
+++ b/camel-wrap/src/generated/resources/org/apache/camel/component/wrap/wrap.json
@@ -0,0 +1,37 @@
+{
+  "component": {
+    "kind": "component",
+    "name": "wrap",
+    "title": "Wrap",
+    "description": "The Wrap Component provides support for configuring component options from the URI",
+    "deprecated": false,
+    "firstVersion": "3.6.0",
+    "label": "core",
+    "javaType": "org.apache.camel.component.wrap.WrapComponent",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel.k",
+    "artifactId": "camel-wrap",
+    "version": "1.5.1-SNAPSHOT",
+    "scheme": "wrap",
+    "extendsScheme": "",
+    "syntax": "wrap:delegateUri",
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": false,
+    "lenientProperties": true
+  },
+  "componentProperties": {
+    "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": 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 message and handled by [...]
+    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": 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 starting and cause the r [...]
+    "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" }
+  },
+  "properties": {
+    "delegateUri": { "kind": "path", "displayName": "Delegate Uri", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "secret": false, "description": "The delegated uri" },
+    "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": 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 message and handled b [...]
+    "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, "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 consumer will deal with [...]
+    "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, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
+    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": 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 starting and cause the  [...]
+    "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." }
+  }
+}
diff --git a/camel-wrap/src/main/java/org/apache/camel/component/wrap/Wrap.java b/camel-wrap/src/main/java/org/apache/camel/component/wrap/Wrap.java
new file mode 100644
index 0000000..ef5521a
--- /dev/null
+++ b/camel-wrap/src/main/java/org/apache/camel/component/wrap/Wrap.java
@@ -0,0 +1,45 @@
+/*
+ * 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.wrap;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Component;
+import org.apache.camel.ExtendedCamelContext;
+
+public final class Wrap {
+    public static final String SCHEME = "wrap";
+
+    private Wrap() {
+    }
+
+    public static Component newComponentInstance(CamelContext context, String scheme) throws Exception {
+        // first check if there's an instance of the given component in the registry
+        Component answer = context.getRegistry().lookupByNameAndType(scheme, Component.class);
+        if (answer != null) {
+            // and then create a new instance using it's class
+            return context.getInjector().newInstance(answer.getClass());
+        }
+
+        // if not, fallback to the factory finder way
+        answer = context.adapt(ExtendedCamelContext.class).getComponentResolver().resolveComponent(scheme, context);
+        if (answer == null) {
+            throw new IllegalStateException("Unable to create an instance of the component with scheme: " + scheme);
+        }
+
+        return answer;
+    }
+}
diff --git a/camel-wrap/src/main/java/org/apache/camel/component/wrap/WrapComponent.java b/camel-wrap/src/main/java/org/apache/camel/component/wrap/WrapComponent.java
new file mode 100644
index 0000000..87f07fd
--- /dev/null
+++ b/camel-wrap/src/main/java/org/apache/camel/component/wrap/WrapComponent.java
@@ -0,0 +1,91 @@
+/*
+ * 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.wrap;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
+import org.apache.camel.support.PropertyBindingSupport;
+import org.apache.camel.util.StringHelper;
+import org.apache.camel.util.URISupport;
+import org.apache.camel.util.UnsafeUriCharactersEncoder;
+
+@Component(Wrap.SCHEME)
+public class WrapComponent extends DefaultComponent {
+    private static final AtomicInteger COUNTER = new AtomicInteger();
+
+    public WrapComponent() {
+        this(null);
+    }
+
+    public WrapComponent(CamelContext context) {
+        super(context);
+    }
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        final String query;
+
+        int idx = uri.indexOf('?');
+        if (idx > -1) {
+            query = uri.substring(idx + 1);
+        } else {
+            final String encoded = UnsafeUriCharactersEncoder.encode(uri);
+            final URI u = new URI(encoded);
+
+            query = u.getRawQuery();
+        }
+
+        final Map<String, Object> queryParams = URISupport.parseQuery(query, true);
+        final String scheme = StringHelper.before(remaining, ":");
+        final String path =  StringHelper.after(remaining, ":");
+        final String newScheme = scheme + "-" + COUNTER.getAndIncrement();
+        final org.apache.camel.Component newComponent = Wrap.newComponentInstance(getCamelContext(), scheme);
+
+        for (Map.Entry<String, Object> entry: parameters.entrySet()) {
+            String key = entry.getKey();
+            Object val = entry.getValue();
+
+            boolean bound = PropertyBindingSupport.build()
+                .withConfigurer(newComponent.getComponentPropertyConfigurer())
+                .withReference(true)
+                .withRemoveParameters(true)
+                .bind(getCamelContext(), newComponent, key, val);
+
+            if (bound) {
+                queryParams.remove(key);
+            }
+        }
+
+        getCamelContext().addComponent(newScheme, newComponent);
+
+        return new WrapEndpoint(
+            uri,
+            this,
+            URISupport.appendParametersToURI(newScheme + ":" + path, queryParams));
+    }
+
+    @Override
+    public boolean useRawUri() {
+        return true;
+    }
+}
diff --git a/camel-wrap/src/main/java/org/apache/camel/component/wrap/WrapEndpoint.java b/camel-wrap/src/main/java/org/apache/camel/component/wrap/WrapEndpoint.java
new file mode 100644
index 0000000..ec150c2
--- /dev/null
+++ b/camel-wrap/src/main/java/org/apache/camel/component/wrap/WrapEndpoint.java
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.wrap;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.AsyncProducer;
+import org.apache.camel.Category;
+import org.apache.camel.Consumer;
+import org.apache.camel.DelegateEndpoint;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriPath;
+import org.apache.camel.support.DefaultAsyncProducer;
+import org.apache.camel.support.DefaultConsumer;
+import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.support.service.ServiceHelper;
+
+@UriEndpoint(
+    firstVersion = "3.6.0",
+    scheme = "wrap",
+    syntax = "wrap:delegateUri",
+    title = "Wrap",
+    lenientProperties = true,
+    category = Category.CORE)
+public class WrapEndpoint extends DefaultEndpoint implements DelegateEndpoint {
+    @Metadata(required = true)
+    @UriPath(description = "The delegated uri")
+    private final String delegateUri;
+
+    private final Endpoint delegateEndpoint;
+
+    public WrapEndpoint(String uri, WrapComponent component, String delegateUri) {
+        super(uri, component);
+
+        this.delegateUri = delegateUri;
+        this.delegateEndpoint = component.getCamelContext().getEndpoint(delegateUri);
+    }
+
+    public String getDelegateUri() {
+        return delegateUri;
+    }
+
+    @Override
+    public Endpoint getEndpoint() {
+        return delegateEndpoint;
+    }
+
+    @Override
+    public WrapComponent getComponent() {
+        return (WrapComponent) super.getComponent();
+    }
+
+    @Override
+    public boolean isLenientProperties() {
+        return true;
+    }
+
+    @Override
+    public boolean isSingleton() {
+        return false;
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        return new KameletProducer();
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        Consumer answer = new KemeletConsumer(processor);
+        configureConsumer(answer);
+        return answer;
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        ServiceHelper.startService(delegateEndpoint);
+        super.doStart();
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        ServiceHelper.stopService(delegateEndpoint);
+        super.doStart();
+    }
+
+    // *********************************
+    //
+    // Helpers
+    //
+    // *********************************
+
+    private class KemeletConsumer extends DefaultConsumer {
+        private volatile Consumer consumer;
+
+        public KemeletConsumer(Processor processor) {
+            super(WrapEndpoint.this, processor);
+        }
+
+        @Override
+        protected void doStart() throws Exception {
+            consumer = delegateEndpoint.createConsumer(getProcessor());
+
+            ServiceHelper.startService(consumer);
+            super.doStart();
+        }
+
+        @Override
+        protected void doStop() throws Exception {
+            ServiceHelper.stopService(consumer);
+            super.doStop();
+        }
+    }
+
+    private class KameletProducer extends DefaultAsyncProducer {
+        private volatile AsyncProducer producer;
+
+        public KameletProducer() {
+            super(WrapEndpoint.this);
+        }
+
+        @Override
+        public boolean process(Exchange exchange, AsyncCallback callback) {
+            if (producer != null) {
+                return producer.process(exchange, callback);
+            } else {
+                callback.done(true);
+                return true;
+            }
+        }
+
+        @Override
+        protected void doStart() throws Exception {
+            producer = delegateEndpoint.createAsyncProducer();
+            ServiceHelper.startService(producer);
+            super.doStart();
+        }
+
+        @Override
+        protected void doStop() throws Exception {
+            ServiceHelper.stopService(producer);
+            super.doStop();
+        }
+    }
+}
\ No newline at end of file
diff --git a/camel-wrap/src/test/java/org/apache/camel/component/wrap/WrapBasicTest.java b/camel-wrap/src/test/java/org/apache/camel/component/wrap/WrapBasicTest.java
new file mode 100644
index 0000000..2f489e1
--- /dev/null
+++ b/camel-wrap/src/test/java/org/apache/camel/component/wrap/WrapBasicTest.java
@@ -0,0 +1,116 @@
+/*
+ * 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.wrap;
+
+import java.util.Properties;
+
+import javax.jms.ConnectionFactory;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.PropertyInject;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.testcontainers.junit5.ContainerAwareTestSupport;
+import org.apache.camel.test.testcontainers.junit5.Wait;
+import org.apache.http.annotation.Obsolete;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.output.Slf4jLogConsumer;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class WrapBasicTest extends ContainerAwareTestSupport {
+    private static final Logger LOGGER = LoggerFactory.getLogger(WrapBasicTest.class);
+    private static final String CONTAINER_NAME = "activemq";
+    private static final String CONTAINER_IMAGE = "rmohr/activemq:5.15.9-alpine";
+    private static final int TCP_PORT = 61616;
+    private static final String QUEUE_NAME = "my-queue";
+
+    @Test
+    public void componentsAreWrapped() throws Exception {
+        assertThat(context().getComponentNames())
+            .filteredOn(n -> n.startsWith("activemq-"))
+            .hasSize(2);
+
+        assertThat(context().getEndpoints())
+            .filteredOn(e ->  e.getEndpointUri().startsWith("activemq-"))
+            .hasSize(2);
+        assertThat(context().getEndpoints())
+            .filteredOn(e ->  e.getEndpointUri().startsWith("activemq:"))
+            .isEmpty();
+
+        getMockEndpoint("mock:result")
+            .expectedBodiesReceived("test");
+
+        fluentTemplate()
+            .to("direct:start")
+            .withBody("test")
+            .send();
+
+        getMockEndpoint("mock:result")
+            .assertIsSatisfied();
+    }
+
+    // **********************************************
+    //
+    // test set-up
+    //
+    // **********************************************
+
+    @Obsolete
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .to("wrap:activemq:{{amqQueueName}}?brokerURL={{amqBrokerUrl}}");
+                from("wrap:activemq:{{amqQueueName}}?connectionFactory=#amqcf")
+                    .to("mock:result");
+            }
+        };
+    }
+
+    @Override
+    protected GenericContainer<?> createContainer() {
+        return new GenericContainer<>(CONTAINER_IMAGE)
+            .withNetworkAliases(CONTAINER_NAME)
+            .withExposedPorts(TCP_PORT)
+            .withLogConsumer(new Slf4jLogConsumer(LOGGER))
+            .waitingFor(Wait.forListeningPort());
+    }
+
+    @Override
+    protected Properties useOverridePropertiesWithPropertiesComponent() {
+        final String host = getContainerHost(CONTAINER_NAME);
+        final int port = getContainerPort(CONTAINER_NAME, TCP_PORT);
+        final String brokerUrl = String.format("tcp://%s:%d", host, port);
+
+        Properties properties = new Properties();
+        properties.setProperty("amqBrokerUrl", brokerUrl);
+        properties.setProperty("amqQueueName", QUEUE_NAME);
+
+        return properties;
+    }
+
+    @BindToRegistry("amqcf")
+    public ConnectionFactory activeMQConnectionFactory(@PropertyInject("amqBrokerUrl") String brokerUrl) {
+        return new ActiveMQConnectionFactory(brokerUrl);
+    }
+}
diff --git a/camel-wrap/src/test/resources/log4j2-test.xml b/camel-wrap/src/test/resources/log4j2-test.xml
new file mode 100644
index 0000000..219912c
--- /dev/null
+++ b/camel-wrap/src/test/resources/log4j2-test.xml
@@ -0,0 +1,42 @@
+<?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.
+
+-->
+<Configuration status="INFO">
+  <Appenders>
+    <Console name="STDOUT" target="SYSTEM_OUT">
+      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%t|%c{1} - %msg%n"/>
+    </Console>
+    <File name="FILE" filename="target/camel-wrap-test.log">
+      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+    </File>
+    <Null name="NONE"/>
+  </Appenders>
+
+  <Loggers>
+    <Logger name="org.apache.camel.component.wrap" level="TRACE"/>
+
+    <Root level="INFO">
+      <!--
+      <AppenderRef ref="STDOUT"/>
+      -->
+      <AppenderRef ref="FILE"/>
+    </Root>
+  </Loggers>
+
+</Configuration>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index dcf4046..2500057 100644
--- a/pom.xml
+++ b/pom.xml
@@ -312,6 +312,7 @@
 
         <module>camel-knative</module>
         <module>camel-kamelet</module>
+        <module>camel-wrap</module>
 
         <module>camel-k-runtime-core</module>
         <module>camel-k-main</module>
@@ -423,6 +424,11 @@
                 <artifactId>camel-kamelet</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.camel.k</groupId>
+                <artifactId>camel-wrap</artifactId>
+                <version>${project.version}</version>
+            </dependency>
 
             <!-- runtime -->
             <dependency>
@@ -587,6 +593,16 @@
                 <artifactId>camel-k-quarkus-master-deployment</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.camel.k</groupId>
+                <artifactId>camel-k-quarkus-wrap</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel.k</groupId>
+                <artifactId>camel-k-quarkus-wrap-deployment</artifactId>
+                <version>${project.version}</version>
+            </dependency>
 
             <!-- runtime - quarkus (tests)-->
 
diff --git a/tooling/camel-k-maven-plugin/src/it/generate-catalog-main/verify.groovy b/tooling/camel-k-maven-plugin/src/it/generate-catalog-main/verify.groovy
index 60a9b53..5cef030 100644
--- a/tooling/camel-k-maven-plugin/src/it/generate-catalog-main/verify.groovy
+++ b/tooling/camel-k-maven-plugin/src/it/generate-catalog-main/verify.groovy
@@ -56,4 +56,10 @@ new File(basedir, "catalog.yaml").withReader {
         assert schemes[0].passive == true
         assert schemes[0].http == false
     }
+
+    catalog.spec.artifacts['camel-wrap'].with {
+        assert schemes.size() == 1
+        assert schemes[0].id == 'wrap'
+        assert dependencies.find { it.groupId == 'org.apache.camel.k' && it.artifactId == 'camel-wrap' }
+    }
 }
diff --git a/tooling/camel-k-maven-plugin/src/it/generate-catalog-quarkus/verify.groovy b/tooling/camel-k-maven-plugin/src/it/generate-catalog-quarkus/verify.groovy
index 1a7f291..efde5b0 100644
--- a/tooling/camel-k-maven-plugin/src/it/generate-catalog-quarkus/verify.groovy
+++ b/tooling/camel-k-maven-plugin/src/it/generate-catalog-quarkus/verify.groovy
@@ -56,4 +56,10 @@ new File(basedir, "catalog.yaml").withReader {
         assert schemes[0].passive == true
         assert schemes[0].http == false
     }
+
+    catalog.spec.artifacts['camel-wrap'].with {
+        assert schemes.size() == 1
+        assert schemes[0].id == 'wrap'
+        assert dependencies.find { it.groupId == 'org.apache.camel.k' && it.artifactId == 'camel-k-quarkus-wrap' }
+    }
 }
\ No newline at end of file
diff --git a/tooling/camel-k-maven-plugin/src/main/java/org/apache/camel/k/tooling/maven/processors/CatalogProcessor3x.java b/tooling/camel-k-maven-plugin/src/main/java/org/apache/camel/k/tooling/maven/processors/CatalogProcessor3x.java
index e33f2eb..89210ab 100644
--- a/tooling/camel-k-maven-plugin/src/main/java/org/apache/camel/k/tooling/maven/processors/CatalogProcessor3x.java
+++ b/tooling/camel-k-maven-plugin/src/main/java/org/apache/camel/k/tooling/maven/processors/CatalogProcessor3x.java
@@ -202,6 +202,22 @@ public class CatalogProcessor3x implements CatalogProcessor {
                     MavenArtifact.from("org.apache.camel.k", "camel-k-quarkus-kamelet"))
                 .build()
         );
+
+        specBuilder.putArtifact(
+            new CamelArtifact.Builder()
+                .groupId("org.apache.camel.k")
+                .artifactId("camel-wrap")
+                .addScheme(new CamelScheme.Builder()
+                    .id("wrap")
+                    .build())
+                .addDependencies(
+                    () -> catalog.getRuntimeProvider() instanceof DefaultRuntimeProvider,
+                    MavenArtifact.from("org.apache.camel.k", "camel-wrap"))
+                .addDependencies(
+                    () -> catalog.getRuntimeProvider() instanceof QuarkusRuntimeProvider,
+                    MavenArtifact.from("org.apache.camel.k", "camel-k-quarkus-wrap"))
+                .build()
+        );
     }
 
     private static void processLoaders(CamelCatalog catalog, CamelCatalogSpec.Builder specBuilder) {