diff --git a/integration-tests/ahc/pom.xml b/integration-tests/ahc/pom.xml
deleted file mode 100644
index e3acf22..0000000
--- a/integration-tests/ahc/pom.xml
+++ /dev/null
@@ -1,128 +0,0 @@
-<?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.quarkus</groupId>
-        <artifactId>camel-quarkus-integration-tests</artifactId>
-        <version>1.1.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>camel-quarkus-integration-test-ahc</artifactId>
-    <name>Camel Quarkus :: Integration Tests :: AHC (Async Http Client)</name>
-    <description>Integration tests for Camel Quarkus AHC (Async Http Client) extension</description>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-ahc</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-resteasy</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>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>io.quarkus</groupId>
-                <artifactId>quarkus-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>build</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>native</id>
-            <activation>
-                <property>
-                    <name>native</name>
-                </property>
-            </activation>
-            <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>
-                                    <systemProperties>
-                                        <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
-                                    </systemProperties>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>io.quarkus</groupId>
-                        <artifactId>quarkus-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>native-image</id>
-                                <goals>
-                                    <goal>native-image</goal>
-                                </goals>
-                                <configuration>
-                                    <reportErrorsAtRuntime>false</reportErrorsAtRuntime>
-                                    <cleanupServer>true</cleanupServer>
-                                    <enableHttpsUrlHandler>true</enableHttpsUrlHandler>
-                                    <enableServer>false</enableServer>
-                                    <dumpProxies>false</dumpProxies>
-                                    <graalvmHome>${graalvmHome}</graalvmHome>
-                                    <enableJni>true</enableJni>
-                                    <enableAllSecurityServices>true</enableAllSecurityServices>
-                                    <disableReports>true</disableReports>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
diff --git a/integration-tests/ahc/src/main/java/org/apache/camel/quarkus/component/ahc/it/AhcResource.java b/integration-tests/ahc/src/main/java/org/apache/camel/quarkus/component/ahc/it/AhcResource.java
deleted file mode 100644
index 1e0a278..0000000
--- a/integration-tests/ahc/src/main/java/org/apache/camel/quarkus/component/ahc/it/AhcResource.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.quarkus.component.ahc.it;
-
-import java.net.URI;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-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.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.ProducerTemplate;
-import org.eclipse.microprofile.config.inject.ConfigProperty;
-import org.jboss.logging.Logger;
-
-@Path("/ahc")
-@ApplicationScoped
-public class AhcResource {
-
-    private static final Logger LOG = Logger.getLogger(AhcResource.class);
-
-    @ConfigProperty(name = "quarkus.http.test-port", defaultValue = "8081")
-    int port;
-
-    @Inject
-    ProducerTemplate producerTemplate;
-
-    @Path("/hello") // the "server" called by the AHC client
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public String getEcho(@QueryParam("name") String name) throws Exception {
-        return "Hello " + name;
-    }
-
-    @Path("/hello") // the "server" called by the AHC client
-    @POST
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response postEcho(String name) throws Exception {
-        return Response
-                .created(new URI("https://camel.apache.org/"))
-                .entity("Hello " + name)
-                .build();
-    }
-
-    @Path("/get") // called from the test
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public String get(@QueryParam("name") String name) throws Exception {
-        final String message = producerTemplate.requestBodyAndHeader(
-                "ahc:http://localhost:" + port + "/ahc/hello?name=" + name,
-                null,
-                Exchange.HTTP_METHOD,
-                "GET",
-                String.class);
-        LOG.infof("Received from ahc: %s", message);
-        return message;
-    }
-
-    @Path("/post") // called from the test
-    @POST
-    @Consumes(MediaType.TEXT_PLAIN)
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response post(String name) throws Exception {
-        LOG.infof("Sending to ahc: %s", name);
-        final String message = producerTemplate.requestBodyAndHeader(
-                "ahc:http://localhost:" + port + "/ahc/hello",
-                name,
-                Exchange.HTTP_METHOD,
-                "POST",
-                String.class);
-        LOG.infof("Got response from ahc: %s", message);
-        return Response
-                .created(new URI("https://camel.apache.org/"))
-                .entity(message)
-                .build();
-    }
-
-}
diff --git a/integration-tests/ahc/src/test/java/org/apache/camel/quarkus/component/ahc/it/AhcIT.java b/integration-tests/ahc/src/test/java/org/apache/camel/quarkus/component/ahc/it/AhcIT.java
deleted file mode 100644
index dc805a7..0000000
--- a/integration-tests/ahc/src/test/java/org/apache/camel/quarkus/component/ahc/it/AhcIT.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.quarkus.component.ahc.it;
-
-import io.quarkus.test.junit.NativeImageTest;
-
-@NativeImageTest
-class AhcIT extends AhcTest {
-
-}
diff --git a/integration-tests/ahc/src/test/java/org/apache/camel/quarkus/component/ahc/it/AhcTest.java b/integration-tests/ahc/src/test/java/org/apache/camel/quarkus/component/ahc/it/AhcTest.java
deleted file mode 100644
index 47b2ee5..0000000
--- a/integration-tests/ahc/src/test/java/org/apache/camel/quarkus/component/ahc/it/AhcTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.quarkus.component.ahc.it;
-
-import java.util.UUID;
-
-import org.junit.jupiter.api.Test;
-
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
-
-@QuarkusTest
-class AhcTest {
-
-    @Test
-    public void get() {
-        final String name = UUID.randomUUID().toString().replace("-", "");
-        RestAssured.given()
-                .contentType(ContentType.TEXT)
-                .queryParam("name", name)
-                .get("/ahc/hello")
-                .then()
-                .statusCode(200)
-                .body(org.hamcrest.Matchers.equalTo("Hello " + name));
-    }
-
-    @Test
-    public void post() {
-        final String name = UUID.randomUUID().toString().replace("-", "");
-        RestAssured.given()
-                .contentType(ContentType.TEXT)
-                .body(name)
-                .post("/ahc/hello")
-                .then()
-                .statusCode(201)
-                .body(org.hamcrest.Matchers.equalTo("Hello " + name));
-    }
-
-}
diff --git a/integration-tests/http/pom.xml b/integration-tests/http/pom.xml
index 562e214..881614a 100644
--- a/integration-tests/http/pom.xml
+++ b/integration-tests/http/pom.xml
@@ -37,6 +37,14 @@
             <artifactId>camel-quarkus-http</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-ahc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-netty-http</artifactId>
