You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2020/02/18 08:14:35 UTC

[camel-quarkus] 03/03: Upgrade to Camel 3.1.0 - WIP

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

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

commit 8784bcd4a58d88a07fed60f9e6ee654905e33e09
Author: James Netherton <ja...@gmail.com>
AuthorDate: Tue Feb 18 08:14:03 2020 +0000

    Upgrade to Camel 3.1.0 - WIP
---
 catalog/camel-quarkus-catalog/pom.xml              |  27 +-
 .../catalog/quarkus/QuarkusRuntimeProvider.java    |   5 +-
 .../quarkus/QuarkusRuntimeProviderTest.java        |  14 +-
 .../pages/list-of-camel-quarkus-extensions.adoc    |   8 +-
 .../component/bindy/deployment/BindyProcessor.java |  12 +
 .../consul/deployment/ConsulProcessor.java         |  12 -
 .../component/xml/deployment/XmlProcessor.java     |   9 +-
 extensions/core-xml/runtime/pom.xml                |   4 +
 .../camel/quarkus/component/xml/XmlRecorder.java   |  27 +-
 .../quarkus/core/deployment/BuildProcessor.java    |  13 +-
 .../CamelModelToXMLDumperBuildItem.java}           |  22 +-
 .../deployment/CamelRoutesLoaderBuildItems.java    |  10 +-
 extensions/core/runtime/pom.xml                    |  10 +-
 .../quarkus/core/CamelMainEventDispatcher.java     |   5 +
 .../apache/camel/quarkus/core/CamelMainEvents.java |   6 +
 .../camel/quarkus/core/CamelMainRecorder.java      |   6 +-
 .../apache/camel/quarkus/core/CamelRecorder.java   |  27 +-
 .../camel/quarkus/core/CamelRoutesCollector.java   |  17 +-
 .../camel/quarkus/core/CamelRuntimeCatalog.java    |   7 +-
 ...esLoader.java => DisabledModelToXMLDumper.java} |  15 +-
 .../core/DisabledPredicateValidatorReifier.java    |   6 +-
 .../quarkus/core/DisabledValidateReifier.java      |   6 +-
 .../core/DisabledXMLRoutesDefinitionLoader.java}   |  23 +-
 .../camel/quarkus/core/FastCamelContext.java       |  67 +--
 .../org/apache/camel/quarkus/core/FastModel.java   |   8 +-
 .../camel/quarkus/core/FastTypeConverter.java      |  11 +-
 .../component/pdf/deployment/PdfProcessor.java     |  19 +-
 extensions/readme.adoc                             |   8 +-
 .../support/policy/deployment/PolicyProcessor.java |   8 +-
 extensions/support/xml/runtime/pom.xml             |   2 +-
 .../quarkus/component/bindy/it/BindyTestRoute.java |   4 +-
 .../apache/camel/quarkus/core/CamelServlet.java    |   5 +
 .../org/apache/camel/quarkus/core/CamelTest.java   |   5 +
 .../apache/camel/quarkus/core/CamelServlet.java    |   4 +-
 .../org/apache/camel/quarkus/core/CamelTest.java   |   5 +-
 .../apache/camel/quarkus/core/CamelServlet.java    |   4 +-
 .../quarkus/component/pdf/it/PdfResource.java      |   2 +-
 .../core/runtime/support/SupportListener.java      |   4 +
 pom.xml                                            |   2 +-
 poms/bom/pom.xml                                   |  21 +-
 tooling/package-maven-plugin/pom.xml               |  32 ++
 .../apache/camel/quarkus/maven/ExtMvelHelper.java  |  12 +-
 .../camel/quarkus/maven/JSonSchemaHelper.java      | 567 +++++++++++++++++++++
 .../quarkus/maven/PrepareCatalogQuarkusMojo.java   |   2 +-
 .../quarkus/maven/UpdateDocExtensionsListMojo.java | 132 ++---
 45 files changed, 955 insertions(+), 260 deletions(-)

diff --git a/catalog/camel-quarkus-catalog/pom.xml b/catalog/camel-quarkus-catalog/pom.xml
index a234169..eb6e3d0 100644
--- a/catalog/camel-quarkus-catalog/pom.xml
+++ b/catalog/camel-quarkus-catalog/pom.xml
@@ -22,8 +22,9 @@
 
     <parent>
         <groupId>org.apache.camel.quarkus</groupId>
-        <artifactId>catalog</artifactId>
+        <artifactId>camel-quarkus-build-parent</artifactId>
         <version>1.1.0-SNAPSHOT</version>
+        <relativePath>../../poms/build-parent/pom.xml</relativePath>
     </parent>
 
     <artifactId>camel-catalog-quarkus</artifactId>
@@ -35,33 +36,27 @@
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-catalog</artifactId>
-            <version>${camel.version}</version>
         </dependency>
 
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.12</version>
+            <groupId>org.jboss.logging</groupId>
+            <artifactId>jboss-logging</artifactId>
             <scope>test</scope>
         </dependency>
-
-        <!-- logging -->
         <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-api</artifactId>
-            <version>2.12.1</version>
+            <groupId>org.jboss.slf4j</groupId>
+            <artifactId>slf4j-jboss-logging</artifactId>
             <scope>test</scope>
         </dependency>
+
         <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-core</artifactId>
-            <version>2.12.1</version>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-slf4j-impl</artifactId>
-            <version>2.12.1</version>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
             <scope>test</scope>
         </dependency>
 
diff --git a/catalog/camel-quarkus-catalog/src/main/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProvider.java b/catalog/camel-quarkus-catalog/src/main/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProvider.java
index b1c37c6..d8a72bf 100644
--- a/catalog/camel-quarkus-catalog/src/main/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProvider.java
+++ b/catalog/camel-quarkus-catalog/src/main/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProvider.java
@@ -22,11 +22,12 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.camel.catalog.CamelCatalog;
-import org.apache.camel.catalog.CatalogHelper;
 import org.apache.camel.catalog.RuntimeProvider;