+        </dependency>
+        <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-resteasy</artifactId>
         </dependency>
diff --git a/integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpResource.java b/integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpResource.java
index 79e1b88..3c2889e 100644
--- a/integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpResource.java
+++ b/integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpResource.java
@@ -29,30 +29,96 @@
 import org.apache.camel.Exchange;
 import org.apache.camel.FluentProducerTemplate;
 
-@Path("/test")
+@Path("/test/client")
 @ApplicationScoped
 public class HttpResource {
     @Inject
     FluentProducerTemplate producerTemplate;
 
-    @Path("/get")
+    // *****************************
+    //
+    // camel-ahc
+    //
+    // *****************************
+
+    @Path("/ahc/get")
     @GET
     @Produces(MediaType.TEXT_PLAIN)
     public String get(@QueryParam("test-port") int port) {
         return producerTemplate
-                .to("http://localhost:" + port + "/service/get?bridgeEndpoint=true&httpMethod=GET")
+                .to("ahc:http://localhost:" + port + "/service/get?bridgeEndpoint=true")
+                .withHeader(Exchange.HTTP_METHOD, "GET")
                 .request(String.class);
     }
 
-    @Path("/post")
+    @Path("/ahc/post")
     @POST
     @Consumes(MediaType.TEXT_PLAIN)
     @Produces(MediaType.TEXT_PLAIN)
     public String post(@QueryParam("test-port") int port, String message) {
         return producerTemplate
-                .to("http://localhost:" + port + "/service/toUpper?bridgeEndpoint=true&httpMethod=POST")
+                .to("ahc://http://localhost:" + port + "/service/toUpper?bridgeEndpoint=true")
                 .withBody(message)
                 .withHeader(Exchange.CONTENT_TYPE, MediaType.TEXT_PLAIN)
+                .withHeader(Exchange.HTTP_METHOD, "POST")
+                .request(String.class);
+    }
+
+    // *****************************
+    //
+    // camel-http
+    //
+    // *****************************
+
+    @Path("/http/get")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public String httpGet(@QueryParam("test-port") int port) {
+        return producerTemplate
+                .to("http://localhost:" + port + "/service/get?bridgeEndpoint=true")
+                .withHeader(Exchange.HTTP_METHOD, "GET")
+                .request(String.class);
+    }
+
+    @Path("/http/post")
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.TEXT_PLAIN)
+    public String httpPost(@QueryParam("test-port") int port, String message) {
+        return producerTemplate
+                .to("http://localhost:" + port + "/service/toUpper?bridgeEndpoint=true")
+                .withBody(message)
+                .withHeader(Exchange.CONTENT_TYPE, MediaType.TEXT_PLAIN)
+                .withHeader(Exchange.HTTP_METHOD, "POST")
+                .request(String.class);
+    }
+
+    // *****************************
+    //
+    // camel-netty-http
+    //
+    // *****************************
+
+    @Path("/netty-http/get")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public String nettyHttpGet(@QueryParam("test-port") int port) {
+        return producerTemplate
+                .to("netty-http:http://localhost:" + port + "/service/get?bridgeEndpoint=true")
+                .withHeader(Exchange.HTTP_METHOD, "GET")
+                .request(String.class);
+    }
+
+    @Path("/netty-http/post")
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.TEXT_PLAIN)
+    public String hettyHttpPost(@QueryParam("test-port") int port, String message) {
+        return producerTemplate
+                .to("netty-http://http://localhost:" + port + "/service/toUpper?bridgeEndpoint=true")
+                .withBody(message)
+                .withHeader(Exchange.CONTENT_TYPE, MediaType.TEXT_PLAIN)
+                .withHeader(Exchange.HTTP_METHOD, "POST")
                 .request(String.class);
     }
 }
diff --git a/integration-tests/netty-http/src/main/java/org/apache/camel/quarkus/component/netty/http/CamelRoute.java b/integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpRoute.java
similarity index 71%
rename from integration-tests/netty-http/src/main/java/org/apache/camel/quarkus/component/netty/http/CamelRoute.java
rename to integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpRoute.java
index db5ea37..9c2ce22 100644
--- a/integration-tests/netty-http/src/main/java/org/apache/camel/quarkus/component/netty/http/CamelRoute.java
+++ b/integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpRoute.java
@@ -14,20 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.netty.http;
+package org.apache.camel.quarkus.component.http.it;
 
 import org.apache.camel.builder.RouteBuilder;
 
-public class CamelRoute extends RouteBuilder {
-
+public class HttpRoute extends RouteBuilder {
     @Override
     public void configure() {
-        from("netty-http:http://0.0.0.0:{{camel.netty.test-port}}/foo")
+        from("netty-http:http://0.0.0.0:{{camel.netty-http.test-port}}/test/server/hello")
                 .transform().constant("Netty Hello World");
-
-        /* /producer proxying /foo */
-        from("netty-http:http://0.0.0.0:{{camel.netty.test-port}}/producer")
-                .to("netty-http:http://localhost:{{camel.netty.test-port}}/foo");
-
     }
 }
diff --git a/integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTest.java b/integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTest.java
index 16fe43a..81d645f 100644
--- a/integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTest.java
+++ b/integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTest.java
@@ -16,21 +16,26 @@
  */
 package org.apache.camel.quarkus.component.http.it;
 
+import io.quarkus.test.common.QuarkusTestResource;
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 
 import static org.hamcrest.Matchers.is;
 
 @QuarkusTest
+@QuarkusTestResource(HttpTestResource.class)
 class HttpTest {
-    @Test
-    public void basic() {
+    @ParameterizedTest
+    @ValueSource(strings = { "ahc", "http", "netty-http" })
+    public void basicProducer(String component) {
         RestAssured
                 .given()
                 .queryParam("test-port", RestAssured.port)
                 .when()
-                .get("/test/get")
+                .get("/test/client/{component}/get", component)
                 .then()
                 .body(is("get"));
 
@@ -39,8 +44,22 @@
                 .queryParam("test-port", RestAssured.port)
                 .body("message")
                 .when()
-                .post("/test/post")
+                .post("/test/client/{component}/post", component)
                 .then()
                 .body(is("MESSAGE"));
     }
+
+    @Test
+    public void basicNettyHttpServer() throws Exception {
+        final int port = Integer.getInteger("camel.netty-http.test-port");
+
+        RestAssured
+                .given()
+                .port(port)
+                .when()
+                .get("/test/server/hello")
+                .then()
+                .body(is("Netty Hello World"));
+    }
+
 }
diff --git a/integration-tests/netty-http/src/test/java/org/apache/camel/quarkus/component/netty/http/NettyHttpTestResource.java b/integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTestResource.java
similarity index 86%
rename from integration-tests/netty-http/src/test/java/org/apache/camel/quarkus/component/netty/http/NettyHttpTestResource.java
rename to integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTestResource.java
index fe7ead2..5b341aa 100644
--- a/integration-tests/netty-http/src/test/java/org/apache/camel/quarkus/component/netty/http/NettyHttpTestResource.java
+++ b/integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTestResource.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.netty.http;
+package org.apache.camel.quarkus.component.http.it;
 
 import java.util.Map;
 import java.util.Objects;
@@ -23,10 +23,10 @@
 
 import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
 
-public class NettyHttpTestResource implements QuarkusTestResourceLifecycleManager {
+public class HttpTestResource implements QuarkusTestResourceLifecycleManager {
     @Override
     public Map<String, String> start() {
-        return AvailablePortFinder.reserveNetworkPorts(Objects::toString, "camel.netty.test-port");
+        return AvailablePortFinder.reserveNetworkPorts(Objects::toString, "camel.netty-http.test-port");
     }
 
     @Override
diff --git a/integration-tests/netty-http/pom.xml b/integration-tests/netty-http/pom.xml
deleted file mode 100644
index ef6a3dd..0000000
--- a/integration-tests/netty-http/pom.xml
+++ /dev/null
@@ -1,134 +0,0 @@
-<?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.quarkus</groupId>
-        <artifactId>camel-quarkus-integration-tests</artifactId>
-        <version>1.1.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>camel-quarkus-integration-test-netty-http</artifactId>
-    <name>Camel Quarkus :: Integration Tests :: Netty HTTP</name>
-    <description>The camel integration tests</description>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-netty-http</artifactId>
-        </dependency>
-
-        <!-- Undertow is here only for the test runner to be able to detect that the server has started -->
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-undertow</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>
-
-        <!-- test dependencies - camel-quarkus -->
-        <dependency>
-            <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-integration-test-support</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>io.quarkus</groupId>
-                <artifactId>quarkus-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>build</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>native</id>
-            <activation>
-                <property>
-                    <name>native</name>
-                </property>
-            </activation>
-            <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>
-                                    <systemProperties>
-                                        <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
-                                    </systemProperties>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>io.quarkus</groupId>
-                        <artifactId>quarkus-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>native-image</id>
-                                <goals>
-                                    <goal>native-image</goal>
-                                </goals>
-                                <configuration>
-                                    <cleanupServer>true</cleanupServer>
-                                    <enableHttpUrlHandler>true</enableHttpUrlHandler>
-                                    <enableServer>false</enableServer>
-                                    <dumpProxies>false</dumpProxies>
-                                    <enableJni>false</enableJni>
-                                    <disableReports>true</disableReports>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-
-</project>
diff --git a/integration-tests/netty-http/src/main/resources/application.properties b/integration-tests/netty-http/src/main/resources/application.properties
deleted file mode 100644
index 494bcea..0000000
--- a/integration-tests/netty-http/src/main/resources/application.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-## ---------------------------------------------------------------------------
-## Licensed to the Apache Software Foundation (ASF) under one or more
-## contributor license agreements.  See the NOTICE file distributed with
-## this work for additional information regarding copyright ownership.
-## The ASF licenses this file to You under the Apache License, Version 2.0
-## (the "License"); you may not use this file except in compliance with
-## the License.  You may obtain a copy of the License at
-##
-##      http://www.apache.org/licenses/LICENSE-2.0
-##
-## Unless required by applicable law or agreed to in writing, software
-## distributed under the License is distributed on an "AS IS" BASIS,
-## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-## See the License for the specific language governing permissions and
-## limitations under the License.
-## ---------------------------------------------------------------------------
-#
-# Quarkus
-#
-quarkus.log.file.enable = false
-
-#
-# Camel
-#
-camel.context.name = quarkus-camel-example
diff --git a/integration-tests/netty-http/src/test/java/org/apache/camel/quarkus/component/netty/http/CamelIT.java b/integration-tests/netty-http/src/test/java/org/apache/camel/quarkus/component/netty/http/CamelIT.java
deleted file mode 100644
index 8926e14..0000000
--- a/integration-tests/netty-http/src/test/java/org/apache/camel/quarkus/component/netty/http/CamelIT.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.quarkus.component.netty.http;
-
-import io.quarkus.test.junit.NativeImageTest;
-
-@NativeImageTest
-public class CamelIT extends CamelTest {
-}
diff --git a/integration-tests/netty-http/src/test/java/org/apache/camel/quarkus/component/netty/http/CamelTest.java b/integration-tests/netty-http/src/test/java/org/apache/camel/quarkus/component/netty/http/CamelTest.java
deleted file mode 100644
index eaba3de..0000000
--- a/integration-tests/netty-http/src/test/java/org/apache/camel/quarkus/component/netty/http/CamelTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.quarkus.component.netty.http;
-
-import java.net.URI;
-
-import io.quarkus.test.common.QuarkusTestResource;
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-
-import org.junit.jupiter.api.Test;
-
-import static org.hamcrest.Matchers.is;
-
-@QuarkusTest
-@QuarkusTestResource(NettyHttpTestResource.class)
-public class CamelTest {
-
-    @Test
-    public void testNetty4Http() throws Exception {
-        final int port = Integer.getInteger("camel.netty.test-port");
-        final String uri = String.format("http://localhost:%d/foo", port);
-
-        RestAssured.when().get(new URI(uri))
-                .then().body(is("Netty Hello World"));
-    }
-
-    @Test
-    public void netty4HttpProducer() throws Exception {
-        final int port = Integer.getInteger("camel.netty.test-port");
-        final String uri = String.format("http://localhost:%d/producer", port);
-
-        RestAssured.when().get(new URI(uri))
-                .then().statusCode(200).body(is("Netty Hello World"));
-    }
-
-}
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index f065336..f3a2d51 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -157,7 +157,6 @@
         <module>core-impl</module>
 
         <!-- extensions a..z; do not remove this comment, it is important when sorting via  mvn process-resources -Pformat -->
-        <module>ahc</module>
         <module>aws</module>
         <module>base64</module>
         <module>bean</module>
@@ -180,7 +179,6 @@
         <module>microprofile</module>
         <module>mongodb</module>
         <module>netty</module>
-        <module>netty-http</module>
         <module>opentracing</module>
         <module>paho</module>
         <module>pdf</module>