+import org.apache.camel.catalog.impl.CatalogHelper;
 
 /**
- * A Quarkus based {@link RuntimeProvider} which only includes the supported Camel components, data formats, and languages
+ * A Quarkus based {@link RuntimeProvider} which only includes the supported Camel components, data formats, and
+ * languages
  * which can be installed in Quarkus using the Camel extensions.
  */
 public class QuarkusRuntimeProvider implements RuntimeProvider {
diff --git a/catalog/camel-quarkus-catalog/src/test/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProviderTest.java b/catalog/camel-quarkus-catalog/src/test/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProviderTest.java
index 2c6b1d1..eb0f52d 100644
--- a/catalog/camel-quarkus-catalog/src/test/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProviderTest.java
+++ b/catalog/camel-quarkus-catalog/src/test/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProviderTest.java
@@ -20,19 +20,19 @@ import java.util.List;
 
 import org.apache.camel.catalog.CamelCatalog;
 import org.apache.camel.catalog.DefaultCamelCatalog;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class QuarkusRuntimeProviderTest {
 
     static CamelCatalog catalog;
 
-    @BeforeClass
+    @BeforeAll
     public static void createCamelCatalog() {
         catalog = new DefaultCamelCatalog();
         catalog.setRuntimeProvider(new QuarkusRuntimeProvider());
diff --git a/docs/modules/ROOT/pages/list-of-camel-quarkus-extensions.adoc b/docs/modules/ROOT/pages/list-of-camel-quarkus-extensions.adoc
index f6d250e..0a5fd7c 100644
--- a/docs/modules/ROOT/pages/list-of-camel-quarkus-extensions.adoc
+++ b/docs/modules/ROOT/pages/list-of-camel-quarkus-extensions.adoc
@@ -18,7 +18,7 @@ In case you are missing some Camel feature in the list:
 == Camel Components
 
 // components: START
-Number of Camel components: 65 in 56 JAR artifacts (0 deprecated)
+Number of Camel components: 66 in 57 JAR artifacts (0 deprecated)
 
 [width="100%",cols="4,1,5",options="header"]
 |===
@@ -64,7 +64,7 @@ Number of Camel components: 65 in 56 JAR artifacts (0 deprecated)
 `aws-sqs:queueNameOrArn` | 0.2.0 | The aws-sqs component is used for sending and receiving messages to Amazon's SQS service.
 
 | link:https://camel.apache.org/components/latest/aws-translate-component.html[AWS Translate] (camel-quarkus-aws-translate) +
-`aws-translate:label` | 1.0.0-M3 | The aws-kms is used for managing Amazon Translate
+`aws-translate:label` | 1.0.0-M3 | The aws-translate component is used for managing Amazon Translate
 
 | link:https://camel.apache.org/components/latest/bean-component.html[Bean] (camel-quarkus-bean) +
 `bean:beanName` | 0.2.0 | The bean component is for invoking Java beans from Camel.
@@ -76,7 +76,7 @@ Number of Camel components: 65 in 56 JAR artifacts (0 deprecated)
 `box:apiName/methodName` | 1.2.0 | For uploading downloading and managing files folders groups collaborations etc on box DOT com.
 
 | link:https://camel.apache.org/components/latest/class-component.html[Class] (camel-quarkus-bean) +
-`class:beanName` | 0.2.0 | The class component is for invoking Java classes (Java beans) from Camel.
+`class:beanName` | 0.2.0 | The Class component is for invoking Java classes (Java beans) from Camel.
 
 | link:https://camel.apache.org/components/latest/consul-component.html[Consul] (camel-quarkus-consul) +
 `consul:apiEndpoint` | 1.0.0-M3 | The camel consul component allows you to work with Consul, a distributed, highly available, datacenter-aware, service discovery and configuration system.
@@ -273,7 +273,7 @@ Number of Camel languages: 9 in 3 JAR artifacts (0 deprecated)
 
 | link:https://camel.apache.org/components/latest/bean-language.html[Bean method] (camel-quarkus-bean) | 0.2.0 | To use a Java bean (aka method call) in Camel expressions or predicates.
 
-| link:https://camel.apache.org/components/latest/constant-language.html[Constant] (camel-quarkus-core) | 0.2.0 | To use a constant value in Camel expressions or predicates.
+| link:https://camel.apache.org/components/latest/constant-language.html[Constant] (camel-quarkus-core) | 0.2.0 | To use a constant value in Camel expressions or predicates. Important: this is a fixed constant value that is only set once during starting up the route, do not use this if you want dynamic values during routing.
 
 | link:https://camel.apache.org/components/latest/exchangeProperty-language.html[ExchangeProperty] (camel-quarkus-core) | 0.2.0 | To use a Camel Exchange property in expressions or predicates.
 
diff --git a/extensions/bindy/deployment/src/main/java/org/apache/camel/quarkus/component/bindy/deployment/BindyProcessor.java b/extensions/bindy/deployment/src/main/java/org/apache/camel/quarkus/component/bindy/deployment/BindyProcessor.java
index 74bd071..65f9d97 100644
--- a/extensions/bindy/deployment/src/main/java/org/apache/camel/quarkus/component/bindy/deployment/BindyProcessor.java
+++ b/extensions/bindy/deployment/src/main/java/org/apache/camel/quarkus/component/bindy/deployment/BindyProcessor.java
@@ -18,6 +18,8 @@ package org.apache.camel.quarkus.component.bindy.deployment;
 
 import io.quarkus.deployment.annotations.BuildStep;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceDirectoryBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
 
 class BindyProcessor {
 
@@ -28,4 +30,14 @@ class BindyProcessor {
         return new FeatureBuildItem(FEATURE);
     }
 
+    @BuildStep
+    ReflectiveClassBuildItem reflectiveClasses() {
+        return new ReflectiveClassBuildItem(false, false, "com.ibm.icu.text.BreakIteratorFactory");
+    }
+
+    @BuildStep
+    NativeImageResourceDirectoryBuildItem resourceBundles() {
+        return new NativeImageResourceDirectoryBuildItem("com/ibm/icu/impl/data");
+    }
+
 }
diff --git a/extensions/consul/deployment/src/main/java/org/apache/camel/quarkus/component/consul/deployment/ConsulProcessor.java b/extensions/consul/deployment/src/main/java/org/apache/camel/quarkus/component/consul/deployment/ConsulProcessor.java
index 131adba..ac2cf5b 100644
--- a/extensions/consul/deployment/src/main/java/org/apache/camel/quarkus/component/consul/deployment/ConsulProcessor.java
+++ b/extensions/consul/deployment/src/main/java/org/apache/camel/quarkus/component/consul/deployment/ConsulProcessor.java
@@ -16,11 +16,9 @@
  */
 package org.apache.camel.quarkus.component.consul.deployment;
 
-import io.quarkus.deployment.annotations.BuildProducer;
 import io.quarkus.deployment.annotations.BuildStep;
 import io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
 
 class ConsulProcessor {
     private static final String FEATURE = "camel-consul";
@@ -35,14 +33,4 @@ class ConsulProcessor {
         return new ExtensionSslNativeSupportBuildItem(FEATURE);
     }
 
-    @BuildStep
-    void reflectiveClasses(BuildProducer<ReflectiveClassBuildItem> reflectiveClasses) {
-        reflectiveClasses.produce(new ReflectiveClassBuildItem(
-                true,
-                false,
-                "org.apache.camel.component.consul.ConsulConfiguration",
-                "org.apache.camel.component.consul.ConsulClientConfiguration",
-                "org.apache.camel.component.consul.health.ConsulHealthCheckRepositoryConfiguration",
-                "org.apache.camel.component.consul.cloud.ConsulServiceRegistryConfiguration"));
-    }
 }
diff --git a/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java b/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java
index 07329c8..19b096b 100644
--- a/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java
+++ b/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java
@@ -24,6 +24,7 @@ import io.quarkus.deployment.builditem.FeatureBuildItem;
 import io.quarkus.jaxb.deployment.JaxbFileRootBuildItem;
 import org.apache.camel.quarkus.component.xml.XmlRecorder;
 import org.apache.camel.quarkus.core.deployment.CamelModelJAXBContextFactoryBuildItem;
+import org.apache.camel.quarkus.core.deployment.CamelModelToXMLDumperBuildItem;
 import org.apache.camel.quarkus.core.deployment.CamelRoutesLoaderBuildItems;
 import org.apache.camel.quarkus.core.deployment.CamelSupport;
 import org.apache.camel.quarkus.support.common.CamelCapabilities;
@@ -56,7 +57,13 @@ class XmlProcessor {
     @BuildStep
     @Record(value = ExecutionTime.STATIC_INIT, optional = true)
     CamelRoutesLoaderBuildItems.Xml xmlLoader(XmlRecorder recorder) {
-        return new CamelRoutesLoaderBuildItems.Xml(recorder.newDefaultXmlLoader());
+        return new CamelRoutesLoaderBuildItems.Xml(recorder.newJaxbXMLRoutesDefinitionLoader());
+    }
+
+    @BuildStep
+    @Record(value = ExecutionTime.STATIC_INIT, optional = true)
+    CamelModelToXMLDumperBuildItem xmlModelDumper(XmlRecorder recorder) {
+        return new CamelModelToXMLDumperBuildItem(recorder.newJaxbModelToXMLDumper());
     }
 
     @BuildStep
diff --git a/extensions/core-xml/runtime/pom.xml b/extensions/core-xml/runtime/pom.xml
index aac5cda..f61467d 100644
--- a/extensions/core-xml/runtime/pom.xml
+++ b/extensions/core-xml/runtime/pom.xml
@@ -48,6 +48,10 @@
 
     <dependencies>
         <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-xml-jaxb</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-core</artifactId>
         </dependency>
diff --git a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java b/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java
index 0170587..1469086 100644
--- a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java
+++ b/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java
@@ -24,12 +24,15 @@ import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.impl.DefaultModelJAXBContextFactory;
 import org.apache.camel.model.ValidateDefinition;
 import org.apache.camel.model.validator.PredicateValidatorDefinition;
-import org.apache.camel.quarkus.core.XmlRoutesLoader;
 import org.apache.camel.reifier.ProcessorReifier;
 import org.apache.camel.reifier.ValidateReifier;
 import org.apache.camel.reifier.validator.PredicateValidatorReifier;
 import org.apache.camel.reifier.validator.ValidatorReifier;
 import org.apache.camel.spi.ModelJAXBContextFactory;
+import org.apache.camel.spi.ModelToXMLDumper;
+import org.apache.camel.spi.XMLRoutesDefinitionLoader;
+import org.apache.camel.xml.jaxb.JaxbModelToXMLDumper;
+import org.apache.camel.xml.jaxb.JaxbXMLRoutesDefinitionLoader;
 import org.graalvm.nativeimage.ImageInfo;
 
 @Recorder
@@ -47,12 +50,30 @@ public class XmlRecorder {
         return new RuntimeValue<>(factory);
     }
 
-    public RuntimeValue<XmlRoutesLoader> newDefaultXmlLoader() {
-        return new RuntimeValue<>(new DefaultXmlRoutesLoader());
+    public RuntimeValue<XMLRoutesDefinitionLoader> newJaxbXMLRoutesDefinitionLoader() {
+        return new RuntimeValue<>(new JaxbXMLRoutesDefinitionLoader());
+    }
+
+    public RuntimeValue<ModelToXMLDumper> newJaxbModelToXMLDumper() {
+        return new RuntimeValue<>(new JaxbModelToXMLDumper());
     }
 
     public void initXmlReifiers() {
         ProcessorReifier.registerReifier(ValidateDefinition.class, ValidateReifier::new);
         ValidatorReifier.registerReifier(PredicateValidatorDefinition.class, PredicateValidatorReifier::new);
     }
+
+    /*
+    
+    
+    @Override
+    protected XMLRoutesDefinitionLoader createXMLRoutesDefinitionLoader() {
+        return xmlLoader;
+    }
+    
+    @Override
+    protected ModelToXMLDumper createModelToXMLDumper() {
+        return modelDumper;
+    }
+     */
 }
diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
index 2672806..1783ab3 100644
--- a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
+++ b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
@@ -334,8 +334,15 @@ class BuildProcessor {
         @Overridable
         @BuildStep
         @Record(value = ExecutionTime.STATIC_INIT, optional = true)
-        public CamelRoutesLoaderBuildItems.Xml createXmlLoader(CamelRecorder recorder) {
-            return new CamelRoutesLoaderBuildItems.Xml(recorder.newDisabledXmlRoutesLoader());
+        public CamelRoutesLoaderBuildItems.Xml createXMLRoutesLoader(CamelRecorder recorder) {
+            return new CamelRoutesLoaderBuildItems.Xml(recorder.newDisabledXMLRoutesDefinitionLoader());
+        }
+
+        @Overridable
+        @BuildStep
+        @Record(value = ExecutionTime.STATIC_INIT, optional = true)
+        public CamelModelToXMLDumperBuildItem createModelToXMLDumper(CamelRecorder recorder) {
+            return new CamelModelToXMLDumperBuildItem(recorder.newDisabledModelToXMLDumper());
         }
 
         @BuildStep
@@ -355,6 +362,7 @@ class BuildProcessor {
                 CamelTypeConverterRegistryBuildItem typeConverterRegistry,
                 CamelModelJAXBContextFactoryBuildItem contextFactory,
                 CamelRoutesLoaderBuildItems.Xml xmlLoader,
+                CamelModelToXMLDumperBuildItem modelDumper,
                 CamelFactoryFinderResolverBuildItem factoryFinderResolverBuildItem,
                 BeanContainerBuildItem beanContainer,
                 CamelConfig config) {
@@ -364,6 +372,7 @@ class BuildProcessor {
                     typeConverterRegistry.getRegistry(),
                     contextFactory.getContextFactory(),
                     xmlLoader.getLoader(),
+                    modelDumper.getValue(),
                     factoryFinderResolverBuildItem.getFactoryFinderResolver(),
                     beanContainer.getValue(),
                     CamelSupport.getCamelVersion(),
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlRoutesLoader.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelModelToXMLDumperBuildItem.java
similarity index 61%
rename from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlRoutesLoader.java
rename to extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelModelToXMLDumperBuildItem.java
index 36a2c1d..0bab4db 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlRoutesLoader.java
+++ b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelModelToXMLDumperBuildItem.java
@@ -14,18 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core;
+package org.apache.camel.quarkus.core.deployment;
 
-import java.io.InputStream;
+import io.quarkus.builder.item.SimpleBuildItem;
+import io.quarkus.runtime.RuntimeValue;
+import org.apache.camel.spi.ModelToXMLDumper;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.model.RoutesDefinition;
-import org.apache.camel.model.rest.RestsDefinition;
+public final class CamelModelToXMLDumperBuildItem extends SimpleBuildItem {
+    private final RuntimeValue<ModelToXMLDumper> value;
 
-public interface XmlRoutesLoader {
-
-    RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception;
-
-    RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception;
+    public CamelModelToXMLDumperBuildItem(RuntimeValue<ModelToXMLDumper> value) {
+        this.value = value;
+    }
 
+    public RuntimeValue<ModelToXMLDumper> getValue() {
+        return value;
+    }
 }
diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRoutesLoaderBuildItems.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRoutesLoaderBuildItems.java
index 815cff7..5638bbc 100644
--- a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRoutesLoaderBuildItems.java
+++ b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRoutesLoaderBuildItems.java
@@ -19,7 +19,7 @@ package org.apache.camel.quarkus.core.deployment;
 import io.quarkus.builder.item.SimpleBuildItem;
 import io.quarkus.runtime.RuntimeValue;
 import org.apache.camel.quarkus.core.RegistryRoutesLoader;
-import org.apache.camel.quarkus.core.XmlRoutesLoader;
+import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 
 public final class CamelRoutesLoaderBuildItems {
     private CamelRoutesLoaderBuildItems() {
@@ -41,16 +41,16 @@ public final class CamelRoutesLoaderBuildItems {
     }
 
     /**
-     * Holds the {@link XmlRoutesLoader} instance.
+     * Holds the {@link XMLRoutesDefinitionLoader} instance.
      */
     public static final class Xml extends SimpleBuildItem {
-        private final RuntimeValue<XmlRoutesLoader> value;
+        private final RuntimeValue<XMLRoutesDefinitionLoader> value;
 
-        public Xml(RuntimeValue<XmlRoutesLoader> value) {
+        public Xml(RuntimeValue<XMLRoutesDefinitionLoader> value) {
             this.value = value;
         }
 
-        public RuntimeValue<XmlRoutesLoader> getLoader() {
+        public RuntimeValue<XMLRoutesDefinitionLoader> getLoader() {
             return value;
         }
     }
diff --git a/extensions/core/runtime/pom.xml b/extensions/core/runtime/pom.xml
index 906fd04..c91b25f 100644
--- a/extensions/core/runtime/pom.xml
+++ b/extensions/core/runtime/pom.xml
@@ -77,12 +77,6 @@
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-core-engine</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.camel</groupId>
-                    <artifactId>camel-jaxp</artifactId>
-                </exclusion>
-            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
@@ -90,6 +84,10 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core-catalog</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
             <artifactId>camel-caffeine-lrucache</artifactId>
         </dependency>
         <dependency>
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEventDispatcher.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEventDispatcher.java
index 1df54ab..2b6f368 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEventDispatcher.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEventDispatcher.java
@@ -26,6 +26,11 @@ import org.apache.camel.main.MainSupport;
  */
 public class CamelMainEventDispatcher implements org.apache.camel.main.MainListener {
     @Override
+    public void beforeConfigure(BaseMainSupport main) {
+        fireEvent(CamelMainEvents.BeforeConfigure.class, new CamelMainEvents.BeforeConfigure());
+    }
+
+    @Override
     public void configure(CamelContext context) {
         fireEvent(CamelMainEvents.Configure.class, new CamelMainEvents.Configure());
     }
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEvents.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEvents.java
index 122803a..75b1d0e 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEvents.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEvents.java
@@ -21,6 +21,12 @@ public final class CamelMainEvents {
     }
 
     /**
+     * Event fired by {@link CamelMain} before the CamelContext is configured.
+     */
+    public static class BeforeConfigure {
+    }
+
+    /**
      * Event fired by {@link CamelMain} before the CamelContext is being created and started.
      */
     public static class BeforeStart {
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java
index f023163..ec0d238 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java
@@ -21,11 +21,13 @@ import io.quarkus.runtime.RuntimeValue;
 import io.quarkus.runtime.ShutdownContext;
 import io.quarkus.runtime.annotations.Recorder;
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.impl.engine.DefaultReactiveExecutor;
 import org.apache.camel.main.MainListener;
 import org.apache.camel.main.RoutesCollector;
 import org.apache.camel.spi.ReactiveExecutor;
+import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 
 @Recorder
 public class CamelMainRecorder {
@@ -75,7 +77,7 @@ public class CamelMainRecorder {
     }
 
     public void setReactiveExecutor(RuntimeValue<CamelMain> main, RuntimeValue<ReactiveExecutor> executor) {
-        main.getValue().getCamelContext().setReactiveExecutor(executor.getValue());
+        main.getValue().getCamelContext().adapt(ExtendedCamelContext.class).setReactiveExecutor(executor.getValue());
     }
 
     public void start(ShutdownContext shutdown, RuntimeValue<CamelMain> main) {
@@ -100,7 +102,7 @@ public class CamelMainRecorder {
 
     public RuntimeValue<RoutesCollector> newRoutesCollector(
             RuntimeValue<RegistryRoutesLoader> registryRoutesLoader,
-            RuntimeValue<XmlRoutesLoader> xmlRoutesLoader) {
+            RuntimeValue<XMLRoutesDefinitionLoader> xmlRoutesLoader) {
 
         return new RuntimeValue<>(new CamelRoutesCollector(registryRoutesLoader.getValue(), xmlRoutesLoader.getValue()));
     }
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
index db05027..35e5688 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
@@ -20,17 +20,19 @@ import io.quarkus.arc.runtime.BeanContainer;
 import io.quarkus.runtime.RuntimeValue;
 import io.quarkus.runtime.annotations.Recorder;
 import org.apache.camel.CamelContext;
+import org.apache.camel.catalog.RuntimeCamelCatalog;
 import org.apache.camel.model.ValidateDefinition;
 import org.apache.camel.model.validator.PredicateValidatorDefinition;
 import org.apache.camel.quarkus.core.FastFactoryFinderResolver.Builder;
 import org.apache.camel.reifier.ProcessorReifier;
 import org.apache.camel.reifier.validator.ValidatorReifier;
-import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
 import org.apache.camel.spi.FactoryFinderResolver;
 import org.apache.camel.spi.ModelJAXBContextFactory;
+import org.apache.camel.spi.ModelToXMLDumper;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.spi.TypeConverterLoader;
 import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 
 @Recorder
 public class CamelRecorder {
@@ -60,21 +62,24 @@ public class CamelRecorder {
             RuntimeValue<Registry> registry,
             RuntimeValue<TypeConverterRegistry> typeConverterRegistry,
             RuntimeValue<ModelJAXBContextFactory> contextFactory,
-            RuntimeValue<XmlRoutesLoader> xmlLoader,
+            RuntimeValue<XMLRoutesDefinitionLoader> xmlLoader,
+            RuntimeValue<ModelToXMLDumper> xmlModelDumper,
             RuntimeValue<FactoryFinderResolver> factoryFinderResolver,
             BeanContainer beanContainer,
             String version,
             CamelConfig config) {
 
-        FastCamelContext context = new FastCamelContext(factoryFinderResolver.getValue(), version);
-        context.setDefaultExtension(RuntimeCamelCatalog.class, () -> new CamelRuntimeCatalog(context, config.runtimeCatalog));
+        FastCamelContext context = new FastCamelContext(
+                factoryFinderResolver.getValue(),
+                version,
+                xmlLoader.getValue(),
+                xmlModelDumper.getValue());
+
+        context.setDefaultExtension(RuntimeCamelCatalog.class, () -> new CamelRuntimeCatalog(config.runtimeCatalog));
         context.setRegistry(registry.getValue());
         context.setTypeConverterRegistry(typeConverterRegistry.getValue());
         context.setLoadTypeConverters(false);
         context.setModelJAXBContextFactory(contextFactory.getValue());
-
-        FastModel model = new FastModel(context, xmlLoader.getValue());
-        context.setModel(model);
         context.init();
 
         // register to the container
@@ -122,8 +127,12 @@ public class CamelRecorder {
         return new RuntimeValue<>(new DisabledModelJAXBContextFactory());
     }
 
-    public RuntimeValue<XmlRoutesLoader> newDisabledXmlRoutesLoader() {
-        return new RuntimeValue<>(new DisabledXmlRoutesLoader());
+    public RuntimeValue<XMLRoutesDefinitionLoader> newDisabledXMLRoutesDefinitionLoader() {
+        return new RuntimeValue<>(new DisabledXMLRoutesDefinitionLoader());
+    }
+
+    public RuntimeValue<ModelToXMLDumper> newDisabledModelToXMLDumper() {
+        return new RuntimeValue<>(new DisabledModelToXMLDumper());
     }
 
     public RuntimeValue<RegistryRoutesLoader> newDefaultRegistryRoutesLoader() {
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRoutesCollector.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRoutesCollector.java
index 8f63cea..0c63b2a 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRoutesCollector.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRoutesCollector.java
@@ -29,6 +29,7 @@ import org.apache.camel.main.RoutesCollector;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
 import org.apache.camel.spi.PackageScanResourceResolver;
+import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,9 +37,9 @@ public class CamelRoutesCollector implements RoutesCollector {
     private static final Logger LOGGER = LoggerFactory.getLogger(CamelRoutesCollector.class);
 
     private final RegistryRoutesLoader registryRoutesLoader;
-    private final XmlRoutesLoader xmlRoutesLoader;
+    private final XMLRoutesDefinitionLoader xmlRoutesLoader;
 
-    public CamelRoutesCollector(RegistryRoutesLoader registryRoutesLoader, XmlRoutesLoader xmlRoutesLoader) {
+    public CamelRoutesCollector(RegistryRoutesLoader registryRoutesLoader, XMLRoutesDefinitionLoader xmlRoutesLoader) {
         this.registryRoutesLoader = registryRoutesLoader;
         this.xmlRoutesLoader = xmlRoutesLoader;
     }
@@ -47,7 +48,7 @@ public class CamelRoutesCollector implements RoutesCollector {
         return registryRoutesLoader;
     }
 
-    public XmlRoutesLoader getXmlRoutesLoader() {
+    public XMLRoutesDefinitionLoader getXmlRoutesLoader() {
         return xmlRoutesLoader;
     }
 
@@ -69,7 +70,10 @@ public class CamelRoutesCollector implements RoutesCollector {
             LOGGER.info("Loading additional Camel XML routes from: {}", part);
             try {
                 for (InputStream is : resolver.findResources(part)) {
-                    answer.add(xmlRoutesLoader.loadRoutesDefinition(camelContext, is));
+                    Object definition = xmlRoutesLoader.loadRoutesDefinition(camelContext, is);
+                    if (definition instanceof RoutesDefinition) {
+                        answer.add((RoutesDefinition) definition);
+                    }
                 }
             } catch (FileNotFoundException e) {
                 LOGGER.debug("No XML routes found in {}. Skipping XML routes detection.", part);
@@ -90,7 +94,10 @@ public class CamelRoutesCollector implements RoutesCollector {
             LOGGER.info("Loading additional Camel XML rests from: {}", part);
             try {
                 for (InputStream is : resolver.findResources(part)) {
-                    answer.add(xmlRoutesLoader.loadRestsDefinition(camelContext, is));
+                    Object definition = xmlRoutesLoader.loadRestsDefinition(camelContext, is);
+                    if (definition instanceof RestsDefinition) {
+                        answer.add((RestsDefinition) definition);
+                    }
                 }
             } catch (FileNotFoundException e) {
                 LOGGER.debug("No XML rests found in {}. Skipping XML rests detection.", part);
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRuntimeCatalog.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRuntimeCatalog.java
index 5b56b9c..98474b3 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRuntimeCatalog.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRuntimeCatalog.java
@@ -16,15 +16,12 @@
  */
 package org.apache.camel.quarkus.core;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.runtimecatalog.impl.DefaultRuntimeCamelCatalog;
+import org.apache.camel.catalog.impl.DefaultRuntimeCamelCatalog;
 
 public class CamelRuntimeCatalog extends DefaultRuntimeCamelCatalog {
     private final CamelConfig.RuntimeCatalogConfig config;
 
-    public CamelRuntimeCatalog(CamelContext camelContext, CamelConfig.RuntimeCatalogConfig config) {
-        super(camelContext, true);
-
+    public CamelRuntimeCatalog(CamelConfig.RuntimeCatalogConfig config) {
         this.config = config;
     }
 
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesLoader.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledModelToXMLDumper.java
similarity index 73%
rename from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesLoader.java
rename to extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledModelToXMLDumper.java
index b470294..94f2f03 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesLoader.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledModelToXMLDumper.java
@@ -16,22 +16,19 @@
  */
 package org.apache.camel.quarkus.core;
 
-import java.io.InputStream;
-
 import org.apache.camel.CamelContext;
-import org.apache.camel.model.RoutesDefinition;
-import org.apache.camel.model.rest.RestsDefinition;
-
-public class DisabledXmlRoutesLoader implements XmlRoutesLoader {
+import org.apache.camel.NamedNode;
+import org.apache.camel.spi.ModelToXMLDumper;
 
+public class DisabledModelToXMLDumper implements ModelToXMLDumper {
     @Override
-    public RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception {
+    public String dumpModelAsXml(CamelContext context, NamedNode definition) throws Exception {
         throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
     }
 
     @Override
-    public RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception {
+    public String dumpModelAsXml(CamelContext context, NamedNode definition, boolean resolvePlaceholders,
+            boolean resolveDelegateEndpoints) throws Exception {
         throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
     }
-
 }
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledPredicateValidatorReifier.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledPredicateValidatorReifier.java
index ee6347f..ef4c206 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledPredicateValidatorReifier.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledPredicateValidatorReifier.java
@@ -24,12 +24,12 @@ import org.apache.camel.spi.Validator;
 
 public class DisabledPredicateValidatorReifier extends ValidatorReifier<PredicateValidatorDefinition> {
 
-    public DisabledPredicateValidatorReifier(ValidatorDefinition definition) {
-        super((PredicateValidatorDefinition) definition);
+    public DisabledPredicateValidatorReifier(CamelContext camelContext, ValidatorDefinition definition) {
+        super(camelContext, (PredicateValidatorDefinition) definition);
     }
 
     @Override
-    protected Validator doCreateValidator(CamelContext context) throws Exception {
+    protected Validator doCreateValidator() {
         throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
     }
 
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledValidateReifier.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledValidateReifier.java
index 6eb8f75..4d796f8 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledValidateReifier.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledValidateReifier.java
@@ -24,12 +24,12 @@ import org.apache.camel.spi.RouteContext;
 
 public class DisabledValidateReifier extends ProcessorReifier<ValidateDefinition> {
 
-    public DisabledValidateReifier(ProcessorDefinition<?> definition) {
-        super((ValidateDefinition) definition);
+    public DisabledValidateReifier(RouteContext routeContext, ProcessorDefinition<?> definition) {
+        super(routeContext, (ValidateDefinition) definition);
     }
 
     @Override
-    public Processor createProcessor(RouteContext routeContext) throws Exception {
+    public Processor createProcessor() throws Exception {
         throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
     }
 }
diff --git a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlRoutesLoader.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXMLRoutesDefinitionLoader.java
similarity index 51%
rename from extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlRoutesLoader.java
rename to extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXMLRoutesDefinitionLoader.java
index c9e1455..c38edc8 100644
--- a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlRoutesLoader.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXMLRoutesDefinitionLoader.java
@@ -14,26 +14,27 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.xml;
+package org.apache.camel.quarkus.core;
 
 import java.io.InputStream;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.model.ModelHelper;
-import org.apache.camel.model.RoutesDefinition;
-import org.apache.camel.model.rest.RestsDefinition;
-import org.apache.camel.quarkus.core.XmlRoutesLoader;
-
-public class DefaultXmlRoutesLoader implements XmlRoutesLoader {
+import org.apache.camel.NamedNode;
+import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 
+public class DisabledXMLRoutesDefinitionLoader implements XMLRoutesDefinitionLoader {
     @Override
-    public RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream is) throws Exception {
-        return ModelHelper.loadRoutesDefinition(context, is);
+    public Object loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception {
+        throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
     }
 
     @Override
-    public RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception {
-        return ModelHelper.loadRestsDefinition(context, is);
+    public Object loadRestsDefinition(CamelContext context, InputStream inputStream) throws Exception {
+        throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
     }
 
+    @Override
+    public <T extends NamedNode> T createModelFromXml(CamelContext context, String xml, Class<T> type) throws Exception {
+        throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
+    }
 }
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
index 1a2640b..da27c25 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
@@ -26,15 +26,14 @@ import org.apache.camel.AsyncProcessor;
 import org.apache.camel.CatalogCamelContext;
 import org.apache.camel.Component;
 import org.apache.camel.Endpoint;
-import org.apache.camel.PollingConsumer;
 import org.apache.camel.Processor;
-import org.apache.camel.Producer;
 import org.apache.camel.TypeConverter;
+import org.apache.camel.catalog.RuntimeCamelCatalog;
+import org.apache.camel.catalog.impl.DefaultRuntimeCamelCatalog;
 import org.apache.camel.component.microprofile.config.CamelMicroProfilePropertiesSource;
 import org.apache.camel.health.HealthCheckRegistry;
 import org.apache.camel.impl.DefaultExecutorServiceManager;
 import org.apache.camel.impl.engine.AbstractCamelContext;
-import org.apache.camel.impl.engine.BaseRouteService;
 import org.apache.camel.impl.engine.BeanProcessorFactoryResolver;
 import org.apache.camel.impl.engine.BeanProxyFactoryResolver;
 import org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager;
@@ -43,6 +42,7 @@ import org.apache.camel.impl.engine.DefaultCamelBeanPostProcessor;
 import org.apache.camel.impl.engine.DefaultCamelContextNameStrategy;
 import org.apache.camel.impl.engine.DefaultClassResolver;
 import org.apache.camel.impl.engine.DefaultComponentResolver;
+import org.apache.camel.impl.engine.DefaultConfigurerResolver;
 import org.apache.camel.impl.engine.DefaultDataFormatResolver;
 import org.apache.camel.impl.engine.DefaultEndpointRegistry;
 import org.apache.camel.impl.engine.DefaultInflightRepository;
@@ -63,13 +63,11 @@ import org.apache.camel.impl.engine.DefaultValidatorRegistry;
 import org.apache.camel.impl.engine.EndpointKey;
 import org.apache.camel.impl.engine.HeadersMapFactoryResolver;
 import org.apache.camel.impl.engine.RestRegistryFactoryResolver;
-import org.apache.camel.impl.engine.ServicePool;
 import org.apache.camel.impl.health.DefaultHealthCheckRegistry;
 import org.apache.camel.impl.transformer.TransformerKey;
 import org.apache.camel.impl.validator.ValidatorKey;
 import org.apache.camel.model.Model;
 import org.apache.camel.processor.MulticastProcessor;
-import org.apache.camel.quarkus.core.FastModel.FastRouteContext;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
 import org.apache.camel.spi.BeanIntrospection;
 import org.apache.camel.spi.BeanProcessorFactory;
@@ -78,6 +76,7 @@ import org.apache.camel.spi.CamelBeanPostProcessor;
 import org.apache.camel.spi.CamelContextNameStrategy;
 import org.apache.camel.spi.ClassResolver;
 import org.apache.camel.spi.ComponentResolver;
+import org.apache.camel.spi.ConfigurerResolver;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.DataFormatResolver;
 import org.apache.camel.spi.EndpointRegistry;
@@ -91,6 +90,7 @@ import org.apache.camel.spi.LanguageResolver;
 import org.apache.camel.spi.ManagementNameStrategy;
 import org.apache.camel.spi.MessageHistoryFactory;
 import org.apache.camel.spi.ModelJAXBContextFactory;
+import org.apache.camel.spi.ModelToXMLDumper;
 import org.apache.camel.spi.NodeIdFactory;
 import org.apache.camel.spi.PackageScanClassResolver;
 import org.apache.camel.spi.PackageScanResourceResolver;
@@ -108,35 +108,31 @@ import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.spi.UnitOfWorkFactory;
 import org.apache.camel.spi.UuidGenerator;
 import org.apache.camel.spi.ValidatorRegistry;
+import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.util.IOHelper;
 
 public class FastCamelContext extends AbstractCamelContext implements CatalogCamelContext {
-    private Model model;
+    private final Model model;
     private final String version;
+    private final XMLRoutesDefinitionLoader xmlLoader;
+    private final ModelToXMLDumper modelDumper;
 
-    public FastCamelContext(FactoryFinderResolver factoryFinderResolver, String version) {
+    public FastCamelContext(FactoryFinderResolver factoryFinderResolver, String version, XMLRoutesDefinitionLoader xmlLoader,
+            ModelToXMLDumper modelDumper) {
         super(false);
 
         this.version = version;
+        this.xmlLoader = xmlLoader;
+        this.modelDumper = modelDumper;
+        this.model = new FastModel(this);
 
         setFactoryFinderResolver(factoryFinderResolver);
         setTracing(Boolean.FALSE);
         setDebugging(Boolean.FALSE);
         setMessageHistory(Boolean.FALSE);
-
         setDefaultExtension(HealthCheckRegistry.class, DefaultHealthCheckRegistry::new);
-    }
-
-    public void setModel(Model model) {
-        this.model = model;
-    }
 
-    public void clearModel() {
-        this.model = null;
-        for (BaseRouteService rs : getRouteServices().values()) {
-            ((FastRouteContext) rs.getRouteContext()).clearModel();
-        }
     }
 
     @Override
@@ -274,16 +270,6 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
     }
 
     @Override
-    protected ServicePool<Producer> createProducerServicePool() {
-        return new ServicePool<>(Endpoint::createProducer, Producer::getEndpoint, 100);
-    }
-
-    @Override
-    protected ServicePool<PollingConsumer> createPollingConsumerServicePool() {
-        return new ServicePool<>(Endpoint::createPollingConsumer, PollingConsumer::getEndpoint, 100);
-    }
-
-    @Override
     protected UnitOfWorkFactory createUnitOfWorkFactory() {
         return new DefaultUnitOfWorkFactory();
     }
@@ -328,6 +314,21 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
     }
 
     @Override
+    protected XMLRoutesDefinitionLoader createXMLRoutesDefinitionLoader() {
+        return xmlLoader;
+    }
+
+    @Override
+    protected ModelToXMLDumper createModelToXMLDumper() {
+        return modelDumper;
+    }
+
+    @Override
+    protected RuntimeCamelCatalog createRuntimeCamelCatalog() {
+        return new DefaultRuntimeCamelCatalog();
+    }
+
+    @Override
     protected Tracer createTracer() {
         Tracer tracer = null;
         if (getRegistry() != null) {
@@ -365,12 +366,12 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
     }
 
     @Override
-    protected TransformerRegistry<TransformerKey> createTransformerRegistry() throws Exception {
+    protected TransformerRegistry<TransformerKey> createTransformerRegistry() {
         return new DefaultTransformerRegistry(this);
     }
 
     @Override
-    protected ValidatorRegistry<ValidatorKey> createValidatorRegistry() throws Exception {
+    protected ValidatorRegistry<ValidatorKey> createValidatorRegistry() {
         return new DefaultValidatorRegistry(this);
     }
 
@@ -387,6 +388,11 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
     }
 
     @Override
+    protected ConfigurerResolver createConfigurerResolver() {
+        return new DefaultConfigurerResolver();
+    }
+
+    @Override
     public void setTypeConverterRegistry(TypeConverterRegistry typeConverterRegistry) {
         super.setTypeConverterRegistry(typeConverterRegistry);
 
@@ -486,7 +492,6 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
 
         if (inputStream != null) {
             try {
-                log.debug("loading scheme {} ", path);
                 return IOHelper.loadText(inputStream);
             } finally {
                 IOHelper.close(inputStream);
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java
index 182f252..9be64bd 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java
@@ -40,12 +40,8 @@ import org.apache.camel.reifier.RouteReifier;
 import org.apache.camel.support.CamelContextHelper;
 
 public class FastModel extends BaseModel {
-
-    private final XmlRoutesLoader xmlLoader;
-
-    public FastModel(CamelContext camelContext, XmlRoutesLoader xmlLoader) {
+    public FastModel(CamelContext camelContext) {
         super(camelContext);
-        this.xmlLoader = xmlLoader;
     }
 
     @Override
@@ -58,7 +54,7 @@ public class FastModel extends BaseModel {
         try {
             String id = routeDefinition.idOrCreate(camelContext.adapt(ExtendedCamelContext.class).getNodeIdFactory());
             FastRouteContext routeContext = new FastRouteContext(camelContext, routeDefinition, id);
-            Route route = new RouteReifier(routeDefinition).createRoute(camelContext, routeContext);
+            Route route = new RouteReifier(routeContext, routeDefinition).createRoute();
             FastRouteService routeService = createRouteService(route);
             mcc.startRouteService(routeService, true);
         } finally {
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java
index 3a829ff..178250f 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java
@@ -18,8 +18,12 @@ package org.apache.camel.quarkus.core;
 
 import org.apache.camel.impl.converter.DefaultTypeConverter;
 import org.apache.camel.spi.TypeConverterLoader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class FastTypeConverter extends DefaultTypeConverter {
+    private static final Logger LOG = LoggerFactory.getLogger(FastTypeConverter.class);
+
     public FastTypeConverter() {
         super(null, null, null, null, false);
     }
@@ -27,7 +31,7 @@ public class FastTypeConverter extends DefaultTypeConverter {
     @Override
     protected void doStart() throws Exception {
         for (TypeConverterLoader loader : getCamelContext().getRegistry().findByType(TypeConverterLoader.class)) {
-            log.debug("TypeConverterLoader: {} loading converters", loader);
+            LOG.debug("TypeConverterLoader: {} loading converters", loader);
             loader.load(this);
         }
     }
@@ -36,9 +40,4 @@ public class FastTypeConverter extends DefaultTypeConverter {
     public void loadCoreAndFastTypeConverters() throws Exception {
         throw new UnsupportedOperationException();
     }
-
-    @Override
-    protected void initTypeConverterLoaders() {
-        // no-op
-    }
 }
diff --git a/extensions/pdf/deployment/src/main/java/org/apache/camel/quarkus/component/pdf/deployment/PdfProcessor.java b/extensions/pdf/deployment/src/main/java/org/apache/camel/quarkus/component/pdf/deployment/PdfProcessor.java
index e7bbf14..612e673 100644
--- a/extensions/pdf/deployment/src/main/java/org/apache/camel/quarkus/component/pdf/deployment/PdfProcessor.java
+++ b/extensions/pdf/deployment/src/main/java/org/apache/camel/quarkus/component/pdf/deployment/PdfProcessor.java
@@ -19,9 +19,8 @@ package org.apache.camel.quarkus.component.pdf.deployment;
 import io.quarkus.deployment.annotations.BuildProducer;
 import io.quarkus.deployment.annotations.BuildStep;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.builditem.nativeimage.NativeImageConfigBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
-import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem;
 
 class PdfProcessor {
 
@@ -32,6 +31,12 @@ class PdfProcessor {
             "org/apache/pdfbox/resources/glyphlist/additional.txt",
             "org/apache/pdfbox/resources/ttf/LiberationSans-Regular.ttf" };
 
+    private static final String[] RUNTIME_INITIALIZED_CLASSES = new String[] {
+            "org.apache.pdfbox.pdmodel.font.PDType1Font",
+            "org.apache.camel.component.pdf.PdfConfiguration",
+            "org.apache.camel.component.pdf.Standard14Fonts",
+    };
+
     @BuildStep
     FeatureBuildItem feature() {
         return new FeatureBuildItem(FEATURE);
@@ -43,11 +48,9 @@ class PdfProcessor {
     }
 
     @BuildStep
-    NativeImageConfigBuildItem build(BuildProducer<ReflectiveClassBuildItem> reflectiveClass) {
-        return NativeImageConfigBuildItem.builder()
-                .addRuntimeInitializedClass("org.apache.pdfbox.pdmodel.font.PDType1Font")
-                .addRuntimeInitializedClass("org.apache.camel.component.pdf.PdfConfiguration")
-                .build();
+    void configureRuntimeInitializedClasses(BuildProducer<RuntimeInitializedClassBuildItem> runtimeInitializedClass) {
+        for (String className : RUNTIME_INITIALIZED_CLASSES) {
+            runtimeInitializedClass.produce(new RuntimeInitializedClassBuildItem(className));
+        }
     }
-
 }
diff --git a/extensions/readme.adoc b/extensions/readme.adoc
index 9e13c22..e79c4b4 100644
--- a/extensions/readme.adoc
+++ b/extensions/readme.adoc
@@ -5,7 +5,7 @@ Apache Camel Quarkus supports the following Camel artifacts as Quarkus Extension
 == Camel Components
 
 // components: START
-Number of Camel components: 65 in 56 JAR artifacts (0 deprecated)
+Number of Camel components: 66 in 57 JAR artifacts (0 deprecated)
 
 [width="100%",cols="4,1,5",options="header"]
 |===
@@ -51,7 +51,7 @@ Number of Camel components: 65 in 56 JAR artifacts (0 deprecated)
 `aws-sqs:queueNameOrArn` | 0.2.0 | The aws-sqs component is used for sending and receiving messages to Amazon's SQS service.
 
 | link:https://camel.apache.org/components/latest/aws-translate-component.html[AWS Translate] (camel-quarkus-aws-translate) +
-`aws-translate:label` | 1.0.0-M3 | The aws-kms is used for managing Amazon Translate
+`aws-translate:label` | 1.0.0-M3 | The aws-translate component is used for managing Amazon Translate
 
 | link:https://camel.apache.org/components/latest/bean-component.html[Bean] (camel-quarkus-bean) +
 `bean:beanName` | 0.2.0 | The bean component is for invoking Java beans from Camel.
@@ -63,7 +63,7 @@ Number of Camel components: 65 in 56 JAR artifacts (0 deprecated)
 `box:apiName/methodName` | 1.2.0 | For uploading downloading and managing files folders groups collaborations etc on box DOT com.
 
 | link:https://camel.apache.org/components/latest/class-component.html[Class] (camel-quarkus-bean) +
-`class:beanName` | 0.2.0 | The class component is for invoking Java classes (Java beans) from Camel.
+`class:beanName` | 0.2.0 | The Class component is for invoking Java classes (Java beans) from Camel.
 
 | link:https://camel.apache.org/components/latest/consul-component.html[Consul] (camel-quarkus-consul) +
 `consul:apiEndpoint` | 1.0.0-M3 | The camel consul component allows you to work with Consul, a distributed, highly available, datacenter-aware, service discovery and configuration system.
@@ -262,7 +262,7 @@ Number of Camel languages: 9 in 3 JAR artifacts (0 deprecated)
 
 | link:https://camel.apache.org/components/latest/bean-language.html[Bean method] (camel-quarkus-bean) | 0.2.0 | To use a Java bean (aka method call) in Camel expressions or predicates.
 
-| link:https://camel.apache.org/components/latest/constant-language.html[Constant] (camel-quarkus-core) | 0.2.0 | To use a constant value in Camel expressions or predicates.
+| link:https://camel.apache.org/components/latest/constant-language.html[Constant] (camel-quarkus-core) | 0.2.0 | To use a constant value in Camel expressions or predicates. Important: this is a fixed constant value that is only set once during starting up the route, do not use this if you want dynamic values during routing.
 
 | link:https://camel.apache.org/components/latest/exchangeProperty-language.html[ExchangeProperty] (camel-quarkus-core) | 0.2.0 | To use a Camel Exchange property in expressions or predicates.
 
diff --git a/extensions/support/policy/deployment/src/main/java/org/apache/camel/quarkus/component/support/policy/deployment/PolicyProcessor.java b/extensions/support/policy/deployment/src/main/java/org/apache/camel/quarkus/component/support/policy/deployment/PolicyProcessor.java
index 8993afa..9a2ce53 100644
--- a/extensions/support/policy/deployment/src/main/java/org/apache/camel/quarkus/component/support/policy/deployment/PolicyProcessor.java
+++ b/extensions/support/policy/deployment/src/main/java/org/apache/camel/quarkus/component/support/policy/deployment/PolicyProcessor.java
@@ -65,13 +65,7 @@ class PolicyProcessor {
                 "org.apache.camel.component.fhir.FhirHistoryEndpointConfiguration",
                 "org.apache.camel.component.fhir.FhirMetaEndpointConfiguration",
                 "org.apache.camel.component.fhir.FhirPatchEndpointConfiguration",
-                "org.apache.camel.component.fhir.FhirDeleteEndpointConfiguration",
-
-                /* org.apache.camel.component.consul.* can be removed after the upgrade to Camel 3.1 */
-                "org.apache.camel.component.consul.ConsulConfiguration",
-                "org.apache.camel.component.consul.ConsulClientConfiguration",
-                "org.apache.camel.component.consul.health.ConsulHealthCheckRepositoryConfiguration",
-                "org.apache.camel.component.consul.cloud.ConsulServiceRegistryConfiguration");
+                "org.apache.camel.component.fhir.FhirDeleteEndpointConfiguration");
     }
 
     /* Make the build fail as long as there are banned classes registered for reflection */
diff --git a/extensions/support/xml/runtime/pom.xml b/extensions/support/xml/runtime/pom.xml
index e72f1ab..5f99efa 100644
--- a/extensions/support/xml/runtime/pom.xml
+++ b/extensions/support/xml/runtime/pom.xml
@@ -52,7 +52,7 @@
 
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-jaxp</artifactId>
+            <artifactId>camel-xml-jaxp</artifactId>
         </dependency>
     </dependencies>
 
diff --git a/integration-tests/bindy/src/main/java/org/apache/camel/quarkus/component/bindy/it/BindyTestRoute.java b/integration-tests/bindy/src/main/java/org/apache/camel/quarkus/component/bindy/it/BindyTestRoute.java
index f98c016..2d26c32 100644
--- a/integration-tests/bindy/src/main/java/org/apache/camel/quarkus/component/bindy/it/BindyTestRoute.java
+++ b/integration-tests/bindy/src/main/java/org/apache/camel/quarkus/component/bindy/it/BindyTestRoute.java
@@ -30,13 +30,13 @@ public class BindyTestRoute extends RouteBuilder {
     public void configure() {
         BindyDataFormat bindyCsvDataFormat = new BindyDataFormat();
         bindyCsvDataFormat.setClassType(CsvOrder.class);
-        bindyCsvDataFormat.setType(BindyType.Csv);
+        bindyCsvDataFormat.setType(BindyType.Csv.name());
         from("direct:jsonToCsv").marshal(bindyCsvDataFormat);
         from("direct:csvToJson").unmarshal(bindyCsvDataFormat);
 
         BindyDataFormat bindyFixedLengthDataFormat = new BindyDataFormat();
         bindyFixedLengthDataFormat.setClassType(FixedLengthOrder.class);
-        bindyFixedLengthDataFormat.setType(BindyType.Fixed);
+        bindyFixedLengthDataFormat.setType(BindyType.Fixed.name());
         from("direct:jsonToFixedLength").marshal(bindyFixedLengthDataFormat);
         from("direct:fixedLengthToJson").unmarshal(bindyFixedLengthDataFormat);
 
diff --git a/integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java b/integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
index bab7f56..d7052bb 100644
--- a/integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
+++ b/integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
@@ -28,6 +28,7 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.spi.Registry;
 
 @Path("/test")
@@ -44,6 +45,8 @@ public class CamelServlet {
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public JsonObject describeMain() {
+        final ExtendedCamelContext camelContext = main.getCamelContext().adapt(ExtendedCamelContext.class);
+
         JsonArrayBuilder listeners = Json.createArrayBuilder();
         main.getMainListeners().forEach(listener -> listeners.add(listener.getClass().getName()));
 
@@ -62,6 +65,8 @@ public class CamelServlet {
         }
 
         return Json.createObjectBuilder()
+                .add("xml-loader", camelContext.getXMLRoutesDefinitionLoader().getClass().getName())
+                .add("xml-model-dumper", camelContext.getModelToXMLDumper().getClass().getName())
                 .add("routes-collector", collector)
                 .add("listeners", listeners)
                 .add("routeBuilders", routeBuilders)
diff --git a/integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/CamelTest.java b/integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
index b6bc1eb..d3fd12d 100644
--- a/integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
+++ b/integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
@@ -21,6 +21,8 @@ import javax.ws.rs.core.MediaType;
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
 import io.restassured.path.json.JsonPath;
+import org.apache.camel.xml.jaxb.JaxbModelToXMLDumper;
+import org.apache.camel.xml.jaxb.JaxbXMLRoutesDefinitionLoader;
 import org.junit.jupiter.api.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -38,6 +40,9 @@ public class CamelTest {
                 .body()
                 .jsonPath();
 
+        assertThat(p.getString("xml-loader")).isEqualTo(JaxbXMLRoutesDefinitionLoader.class.getName());
+        assertThat(p.getString("xml-model-dumper")).isEqualTo(JaxbModelToXMLDumper.class.getName());
+
         assertThat(p.getList("routeBuilders", String.class))
                 .isEmpty();
         assertThat(p.getList("routes", String.class))
diff --git a/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java b/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
index 1d13b31..de0c8ca 100644
--- a/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
+++ b/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
@@ -147,6 +147,8 @@ public class CamelServlet {
         }
 
         return Json.createObjectBuilder()
+                .add("xml-loader", camelContext.getXMLRoutesDefinitionLoader().getClass().getName())
+                .add("xml-model-dumper", camelContext.getModelToXMLDumper().getClass().getName())
                 .add("routes-collector", collector)
                 .add("listeners", listeners)
                 .add("routeBuilders", routeBuilders)
@@ -165,7 +167,7 @@ public class CamelServlet {
     @GET
     @Produces(MediaType.TEXT_PLAIN)
     public JsonObject reactiveExecutor() {
-        ReactiveExecutor executor = context.getReactiveExecutor();
+        ReactiveExecutor executor = context.adapt(ExtendedCamelContext.class).getReactiveExecutor();
 
         JsonObjectBuilder builder = Json.createObjectBuilder();
         builder.add("class", executor.getClass().getName());
diff --git a/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java b/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
index a9c5892..ab7e3d4 100644
--- a/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
+++ b/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
@@ -77,9 +77,12 @@ public class CamelTest {
                 .body()
                 .jsonPath();
 
+        assertThat(p.getString("xml-loader")).isEqualTo(DisabledXMLRoutesDefinitionLoader.class.getName());
+        assertThat(p.getString("xml-model-dumper")).isEqualTo(DisabledModelToXMLDumper.class.getName());
+
         assertThat(p.getString("routes-collector.type")).isEqualTo(CamelRoutesCollector.class.getName());
         assertThat(p.getString("routes-collector.type-registry")).isEqualTo(RegistryRoutesLoaders.Default.class.getName());
-        assertThat(p.getString("routes-collector.type-xml")).isEqualTo(DisabledXmlRoutesLoader.class.getName());
+        assertThat(p.getString("routes-collector.type-xml")).isEqualTo(DisabledXMLRoutesDefinitionLoader.class.getName());
 
         assertThat(p.getList("listeners", String.class))
                 .containsOnly(CamelMainEventDispatcher.class.getName(), SupportListener.class.getName());
diff --git a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
index d83da39..773d87e 100644
--- a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
+++ b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
@@ -30,8 +30,8 @@ import javax.ws.rs.core.MediaType;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.NoSuchLanguageException;
+import org.apache.camel.catalog.RuntimeCamelCatalog;
 import org.apache.camel.component.log.LogComponent;
-import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.support.processor.DefaultExchangeFormatter;
 
@@ -103,7 +103,7 @@ public class CamelServlet {
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public String catalog(@PathParam("type") String type, @PathParam("name") String name) throws IOException {
-        final RuntimeCamelCatalog catalog = context.getExtension(RuntimeCamelCatalog.class);
+        final CamelRuntimeCatalog catalog = (CamelRuntimeCatalog) context.getExtension(RuntimeCamelCatalog.class);
 
         switch (type) {
         case "component":
diff --git a/integration-tests/pdf/src/main/java/org/apache/camel/quarkus/component/pdf/it/PdfResource.java b/integration-tests/pdf/src/main/java/org/apache/camel/quarkus/component/pdf/it/PdfResource.java
index c8d7bda..ffd6fa8 100644
--- a/integration-tests/pdf/src/main/java/org/apache/camel/quarkus/component/pdf/it/PdfResource.java
+++ b/integration-tests/pdf/src/main/java/org/apache/camel/quarkus/component/pdf/it/PdfResource.java
@@ -51,7 +51,7 @@ public class PdfResource {
     @Produces(MediaType.APPLICATION_OCTET_STREAM)
     public Response createFromText(String message) throws Exception {
         document = producerTemplate.requestBody(
-                "pdf:create?fontSize=6&pageSize=PAGE_SIZE_A5", message, byte[].class);
+                "pdf:create?fontSize=6&pageSize=PAGE_SIZE_A5&font=Courier", message, byte[].class);
 
         LOG.infof("The PDDocument has been created and contains %d bytes", document.length);
 
diff --git a/integration-tests/support/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportListener.java b/integration-tests/support/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportListener.java
index 962d471..decef0a 100644
--- a/integration-tests/support/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportListener.java
+++ b/integration-tests/support/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportListener.java
@@ -39,6 +39,10 @@ public class SupportListener implements MainListener {
     }
 
     @Override
+    public void beforeConfigure(BaseMainSupport main) {
+    }
+
+    @Override
     public void beforeStart(BaseMainSupport main) {
         main.addRoutesBuilder(new MyBuilder());
     }
diff --git a/pom.xml b/pom.xml
index 6d63464..dfc14f6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,7 +41,7 @@
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 
         <ahc.version>2.10.4</ahc.version>
-        <camel.version>3.0.1</camel.version>
+        <camel.version>3.1.0-SNAPSHOT</camel.version>
         <guava.version>26.0-jre</guava.version>
         <hapi.version>4.1.0</hapi.version>
         <quarkus.version>1.3.0.Alpha2</quarkus.version>
diff --git a/poms/bom/pom.xml b/poms/bom/pom.xml
index bf2c976..aa79fad 100644
--- a/poms/bom/pom.xml
+++ b/poms/bom/pom.xml
@@ -178,6 +178,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
+                <artifactId>camel-catalog</artifactId>
+                <version>${camel.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
                 <artifactId>camel-cloud</artifactId>
                 <version>${camel.version}</version>
             </dependency>
@@ -198,6 +203,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
+                <artifactId>camel-core-catalog</artifactId>
+                <version>${camel.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
                 <artifactId>camel-core-engine</artifactId>
                 <version>${camel.version}</version>
             </dependency>
@@ -300,11 +310,6 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
-                <artifactId>camel-jaxp</artifactId>
-                <version>${camel.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.camel</groupId>
                 <artifactId>camel-jdbc</artifactId>
                 <version>${camel.version}</version>
             </dependency>
@@ -355,6 +360,12 @@
                 <groupId>org.apache.camel</groupId>
                 <artifactId>camel-main</artifactId>
                 <version>${camel.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.apache.camel</groupId>
+                        <artifactId>camel-headersmap</artifactId>
+                    </exclusion>
+                </exclusions>
             </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
diff --git a/tooling/package-maven-plugin/pom.xml b/tooling/package-maven-plugin/pom.xml
index ad49f19..d8d07f2 100644
--- a/tooling/package-maven-plugin/pom.xml
+++ b/tooling/package-maven-plugin/pom.xml
@@ -53,6 +53,28 @@
             </exclusions>
         </dependency>
         <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-support</artifactId>
+            <version>${camel.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-util</artifactId>
+            <version>${camel.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
             <groupId>org.apache.maven</groupId>
             <artifactId>maven-core</artifactId>
             <exclusions>
@@ -69,6 +91,10 @@
                     <artifactId>commons-io</artifactId>
                 </exclusion>
                 <exclusion>
+                    <groupId>org.apache.commons</groupId>
+                    <artifactId>commons-lang3</artifactId>
+                </exclusion>
+                <exclusion>
                     <groupId>com.google.guava</groupId>
                     <artifactId>guava</artifactId>
                 </exclusion>
@@ -77,6 +103,12 @@
         <dependency>
             <groupId>org.apache.maven</groupId>
             <artifactId>maven-artifact</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.commons</groupId>
+                    <artifactId>commons-lang3</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.apache.maven</groupId>
diff --git a/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/ExtMvelHelper.java b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/ExtMvelHelper.java
index 5066e5d..0b0f86e 100644
--- a/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/ExtMvelHelper.java
+++ b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/ExtMvelHelper.java
@@ -19,10 +19,10 @@ package org.apache.camel.quarkus.maven;
 import java.nio.file.Path;
 
 import org.apache.camel.maven.packaging.MvelHelper;
-import org.apache.camel.maven.packaging.StringHelper;
-import org.apache.camel.maven.packaging.model.ComponentModel;
-import org.apache.camel.maven.packaging.model.DataFormatModel;
-import org.apache.camel.maven.packaging.model.LanguageModel;
+import org.apache.camel.tooling.util.Strings;
+import org.apache.camel.tooling.model.ComponentModel;
+import org.apache.camel.tooling.model.DataFormatModel;
+import org.apache.camel.tooling.model.LanguageModel;
 
 public class ExtMvelHelper {
 
@@ -37,7 +37,7 @@ public class ExtMvelHelper {
     }
 
     public String getFirstVersionShort(Object model) {
-        return StringHelper.cutLastZeroDigit((String) invokeGetter(model, "getFirstVersion"));
+        return org.apache.camel.tooling.model.Strings.cutLastZeroDigit((String) invokeGetter(model, "getFirstVersion"));
     }
 
     public String getDocLink(Object model) {
@@ -76,6 +76,6 @@ public class ExtMvelHelper {
     }
 
     private String getExtensionDocName(Object model) {
-        return StringHelper.after((String) invokeGetter(model, "getArtifactId"), "camel-quarkus-") + ".adoc";
+        return Strings.after((String) invokeGetter(model, "getArtifactId"), "camel-quarkus-") + ".adoc";
     }
 }
diff --git a/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/JSonSchemaHelper.java b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/JSonSchemaHelper.java
new file mode 100644
index 0000000..1b560d0
--- /dev/null
+++ b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/JSonSchemaHelper.java
@@ -0,0 +1,567 @@
+/*
+ * 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.maven;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.camel.util.json.JsonArray;
+import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
+
+/**
+ * Used for parsing Camel components json meta-data descriptors.
+ */
+public final class JSonSchemaHelper {
+
+    private static final String[] LOGGING_LEVELS = new String[]{"ERROR", "WARN", "INFO", "DEBUG", "TRACE", "OFF"};
+
+    private JSonSchemaHelper() {
+    }
+
+    /**
+     * Parses the camel-main json schema to split it into a list or rows, where each row contains key value pairs with the metadata
+     *
+     * @param json the main configuration json
+     * @return a list of all the rows, where each row is a set of key value pairs with metadata
+     * @throws RuntimeException is thrown if error parsing the json data
+     */
+    @SuppressWarnings("unchecked")
+    public static List<Map<String, String>> parseMainJsonSchema(String json) {
+        List<Map<String, String>> answer = new ArrayList<>();
+        if (json == null) {
+            return answer;
+        }
+
+        // convert into a List<Map<String, String>> structure which is expected as output from this parser
+        try {
+            JsonObject output = (JsonObject) Jsoner.deserialize(json);
+            for (String key : output.keySet()) {
+                JsonArray array = (JsonArray) output.get(key);
+                if (key.equals("properties")) {
+                    // flattern each entry in the row with name as they key, and its value as the content (its a map also)
+                    for (Object obj : array) {
+                        Map entry = (Map) obj;
+                        Map<String, String> newRow = new LinkedHashMap();
+                        newRow.putAll(entry);
+                        answer.add(newRow);
+                        String name = ((Map) obj).get("name").toString();
+                        // use naming style with camel case
+                        String lookupKey = dashToCamelCase(name);
+                        newRow.put("name", lookupKey);
+                        // its the java type
+                        String type = newRow.get("type");
+                        newRow.put("javaType", type);
+                        newRow.put("type", fromMainToType(type));
+                        // add known enums
+                        if ("org.apache.camel.LoggingLevel".equals(type)) {
+                            newRow.put("enum", "ERROR,WARN,INFO,DEBUG,TRACE,OFF");
+                        } else if ("org.apache.camel.ManagementStatisticsLevel".equals(type)) {
+                            newRow.put("enum", "Extended,Default,RoutesOnly,Off");
+                        } else if ("org.apache.camel.spi.RestBindingMode".equals(type)) {
+                            newRow.put("enum", "auto,off,json,xml,json_xml");
+                        } else if ("org.apache.camel.spi.RestHostNameResolver".equals(type)) {
+                            newRow.put("enum", "allLocalIp,localIp,localHostName");
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            // wrap parsing exceptions as runtime
+            throw new RuntimeException("Cannot parse json", e);
+        }
+
+        return answer;
+    }
+
+    private static String fromMainToType(String type) {
+        if ("boolean".equals(type) || "java.lang.Boolean".equals(type)) {
+            return "boolean";
+        } else if ("int".equals(type) || "java.lang.Integer".equals(type)) {
+            return "integer";
+        } else if ("long".equals(type) || "java.lang.Long".equals(type)) {
+            return "integer";
+        } else if ("float".equals(type) || "java.lang.Float".equals(type)) {
+            return "number";
+        } else if ("double".equals(type) || "java.lang.Double".equals(type)) {
+            return "number";
+        } else if ("string".equals(type) || "java.lang.String".equals(type)) {
+            return "string";
+        } else {
+            return "object";
+        }
+    }
+
+    /**
+     * Parses the json schema to split it into a list or rows, where each row contains key value pairs with the metadata
+     *
+     * @param group the group to parse from such as <tt>component</tt>, <tt>componentProperties</tt>, or <tt>properties</tt>.
+     * @param json the json
+     * @return a list of all the rows, where each row is a set of key value pairs with metadata
+     * @throws RuntimeException is thrown if error parsing the json data
+     */
+    @SuppressWarnings("unchecked")
+    public static List<Map<String, String>> parseJsonSchema(String group, String json, boolean parseProperties) {
+        List<Map<String, String>> answer = new ArrayList<>();
+        if (json == null) {
+            return answer;
+        }
+
+        // convert into a List<Map<String, String>> structure which is expected as output from this parser
+        try {
+            JsonObject output = (JsonObject) Jsoner.deserialize(json);
+            for (String key : output.keySet()) {
+                Map row = output.getMap(key);
+                if (key.equals(group)) {
+                    if (parseProperties) {
+                        // flattern each entry in the row with name as they key, and its value as the content (its a map also)
+                        for (Object obj : row.entrySet()) {
+                            Map.Entry entry = (Map.Entry) obj;
+                            Map<String, String> newRow = new LinkedHashMap();
+                            newRow.put("name", entry.getKey().toString());
+
+                            Map newData = transformMap((Map) entry.getValue());
+                            newRow.putAll(newData);
+                            answer.add(newRow);
+                        }
+                    } else {
+                        // flattern each entry in the row as a list of single Map<key, value> elements
+                        Map newData = transformMap(row);
+                        for (Object obj : newData.entrySet()) {
+                            Map.Entry entry = (Map.Entry) obj;
+                            Map<String, String> newRow = new LinkedHashMap<>();
+                            newRow.put(entry.getKey().toString(), entry.getValue().toString());
+                            answer.add(newRow);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            // wrap parsing exceptions as runtime
+            throw new RuntimeException("Cannot parse json", e);
+        }
+
+        return answer;
+    }
+
+    private static Map<String, String> transformMap(Map jsonMap) {
+        Map<String, String> answer = new LinkedHashMap<>();
+
+        for (Object rowObj : jsonMap.entrySet()) {
+            Map.Entry rowEntry = (Map.Entry) rowObj;
+            // if its a list type then its an enum, and we need to parse it as a single line separated with comma
+            // to be backwards compatible
+            Object newValue = rowEntry.getValue();
+            if (newValue instanceof List) {
+                List<?> list = (List) newValue;
+                newValue = list.stream().map(Object::toString)
+                        .collect(Collectors.joining(","));
+            }
+            // ensure value is escaped
+            String value = escapeJson(newValue.toString());
+            answer.put(rowEntry.getKey().toString(), value);
+        }
+
+        return answer;
+    }
+
+    private static String escapeJson(String value) {
+        // need to safe encode \r as \\r so its escaped
+        // need to safe encode \n as \\n so its escaped
+        // need to safe encode \t as \\t so its escaped
+        return value
+                .replace("\\r", "\\\\r")
+                .replace("\\n", "\\\\n")
+                .replace("\\t", "\\\\t");
+    }
+
+    public static boolean isComponentLenientProperties(List<Map<String, String>> rows) {
+        for (Map<String, String> row : rows) {
+            if (row.containsKey("lenientProperties")) {
+                return "true".equals(row.get("lenientProperties"));
+            }
+        }
+        return false;
+    }
+
+    public static boolean isComponentConsumerOnly(List<Map<String, String>> rows) {
+        for (Map<String, String> row : rows) {
+            if (row.containsKey("consumerOnly")) {
+                return "true".equals(row.get("consumerOnly"));
+            }
+        }
+        return false;
+    }
+
+    public static boolean isComponentProducerOnly(List<Map<String, String>> rows) {
+        for (Map<String, String> row : rows) {
+            if (row.containsKey("producerOnly")) {
+                return "true".equals(row.get("producerOnly"));
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyConsumerOnly(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String labels = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("label")) {
+                labels = row.get("label");
+            }
+            if (found) {
+                return labels != null && labels.contains("consumer");
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyProducerOnly(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String labels = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("label")) {
+                labels = row.get("label");
+            }
+            if (found) {
+                return labels != null && labels.contains("producer");
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyRequired(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            boolean required = false;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("required")) {
+                required = "true".equals(row.get("required"));
+            }
+            if (found) {
+                return required;
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyDeprecated(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            boolean deprecated = false;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("deprecated")) {
+                deprecated = "true".equals(row.get("deprecated"));
+            }
+            if (found) {
+                return deprecated;
+            }
+        }
+        return false;
+    }
+
+    public static String getPropertyKind(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String kind = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("kind")) {
+                kind = row.get("kind");
+            }
+            if (found) {
+                return kind;
+            }
+        }
+        return null;
+    }
+
+    public static String getPropertyJavaType(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String javaType = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("javaType")) {
+                javaType = row.get("javaType");
+            }
+            if (found) {
+                return javaType;
+            }
+        }
+        return null;
+    }
+
+    public static boolean isPropertyBoolean(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String type = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("type")) {
+                type = row.get("type");
+            }
+            if (found) {
+                return "boolean".equals(type);
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyInteger(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String type = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("type")) {
+                type = row.get("type");
+            }
+            if (found) {
+                return "integer".equals(type);
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyArray(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String type = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("type")) {
+                type = row.get("type");
+            }
+            if (found) {
+                return "array".equals(type);
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyNumber(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String type = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("type")) {
+                type = row.get("type");
+            }
+            if (found) {
+                return "number".equals(type);
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyObject(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String type = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("type")) {
+                type = row.get("type");
+            }
+            if (found) {
+                return "object".equals(type);
+            }
+        }
+        return false;
+    }
+
+    public static String getPropertyDefaultValue(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String defaultValue = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("defaultValue")) {
+                defaultValue = row.get("defaultValue");
+            }
+            if (found) {
+                return defaultValue;
+            }
+        }
+        return null;
+    }
+
+    public static String stripOptionalPrefixFromName(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            boolean found = false;
+            if (row.containsKey("name")) {
+                String optionalPrefix = row.get("optionalPrefix");
+                if (optionalPrefix != null && !optionalPrefix.isEmpty() && name.startsWith(optionalPrefix)) {
+                    name = name.substring(optionalPrefix.length());
+                    // try again
+                    return stripOptionalPrefixFromName(rows, name);
+                } else {
+                    found = name.equalsIgnoreCase(row.get("name"));
+                }
+            }
+            if (found) {
+                return name;
+            }
+        }
+        return name;
+    }
+
+    public static String getPropertyEnum(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String enums = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("enum")) {
+                enums = row.get("enum");
+            }
+            if (found) {
+                return enums;
+            }
+        }
+        return null;
+    }
+
+    public static String getPropertyPrefix(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String prefix = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("prefix")) {
+                prefix = row.get("prefix");
+            }
+            if (found) {
+                return prefix;
+            }
+        }
+        return null;
+    }
+
+    public static boolean isPropertyMultiValue(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            boolean multiValue = false;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("multiValue")) {
+                multiValue = "true".equals(row.get("multiValue"));
+            }
+            if (found) {
+                return multiValue;
+            }
+        }
+        return false;
+    }
+
+    public static String getPropertyNameFromNameWithPrefix(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String propertyName = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                propertyName = row.get("name");
+            }
+            if (row.containsKey("prefix")) {
+                String preifx = row.get("prefix");
+                found = name.startsWith(preifx);
+            }
+            if (found) {
+                return propertyName;
+            }
+        }
+        return null;
+    }
+
+    public static Map<String, String> getRow(List<Map<String, String>> rows, String key) {
+        for (Map<String, String> row : rows) {
+            if (key.equals(row.get("name"))) {
+                return row;
+            }
+        }
+        return null;
+    }
+
+    public static Set<String> getNames(List<Map<String, String>> rows) {
+        Set<String> answer = new LinkedHashSet<>();
+        for (Map<String, String> row : rows) {
+            if (row.containsKey("name")) {
+                answer.add(row.get("name"));
+            }
+        }
+        return answer;
+    }
+
+    /**
+     * Converts the string from dash format into camel case (hello-great-world -> helloGreatWorld)
+     *
+     * @param text  the string
+     * @return the string camel cased
+     */
+    private static String dashToCamelCase(String text) {
+        if (text == null) {
+            return null;
+        }
+        int length = text.length();
+        if (length == 0) {
+            return text;
+        }
+        if (text.indexOf('-') == -1) {
+            return text;
+        }
+
+        StringBuilder sb = new StringBuilder();
+
+        for (int i = 0; i < text.length(); i++) {
+            char c = text.charAt(i);
+            if (c == '-') {
+                i++;
+                sb.append(Character.toUpperCase(text.charAt(i)));
+            } else {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+}
\ No newline at end of file
diff --git a/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PrepareCatalogQuarkusMojo.java b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PrepareCatalogQuarkusMojo.java
index 0ca8459..0a07936 100644
--- a/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PrepareCatalogQuarkusMojo.java
+++ b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PrepareCatalogQuarkusMojo.java
@@ -64,7 +64,7 @@ import com.google.gson.GsonBuilder;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
 
 /**
  * Prepares the Quarkus provider camel catalog to include component it supports
diff --git a/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/UpdateDocExtensionsListMojo.java b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/UpdateDocExtensionsListMojo.java
index bb392f4..b5fac67 100644
--- a/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/UpdateDocExtensionsListMojo.java
+++ b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/UpdateDocExtensionsListMojo.java
@@ -33,12 +33,11 @@ import java.util.TreeSet;
 
 import static java.util.stream.Collectors.toSet;
 
-import org.apache.camel.maven.packaging.JSonSchemaHelper;
-import org.apache.camel.maven.packaging.StringHelper;
-import org.apache.camel.maven.packaging.model.ComponentModel;
-import org.apache.camel.maven.packaging.model.DataFormatModel;
-import org.apache.camel.maven.packaging.model.LanguageModel;
-import org.apache.camel.maven.packaging.model.OtherModel;
+import org.apache.camel.util.StringHelper;
+import org.apache.camel.tooling.model.ComponentModel;
+import org.apache.camel.tooling.model.DataFormatModel;
+import org.apache.camel.tooling.model.LanguageModel;
+import org.apache.camel.tooling.model.OtherModel;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -49,8 +48,8 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 import org.mvel2.templates.TemplateRuntime;
 
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
-import static org.apache.camel.maven.packaging.PackageHelper.writeText;
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.PackageHelper.writeText;
 
 /**
  * Updates the documentation in:
@@ -183,7 +182,7 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
 
             // how many deprecated
             long deprecated = components.stream()
-                    .filter(c -> "true".equals(c.getDeprecated()))
+                    .filter(ComponentModel::isDeprecated)
                     .count();
 
             // update the big readme file in the extensions dir
@@ -251,7 +250,7 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
 
             // how many deprecated
             long deprecated = models.stream()
-                    .filter(m -> "true".equals(m.getDeprecated()))
+                    .filter(DataFormatModel::isDeprecated)
                     .count();
 
             // filter out camel-core
@@ -325,7 +324,7 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
 
             // how many deprecated
             long deprecated = languages.stream()
-                    .filter(l -> "true".equals(l.getDeprecated()))
+                    .filter(LanguageModel::isDeprecated)
                     .count();
 
             // update the big readme file in the extensions dir
@@ -387,7 +386,7 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
 
             // how many deprecated
             long deprecated = others.stream()
-                    .filter(o -> "true".equals(o.getDeprecated()))
+                    .filter(OtherModel::isDeprecated)
                     .count();
 
             // update the big readme file in the extensions dir
@@ -665,22 +664,22 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
         List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("component", json, false);
 
         ComponentModel component = new ComponentModel();
-        component.setScheme(JSonSchemaHelper.getSafeValue("scheme", rows));
-        component.setSyntax(JSonSchemaHelper.getSafeValue("syntax", rows));
-        component.setAlternativeSyntax(JSonSchemaHelper.getSafeValue("alternativeSyntax", rows));
-        component.setAlternativeSchemes(JSonSchemaHelper.getSafeValue("alternativeSchemes", rows));
-        component.setTitle(JSonSchemaHelper.getSafeValue("title", rows));
-        component.setDescription(JSonSchemaHelper.getSafeValue("description", rows));
-        component.setFirstVersion(JSonSchemaHelper.getSafeValue("firstVersion", rows));
-        component.setLabel(JSonSchemaHelper.getSafeValue("label", rows));
-        component.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows));
-        component.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", rows));
-        component.setConsumerOnly(JSonSchemaHelper.getSafeValue("consumerOnly", rows));
-        component.setProducerOnly(JSonSchemaHelper.getSafeValue("producerOnly", rows));
-        component.setJavaType(JSonSchemaHelper.getSafeValue("javaType", rows));
-        component.setGroupId(JSonSchemaHelper.getSafeValue("groupId", rows));
-        component.setArtifactId(JSonSchemaHelper.getSafeValue("artifactId", rows));
-        component.setVersion(JSonSchemaHelper.getSafeValue("version", rows));
+        component.setScheme(getJSonValue("scheme", rows));
+        component.setSyntax(getJSonValue("syntax", rows));
+        component.setAlternativeSyntax(getJSonValue("alternativeSyntax", rows));
+        component.setAlternativeSchemes(getJSonValue("alternativeSchemes", rows));
+        component.setTitle(getJSonValue("title", rows));
+        component.setDescription(getJSonValue("description", rows));
+        component.setFirstVersion(getJSonValue("firstVersion", rows));
+        component.setLabel(getJSonValue("label", rows));
+        component.setDeprecated(Boolean.valueOf(getJSonValue("deprecated", rows)));
+        component.setDeprecationNote(getJSonValue("deprecationNote", rows));
+        component.setConsumerOnly(Boolean.valueOf(getJSonValue("consumerOnly", rows)));
+        component.setProducerOnly(Boolean.valueOf(getJSonValue("producerOnly", rows)));
+        component.setJavaType(getJSonValue("javaType", rows));
+        component.setGroupId(getJSonValue("groupId", rows));
+        component.setArtifactId(getJSonValue("artifactId", rows));
+        component.setVersion(getJSonValue("version", rows));
 
         return component;
     }
@@ -689,18 +688,18 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
         List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("dataformat", json, false);
 
         DataFormatModel dataFormat = new DataFormatModel();
-        dataFormat.setName(JSonSchemaHelper.getSafeValue("name", rows));
-        dataFormat.setTitle(JSonSchemaHelper.getSafeValue("title", rows));
-        dataFormat.setModelName(JSonSchemaHelper.getSafeValue("modelName", rows));
-        dataFormat.setDescription(JSonSchemaHelper.getSafeValue("description", rows));
-        dataFormat.setFirstVersion(JSonSchemaHelper.getSafeValue("firstVersion", rows));
-        dataFormat.setLabel(JSonSchemaHelper.getSafeValue("label", rows));
-        dataFormat.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows));
-        dataFormat.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", rows));
-        dataFormat.setJavaType(JSonSchemaHelper.getSafeValue("javaType", rows));
-        dataFormat.setGroupId(JSonSchemaHelper.getSafeValue("groupId", rows));
-        dataFormat.setArtifactId(JSonSchemaHelper.getSafeValue("artifactId", rows));
-        dataFormat.setVersion(JSonSchemaHelper.getSafeValue("version", rows));
+        dataFormat.setName(getJSonValue("name", rows));
+        dataFormat.setTitle(getJSonValue("title", rows));
+        dataFormat.setModelName(getJSonValue("modelName", rows));
+        dataFormat.setDescription(getJSonValue("description", rows));
+        dataFormat.setFirstVersion(getJSonValue("firstVersion", rows));
+        dataFormat.setLabel(getJSonValue("label", rows));
+        dataFormat.setDeprecated(Boolean.valueOf(getJSonValue("deprecated", rows)));
+        dataFormat.setDeprecationNote(getJSonValue("deprecationNote", rows));
+        dataFormat.setJavaType(getJSonValue("javaType", rows));
+        dataFormat.setGroupId(getJSonValue("groupId", rows));
+        dataFormat.setArtifactId(getJSonValue("artifactId", rows));
+        dataFormat.setVersion(getJSonValue("version", rows));
 
         return dataFormat;
     }
@@ -709,18 +708,18 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
         List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("language", json, false);
 
         LanguageModel language = new LanguageModel();
-        language.setTitle(JSonSchemaHelper.getSafeValue("title", rows));
-        language.setName(JSonSchemaHelper.getSafeValue("name", rows));
-        language.setModelName(JSonSchemaHelper.getSafeValue("modelName", rows));
-        language.setDescription(JSonSchemaHelper.getSafeValue("description", rows));
-        language.setFirstVersion(JSonSchemaHelper.getSafeValue("firstVersion", rows));
-        language.setLabel(JSonSchemaHelper.getSafeValue("label", rows));
-        language.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows));
-        language.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", rows));
-        language.setJavaType(JSonSchemaHelper.getSafeValue("javaType", rows));
-        language.setGroupId(JSonSchemaHelper.getSafeValue("groupId", rows));
-        language.setArtifactId(JSonSchemaHelper.getSafeValue("artifactId", rows));
-        language.setVersion(JSonSchemaHelper.getSafeValue("version", rows));
+        language.setTitle(getJSonValue("title", rows));
+        language.setName(getJSonValue("name", rows));
+        language.setModelName(getJSonValue("modelName", rows));
+        language.setDescription(getJSonValue("description", rows));
+        language.setFirstVersion(getJSonValue("firstVersion", rows));
+        language.setLabel(getJSonValue("label", rows));
+        language.setDeprecated(Boolean.valueOf(getJSonValue("deprecated", rows)));
+        language.setDeprecationNote(getJSonValue("deprecationNote", rows));
+        language.setJavaType(getJSonValue("javaType", rows));
+        language.setGroupId(getJSonValue("groupId", rows));
+        language.setArtifactId(getJSonValue("artifactId", rows));
+        language.setVersion(getJSonValue("version", rows));
 
         return language;
     }
@@ -729,20 +728,29 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
         List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("other", json, false);
 
         OtherModel other = new OtherModel();
-        other.setName(JSonSchemaHelper.getSafeValue("name", rows));
-        other.setTitle(JSonSchemaHelper.getSafeValue("title", rows));
-        other.setDescription(JSonSchemaHelper.getSafeValue("description", rows));
-        other.setFirstVersion(JSonSchemaHelper.getSafeValue("firstVersion", rows));
-        other.setLabel(JSonSchemaHelper.getSafeValue("label", rows));
-        other.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows));
-        other.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", rows));
-        other.setGroupId(JSonSchemaHelper.getSafeValue("groupId", rows));
-        other.setArtifactId(JSonSchemaHelper.getSafeValue("artifactId", rows));
-        other.setVersion(JSonSchemaHelper.getSafeValue("version", rows));
+        other.setName(getJSonValue("name", rows));
+        other.setTitle(getJSonValue("title", rows));
+        other.setDescription(getJSonValue("description", rows));
+        other.setFirstVersion(getJSonValue("firstVersion", rows));
+        other.setLabel(getJSonValue("label", rows));
+        other.setDeprecated(Boolean.valueOf(getJSonValue("deprecated", rows)));
+        other.setDeprecationNote(getJSonValue("deprecationNote", rows));
+        other.setGroupId(getJSonValue("groupId", rows));
+        other.setArtifactId(getJSonValue("artifactId", rows));
+        other.setVersion(getJSonValue("version", rows));
 
         return other;
     }
 
+    private String getJSonValue(String key, List<Map<String, String>> rows) {
+        for (Map<String, String> row : rows) {
+            if (row.containsKey(key)) {
+                return row.get(key);
+            }
+        }
+        return "";
+    }
+
     private Path getExtensionsDocPath() {
         return Paths.get(websiteDocBaseDir.toString(), "extensions");
     }