You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gn...@apache.org on 2020/01/15 16:12:06 UTC

[camel] branch master updated (3e0f8bf -> fe981b2)

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

gnodet pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git.


    from 3e0f8bf  CAMEL-14354: camel-core - Optimize
     new a78c904  Remove spring-boot specific mojos
     new c1a0f9f  Move a few helper methods around, syntactic enhancements for streams, etc...
     new 01e6763  Move srcgen to camel-tooling-util
     new 3a4bfe5  Small changes to the model to make it easier to work with
     new 8a8431c  [CAMEL-14404] Provide a lightweight xml parser
     new d3908e0  Regen doc
     new fe981b2  Regen endpoint dsl

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 bom/camel-bom/pom.xml                              |    5 +
 .../src/main/docs/activemq-component.adoc          |   62 +-
 .../src/main/docs/ahc-ws-component.adoc            |    4 +-
 .../camel-ahc/src/main/docs/ahc-component.adoc     |    4 +-
 .../camel-amqp/src/main/docs/amqp-component.adoc   |   62 +-
 .../main/docs/atmosphere-websocket-component.adoc  |    6 +-
 .../src/main/docs/aws-ddbstream-component.adoc     |    2 +-
 .../src/main/docs/aws-s3-component.adoc            |    2 +-
 .../src/main/docs/aws-sqs-component.adoc           |    6 +-
 .../src/main/docs/aws-swf-component.adoc           |    8 +-
 .../src/main/docs/bean-validator-component.adoc    |    4 +-
 .../src/main/docs/beanstalk-component.adoc         |    2 +-
 .../src/main/docs/cometd-component.adoc            |    2 +-
 .../src/main/docs/consul-component.adoc            |    2 +-
 .../src/main/docs/crypto-cms-component.adoc        |    6 +-
 .../camel-cxf/src/main/docs/cxf-component.adoc     |    4 +-
 .../camel-cxf/src/main/docs/cxfrs-component.adoc   |    4 +-
 .../maven/config/ConnectorConfigGenerator.java     |    8 +-
 .../src/main/docs/debezium-mongodb-component.adoc  |    4 +-
 .../src/main/docs/debezium-mysql-component.adoc    |   14 +-
 .../src/main/docs/debezium-postgres-component.adoc |    2 +-
 .../main/docs/debezium-sqlserver-component.adoc    |    8 +-
 .../src/main/docs/disruptor-component.adoc         |    4 +-
 .../src/main/docs/ehcache-component.adoc           |    2 +-
 .../src/main/docs/elytron-component.adoc           |    2 +-
 .../camel-etcd/src/main/docs/etcd-component.adoc   |    2 +-
 .../camel-file/src/main/docs/file-component.adoc   |   10 +-
 .../camel-ftp/src/main/docs/ftp-component.adoc     |   12 +-
 .../camel-ftp/src/main/docs/ftps-component.adoc    |   18 +-
 .../camel-ftp/src/main/docs/sftp-component.adoc    |   14 +-
 .../camel/component/hbase/model/HBaseCell.java     |    6 +-
 .../camel/component/hbase/model/HBaseRow.java      |    2 +-
 .../camel-http/src/main/docs/http-component.adoc   |    8 +-
 .../src/main/docs/iec60870-client-component.adoc   |    4 +-
 .../src/main/docs/iec60870-server-component.adoc   |    4 +-
 .../src/main/docs/ignite-cache-component.adoc      |    2 +-
 .../src/main/docs/ignite-compute-component.adoc    |    2 +-
 .../src/main/docs/ignite-events-component.adoc     |    2 +-
 .../src/main/docs/ignite-idgen-component.adoc      |    2 +-
 .../src/main/docs/ignite-messaging-component.adoc  |    2 +-
 .../src/main/docs/ignite-queue-component.adoc      |    2 +-
 .../src/main/docs/ignite-set-component.adoc        |    2 +-
 .../camel-irc/src/main/docs/irc-component.adoc     |    2 +-
 .../src/main/docs/jcache-component.adoc            |    4 +-
 .../camel-jdbc/src/main/docs/jdbc-component.adoc   |    2 +-
 .../camel-jetty/src/main/docs/jetty-component.adoc |   12 +-
 .../camel-jms/src/main/docs/jms-component.adoc     |   62 +-
 .../camel-jmx/src/main/docs/jmx-component.adoc     |    2 +-
 .../camel-kafka/src/main/docs/kafka-component.adoc |    8 +-
 .../src/main/docs/lumberjack-component.adoc        |    2 +-
 .../camel-mail/src/main/docs/mail-component.adoc   |    6 +-
 .../src/main/docs/milo-server-component.adoc       |   10 +-
 .../camel-mina/src/main/docs/mina-component.adoc   |    2 +-
 .../camel-nats/src/main/docs/nats-component.adoc   |    2 +-
 .../src/main/docs/netty-http-component.adoc        |    8 +-
 .../camel-netty/src/main/docs/netty-component.adoc |    8 +-
 .../camel-nsq/src/main/docs/nsq-component.adoc     |    2 +-
 .../src/main/docs/olingo2-component.adoc           |    2 +-
 .../src/main/docs/olingo4-component.adoc           |    2 +-
 .../src/main/docs/pulsar-component.adoc            |    6 +-
 .../src/main/docs/quartz-component.adoc            |    6 +-
 .../src/main/docs/rabbitmq-component.adoc          |   12 +-
 .../src/main/docs/reactive-streams-component.adoc  |    2 +-
 .../src/main/docs/rest-openapi-component.adoc      |    2 +-
 .../src/main/docs/rest-swagger-component.adoc      |    2 +-
 .../src/main/docs/servicenow-component.adoc        |    4 +-
 .../src/main/docs/servlet-component.adoc           |    6 +-
 .../src/main/docs/sjms-batch-component.adoc        |    2 +-
 .../camel-sjms/src/main/docs/sjms-component.adoc   |    4 +-
 .../camel-sjms2/src/main/docs/sjms2-component.adoc |    4 +-
 .../camel-solr/src/main/docs/solr-component.adoc   |    2 +-
 .../src/main/docs/soroush-component.adoc           |    2 +-
 .../src/main/docs/splunk-component.adoc            |    2 +-
 .../src/main/docs/spring-ws-component.adoc         |    2 +-
 .../camel-stomp/src/main/docs/stomp-component.adoc |    2 +-
 .../src/main/docs/undertow-component.adoc          |    2 +-
 .../src/main/docs/weather-component.adoc           |    2 +-
 .../src/main/docs/websocket-component.adoc         |    2 +-
 .../camel-xj/src/main/docs/xj-component.adoc       |    2 +-
 .../src/main/docs/xmlsecurity-component.adoc       |    2 +-
 .../src/main/docs/xslt-saxon-component.adoc        |    2 +-
 .../src/main/docs/zookeeper-master-component.adoc  |    2 +-
 .../apache/camel/model/AggregateDefinition.java    |    7 +-
 .../org/apache/camel/model/CatchDefinition.java    |    8 +-
 .../camel/model/CircuitBreakerDefinition.java      |   13 +-
 .../org/apache/camel/model/FinallyDefinition.java  |   13 +
 .../apache/camel/model/InterceptDefinition.java    |   12 +
 .../camel/model/InterceptFromDefinition.java       |    3 +
 .../model/InterceptSendToEndpointDefinition.java   |   14 +
 .../apache/camel/model/LoadBalanceDefinition.java  |   13 +-
 .../apache/camel/model/MulticastDefinition.java    |   13 +
 .../apache/camel/model/OnCompletionDefinition.java |   10 +-
 .../apache/camel/model/OnExceptionDefinition.java  |    8 +-
 .../apache/camel/model/OnFallbackDefinition.java   |   13 +
 .../apache/camel/model/OtherwiseDefinition.java    |   13 +
 .../org/apache/camel/model/OutputDefinition.java   |    4 +-
 .../org/apache/camel/model/PipelineDefinition.java |   14 +
 .../org/apache/camel/model/PolicyDefinition.java   |   14 +
 .../apache/camel/model/ResequenceDefinition.java   |    8 +-
 .../org/apache/camel/model/RouteDefinition.java    |   15 +-
 .../org/apache/camel/model/SagaDefinition.java     |    7 +
 .../org/apache/camel/model/StepDefinition.java     |   14 +
 .../apache/camel/model/TransactedDefinition.java   |    9 +
 .../java/org/apache/camel/model/TryDefinition.java |    7 +
 .../model/cloud/ServiceCallConfiguration.java      |  104 +
 .../cloud/ServiceCallExpressionConfiguration.java  |   68 +-
 .../ServiceCallServiceChooserConfiguration.java    |   66 +-
 .../ServiceCallServiceDiscoveryConfiguration.java  |   66 +-
 .../ServiceCallServiceFilterConfiguration.java     |   59 +-
 ...erviceCallServiceLoadBalancerConfiguration.java |   59 +-
 .../camel/model/dataformat/BindyDataFormat.java    |    7 +
 .../apache/camel/model/ModelSanityCheckerTest.java |    3 +-
 .../builder/endpoint/EndpointBuilderFactory.java   |  162 +-
 .../camel/builder/endpoint/EndpointBuilders.java   |  162 +-
 ...zelcastReplicatedmapEndpointBuilderFactory.java |    2 +-
 ...ubernetesDeploymentsEndpointBuilderFactory.java |    2 +-
 ...sistentVolumesClaimsEndpointBuilderFactory.java |    2 +-
 ...tesPersistentVolumesEndpointBuilderFactory.java |    2 +-
 ...plicationControllersEndpointBuilderFactory.java |    2 +-
 ...rnetesResourcesQuotaEndpointBuilderFactory.java |    2 +-
 ...netesServiceAccountsEndpointBuilderFactory.java |    2 +-
 ...penshiftBuildConfigsEndpointBuilderFactory.java |    2 +-
 .../dsl/WordpressEndpointBuilderFactory.java       |    2 +-
 core/camel-xml-io/pom.xml                          |   73 +
 .../java/org/apache/camel/xml/in/BaseParser.java   |  245 ++
 .../java/org/apache/camel/xml/in/ModelParser.java  | 3033 ++++++++++++++++++
 .../java/org/apache/camel/xml/io/MXParser.java     | 3243 ++++++++++++++++++++
 .../org/apache/camel/xml/io/XmlPullParser.java     |  964 ++++++
 .../camel/xml/io/XmlPullParserException.java       |   55 +
 .../org/apache/camel/xml/io/XmlStreamReader.java   |  747 +++++
 .../camel/xml/io/XmlStreamReaderException.java     |  150 +
 .../org/apache/camel/xml/in/ModelParserTest.java   |   77 +
 .../src/test/resources}/barInterceptorRoute.xml    |    0
 .../src/test/resources}/barOnExceptionRoute.xml    |    0
 .../src/test/resources}/barPolicyRoute.xml         |    0
 .../src/test/resources}/barRest.xml                |    0
 .../src/test/resources}/barRoute.xml               |    0
 .../src/test/resources}/barUpdatedRoute.xml        |    0
 .../src/test/resources}/convertBody.xml            |    0
 .../src/test/resources}/dynamicRecipientList.xml   |    0
 .../src/test/resources}/loop.xml                   |    0
 .../src/test/resources}/processor.xml              |    0
 .../src/test/resources}/processorWithFilter.xml    |    0
 .../test/resources}/processorWithGroovyFilter.xml  |    0
 .../test/resources}/processorWithHeaderFilter.xml  |    0
 .../test/resources}/processorWithSimpleFilter.xml  |    0
 .../src/test/resources}/resequencerBatch.xml       |    0
 .../src/test/resources}/resequencerStream.xml      |    0
 .../src/test/resources}/routeGroup.xml             |    0
 .../src/test/resources}/routeProperties.xml        |    0
 .../test/resources}/routeWithBindyDataFormat.xml   |    0
 .../src/test/resources}/routeWithChoice.xml        |    0
 .../routeWithCircuitBreakerLoadBalance.xml         |   33 +
 .../src/test/resources}/routeWithCvsDataFormat.xml |    0
 .../resources}/routeWithFailoverLoadBalance.xml    |    0
 .../resources}/routeWithFlatpackDataFormat.xml     |    0
 .../src/test/resources}/routeWithHL7DataFormat.xml |    0
 .../test/resources}/routeWithJSonDataFormat.xml    |    0
 .../test/resources}/routeWithJaxbDataFormat.xml    |    0
 .../src/test/resources}/routeWithLoadBalance.xml   |    0
 .../src/test/resources}/routeWithNamespace.xml     |    0
 .../src/test/resources}/routeWithRSSDataFormat.xml |    0
 .../test/resources}/routeWithRandomLoadBalance.xml |    0
 .../test/resources}/routeWithStickyLoadBalance.xml |    0
 .../resources}/routeWithTidyMarkupDataFormat.xml   |    0
 .../test/resources}/routeWithTopicLoadBalance.xml  |    0
 .../resources}/routeWithXMLSecurityDataFormat.xml  |    0
 .../test/resources}/routeWithXStreamDataFormat.xml |    0
 .../test/resources}/routeWithZipFileDataFormat.xml |    0
 .../src/test/resources}/routingSlip.xml            |    0
 .../routingSlipHeaderAndDelimiterSet.xml           |    0
 .../src/test/resources}/routingSlipHeaderSet.xml   |    0
 .../src/test/resources}/saga.xml                   |    0
 .../src/test/resources}/scan-route.xml             |    0
 .../src/test/resources}/script.xml                 |    0
 .../src/test/resources}/setBody.xml                |    0
 .../src/test/resources}/setHeader.xml              |    0
 .../src/test/resources}/setHeaderToConstant.xml    |    0
 .../src/test/resources}/simpleRest.xml             |    0
 .../src/test/resources}/simpleRestToD.xml          |    0
 .../src/test/resources}/simpleRoute.xml            |    0
 .../src/test/resources}/splitter.xml               |    0
 .../src/test/resources}/staticRecipientList.xml    |    0
 .../src/test/resources}/transform.xml              |    0
 core/pom.xml                                       |    1 +
 .../modules/ROOT/pages/activemq-component.adoc     |   62 +-
 .../modules/ROOT/pages/ahc-component.adoc          |    4 +-
 .../modules/ROOT/pages/ahc-ws-component.adoc       |    4 +-
 .../modules/ROOT/pages/amqp-component.adoc         |   62 +-
 .../ROOT/pages/atmosphere-websocket-component.adoc |    6 +-
 .../ROOT/pages/aws-ddbstream-component.adoc        |    2 +-
 .../modules/ROOT/pages/aws-s3-component.adoc       |    2 +-
 .../modules/ROOT/pages/aws-sqs-component.adoc      |    6 +-
 .../modules/ROOT/pages/aws-swf-component.adoc      |    8 +-
 .../ROOT/pages/bean-validator-component.adoc       |    4 +-
 .../modules/ROOT/pages/beanstalk-component.adoc    |    2 +-
 .../modules/ROOT/pages/cometd-component.adoc       |    2 +-
 .../modules/ROOT/pages/consul-component.adoc       |    2 +-
 .../modules/ROOT/pages/crypto-cms-component.adoc   |    6 +-
 .../modules/ROOT/pages/cxf-component.adoc          |    4 +-
 .../modules/ROOT/pages/cxfrs-component.adoc        |    4 +-
 .../ROOT/pages/debezium-mongodb-component.adoc     |    4 +-
 .../ROOT/pages/debezium-mysql-component.adoc       |   14 +-
 .../ROOT/pages/debezium-postgres-component.adoc    |    2 +-
 .../ROOT/pages/debezium-sqlserver-component.adoc   |    8 +-
 .../modules/ROOT/pages/disruptor-component.adoc    |    4 +-
 .../modules/ROOT/pages/ehcache-component.adoc      |    2 +-
 .../modules/ROOT/pages/elytron-component.adoc      |    2 +-
 .../modules/ROOT/pages/etcd-component.adoc         |    2 +-
 .../modules/ROOT/pages/file-component.adoc         |   10 +-
 .../modules/ROOT/pages/ftp-component.adoc          |   12 +-
 .../modules/ROOT/pages/ftps-component.adoc         |   18 +-
 .../modules/ROOT/pages/http-component.adoc         |    8 +-
 .../ROOT/pages/iec60870-client-component.adoc      |    4 +-
 .../ROOT/pages/iec60870-server-component.adoc      |    4 +-
 .../modules/ROOT/pages/ignite-cache-component.adoc |    2 +-
 .../ROOT/pages/ignite-compute-component.adoc       |    2 +-
 .../ROOT/pages/ignite-events-component.adoc        |    2 +-
 .../modules/ROOT/pages/ignite-idgen-component.adoc |    2 +-
 .../ROOT/pages/ignite-messaging-component.adoc     |    2 +-
 .../modules/ROOT/pages/ignite-queue-component.adoc |    2 +-
 .../modules/ROOT/pages/ignite-set-component.adoc   |    2 +-
 docs/components/modules/ROOT/pages/index.adoc      |    6 +-
 .../modules/ROOT/pages/ipfs-component.adoc         |   10 +-
 .../modules/ROOT/pages/irc-component.adoc          |    2 +-
 .../modules/ROOT/pages/jcache-component.adoc       |    4 +-
 .../modules/ROOT/pages/jdbc-component.adoc         |    2 +-
 .../modules/ROOT/pages/jetty-component.adoc        |   12 +-
 .../modules/ROOT/pages/jms-component.adoc          |   62 +-
 .../modules/ROOT/pages/jmx-component.adoc          |    2 +-
 .../modules/ROOT/pages/kafka-component.adoc        |    8 +-
 .../modules/ROOT/pages/lumberjack-component.adoc   |    2 +-
 .../modules/ROOT/pages/mail-component.adoc         |    6 +-
 .../modules/ROOT/pages/milo-server-component.adoc  |   10 +-
 .../modules/ROOT/pages/mina-component.adoc         |    2 +-
 .../modules/ROOT/pages/nats-component.adoc         |    2 +-
 .../modules/ROOT/pages/netty-component.adoc        |    8 +-
 .../modules/ROOT/pages/netty-http-component.adoc   |    8 +-
 .../modules/ROOT/pages/nsq-component.adoc          |    2 +-
 .../modules/ROOT/pages/olingo2-component.adoc      |    2 +-
 .../modules/ROOT/pages/olingo4-component.adoc      |    2 +-
 .../modules/ROOT/pages/pulsar-component.adoc       |    6 +-
 .../modules/ROOT/pages/quartz-component.adoc       |    6 +-
 .../modules/ROOT/pages/rabbitmq-component.adoc     |   12 +-
 .../ROOT/pages/reactive-streams-component.adoc     |    2 +-
 .../modules/ROOT/pages/rest-openapi-component.adoc |    2 +-
 .../modules/ROOT/pages/rest-swagger-component.adoc |    2 +-
 .../modules/ROOT/pages/servicenow-component.adoc   |    4 +-
 .../modules/ROOT/pages/servlet-component.adoc      |    6 +-
 .../modules/ROOT/pages/sftp-component.adoc         |   14 +-
 .../modules/ROOT/pages/sjms-batch-component.adoc   |    2 +-
 .../modules/ROOT/pages/sjms-component.adoc         |    4 +-
 .../modules/ROOT/pages/sjms2-component.adoc        |    4 +-
 .../modules/ROOT/pages/solr-component.adoc         |    2 +-
 .../modules/ROOT/pages/soroush-component.adoc      |    2 +-
 .../modules/ROOT/pages/splunk-component.adoc       |    2 +-
 .../modules/ROOT/pages/spring-ws-component.adoc    |    2 +-
 .../modules/ROOT/pages/stomp-component.adoc        |    2 +-
 .../modules/ROOT/pages/undertow-component.adoc     |    2 +-
 .../modules/ROOT/pages/weather-component.adoc      |    2 +-
 .../modules/ROOT/pages/websocket-component.adoc    |    2 +-
 .../modules/ROOT/pages/xj-component.adoc           |    2 +-
 .../modules/ROOT/pages/xmlsecurity-component.adoc  |    2 +-
 .../modules/ROOT/pages/xslt-saxon-component.adoc   |    2 +-
 .../ROOT/pages/zookeeper-master-component.adoc     |    2 +-
 parent/pom.xml                                     |    5 +
 tooling/apt/pom.xml                                |    6 +-
 .../camel/tools/apt/AnnotationProcessorHelper.java |   35 +-
 .../camel/tools/apt/ConstantProviderProcessor.java |   12 +-
 .../apt/CoreEipAnnotationProcessorHelper.java      |   14 +-
 .../camel/tools/apt/DocumentationHelper.java       |    2 +-
 .../tools/apt/EndpointAnnotationProcessor.java     |   20 +-
 .../camel/tools/apt/ModelAnnotationProcessor.java  |    2 +-
 .../tools/apt/PropertyConfigurerGenerator.java     |   20 +-
 .../tools/apt/PropertyPlaceholderGenerator.java    |   19 +-
 .../org/apache/camel/tools/apt/SpiProcessor.java   |    2 +-
 .../tools/apt/SpringAnnotationProcessorHelper.java |   14 +-
 .../camel/tools/apt/TypeConverterProcessor.java    |    2 +-
 .../camel/tools/apt/helper/EndpointHelper.java     |    1 +
 .../apache/camel/tools/apt/helper/IOHelper.java    |   84 -
 .../org/apache/camel/tools/apt/helper/Strings.java |  144 -
 .../camel/tools/apt/model/ComponentOption.java     |    2 +-
 .../camel/tools/apt/model/EndpointOption.java      |    2 +-
 .../org/apache/camel/tools/apt/StringsTest.java    |   38 -
 tooling/camel-tooling-util/pom.xml                 |   45 +
 .../org/apache/camel/tooling/util/FileUtil.java    |   81 +
 .../camel/tooling/util/JSonSchemaHelper.java}      |  153 +-
 .../apache/camel/tooling/util}/PackageHelper.java  |   99 +-
 .../org/apache/camel/tooling/util/Strings.java     |  328 ++
 .../camel/tooling/util}/srcgen/Annotation.java     |    2 +-
 .../apache/camel/tooling/util}/srcgen/Field.java   |    2 +-
 .../camel/tooling/util}/srcgen/GenericType.java    |    6 +-
 .../camel/tooling/util}/srcgen/JavaClass.java      |  153 +-
 .../apache/camel/tooling/util}/srcgen/Javadoc.java |    2 +-
 .../apache/camel/tooling/util}/srcgen/Method.java  |   29 +-
 .../apache/camel/tooling/util}/srcgen/Param.java   |    2 +-
 .../camel/tooling/util}/srcgen/Property.java       |    2 +-
 .../src/main/resources/META-INF/LICENSE.txt        |    0
 .../src/main/resources/META-INF/NOTICE.txt         |    0
 .../camel/tooling/util/JSonSchemaHelperTest.java}  |   12 +-
 .../camel/tooling/util}/PackageHelperTest.java     |    3 +-
 .../apache/camel/tooling/util/ResourceUtils.java}  |   16 +-
 .../org/apache/camel/tooling/util/StringsTest.java |   40 +
 .../src/test/resources/filecontent/a.txt           |    0
 .../src/test/resources/json/a.json                 |    0
 .../src/test/resources/json/aop.json               |    0
 .../src/test/resources/json/b.json                 |    0
 .../src/test/resources/json/c.txt                  |    0
 tooling/maven/bom-generator-maven-plugin/pom.xml   |    4 +
 .../maven/bom/generator/BomGeneratorMojo.java      |   41 +-
 .../maven/camel-api-component-maven-plugin/pom.xml |    5 +
 .../apache/camel/maven/AbstractGeneratorMojo.java  |   22 +-
 .../pom.xml                                        |    8 +
 .../apache/camel/maven/DocumentationEnricher.java  |    1 +
 .../camel/maven/EipDocumentationEnricherMojo.java  |    1 +
 .../java/org/apache/camel/maven/PackageHelper.java |   68 -
 .../maven/camel-main-package-maven-plugin/pom.xml  |    5 +
 .../apache/camel/maven/PrepareCamelMainMojo.java   |   32 +-
 tooling/maven/camel-package-maven-plugin/pom.xml   |    5 +-
 .../maven/packaging/AbstractGeneratorMojo.java     |   44 +-
 .../camel/maven/packaging/EndpointDslMojo.java     |   56 +-
 .../camel/maven/packaging/JSonSchemaHelper.java    |  206 --
 .../packaging/ModelXmlParserGeneratorMojo.java     |  717 +++++
 .../packaging/PackageArchetypeCatalogMojo.java     |    6 +-
 .../maven/packaging/PackageComponentMojo.java      |   13 +-
 .../maven/packaging/PackageDataFormatMojo.java     |   23 +-
 .../camel/maven/packaging/PackageLanguageMojo.java |   19 +-
 .../camel/maven/packaging/PackageModelMojo.java    |    1 +
 .../camel/maven/packaging/PackageOtherMojo.java    |    2 +-
 .../maven/packaging/PrepareCatalogKarafMojo.java   |  264 +-
 .../camel/maven/packaging/PrepareCatalogMojo.java  |  251 +-
 .../packaging/PrepareCatalogSpringBootMojo.java    |  717 -----
 .../camel/maven/packaging/PrepareExampleMojo.java  |   26 +-
 .../maven/packaging/PrepareParentPomMojo.java      |   18 +-
 .../maven/packaging/PrepareReleasePomMojo.java     |   20 +-
 .../maven/packaging/PrepareUserGuideMojo.java      |  159 +-
 .../camel/maven/packaging/SpringBootHelper.java    |   74 -
 .../apache/camel/maven/packaging/StringHelper.java |  200 --
 .../packaging/UpdateDocComponentListMojo.java      |  225 +-
 .../camel/maven/packaging/UpdateReadmeMojo.java    |   68 +-
 ...pdateSpringBootAutoConfigurationReadmeMojo.java |  400 ---
 .../maven/packaging/ValidateComponentMojo.java     |   10 +-
 .../camel/maven/packaging/ValidateHelper.java      |   14 +-
 .../maven/packaging/model/ComponentModel.java      |    6 +-
 .../packaging/model/ComponentOptionModel.java      |    8 +-
 .../maven/packaging/model/DataFormatModel.java     |    6 +-
 .../packaging/model/DataFormatOptionModel.java     |    4 +-
 .../maven/packaging/model/EipOptionModel.java      |    8 +-
 .../maven/packaging/model/EndpointOptionModel.java |    8 +-
 .../camel/maven/packaging/model/LanguageModel.java |    6 +-
 .../maven/packaging/model/LanguageOptionModel.java |    4 +-
 .../camel/maven/packaging/model/OtherModel.java    |    6 +-
 .../maven/packaging/model/OtherOptionModel.java    |    8 +-
 .../model/SpringBootAutoConfigureOptionModel.java  |    8 +-
 .../src/main/resources/component-options.mvel      |    2 +-
 .../maven/packaging/model/StringHelperTest.java    |    4 +-
 tooling/pom.xml                                    |    1 +
 357 files changed, 11626 insertions(+), 4265 deletions(-)
 create mode 100644 core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallConfiguration.java
 create mode 100644 core/camel-xml-io/pom.xml
 create mode 100644 core/camel-xml-io/src/main/java/org/apache/camel/xml/in/BaseParser.java
 create mode 100644 core/camel-xml-io/src/main/java/org/apache/camel/xml/in/ModelParser.java
 create mode 100644 core/camel-xml-io/src/main/java/org/apache/camel/xml/io/MXParser.java
 create mode 100644 core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlPullParser.java
 create mode 100644 core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlPullParserException.java
 create mode 100644 core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlStreamReader.java
 create mode 100644 core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlStreamReaderException.java
 create mode 100644 core/camel-xml-io/src/test/java/org/apache/camel/xml/in/ModelParserTest.java
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/barInterceptorRoute.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/barOnExceptionRoute.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/barPolicyRoute.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/barRest.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/barRoute.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/barUpdatedRoute.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/convertBody.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/dynamicRecipientList.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/loop.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/processor.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/processorWithFilter.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/processorWithGroovyFilter.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/processorWithHeaderFilter.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/processorWithSimpleFilter.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/resequencerBatch.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/resequencerStream.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeGroup.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeProperties.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithBindyDataFormat.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithChoice.xml (100%)
 create mode 100644 core/camel-xml-io/src/test/resources/routeWithCircuitBreakerLoadBalance.xml
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithCvsDataFormat.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithFailoverLoadBalance.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithFlatpackDataFormat.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithHL7DataFormat.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithJSonDataFormat.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithJaxbDataFormat.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithLoadBalance.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithNamespace.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithRSSDataFormat.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithRandomLoadBalance.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithStickyLoadBalance.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithTidyMarkupDataFormat.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithTopicLoadBalance.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithXMLSecurityDataFormat.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithXStreamDataFormat.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routeWithZipFileDataFormat.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routingSlip.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routingSlipHeaderAndDelimiterSet.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/routingSlipHeaderSet.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/saga.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/scan-route.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/script.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/setBody.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/setHeader.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/setHeaderToConstant.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/simpleRest.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/simpleRestToD.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/simpleRoute.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/splitter.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/staticRecipientList.xml (100%)
 copy core/{camel-core/src/test/resources/org/apache/camel/model => camel-xml-io/src/test/resources}/transform.xml (100%)
 delete mode 100644 tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/IOHelper.java
 delete mode 100644 tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/Strings.java
 delete mode 100644 tooling/apt/src/test/java/org/apache/camel/tools/apt/StringsTest.java
 create mode 100644 tooling/camel-tooling-util/pom.xml
 create mode 100644 tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/FileUtil.java
 rename tooling/{apt/src/main/java/org/apache/camel/tools/apt/helper/JsonSchemaHelper.java => camel-tooling-util/src/main/java/org/apache/camel/tooling/util/JSonSchemaHelper.java} (80%)
 rename tooling/{maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging => camel-tooling-util/src/main/java/org/apache/camel/tooling/util}/PackageHelper.java (69%)
 create mode 100644 tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/Strings.java
 rename tooling/{maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging => camel-tooling-util/src/main/java/org/apache/camel/tooling/util}/srcgen/Annotation.java (98%)
 rename tooling/{maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging => camel-tooling-util/src/main/java/org/apache/camel/tooling/util}/srcgen/Field.java (98%)
 rename tooling/{maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging => camel-tooling-util/src/main/java/org/apache/camel/tooling/util}/srcgen/GenericType.java (99%)
 rename tooling/{maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging => camel-tooling-util/src/main/java/org/apache/camel/tooling/util}/srcgen/JavaClass.java (81%)
 rename tooling/{maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging => camel-tooling-util/src/main/java/org/apache/camel/tooling/util}/srcgen/Javadoc.java (95%)
 rename tooling/{maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging => camel-tooling-util/src/main/java/org/apache/camel/tooling/util}/srcgen/Method.java (84%)
 copy tooling/{maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging => camel-tooling-util/src/main/java/org/apache/camel/tooling/util}/srcgen/Param.java (95%)
 rename tooling/{maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging => camel-tooling-util/src/main/java/org/apache/camel/tooling/util}/srcgen/Property.java (98%)
 copy tooling/{maven/camel-package-maven-plugin => camel-tooling-util}/src/main/resources/META-INF/LICENSE.txt (100%)
 copy tooling/{camel-util-json => camel-tooling-util}/src/main/resources/META-INF/NOTICE.txt (100%)
 rename tooling/{apt/src/test/java/org/apache/camel/tools/apt/JsonSchemaHelperTest.java => camel-tooling-util/src/test/java/org/apache/camel/tooling/util/JSonSchemaHelperTest.java} (94%)
 rename tooling/{maven/camel-eip-documentation-enricher-maven-plugin/src/test/java/org/apache/camel/maven => camel-tooling-util/src/test/java/org/apache/camel/tooling/util}/PackageHelperTest.java (94%)
 rename tooling/{maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Param.java => camel-tooling-util/src/test/java/org/apache/camel/tooling/util/ResourceUtils.java} (71%)
 create mode 100644 tooling/camel-tooling-util/src/test/java/org/apache/camel/tooling/util/StringsTest.java
 rename tooling/{maven/camel-eip-documentation-enricher-maven-plugin => camel-tooling-util}/src/test/resources/filecontent/a.txt (100%)
 rename tooling/{maven/camel-eip-documentation-enricher-maven-plugin => camel-tooling-util}/src/test/resources/json/a.json (100%)
 rename tooling/{maven/camel-eip-documentation-enricher-maven-plugin => camel-tooling-util}/src/test/resources/json/aop.json (100%)
 rename tooling/{maven/camel-eip-documentation-enricher-maven-plugin => camel-tooling-util}/src/test/resources/json/b.json (100%)
 rename tooling/{maven/camel-eip-documentation-enricher-maven-plugin => camel-tooling-util}/src/test/resources/json/c.txt (100%)
 delete mode 100644 tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/PackageHelper.java
 delete mode 100644 tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/JSonSchemaHelper.java
 create mode 100644 tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelXmlParserGeneratorMojo.java
 delete mode 100644 tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogSpringBootMojo.java
 delete mode 100644 tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootHelper.java
 delete mode 100644 tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/StringHelper.java
 delete mode 100644 tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateSpringBootAutoConfigurationReadmeMojo.java


[camel] 04/07: Small changes to the model to make it easier to work with

Posted by gn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3a4bfe51dbde6bd3bacf26da6b77d075cbaab5c2
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Wed Jan 15 14:48:56 2020 +0100

    Small changes to the model to make it easier to work with
---
 .../camel/component/hbase/model/HBaseCell.java     |   6 +-
 .../camel/component/hbase/model/HBaseRow.java      |   2 +-
 .../apache/camel/model/AggregateDefinition.java    |   7 +-
 .../org/apache/camel/model/CatchDefinition.java    |   8 +-
 .../camel/model/CircuitBreakerDefinition.java      |  13 +--
 .../org/apache/camel/model/FinallyDefinition.java  |  13 +++
 .../apache/camel/model/InterceptDefinition.java    |  12 +++
 .../camel/model/InterceptFromDefinition.java       |   3 +
 .../model/InterceptSendToEndpointDefinition.java   |  14 +++
 .../apache/camel/model/LoadBalanceDefinition.java  |  13 +--
 .../apache/camel/model/MulticastDefinition.java    |  13 +++
 .../apache/camel/model/OnCompletionDefinition.java |  10 +-
 .../apache/camel/model/OnExceptionDefinition.java  |   8 +-
 .../apache/camel/model/OnFallbackDefinition.java   |  13 +++
 .../apache/camel/model/OtherwiseDefinition.java    |  13 +++
 .../org/apache/camel/model/OutputDefinition.java   |   4 +-
 .../org/apache/camel/model/PipelineDefinition.java |  14 +++
 .../org/apache/camel/model/PolicyDefinition.java   |  14 +++
 .../apache/camel/model/ResequenceDefinition.java   |   8 +-
 .../org/apache/camel/model/RouteDefinition.java    |  15 +--
 .../org/apache/camel/model/SagaDefinition.java     |   7 ++
 .../org/apache/camel/model/StepDefinition.java     |  14 +++
 .../apache/camel/model/TransactedDefinition.java   |   9 ++
 .../java/org/apache/camel/model/TryDefinition.java |   7 ++
 .../model/cloud/ServiceCallConfiguration.java      | 104 +++++++++++++++++++++
 .../cloud/ServiceCallExpressionConfiguration.java  |  68 +-------------
 .../ServiceCallServiceChooserConfiguration.java    |  66 +------------
 .../ServiceCallServiceDiscoveryConfiguration.java  |  66 +------------
 .../ServiceCallServiceFilterConfiguration.java     |  59 +-----------
 ...erviceCallServiceLoadBalancerConfiguration.java |  59 +-----------
 .../camel/model/dataformat/BindyDataFormat.java    |   7 ++
 .../apache/camel/model/ModelSanityCheckerTest.java |   3 +-
 32 files changed, 310 insertions(+), 362 deletions(-)

diff --git a/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseCell.java b/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseCell.java
index 41774c8..6847acc 100644
--- a/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseCell.java
+++ b/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseCell.java
@@ -37,20 +37,20 @@ public class HBaseCell {
         return "HBaseCell=[family=" + family + ", qualifier=" + qualifier + ", value=" + value + ", valueType=" + valueType.getName();
     }
 
-    @XmlAttribute(name = "family")
     public String getFamily() {
         return family;
     }
 
+    @XmlAttribute(name = "family")
     public void setFamily(String family) {
         this.family = family;
     }
 
-    @XmlAttribute(name = "qualifier")
     public String getQualifier() {
         return qualifier;
     }
 
+    @XmlAttribute(name = "qualifier")
     public void setQualifier(String qualifier) {
         this.qualifier = qualifier;
     }
@@ -63,11 +63,11 @@ public class HBaseCell {
         this.value = value;
     }
 
-    @XmlAttribute(name = "type")
     public Class<?> getValueType() {
         return valueType;
     }
 
+    @XmlAttribute(name = "type")
     public void setValueType(Class<?> valueType) {
         if (valueType == null) {
             throw new IllegalArgumentException("Value type can not be null");
diff --git a/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseRow.java b/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseRow.java
index 56a09da..8b5fe6b 100644
--- a/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseRow.java
+++ b/components/camel-hbase/src/main/java/org/apache/camel/component/hbase/model/HBaseRow.java
@@ -48,11 +48,11 @@ public class HBaseRow implements Cloneable {
         this.id = id;
     }
 
-    @XmlAttribute(name = "type")
     public Class<?> getRowType() {
         return rowType;
     }
 
+    @XmlAttribute(name = "type")
     public void setRowType(Class<?> rowType) {
         this.rowType = rowType;
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/AggregateDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/AggregateDefinition.java
index a24c262..3049b1a 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/AggregateDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/AggregateDefinition.java
@@ -50,7 +50,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "aggregate")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition> implements OutputNode, ExecutorServiceAwareDefinition<AggregateDefinition> {
+public class AggregateDefinition extends OutputDefinition<AggregateDefinition> implements ExecutorServiceAwareDefinition<AggregateDefinition> {
     @XmlElement(name = "correlationExpression", required = true)
     private ExpressionSubElementDefinition correlationExpression;
     @XmlElement(name = "completionPredicate")
@@ -136,8 +136,6 @@ public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition
     private AggregateController aggregateController;
     @XmlAttribute
     private String aggregateControllerRef;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
 
     public AggregateDefinition() {
     }
@@ -1145,8 +1143,9 @@ public class AggregateDefinition extends ProcessorDefinition<AggregateDefinition
         return outputs;
     }
 
+    @XmlElementRef
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
+        super.setOutputs(outputs);
     }
 
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/CatchDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/CatchDefinition.java
index baee0d0..e400e15 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/CatchDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/CatchDefinition.java
@@ -37,14 +37,12 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "error")
 @XmlRootElement(name = "doCatch")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class CatchDefinition extends ProcessorDefinition<CatchDefinition> implements OutputNode {
+public class CatchDefinition extends OutputDefinition<CatchDefinition> {
     @XmlElement(name = "exception")
     private List<String> exceptions = new ArrayList<>();
     @XmlElement(name = "onWhen")
     @AsPredicate
     private WhenDefinition onWhen;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
     @XmlTransient
     private List<Class<? extends Throwable>> exceptionClasses;
 
@@ -80,8 +78,10 @@ public class CatchDefinition extends ProcessorDefinition<CatchDefinition> implem
         return outputs;
     }
 
+    @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
+        super.setOutputs(outputs);
     }
 
     public List<Class<? extends Throwable>> getExceptionClasses() {
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/CircuitBreakerDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/CircuitBreakerDefinition.java
index 5ff3f91..122eb29 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/CircuitBreakerDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/CircuitBreakerDefinition.java
@@ -33,7 +33,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing,circuitbreaker")
 @XmlRootElement(name = "circuitBreaker")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class CircuitBreakerDefinition extends ProcessorDefinition<CircuitBreakerDefinition> implements OutputNode {
+public class CircuitBreakerDefinition extends OutputDefinition<CircuitBreakerDefinition> {
 
     @XmlElement
     private HystrixConfigurationDefinition hystrixConfiguration;
@@ -41,8 +41,6 @@ public class CircuitBreakerDefinition extends ProcessorDefinition<CircuitBreaker
     private Resilience4jConfigurationDefinition resilience4jConfiguration;
     @XmlAttribute
     private String configurationRef;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
     @XmlTransient
     private OnFallbackDefinition onFallback;
 
@@ -69,13 +67,10 @@ public class CircuitBreakerDefinition extends ProcessorDefinition<CircuitBreaker
         return outputs;
     }
 
+    @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
-        if (outputs != null) {
-            for (ProcessorDefinition<?> output : outputs) {
-                configureChild(output);
-            }
-        }
+        super.setOutputs(outputs);
     }
 
     @Override
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/FinallyDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/FinallyDefinition.java
index 5bec371..1bf5f9f 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/FinallyDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/FinallyDefinition.java
@@ -16,8 +16,11 @@
  */
 package org.apache.camel.model;
 
+import java.util.List;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.spi.Metadata;
@@ -45,4 +48,14 @@ public class FinallyDefinition extends OutputDefinition<FinallyDefinition> {
         return "doFinally";
     }
 
+    @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptDefinition.java
index dbf2d0a..98d603d 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptDefinition.java
@@ -21,6 +21,7 @@ import java.util.List;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -67,6 +68,17 @@ public class InterceptDefinition extends OutputDefinition<InterceptDefinition> {
         return true;
     }
 
+    @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
     /**
      * Applies this interceptor only if the given predicate is true
      *
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptFromDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptFromDefinition.java
index c39e088..e99c6da 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptFromDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptFromDefinition.java
@@ -16,9 +16,12 @@
  */
 package org.apache.camel.model;
 
+import java.util.List;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.spi.Metadata;
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java
index 1cb0d13..87155da 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/InterceptSendToEndpointDefinition.java
@@ -16,9 +16,12 @@
  */
 package org.apache.camel.model;
 
+import java.util.List;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.Predicate;
@@ -48,6 +51,17 @@ public class InterceptSendToEndpointDefinition extends OutputDefinition<Intercep
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
+    @Override
     public String toString() {
         return "InterceptSendToEndpoint[" + uri + " -> " + getOutputs() + "]";
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
index 5fa0735..c46716d 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
@@ -45,7 +45,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "loadBalance")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefinition> implements OutputNode {
+public class LoadBalanceDefinition extends OutputDefinition<LoadBalanceDefinition> {
     @XmlElements({@XmlElement(required = false, name = "failover", type = FailoverLoadBalancerDefinition.class),
                   @XmlElement(required = false, name = "random", type = RandomLoadBalancerDefinition.class),
                   @XmlElement(required = false, name = "customLoadBalancer", type = CustomLoadBalancerDefinition.class),
@@ -54,8 +54,6 @@ public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefini
                   @XmlElement(required = false, name = "topic", type = TopicLoadBalancerDefinition.class),
                   @XmlElement(required = false, name = "weighted", type = WeightedLoadBalancerDefinition.class)})
     private LoadBalancerDefinition loadBalancerType;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
 
     public LoadBalanceDefinition() {
     }
@@ -65,13 +63,10 @@ public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefini
         return outputs;
     }
 
+    @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
-        if (outputs != null) {
-            for (ProcessorDefinition<?> output : outputs) {
-                configureChild(output);
-            }
-        }
+        super.setOutputs(outputs);
     }
 
     public LoadBalancerDefinition getLoadBalancerType() {
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/MulticastDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/MulticastDefinition.java
index 79d9233..a7bf4e8 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/MulticastDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/MulticastDefinition.java
@@ -16,12 +16,14 @@
  */
 package org.apache.camel.model;
 
+import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.function.Supplier;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -74,6 +76,17 @@ public class MulticastDefinition extends OutputDefinition<MulticastDefinition> i
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
+    @Override
     public String toString() {
         return "Multicast[" + getOutputs() + "]";
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/OnCompletionDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
index f82d93f..a0086e6 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
@@ -27,6 +27,7 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
 
 import org.apache.camel.Predicate;
 import org.apache.camel.spi.AsPredicate;
@@ -37,8 +38,9 @@ import org.apache.camel.spi.Metadata;
  */
 @Metadata(label = "configuration")
 @XmlRootElement(name = "onCompletion")
+@XmlType(propOrder = {"onWhen", "outputs"})
 @XmlAccessorType(XmlAccessType.FIELD)
-public class OnCompletionDefinition extends ProcessorDefinition<OnCompletionDefinition> implements OutputNode, ExecutorServiceAwareDefinition<OnCompletionDefinition> {
+public class OnCompletionDefinition extends OutputDefinition<OnCompletionDefinition> implements ExecutorServiceAwareDefinition<OnCompletionDefinition> {
     @XmlAttribute
     @Metadata(defaultValue = "AfterConsumer")
     private OnCompletionMode mode;
@@ -55,8 +57,6 @@ public class OnCompletionDefinition extends ProcessorDefinition<OnCompletionDefi
     private String executorServiceRef;
     @XmlAttribute(name = "useOriginalMessage")
     private String useOriginalMessage;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
     @XmlTransient
     private ExecutorService executorService;
     @XmlTransient
@@ -268,8 +268,10 @@ public class OnCompletionDefinition extends ProcessorDefinition<OnCompletionDefi
         return outputs;
     }
 
+    @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
+        super.setOutputs(outputs);
     }
 
     public OnCompletionMode getMode() {
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/OnExceptionDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
index a842798..4f1bef5 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
@@ -45,7 +45,7 @@ import org.apache.camel.util.ObjectHelper;
 @Metadata(label = "error")
 @XmlRootElement(name = "onException")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefinition> implements OutputNode {
+public class OnExceptionDefinition extends OutputDefinition<OnExceptionDefinition> {
     @XmlElement(name = "exception", required = true)
     private List<String> exceptions = new ArrayList<>();
     @XmlElement(name = "onWhen")
@@ -72,8 +72,6 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini
     private String useOriginalMessage;
     @XmlAttribute(name = "useOriginalBody")
     private String useOriginalBody;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
     @XmlTransient
     private Predicate handledPolicy;
     @XmlTransient
@@ -808,8 +806,10 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini
         return outputs;
     }
 
+    @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
+        super.setOutputs(outputs);
     }
 
     public List<String> getExceptions() {
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/OnFallbackDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/OnFallbackDefinition.java
index ccec8a7..90a607f 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/OnFallbackDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/OnFallbackDefinition.java
@@ -16,11 +16,13 @@
  */
 package org.apache.camel.model;
 
+import java.util.List;
 import java.util.stream.Collectors;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.spi.Metadata;
@@ -41,6 +43,17 @@ public class OnFallbackDefinition extends OutputDefinition<OnFallbackDefinition>
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
+    @Override
     public String toString() {
         if (Boolean.toString(true).equals(fallbackViaNetwork)) {
             return "OnFallbackViaNetwork[" + getOutputs() + "]";
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/OtherwiseDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/OtherwiseDefinition.java
index 573fd71..a2e9289 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/OtherwiseDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/OtherwiseDefinition.java
@@ -16,10 +16,12 @@
  */
 package org.apache.camel.model;
 
+import java.util.List;
 import java.util.stream.Collectors;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.spi.Metadata;
@@ -36,6 +38,17 @@ public class OtherwiseDefinition extends OutputDefinition<OtherwiseDefinition> {
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
+    @Override
     public String toString() {
         return "Otherwise[" + getOutputs() + "]";
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/OutputDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/OutputDefinition.java
index c8b6e30..6ad7880 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/OutputDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/OutputDefinition.java
@@ -22,6 +22,7 @@ import java.util.List;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
 import org.apache.camel.spi.Metadata;
@@ -31,10 +32,9 @@ import org.apache.camel.spi.Metadata;
  */
 @Metadata(label = "configuration")
 @XmlType(name = "output")
-@XmlAccessorType(XmlAccessType.FIELD)
+@XmlAccessorType(XmlAccessType.NONE)
 public class OutputDefinition<Type extends ProcessorDefinition<Type>> extends ProcessorDefinition<Type> implements OutputNode {
 
-    @XmlElementRef
     protected List<ProcessorDefinition<?>> outputs = new ArrayList<>();
 
     @Override
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/PipelineDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/PipelineDefinition.java
index 501aef4..cfbad09 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/PipelineDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/PipelineDefinition.java
@@ -16,8 +16,11 @@
  */
 package org.apache.camel.model;
 
+import java.util.List;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.spi.Metadata;
@@ -34,6 +37,17 @@ public class PipelineDefinition extends OutputDefinition<PipelineDefinition> {
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
+    @Override
     public String getShortName() {
         return "pipeline";
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/PolicyDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/PolicyDefinition.java
index 375da46..f2f7536 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/PolicyDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/PolicyDefinition.java
@@ -16,9 +16,12 @@
  */
 package org.apache.camel.model;
 
+import java.util.List;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -49,6 +52,17 @@ public class PolicyDefinition extends OutputDefinition<PolicyDefinition> {
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return outputs;
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
+    @Override
     public String toString() {
         return "Policy[" + description() + "]";
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/ResequenceDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/ResequenceDefinition.java
index 4bd193d..ef0ece2 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/ResequenceDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/ResequenceDefinition.java
@@ -41,7 +41,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "resequence")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ResequenceDefinition extends ProcessorDefinition<ResequenceDefinition> implements OutputNode {
+public class ResequenceDefinition extends OutputDefinition<ResequenceDefinition> {
     @Metadata(required = false)
     @XmlElements({@XmlElement(name = "batch-config", type = BatchResequencerConfig.class), @XmlElement(name = "stream-config", type = StreamResequencerConfig.class)})
     private ResequencerConfig resequencerConfig;
@@ -52,8 +52,6 @@ public class ResequenceDefinition extends ProcessorDefinition<ResequenceDefiniti
     @XmlElementRef
     @Metadata(required = true)
     private ExpressionDefinition expression;
-    @XmlElementRef
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
 
     public ResequenceDefinition() {
     }
@@ -69,8 +67,10 @@ public class ResequenceDefinition extends ProcessorDefinition<ResequenceDefiniti
         return outputs;
     }
 
+    @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
+        super.setOutputs(outputs);
     }
 
     // Fluent API
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinition.java
index 7e839eb..470a9d6 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteDefinition.java
@@ -53,10 +53,9 @@ import org.apache.camel.spi.RoutePolicy;
 @XmlType(propOrder = {"input", "inputType", "outputType", "outputs", "routeProperties"})
 @XmlAccessorType(XmlAccessType.PROPERTY)
 // must use XmlAccessType.PROPERTY as there is some custom logic needed to be executed in the setter methods
-public class RouteDefinition extends ProcessorDefinition<RouteDefinition> implements OutputNode, NamedRoute {
+public class RouteDefinition extends OutputDefinition<RouteDefinition> implements NamedRoute {
     private final AtomicBoolean prepared = new AtomicBoolean(false);
     private FromDefinition input;
-    private List<ProcessorDefinition<?>> outputs = new ArrayList<>();
     private String group;
     private String streamCache;
     private String trace;
@@ -693,14 +692,9 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> implem
      * route.
      */
     @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
-        this.outputs = outputs;
-
-        if (outputs != null) {
-            for (ProcessorDefinition<?> output : outputs) {
-                configureChild(output);
-            }
-        }
+        super.setOutputs(outputs);
     }
 
     /**
@@ -853,6 +847,7 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> implem
     /**
      * Sets the error handler if one is not already set
      */
+    @XmlTransient
     public void setErrorHandlerFactoryIfNull(ErrorHandlerFactory errorHandlerFactory) {
         if (this.errorHandlerFactory == null) {
             setErrorHandlerFactory(errorHandlerFactory);
@@ -925,7 +920,6 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> implem
         return new ErrorHandlerBuilderRef(ErrorHandlerReifier.DEFAULT_ERROR_HANDLER_BUILDER);
     }
 
-    @XmlTransient
     public ErrorHandlerFactory getErrorHandlerFactory() {
         if (errorHandlerFactory == null) {
             errorHandlerFactory = createErrorHandlerBuilder();
@@ -936,6 +930,7 @@ public class RouteDefinition extends ProcessorDefinition<RouteDefinition> implem
     /**
      * Sets the error handler to use with processors created by this builder
      */
+    @XmlTransient
     public void setErrorHandlerFactory(ErrorHandlerFactory errorHandlerFactory) {
         this.errorHandlerFactory = errorHandlerFactory;
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/SagaDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/SagaDefinition.java
index d0ba02d..e1d9269 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/SagaDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/SagaDefinition.java
@@ -24,6 +24,7 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -68,6 +69,12 @@ public class SagaDefinition extends OutputDefinition<SagaDefinition> {
     public SagaDefinition() {
     }
 
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
     @Override
     public boolean isAbstract() {
         return true;
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/StepDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/StepDefinition.java
index c51436e..4b88aef 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/StepDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/StepDefinition.java
@@ -16,8 +16,11 @@
  */
 package org.apache.camel.model;
 
+import java.util.List;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.spi.Metadata;
@@ -35,6 +38,17 @@ public class StepDefinition extends OutputDefinition<StepDefinition> {
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return super.getOutputs();
+    }
+
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
+    @Override
     public String getShortName() {
         return "step";
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/TransactedDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/TransactedDefinition.java
index 4d3ed22..ba7fcdf 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/TransactedDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/TransactedDefinition.java
@@ -16,9 +16,12 @@
  */
 package org.apache.camel.model;
 
+import java.util.List;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -54,6 +57,12 @@ public class TransactedDefinition extends OutputDefinition<TransactedDefinition>
         this.policy = policy;
     }
 
+    @XmlElementRef
+    @Override
+    public void setOutputs(List<ProcessorDefinition<?>> outputs) {
+        super.setOutputs(outputs);
+    }
+
     @Override
     public String toString() {
         String desc = description();
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/TryDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/TryDefinition.java
index 116ce4f..5a202c7 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/TryDefinition.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/TryDefinition.java
@@ -23,6 +23,7 @@ import java.util.List;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -157,6 +158,12 @@ public class TryDefinition extends OutputDefinition<TryDefinition> {
     }
 
     @Override
+    public List<ProcessorDefinition<?>> getOutputs() {
+        return super.getOutputs();
+    }
+
+    @XmlElementRef
+    @Override
     public void setOutputs(List<ProcessorDefinition<?>> outputs) {
         initialized = false;
         super.setOutputs(outputs);
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallConfiguration.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallConfiguration.java
new file mode 100644
index 0000000..610b5ee
--- /dev/null
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallConfiguration.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.model.cloud;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.model.IdentifiedType;
+import org.apache.camel.model.PropertyDefinition;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.support.CamelContextHelper;
+
+@XmlType(name = "serviceCallConfiguration")
+@XmlAccessorType(XmlAccessType.FIELD)
+public abstract class ServiceCallConfiguration extends IdentifiedType {
+    @XmlElement(name = "properties")
+    @Metadata(label = "advanced")
+    protected List<PropertyDefinition> properties;
+
+    // *************************************************************************
+    //
+    // *************************************************************************
+
+    public List<PropertyDefinition> getProperties() {
+        return properties;
+    }
+
+    /**
+     * Set client properties to use.
+     * <p/>
+     * These properties are specific to what service call implementation are in
+     * use. For example if using ribbon, then the client properties are define
+     * in com.netflix.client.config.CommonClientConfigKey.
+     */
+    public void setProperties(List<PropertyDefinition> properties) {
+        this.properties = properties;
+    }
+
+    /**
+     * Adds a custom property to use.
+     * <p/>
+     * These properties are specific to what service call implementation are in
+     * use. For example if using ribbon, then the client properties are define
+     * in com.netflix.client.config.CommonClientConfigKey.
+     */
+    public ServiceCallConfiguration property(String key, String value) {
+        if (properties == null) {
+            properties = new ArrayList<>();
+        }
+        PropertyDefinition prop = new PropertyDefinition();
+        prop.setKey(key);
+        prop.setValue(value);
+        properties.add(prop);
+        return this;
+    }
+
+    protected Map<String, String> getPropertiesAsMap(CamelContext camelContext) throws Exception {
+        Map<String, String> answer;
+
+        if (properties == null || properties.isEmpty()) {
+            answer = Collections.emptyMap();
+        } else {
+            answer = new HashMap<>();
+            for (PropertyDefinition prop : properties) {
+                // support property placeholders
+                String key = CamelContextHelper.parseText(camelContext, prop.getKey());
+                String value = CamelContextHelper.parseText(camelContext, prop.getValue());
+                answer.put(key, value);
+            }
+        }
+
+        return answer;
+    }
+
+    // *************************************************************************
+    // Utilities
+    // *************************************************************************
+
+    protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception {
+    }
+}
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
index cfaa939..0de723d 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
@@ -16,16 +16,12 @@
  */
 package org.apache.camel.model.cloud;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
@@ -36,9 +32,7 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceCallConstants;
 import org.apache.camel.cloud.ServiceExpressionFactory;
-import org.apache.camel.model.IdentifiedType;
 import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.support.CamelContextHelper;
@@ -47,14 +41,11 @@ import org.apache.camel.support.PropertyBindingSupport;
 @Metadata(label = "routing,cloud")
 @XmlRootElement(name = "serviceExpression")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ServiceCallExpressionConfiguration extends IdentifiedType implements ServiceExpressionFactory {
+public class ServiceCallExpressionConfiguration extends ServiceCallConfiguration implements ServiceExpressionFactory {
     @XmlTransient
     private final ServiceCallDefinition parent;
     @XmlTransient
     private final String factoryKey;
-    @XmlElement(name = "properties")
-    @Metadata(label = "advanced")
-    private List<PropertyDefinition> properties;
     @XmlAttribute
     @Metadata(defaultValue = ServiceCallConstants.SERVICE_HOST)
     private String hostHeader = ServiceCallConstants.SERVICE_HOST;
@@ -87,55 +78,8 @@ public class ServiceCallExpressionConfiguration extends IdentifiedType implement
     //
     // *************************************************************************
 
-    public List<PropertyDefinition> getProperties() {
-        return properties;
-    }
-
-    /**
-     * Set client properties to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
-    public void setProperties(List<PropertyDefinition> properties) {
-        this.properties = properties;
-    }
-
-    /**
-     * Adds a custom property to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
-    public ServiceCallExpressionConfiguration property(String key, String value) {
-        if (properties == null) {
-            properties = new ArrayList<>();
-        }
-        PropertyDefinition prop = new PropertyDefinition();
-        prop.setKey(key);
-        prop.setValue(value);
-        properties.add(prop);
-        return this;
-    }
-
-    protected Map<String, String> getPropertiesAsMap(CamelContext camelContext) throws Exception {
-        Map<String, String> answer;
-
-        if (properties == null || properties.isEmpty()) {
-            answer = Collections.emptyMap();
-        } else {
-            answer = new HashMap<>();
-            for (PropertyDefinition prop : properties) {
-                // support property placeholders
-                String key = CamelContextHelper.parseText(camelContext, prop.getKey());
-                String value = CamelContextHelper.parseText(camelContext, prop.getValue());
-                answer.put(key, value);
-            }
-        }
-
-        return answer;
+    public ServiceCallServiceChooserConfiguration property(String key, String value) {
+        return (ServiceCallServiceChooserConfiguration) super.property(key, value);
     }
 
     public String getHostHeader() {
@@ -282,10 +226,4 @@ public class ServiceCallExpressionConfiguration extends IdentifiedType implement
         return answer;
     }
 
-    // *************************************************************************
-    // Utilities
-    // *************************************************************************
-
-    protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception {
-    }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
index cca7642..2ceedfa 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
@@ -16,15 +16,11 @@
  */
 package org.apache.camel.model.cloud;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -33,9 +29,7 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceChooser;
 import org.apache.camel.cloud.ServiceChooserFactory;
-import org.apache.camel.model.IdentifiedType;
 import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.PropertyBindingSupport;
@@ -44,14 +38,11 @@ import org.apache.camel.util.ObjectHelper;
 @Metadata(label = "routing,cloud,service-discovery")
 @XmlRootElement(name = "serviceChooserConfiguration")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ServiceCallServiceChooserConfiguration extends IdentifiedType implements ServiceChooserFactory {
+public class ServiceCallServiceChooserConfiguration extends ServiceCallConfiguration implements ServiceChooserFactory {
     @XmlTransient
     private final ServiceCallDefinition parent;
     @XmlTransient
     private final String factoryKey;
-    @XmlElement(name = "properties")
-    @Metadata(label = "advanced")
-    private List<PropertyDefinition> properties;
 
     public ServiceCallServiceChooserConfiguration() {
         this(null, null);
@@ -74,55 +65,8 @@ public class ServiceCallServiceChooserConfiguration extends IdentifiedType imple
     //
     // *************************************************************************
 
-    public List<PropertyDefinition> getProperties() {
-        return properties;
-    }
-
-    /**
-     * Set client properties to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
-    public void setProperties(List<PropertyDefinition> properties) {
-        this.properties = properties;
-    }
-
-    /**
-     * Adds a custom property to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
     public ServiceCallServiceChooserConfiguration property(String key, String value) {
-        if (properties == null) {
-            properties = new ArrayList<>();
-        }
-        PropertyDefinition prop = new PropertyDefinition();
-        prop.setKey(key);
-        prop.setValue(value);
-        properties.add(prop);
-        return this;
-    }
-
-    protected Map<String, String> getPropertiesAsMap(CamelContext camelContext) throws Exception {
-        Map<String, String> answer;
-
-        if (properties == null || properties.isEmpty()) {
-            answer = Collections.emptyMap();
-        } else {
-            answer = new HashMap<>();
-            for (PropertyDefinition prop : properties) {
-                // support property placeholders
-                String key = CamelContextHelper.parseText(camelContext, prop.getKey());
-                String value = CamelContextHelper.parseText(camelContext, prop.getValue());
-                answer.put(key, value);
-            }
-        }
-
-        return answer;
+        return (ServiceCallServiceChooserConfiguration) super.property(key, value);
     }
 
     // *************************************************************************
@@ -192,10 +136,4 @@ public class ServiceCallServiceChooserConfiguration extends IdentifiedType imple
         return answer;
     }
 
-    // *************************************************************************
-    // Utilities
-    // *************************************************************************
-
-    protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception {
-    }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
index 8c9a650..4315cb8 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
@@ -16,16 +16,12 @@
  */
 package org.apache.camel.model.cloud;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -34,9 +30,7 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceDiscovery;
 import org.apache.camel.cloud.ServiceDiscoveryFactory;
-import org.apache.camel.model.IdentifiedType;
 import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.PropertyBindingSupport;
@@ -45,14 +39,11 @@ import org.apache.camel.util.ObjectHelper;
 @Metadata(label = "routing,cloud,service-discovery")
 @XmlRootElement(name = "serviceDiscoveryConfiguration")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ServiceCallServiceDiscoveryConfiguration extends IdentifiedType implements ServiceDiscoveryFactory {
+public class ServiceCallServiceDiscoveryConfiguration extends ServiceCallConfiguration implements ServiceDiscoveryFactory {
     @XmlTransient
     private final Optional<ServiceCallDefinition> parent;
     @XmlTransient
     private final String factoryKey;
-    @XmlElement(name = "properties")
-    @Metadata(label = "advanced")
-    private List<PropertyDefinition> properties;
 
     public ServiceCallServiceDiscoveryConfiguration() {
         this(null, null);
@@ -75,55 +66,8 @@ public class ServiceCallServiceDiscoveryConfiguration extends IdentifiedType imp
     //
     // *************************************************************************
 
-    public List<PropertyDefinition> getProperties() {
-        return properties;
-    }
-
-    /**
-     * Set client properties to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
-    public void setProperties(List<PropertyDefinition> properties) {
-        this.properties = properties;
-    }
-
-    /**
-     * Adds a custom property to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
     public ServiceCallServiceDiscoveryConfiguration property(String key, String value) {
-        if (properties == null) {
-            properties = new ArrayList<>();
-        }
-        PropertyDefinition prop = new PropertyDefinition();
-        prop.setKey(key);
-        prop.setValue(value);
-        properties.add(prop);
-        return this;
-    }
-
-    protected Map<String, String> getPropertiesAsMap(CamelContext camelContext) throws Exception {
-        Map<String, String> answer;
-
-        if (properties == null || properties.isEmpty()) {
-            answer = Collections.emptyMap();
-        } else {
-            answer = new HashMap<>();
-            for (PropertyDefinition prop : properties) {
-                // support property placeholders
-                String key = CamelContextHelper.parseText(camelContext, prop.getKey());
-                String value = CamelContextHelper.parseText(camelContext, prop.getValue());
-                answer.put(key, value);
-            }
-        }
-
-        return answer;
+        return (ServiceCallServiceDiscoveryConfiguration) super.property(key, value);
     }
 
     // *************************************************************************
@@ -193,10 +137,4 @@ public class ServiceCallServiceDiscoveryConfiguration extends IdentifiedType imp
         return answer;
     }
 
-    // *************************************************************************
-    // Utilities
-    // *************************************************************************
-
-    protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception {
-    }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
index 52a0c3f..25d7a33 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
@@ -16,15 +16,11 @@
  */
 package org.apache.camel.model.cloud;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -33,9 +29,7 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceFilter;
 import org.apache.camel.cloud.ServiceFilterFactory;
-import org.apache.camel.model.IdentifiedType;
 import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.PropertyBindingSupport;
@@ -44,14 +38,11 @@ import org.apache.camel.util.ObjectHelper;
 @Metadata(label = "routing,cloud,service-discovery")
 @XmlRootElement(name = "serviceFilterConfiguration")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ServiceCallServiceFilterConfiguration extends IdentifiedType implements ServiceFilterFactory {
+public class ServiceCallServiceFilterConfiguration extends ServiceCallConfiguration implements ServiceFilterFactory {
     @XmlTransient
     private final ServiceCallDefinition parent;
     @XmlTransient
     private final String factoryKey;
-    @XmlElement(name = "properties")
-    @Metadata(label = "advanced")
-    private List<PropertyDefinition> properties;
 
     public ServiceCallServiceFilterConfiguration() {
         this(null, null);
@@ -74,21 +65,6 @@ public class ServiceCallServiceFilterConfiguration extends IdentifiedType implem
     //
     // *************************************************************************
 
-    public List<PropertyDefinition> getProperties() {
-        return properties;
-    }
-
-    /**
-     * Set client properties to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
-    public void setProperties(List<PropertyDefinition> properties) {
-        this.properties = properties;
-    }
-
     /**
      * Adds a custom property to use.
      * <p/>
@@ -97,32 +73,7 @@ public class ServiceCallServiceFilterConfiguration extends IdentifiedType implem
      * in com.netflix.client.config.CommonClientConfigKey.
      */
     public ServiceCallServiceFilterConfiguration property(String key, String value) {
-        if (properties == null) {
-            properties = new ArrayList<>();
-        }
-        PropertyDefinition prop = new PropertyDefinition();
-        prop.setKey(key);
-        prop.setValue(value);
-        properties.add(prop);
-        return this;
-    }
-
-    protected Map<String, String> getPropertiesAsMap(CamelContext camelContext) throws Exception {
-        Map<String, String> answer;
-
-        if (properties == null || properties.isEmpty()) {
-            answer = Collections.emptyMap();
-        } else {
-            answer = new HashMap<>();
-            for (PropertyDefinition prop : properties) {
-                // support property placeholders
-                String key = CamelContextHelper.parseText(camelContext, prop.getKey());
-                String value = CamelContextHelper.parseText(camelContext, prop.getValue());
-                answer.put(key, value);
-            }
-        }
-
-        return answer;
+        return (ServiceCallServiceFilterConfiguration) super.property(key, value);
     }
 
     // *************************************************************************
@@ -192,10 +143,4 @@ public class ServiceCallServiceFilterConfiguration extends IdentifiedType implem
         return answer;
     }
 
-    // *************************************************************************
-    // Utilities
-    // *************************************************************************
-
-    protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception {
-    }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
index e6afc97..3fb9fd5 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
@@ -16,15 +16,11 @@
  */
 package org.apache.camel.model.cloud;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
@@ -33,9 +29,7 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceLoadBalancer;
 import org.apache.camel.cloud.ServiceLoadBalancerFactory;
-import org.apache.camel.model.IdentifiedType;
 import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.PropertyBindingSupport;
@@ -44,14 +38,11 @@ import org.apache.camel.util.ObjectHelper;
 @Metadata(label = "routing,cloud,load-balancing")
 @XmlRootElement(name = "loadBalancerConfiguration")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ServiceCallServiceLoadBalancerConfiguration extends IdentifiedType implements ServiceLoadBalancerFactory {
+public class ServiceCallServiceLoadBalancerConfiguration extends ServiceCallConfiguration implements ServiceLoadBalancerFactory {
     @XmlTransient
     private final ServiceCallDefinition parent;
     @XmlTransient
     private final String factoryKey;
-    @XmlElement(name = "properties")
-    @Metadata(label = "advanced")
-    private List<PropertyDefinition> properties;
 
     public ServiceCallServiceLoadBalancerConfiguration() {
         this(null, null);
@@ -74,21 +65,6 @@ public class ServiceCallServiceLoadBalancerConfiguration extends IdentifiedType
     //
     // *************************************************************************
 
-    public List<PropertyDefinition> getProperties() {
-        return properties;
-    }
-
-    /**
-     * Set client properties to use.
-     * <p/>
-     * These properties are specific to what service call implementation are in
-     * use. For example if using ribbon, then the client properties are define
-     * in com.netflix.client.config.CommonClientConfigKey.
-     */
-    public void setProperties(List<PropertyDefinition> properties) {
-        this.properties = properties;
-    }
-
     /**
      * Adds a custom property to use.
      * <p/>
@@ -97,32 +73,7 @@ public class ServiceCallServiceLoadBalancerConfiguration extends IdentifiedType
      * in com.netflix.client.config.CommonClientConfigKey.
      */
     public ServiceCallServiceLoadBalancerConfiguration property(String key, String value) {
-        if (properties == null) {
-            properties = new ArrayList<>();
-        }
-        PropertyDefinition prop = new PropertyDefinition();
-        prop.setKey(key);
-        prop.setValue(value);
-        properties.add(prop);
-        return this;
-    }
-
-    protected Map<String, String> getPropertiesAsMap(CamelContext camelContext) throws Exception {
-        Map<String, String> answer;
-
-        if (properties == null || properties.isEmpty()) {
-            answer = Collections.emptyMap();
-        } else {
-            answer = new HashMap<>();
-            for (PropertyDefinition prop : properties) {
-                // support property placeholders
-                String key = CamelContextHelper.parseText(camelContext, prop.getKey());
-                String value = CamelContextHelper.parseText(camelContext, prop.getValue());
-                answer.put(key, value);
-            }
-        }
-
-        return answer;
+        return (ServiceCallServiceLoadBalancerConfiguration) super.property(key, value);
     }
 
     // *************************************************************************
@@ -192,10 +143,4 @@ public class ServiceCallServiceLoadBalancerConfiguration extends IdentifiedType
         return answer;
     }
 
-    // *************************************************************************
-    // Utilities
-    // *************************************************************************
-
-    protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception {
-    }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java
index 001eca9..29d2e8b 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/dataformat/BindyDataFormat.java
@@ -77,6 +77,13 @@ public class BindyDataFormat extends DataFormatDefinition {
     /**
      * Name of model class to use.
      */
+    public void setClassType(String classType) {
+        setClassTypeAsString(classType);
+    }
+
+    /**
+     * Name of model class to use.
+     */
     public void setClassType(Class<?> classType) {
         this.clazz = classType;
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/model/ModelSanityCheckerTest.java b/core/camel-core/src/test/java/org/apache/camel/model/ModelSanityCheckerTest.java
index d2a485e..7417def 100644
--- a/core/camel-core/src/test/java/org/apache/camel/model/ModelSanityCheckerTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/model/ModelSanityCheckerTest.java
@@ -108,7 +108,8 @@ public class ModelSanityCheckerTest extends Assert {
 
                 assertFalse("Class " + clazz.getName() + " has method " + method.getName() + " should not have @XmlAttribute annotation", attribute);
                 assertFalse("Class " + clazz.getName() + " has method " + method.getName() + " should not have @XmlElement annotation", element);
-                assertFalse("Class " + clazz.getName() + " has method " + method.getName() + " should not have @XmlElementRef annotation", elementRef);
+                assertFalse("Class " + clazz.getName() + " has method " + method.getName() + " should not have @XmlElementRef annotation",
+                        elementRef && !"setOutputs".equals(method.getName()));
             }
         }
 


[camel] 02/07: Move a few helper methods around, syntactic enhancements for streams, etc...

Posted by gn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit c1a0f9fa0cd76c7ef41550fe475d57711c9c6899
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Sat Dec 21 00:01:43 2019 +0100

    Move a few helper methods around, syntactic enhancements for streams, etc...
---
 bom/camel-bom/pom.xml                              |   5 +
 parent/pom.xml                                     |   5 +
 tooling/apt/pom.xml                                |   6 +-
 .../camel/tools/apt/AnnotationProcessorHelper.java |  35 +--
 .../camel/tools/apt/ConstantProviderProcessor.java |  12 +-
 .../apt/CoreEipAnnotationProcessorHelper.java      |  14 +-
 .../camel/tools/apt/DocumentationHelper.java       |   2 +-
 .../tools/apt/EndpointAnnotationProcessor.java     |  20 +-
 .../camel/tools/apt/ModelAnnotationProcessor.java  |   2 +-
 .../tools/apt/PropertyConfigurerGenerator.java     |  20 +-
 .../tools/apt/PropertyPlaceholderGenerator.java    |  19 +-
 .../org/apache/camel/tools/apt/SpiProcessor.java   |   2 +-
 .../tools/apt/SpringAnnotationProcessorHelper.java |  14 +-
 .../camel/tools/apt/TypeConverterProcessor.java    |   2 +-
 .../camel/tools/apt/helper/EndpointHelper.java     |   1 +
 .../apache/camel/tools/apt/helper/IOHelper.java    |  84 ------
 .../org/apache/camel/tools/apt/helper/Strings.java | 144 ---------
 .../camel/tools/apt/model/ComponentOption.java     |   2 +-
 .../camel/tools/apt/model/EndpointOption.java      |   2 +-
 tooling/camel-tooling-util/pom.xml                 |  45 +++
 .../org/apache/camel/tooling/util/FileUtil.java    |  81 +++++
 .../camel/tooling/util/JSonSchemaHelper.java}      | 153 ++++++++--
 .../apache/camel/tooling/util}/PackageHelper.java  |  99 +++----
 .../org/apache/camel/tooling/util/Strings.java     | 328 +++++++++++++++++++++
 .../src/main/resources/META-INF/LICENSE.txt        | 203 +++++++++++++
 .../src/main/resources/META-INF/NOTICE.txt         |  14 +
 .../camel/tooling/util/JSonSchemaHelperTest.java}  |  12 +-
 .../camel/tooling/util}/PackageHelperTest.java     |   3 +-
 .../apache/camel/tooling/util/ResourceUtils.java}  |  23 +-
 .../org/apache/camel/tooling/util/StringsTest.java |  40 +++
 .../src/test/resources/filecontent/a.txt           |   0
 .../src/test/resources/json/a.json                 |   0
 .../src/test/resources/json/aop.json               |   0
 .../src/test/resources/json/b.json                 |   0
 .../src/test/resources/json/c.txt                  |   0
 tooling/maven/bom-generator-maven-plugin/pom.xml   |   4 +
 .../maven/bom/generator/BomGeneratorMojo.java      |  41 +--
 .../maven/camel-api-component-maven-plugin/pom.xml |   5 +
 .../apache/camel/maven/AbstractGeneratorMojo.java  |  22 +-
 .../pom.xml                                        |   8 +
 .../apache/camel/maven/DocumentationEnricher.java  |   1 +
 .../camel/maven/EipDocumentationEnricherMojo.java  |   1 +
 .../java/org/apache/camel/maven/PackageHelper.java |  68 -----
 .../maven/camel-main-package-maven-plugin/pom.xml  |   5 +
 .../apache/camel/maven/PrepareCamelMainMojo.java   |  32 +-
 tooling/maven/camel-package-maven-plugin/pom.xml   |   5 +-
 .../maven/packaging/AbstractGeneratorMojo.java     |  44 +--
 .../camel/maven/packaging/EndpointDslMojo.java     |  46 ++-
 .../camel/maven/packaging/JSonSchemaHelper.java    | 206 -------------
 .../packaging/PackageArchetypeCatalogMojo.java     |   6 +-
 .../maven/packaging/PackageComponentMojo.java      |  13 +-
 .../maven/packaging/PackageDataFormatMojo.java     |  23 +-
 .../camel/maven/packaging/PackageLanguageMojo.java |  19 +-
 .../camel/maven/packaging/PackageModelMojo.java    |   1 +
 .../camel/maven/packaging/PackageOtherMojo.java    |   2 +-
 .../maven/packaging/PrepareCatalogKarafMojo.java   | 264 +++++------------
 .../camel/maven/packaging/PrepareCatalogMojo.java  | 251 ++++------------
 .../camel/maven/packaging/PrepareExampleMojo.java  |  26 +-
 .../maven/packaging/PrepareParentPomMojo.java      |  18 +-
 .../maven/packaging/PrepareReleasePomMojo.java     |  20 +-
 .../maven/packaging/PrepareUserGuideMojo.java      | 159 +++++-----
 .../apache/camel/maven/packaging/StringHelper.java | 200 -------------
 .../packaging/UpdateDocComponentListMojo.java      | 225 +++++++-------
 .../camel/maven/packaging/UpdateReadmeMojo.java    |  68 ++---
 .../maven/packaging/ValidateComponentMojo.java     |  10 +-
 .../camel/maven/packaging/ValidateHelper.java      |  14 +-
 .../maven/packaging/model/ComponentModel.java      |   6 +-
 .../packaging/model/ComponentOptionModel.java      |   8 +-
 .../maven/packaging/model/DataFormatModel.java     |   6 +-
 .../packaging/model/DataFormatOptionModel.java     |   4 +-
 .../maven/packaging/model/EipOptionModel.java      |   8 +-
 .../maven/packaging/model/EndpointOptionModel.java |   8 +-
 .../camel/maven/packaging/model/LanguageModel.java |   6 +-
 .../maven/packaging/model/LanguageOptionModel.java |   4 +-
 .../camel/maven/packaging/model/OtherModel.java    |   6 +-
 .../maven/packaging/model/OtherOptionModel.java    |   8 +-
 .../model/SpringBootAutoConfigureOptionModel.java  |   8 +-
 .../src/main/resources/component-options.mvel      |   2 +-
 .../maven/packaging/model/StringHelperTest.java    |   4 +-
 tooling/pom.xml                                    |   1 +
 80 files changed, 1514 insertions(+), 1764 deletions(-)

diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index a639b8e..3469331 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -1690,6 +1690,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-tooling-util</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-twilio</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/parent/pom.xml b/parent/pom.xml
index a1dd9c6..6c8ce08 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -731,6 +731,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
+                <artifactId>camel-tooling-util</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
                 <artifactId>camel-api</artifactId>
                 <version>${project.version}</version>
             </dependency>
diff --git a/tooling/apt/pom.xml b/tooling/apt/pom.xml
index 8c3347d..2a81ce2 100644
--- a/tooling/apt/pom.xml
+++ b/tooling/apt/pom.xml
@@ -46,14 +46,16 @@
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>spi-annotations</artifactId>
-            <version>${project.version}</version>
         </dependency>
 
         <!-- use our patched ordered json-simple parser -->
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-util-json</artifactId>
-            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-tooling-util</artifactId>
         </dependency>
 
         <!-- logging -->
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/AnnotationProcessorHelper.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/AnnotationProcessorHelper.java
index 4b824ad..a938f08 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/AnnotationProcessorHelper.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/AnnotationProcessorHelper.java
@@ -18,7 +18,6 @@ package org.apache.camel.tools.apt;
 
 import java.io.BufferedWriter;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.Writer;
@@ -46,9 +45,8 @@ import javax.tools.Diagnostic;
 import javax.tools.FileObject;
 import javax.tools.StandardLocation;
 
-import static org.apache.camel.tools.apt.helper.IOHelper.loadText;
-import static org.apache.camel.tools.apt.helper.Strings.canonicalClassName;
-import static org.apache.camel.tools.apt.helper.Strings.isNullOrEmpty;
+import static org.apache.camel.tooling.util.Strings.canonicalClassName;
+import static org.apache.camel.tooling.util.Strings.isNullOrEmpty;
 
 /**
  * Abstract class for Camel apt plugins.
@@ -338,10 +336,6 @@ public final class AnnotationProcessorHelper {
         processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, message);
     }
 
-    public static void warning(ProcessingEnvironment processingEnv, String message) {
-        processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, message);
-    }
-
     public static void error(ProcessingEnvironment processingEnv, String message) {
         processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, message);
     }
@@ -355,31 +349,6 @@ public final class AnnotationProcessorHelper {
         processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, buffer.toString());
     }
 
-    public static String loadResource(ProcessingEnvironment processingEnv, String packageName, String fileName) {
-        Filer filer = processingEnv.getFiler();
-
-        FileObject resource;
-        String relativeName = packageName + "/" + fileName;
-        try {
-            resource = filer.getResource(StandardLocation.CLASS_OUTPUT, "", relativeName);
-        } catch (Throwable e) {
-            return "Cannot load classpath resource: " + relativeName + " due: " + e.getMessage();
-        }
-
-        if (resource == null) {
-            return null;
-        }
-
-        try {
-            InputStream is = resource.openInputStream();
-            return loadText(is, true);
-        } catch (Exception e) {
-            warning(processingEnv, "APT cannot load file: " + packageName + "/" + fileName);
-        }
-
-        return null;
-    }
-
     public static void dumpExceptionToErrorFile(String fileName, String message, Throwable e) {
         try (BufferedWriter w = Files.newBufferedWriter(Paths.get(fileName), StandardOpenOption.CREATE, StandardOpenOption.APPEND)) {
             w.append(message);
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/ConstantProviderProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/ConstantProviderProcessor.java
index 749fbb0..2066e10 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/ConstantProviderProcessor.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/ConstantProviderProcessor.java
@@ -30,13 +30,11 @@ import javax.lang.model.element.VariableElement;
 import javax.lang.model.type.TypeMirror;
 import javax.lang.model.util.ElementFilter;
 import javax.tools.Diagnostic;
-import javax.tools.JavaFileObject;
 
 import org.apache.camel.spi.annotations.ConstantProvider;
-import org.apache.camel.tools.apt.helper.IOHelper;
 
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.dumpExceptionToErrorFile;
-import static org.apache.camel.tools.apt.helper.Strings.canonicalClassName;
+import static org.apache.camel.tooling.util.Strings.canonicalClassName;
 
 @SupportedAnnotationTypes({"org.apache.camel.spi.annotations.ConstantProvider"})
 public class ConstantProviderProcessor extends AbstractCamelAnnotationProcessor {
@@ -89,11 +87,7 @@ public class ConstantProviderProcessor extends AbstractCamelAnnotationProcessor
         String pn = fqn.substring(0, fqn.lastIndexOf('.'));
         String cn = fqn.substring(fqn.lastIndexOf('.') + 1);
 
-        Writer w = null;
-        try {
-            JavaFileObject src = processingEnv.getFiler().createSourceFile(fqn);
-            w = src.openWriter();
-
+        try (Writer w = processingEnv.getFiler().createSourceFile(fqn).openWriter()) {
             w.write("/* Generated by org.apache.camel:apt */\n");
             w.write("package " + pn + ";\n");
             w.write("\n");
@@ -122,8 +116,6 @@ public class ConstantProviderProcessor extends AbstractCamelAnnotationProcessor
         } catch (Exception e) {
             processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Unable to generate source code file: " + fqn + ": " + e.getMessage());
             dumpExceptionToErrorFile("camel-apt-error.log", "Unable to generate source code file: " + fqn, e);
-        } finally {
-            IOHelper.close(w);
         }
     }
 
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/CoreEipAnnotationProcessorHelper.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/CoreEipAnnotationProcessorHelper.java
index 18a33c3..4eeea7d 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/CoreEipAnnotationProcessorHelper.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/CoreEipAnnotationProcessorHelper.java
@@ -44,8 +44,8 @@ import javax.xml.bind.annotation.XmlValue;
 
 import org.apache.camel.spi.AsPredicate;
 import org.apache.camel.spi.Metadata;
-import org.apache.camel.tools.apt.helper.JsonSchemaHelper;
-import org.apache.camel.tools.apt.helper.Strings;
+import org.apache.camel.tooling.util.JSonSchemaHelper;
+import org.apache.camel.tooling.util.Strings;
 
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.findJavaDoc;
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.findTypeElement;
@@ -53,10 +53,10 @@ import static org.apache.camel.tools.apt.AnnotationProcessorHelper.findTypeEleme
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.hasSuperClass;
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.implementsInterface;
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.processFile;
-import static org.apache.camel.tools.apt.helper.JsonSchemaHelper.sanitizeDescription;
-import static org.apache.camel.tools.apt.helper.Strings.canonicalClassName;
-import static org.apache.camel.tools.apt.helper.Strings.isNullOrEmpty;
-import static org.apache.camel.tools.apt.helper.Strings.safeNull;
+import static org.apache.camel.tooling.util.JSonSchemaHelper.sanitizeDescription;
+import static org.apache.camel.tooling.util.Strings.canonicalClassName;
+import static org.apache.camel.tooling.util.Strings.isNullOrEmpty;
+import static org.apache.camel.tooling.util.Strings.safeNull;
 
 /**
  * Process all camel-core's model classes (EIPs and DSL) and generate json
@@ -236,7 +236,7 @@ public class CoreEipAnnotationProcessorHelper {
             // as its json we need to sanitize the docs
             String doc = entry.getDocumentation();
             doc = sanitizeDescription(doc, false);
-            buffer.append(JsonSchemaHelper.toJson(entry.getName(), entry.getDisplayName(), entry.getKind(), entry.isRequired(), entry.getType(), entry.getDefaultValue(), doc,
+            buffer.append(JSonSchemaHelper.toJson(entry.getName(), entry.getDisplayName(), entry.getKind(), entry.isRequired(), entry.getType(), entry.getDefaultValue(), doc,
                                                   entry.isDeprecated(), entry.getDeprecationNote(), false, null, null, entry.isEnumType(), entry.getEnums(), entry.isOneOf(),
                                                   entry.getOneOfTypes(), entry.isAsPredicate(), null, null, false, null, null));
         }
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/DocumentationHelper.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/DocumentationHelper.java
index fb243e3..a94b585 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/DocumentationHelper.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/DocumentationHelper.java
@@ -22,7 +22,7 @@ import java.nio.file.Files;
 import java.util.List;
 import java.util.Map;
 
-import static org.apache.camel.tools.apt.helper.JsonSchemaHelper.parseJsonSchema;
+import static org.apache.camel.tooling.util.JSonSchemaHelper.parseJsonSchema;
 
 /**
  * Helper to find documentation for inherited options when a component extends another.
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
index 4f18719..0c08d6d 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/EndpointAnnotationProcessor.java
@@ -50,8 +50,8 @@ import org.apache.camel.spi.UriParams;
 import org.apache.camel.spi.UriPath;
 import org.apache.camel.spi.annotations.Component;
 import org.apache.camel.tools.apt.helper.EndpointHelper;
-import org.apache.camel.tools.apt.helper.JsonSchemaHelper;
-import org.apache.camel.tools.apt.helper.Strings;
+import org.apache.camel.tooling.util.JSonSchemaHelper;
+import org.apache.camel.tooling.util.Strings;
 import org.apache.camel.tools.apt.model.ComponentModel;
 import org.apache.camel.tools.apt.model.ComponentOption;
 import org.apache.camel.tools.apt.model.EndpointOption;
@@ -65,10 +65,10 @@ import static org.apache.camel.tools.apt.AnnotationProcessorHelper.findJavaDoc;
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.findTypeElement;
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.implementsInterface;
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.processFile;
-import static org.apache.camel.tools.apt.helper.JsonSchemaHelper.sanitizeDescription;
-import static org.apache.camel.tools.apt.helper.Strings.canonicalClassName;
-import static org.apache.camel.tools.apt.helper.Strings.getOrElse;
-import static org.apache.camel.tools.apt.helper.Strings.isNullOrEmpty;
+import static org.apache.camel.tooling.util.JSonSchemaHelper.sanitizeDescription;
+import static org.apache.camel.tooling.util.Strings.canonicalClassName;
+import static org.apache.camel.tooling.util.Strings.getOrElse;
+import static org.apache.camel.tooling.util.Strings.isNullOrEmpty;
 
 /**
  * Processes all Camel {@link UriEndpoint}s and generate json schema documentation for the endpoint/component.
@@ -326,7 +326,7 @@ public class EndpointAnnotationProcessor extends AbstractCamelAnnotationProcesso
             boolean multiValue = false;
             boolean asPredicate = false;
 
-            buffer.append(JsonSchemaHelper.toJson(entry.getName(), entry.getDisplayName(), "property", required, entry.getType(), defaultValue, doc,
+            buffer.append(JSonSchemaHelper.toJson(entry.getName(), entry.getDisplayName(), "property", required, entry.getType(), defaultValue, doc,
                 entry.isDeprecated(), entry.getDeprecationNote(), entry.isSecret(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(),
                 false, null, asPredicate, optionalPrefix, prefix, multiValue, entry.getConfigurationClass(), entry.getConfigurationField()));
 
@@ -400,7 +400,7 @@ public class EndpointAnnotationProcessor extends AbstractCamelAnnotationProcesso
             boolean multiValue = false;
             boolean asPredicate = false;
 
-            buffer.append(JsonSchemaHelper.toJson(entry.getName(), entry.getDisplayName(), "path", required, entry.getType(), defaultValue, doc,
+            buffer.append(JSonSchemaHelper.toJson(entry.getName(), entry.getDisplayName(), "path", required, entry.getType(), defaultValue, doc,
                 entry.isDeprecated(), entry.getDeprecationNote(), entry.isSecret(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(),
                 false, null, asPredicate, optionalPrefix, prefix, multiValue, null, null));
 
@@ -448,7 +448,7 @@ public class EndpointAnnotationProcessor extends AbstractCamelAnnotationProcesso
             boolean multiValue = entry.isMultiValue();
             boolean asPredicate = false;
 
-            buffer.append(JsonSchemaHelper.toJson(entry.getName(), entry.getDisplayName(), "parameter", required, entry.getType(), defaultValue,
+            buffer.append(JSonSchemaHelper.toJson(entry.getName(), entry.getDisplayName(), "parameter", required, entry.getType(), defaultValue,
                 doc, entry.isDeprecated(), entry.getDeprecationNote(), entry.isSecret(), entry.getGroup(), entry.getLabel(), entry.isEnumType(), entry.getEnums(),
                 false, null, asPredicate, optionalPrefix, prefix, multiValue, entry.getConfigurationClass(), entry.getConfigurationField()));
 
@@ -765,7 +765,7 @@ public class EndpointAnnotationProcessor extends AbstractCamelAnnotationProcesso
                         isEnum = true;
                         String[] values = path.enums().split(",");
                         for (String val : values) {
-                            enums.add(val);
+                            enums.add(val.trim());
                         }
                     } else {
                         isEnum = fieldTypeElement != null && fieldTypeElement.getKind() == ElementKind.ENUM;
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/ModelAnnotationProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/ModelAnnotationProcessor.java
index 0995240..4d4528d 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/ModelAnnotationProcessor.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/ModelAnnotationProcessor.java
@@ -30,7 +30,7 @@ import javax.lang.model.element.TypeElement;
 import javax.tools.Diagnostic.Kind;
 import javax.xml.bind.annotation.XmlRootElement;
 
-import static org.apache.camel.tools.apt.helper.Strings.canonicalClassName;
+import static org.apache.camel.tooling.util.Strings.canonicalClassName;
 
 /**
  * APT compiler plugin to generate JSon Schema for all EIP models and camel-spring's <camelContext> types.
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/PropertyConfigurerGenerator.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/PropertyConfigurerGenerator.java
index 6c8af09..3ab11c9 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/PropertyConfigurerGenerator.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/PropertyConfigurerGenerator.java
@@ -24,10 +24,8 @@ import javax.annotation.processing.ProcessingEnvironment;
 import javax.lang.model.element.TypeElement;
 import javax.tools.Diagnostic;
 import javax.tools.FileObject;
-import javax.tools.JavaFileObject;
 import javax.tools.StandardLocation;
 
-import org.apache.camel.tools.apt.helper.IOHelper;
 import org.apache.camel.tools.apt.model.PropertyOption;
 
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.dumpExceptionToErrorFile;
@@ -40,11 +38,7 @@ public final class PropertyConfigurerGenerator {
     public static void generateExtendConfigurer(ProcessingEnvironment processingEnv, TypeElement parent,
                                                 String pn, String cn, String fqn) {
 
-        Writer w = null;
-        try {
-            JavaFileObject src = processingEnv.getFiler().createSourceFile(fqn, parent);
-            w = src.openWriter();
-
+        try (Writer w = processingEnv.getFiler().createSourceFile(fqn, parent).openWriter()) {
             w.write("/* Generated by org.apache.camel:apt */\n");
             w.write("package " + pn + ";\n");
             w.write("\n");
@@ -60,8 +54,6 @@ public final class PropertyConfigurerGenerator {
         } catch (Exception e) {
             processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Unable to generate source code file: " + fqn + ": " + e.getMessage());
             dumpExceptionToErrorFile("camel-apt-error.log", "Unable to generate source code file: " + fqn, e);
-        } finally {
-            IOHelper.close(w);
         }
     }
 
@@ -69,13 +61,7 @@ public final class PropertyConfigurerGenerator {
                                                   String pn, String cn, String fqn, String en,
                                                   Set<PropertyOption> options) {
 
-        Writer w = null;
-        try {
-            JavaFileObject src = processingEnv.getFiler().createSourceFile(fqn, parent);
-            w = src.openWriter();
-
-            int size = options.size();
-
+        try (Writer w = processingEnv.getFiler().createSourceFile(fqn, parent).openWriter()) {
             w.write("/* Generated by org.apache.camel:apt */\n");
             w.write("package " + pn + ";\n");
             w.write("\n");
@@ -130,8 +116,6 @@ public final class PropertyConfigurerGenerator {
         } catch (Exception e) {
             processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Unable to generate source code file: " + fqn + ": " + e.getMessage());
             dumpExceptionToErrorFile("camel-apt-error.log", "Unable to generate source code file: " + fqn, e);
-        } finally {
-            IOHelper.close(w);
         }
     }
 
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/PropertyPlaceholderGenerator.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/PropertyPlaceholderGenerator.java
index 85e5000..556c5de 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/PropertyPlaceholderGenerator.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/PropertyPlaceholderGenerator.java
@@ -23,9 +23,6 @@ import javax.annotation.processing.ProcessingEnvironment;
 import javax.annotation.processing.RoundEnvironment;
 import javax.lang.model.element.TypeElement;
 import javax.tools.Diagnostic;
-import javax.tools.JavaFileObject;
-
-import org.apache.camel.tools.apt.helper.IOHelper;
 
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.dumpExceptionToErrorFile;
 
@@ -38,11 +35,7 @@ public final class PropertyPlaceholderGenerator {
                                                                  String def, String fqnDef, String cn, String fqn,
                                                                  Set<CoreEipAnnotationProcessorHelper.EipOption> options) {
 
-        Writer w = null;
-        try {
-            JavaFileObject src = processingEnv.getFiler().createSourceFile(fqn, parent);
-            w = src.openWriter();
-
+        try (Writer w = processingEnv.getFiler().createSourceFile(fqn, parent).openWriter()) {
             w.write("/* Generated by org.apache.camel:apt */\n");
             w.write("package org.apache.camel.model.placeholder;\n");
             w.write("\n");
@@ -101,8 +94,6 @@ public final class PropertyPlaceholderGenerator {
         } catch (Exception e) {
             processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Unable to generate source code file: " + fqn + ": " + e.getMessage());
             dumpExceptionToErrorFile("camel-apt-error.log", "Unable to generate source code file: " + fqn, e);
-        } finally {
-            IOHelper.close(w);
         }
     }
 
@@ -111,11 +102,7 @@ public final class PropertyPlaceholderGenerator {
 
         String fqn = "org.apache.camel.model.placeholder.DefinitionPropertiesPlaceholderProviderHelper";
 
-        Writer w = null;
-        try {
-            JavaFileObject src = processingEnv.getFiler().createSourceFile(fqn);
-            w = src.openWriter();
-
+        try (Writer w = processingEnv.getFiler().createSourceFile(fqn).openWriter()) {
             w.write("/* Generated by camel-apt */\n");
             w.write("package org.apache.camel.model.placeholder;\n");
             w.write("\n");
@@ -158,8 +145,6 @@ public final class PropertyPlaceholderGenerator {
         } catch (Exception e) {
             processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Unable to generate source code file: " + fqn + ": " + e.getMessage());
             dumpExceptionToErrorFile("camel-apt-error.log", "Unable to generate source code file: " + fqn, e);
-        } finally {
-            IOHelper.close(w);
         }
     }
 
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/SpiProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/SpiProcessor.java
index 28cec75..dc97f87 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/SpiProcessor.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/SpiProcessor.java
@@ -30,7 +30,7 @@ import javax.tools.StandardLocation;
 import org.apache.camel.spi.annotations.ServiceFactory;
 import org.apache.camel.spi.annotations.SubServiceFactory;
 
-import static org.apache.camel.tools.apt.helper.Strings.canonicalClassName;
+import static org.apache.camel.tooling.util.Strings.canonicalClassName;
 
 @SupportedAnnotationTypes({"org.apache.camel.spi.annotations.*"})
 public class SpiProcessor extends AbstractCamelAnnotationProcessor {
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/SpringAnnotationProcessorHelper.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/SpringAnnotationProcessorHelper.java
index 7259f47..e925af8 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/SpringAnnotationProcessorHelper.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/SpringAnnotationProcessorHelper.java
@@ -40,16 +40,16 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
 import org.apache.camel.spi.Metadata;
-import org.apache.camel.tools.apt.helper.JsonSchemaHelper;
-import org.apache.camel.tools.apt.helper.Strings;
+import org.apache.camel.tooling.util.JSonSchemaHelper;
+import org.apache.camel.tooling.util.Strings;
 
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.findJavaDoc;
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.findTypeElement;
 import static org.apache.camel.tools.apt.AnnotationProcessorHelper.processFile;
-import static org.apache.camel.tools.apt.helper.JsonSchemaHelper.sanitizeDescription;
-import static org.apache.camel.tools.apt.helper.Strings.canonicalClassName;
-import static org.apache.camel.tools.apt.helper.Strings.isNullOrEmpty;
-import static org.apache.camel.tools.apt.helper.Strings.safeNull;
+import static org.apache.camel.tooling.util.JSonSchemaHelper.sanitizeDescription;
+import static org.apache.camel.tooling.util.Strings.canonicalClassName;
+import static org.apache.camel.tooling.util.Strings.isNullOrEmpty;
+import static org.apache.camel.tooling.util.Strings.safeNull;
 
 /**
  * Process camel-spring's <camelContext> and generate json schema documentation
@@ -137,7 +137,7 @@ public class SpringAnnotationProcessorHelper {
             String doc = entry.getDocumentation();
             doc = sanitizeDescription(doc, false);
 
-            buffer.append(JsonSchemaHelper.toJson(entry.getName(), entry.getDisplayName(), entry.getKind(), entry.isRequired(), entry.getType(), entry.getDefaultValue(), doc,
+            buffer.append(JSonSchemaHelper.toJson(entry.getName(), entry.getDisplayName(), entry.getKind(), entry.isRequired(), entry.getType(), entry.getDefaultValue(), doc,
                                                   entry.isDeprecated(), entry.getDeprecationNote(), false, null, null, entry.isEnumType(), entry.getEnums(), entry.isOneOf(),
                                                   entry.getOneOfTypes(), entry.isAsPredicate(), null, null, false, null, null));
         }
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterProcessor.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterProcessor.java
index d4d1ae9..4d64b86 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterProcessor.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/TypeConverterProcessor.java
@@ -32,7 +32,7 @@ import javax.lang.model.element.TypeElement;
 import javax.tools.FileObject;
 import javax.tools.StandardLocation;
 
-import static org.apache.camel.tools.apt.helper.Strings.canonicalClassName;
+import static org.apache.camel.tooling.util.Strings.canonicalClassName;
 
 @SupportedAnnotationTypes({"org.apache.camel.Converter"})
 public class TypeConverterProcessor extends AbstractCamelAnnotationProcessor {
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/EndpointHelper.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/EndpointHelper.java
index bf07850..a51fc92 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/EndpointHelper.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/EndpointHelper.java
@@ -18,6 +18,7 @@ package org.apache.camel.tools.apt.helper;
 
 import java.util.Comparator;
 
+import org.apache.camel.tooling.util.Strings;
 import org.apache.camel.tools.apt.model.EndpointOption;
 import org.apache.camel.tools.apt.model.EndpointPath;
 
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/IOHelper.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/IOHelper.java
deleted file mode 100644
index bc95e31..0000000
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/IOHelper.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.tools.apt.helper;
-
-import java.io.BufferedReader;
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public final class IOHelper {
-
-    private IOHelper() {
-    }
-
-    /**
-     * Loads the entire stream into memory as a String and returns it.
-     * <p/>
-     * <b>Notice:</b> This implementation appends a <tt>\n</tt> as line
-     * terminator at the of the text.
-     * <p/>
-     * Warning, don't use for crazy big streams :)
-     */
-    public static String loadText(InputStream in, boolean skipCommentOrEmptyLines) throws IOException {
-        StringBuilder builder = new StringBuilder();
-        InputStreamReader isr = new InputStreamReader(in);
-        try {
-            BufferedReader reader = new BufferedReader(isr);
-            while (true) {
-                String line = reader.readLine();
-                if (line != null) {
-
-                    boolean empty = Strings.isNullOrEmpty(line);
-                    boolean comment = line.trim().startsWith("#");
-                    if (skipCommentOrEmptyLines && (empty || comment)) {
-                        continue;
-                    }
-
-                    builder.append(line);
-                    builder.append("\n");
-                } else {
-                    break;
-                }
-            }
-            return builder.toString();
-        } finally {
-            close(isr, in);
-        }
-    }
-
-    /**
-     * Closes the given resources if they are available.
-     *
-     * @param closeables the objects to close
-     */
-    public static void close(Closeable... closeables) {
-        for (Closeable closeable : closeables) {
-            try {
-                if (closeable != null) {
-                    closeable.close();
-                }
-            } catch (IOException e) {
-                // ignore
-            }
-        }
-    }
-
-
-
-}
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/Strings.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/Strings.java
deleted file mode 100644
index aff3f45..0000000
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/Strings.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.tools.apt.helper;
-
-/**
- * Some String helper methods
- */
-public final class Strings {
-
-    private Strings() {
-        //Helper class
-    }
-
-    /**
-     * Returns true if the given text is null or empty string or has <tt>null</tt> as the value
-     */
-    public static boolean isNullOrEmpty(String text) {
-        return text == null || text.length() == 0 || "null".equals(text);
-    }
-
-    public static String safeNull(String text) {
-        if (isNullOrEmpty(text)) {
-            return "";
-        } else {
-            return text;
-        }
-    }
-
-    /**
-     * Returns the value or the defaultValue if it is null
-     */
-    public static String getOrElse(String text, String defaultValue) {
-        return (text != null) ? text : defaultValue;
-    }
-
-    /**
-     * Returns the string after the given token
-     *
-     * @param text  the text
-     * @param after the token
-     * @return the text after the token, or <tt>null</tt> if text does not contain the token
-     */
-    public static String after(String text, String after) {
-        if (!text.contains(after)) {
-            return null;
-        }
-        return text.substring(text.indexOf(after) + after.length());
-    }
-
-    /**
-     * Returns the canonical class name by removing any generic type information.
-     */
-    public static String canonicalClassName(String className) {
-        // remove generics
-        int pos = className.indexOf('<');
-        if (pos != -1) {
-            return className.substring(0, pos);
-        } else {
-            return className;
-        }
-    }
-
-    /**
-     * Returns the text wrapped double quotes
-     */
-    public static String doubleQuote(String text) {
-        return quote(text, "\"");
-    }
-
-    /**
-     * Returns the text wrapped single quotes
-     */
-    public static String singleQuote(String text) {
-        return quote(text, "'");
-    }
-
-    /**
-     * Wraps the text in the given quote text
-     *
-     * @param text the text to wrap in quotes
-     * @param quote the quote text added to the prefix and postfix of the text
-     *
-     * @return the text wrapped in the given quotes
-     */
-    public static String quote(String text, String quote) {
-        return quote + text + quote;
-    }
-
-    /**
-     * Clips the text between the start and end markers
-     */
-    public static String between(String text, String start, String end) {
-        int pos = text.indexOf(start);
-        if (pos > 0) {
-            text = text.substring(pos + 1);
-        }
-        int pos2 = text.lastIndexOf(end);
-        if (pos2 > 0) {
-            text = text.substring(0, pos2);
-        }
-        return text;
-    }
-
-    /**
-     * Capitalizes the name as a title
-     *
-     * @param name  the name
-     * @return as a title
-     */
-    public static String asTitle(String name) {
-        StringBuilder sb = new StringBuilder();
-        for (char c : name.toCharArray()) {
-            boolean upper = Character.isUpperCase(c);
-            boolean first = sb.length() == 0;
-            if (first) {
-                sb.append(Character.toUpperCase(c));
-            } else if (upper) {
-                char prev = sb.charAt(sb.length() - 1);
-                if (!Character.isUpperCase(prev)) {
-                    // append space if previous is not upper
-                    sb.append(' ');
-                }
-                sb.append(c);
-            } else {
-                sb.append(Character.toLowerCase(c));
-            }
-        }
-        return sb.toString().trim();
-    }
-}
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/ComponentOption.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/ComponentOption.java
index dd77337..efec802 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/ComponentOption.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/ComponentOption.java
@@ -18,7 +18,7 @@ package org.apache.camel.tools.apt.model;
 
 import java.util.Set;
 
-import static org.apache.camel.tools.apt.helper.Strings.isNullOrEmpty;
+import static org.apache.camel.tooling.util.Strings.isNullOrEmpty;
 
 public final class ComponentOption implements PropertyOption {
 
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java
index c44ef4f..ff1a4c9 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java
+++ b/tooling/apt/src/main/java/org/apache/camel/tools/apt/model/EndpointOption.java
@@ -18,7 +18,7 @@ package org.apache.camel.tools.apt.model;
 
 import java.util.Set;
 
-import static org.apache.camel.tools.apt.helper.Strings.isNullOrEmpty;
+import static org.apache.camel.tooling.util.Strings.isNullOrEmpty;
 
 public final class EndpointOption implements PropertyOption {
 
diff --git a/tooling/camel-tooling-util/pom.xml b/tooling/camel-tooling-util/pom.xml
new file mode 100644
index 0000000..d565914
--- /dev/null
+++ b/tooling/camel-tooling-util/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>tooling</artifactId>
+        <version>3.1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-tooling-util</artifactId>
+
+    <name>Camel :: Tooling :: Util</name>
+    <description>Tooling utilities</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-util-json</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/FileUtil.java b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/FileUtil.java
new file mode 100644
index 0000000..b39b552
--- /dev/null
+++ b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/FileUtil.java
@@ -0,0 +1,81 @@
+package org.apache.camel.tooling.util;
+
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.util.Arrays;
+
+public class FileUtil {
+
+    /**
+     * Update a file with the given string content if neeed.
+     * The file won't be modified if the content is already the same.
+     *
+     * @param path the path of the file to update
+     * @param newdata the new string data, <code>null</code> to delete the file
+     * @return <code>true</code> if the file was modified, <code>false</code> otherwise
+     * @throws IOException if an exception occurs
+     */
+    public static boolean updateFile(Path path, String newdata) throws IOException {
+        return updateFile(path, newdata != null ? newdata.getBytes() : null);
+    }
+
+    /**
+     * Update a file with the given string content if neeed.
+     * The file won't be modified if the content is already the same.
+     *
+     * @param path the path of the file to update
+     * @param newdata the new string data, <code>null</code> to delete the file
+     * @param encoding the encoding to use
+     * @return <code>true</code> if the file was modified, <code>false</code> otherwise
+     * @throws IOException if an exception occurs
+     */
+    public static boolean updateFile(Path path, String newdata, Charset encoding) throws IOException {
+        return updateFile(path, newdata != null ? newdata.getBytes(encoding) : null);
+    }
+
+    /**
+     * Update a file with the given binary content if neeed.
+     * The file won't be modified if the content is already the same.
+     *
+     * @param path the path of the file to update
+     * @param newdata the new binary data, <code>null</code> to delete the file
+     * @return <code>true</code> if the file was modified, <code>false</code> otherwise
+     * @throws IOException if an exception occurs
+     */
+    public static boolean updateFile(Path path, byte[] newdata) throws IOException {
+        if (newdata == null) {
+            if (!Files.exists(path)) {
+                return false;
+            }
+            Files.delete(path);
+            return true;
+        } else {
+            byte[] olddata = new byte[0];
+            if (Files.exists(path) && Files.isReadable(path)) {
+                olddata = Files.readAllBytes(path);
+            }
+            if (Arrays.equals(olddata, newdata)) {
+                return false;
+            }
+            Files.createDirectories(path.getParent());
+            Files.write(path, newdata, StandardOpenOption.WRITE,
+                    StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
+            return true;
+        }
+    }
+
+    /**
+     * Read the content of the input file and update the target accordingly
+     *
+     * @param from the source file
+     * @param to the target file
+     * @throws IOException if an exception occurs
+     */
+    public static void updateFile(Path from, Path to) throws IOException {
+        updateFile(to, Files.readAllBytes(from));
+    }
+
+}
diff --git a/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/JsonSchemaHelper.java b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/JSonSchemaHelper.java
similarity index 80%
rename from tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/JsonSchemaHelper.java
rename to tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/JSonSchemaHelper.java
index b4619ff..c03ef7c 100644
--- a/tooling/apt/src/main/java/org/apache/camel/tools/apt/helper/JsonSchemaHelper.java
+++ b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/JSonSchemaHelper.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.tools.apt.helper;
+package org.apache.camel.tooling.util;
 
 import java.io.File;
 import java.net.URI;
@@ -33,18 +33,18 @@ import org.apache.camel.util.json.Jsoner;
 /**
  * A helper class for <a href="http://json-schema.org/">JSON schema</a>.
  */
-public final class JsonSchemaHelper {
+public final class JSonSchemaHelper {
 
     private static final String VALID_CHARS = ".,-='/\\!&%():;#${}";
 
-    private JsonSchemaHelper() {
+    private JSonSchemaHelper() {
     }
 
     public static String toJson(String name, String displayName, String kind, Boolean required, String type, String defaultValue, String description,
                                 Boolean deprecated, String deprecationNote, Boolean secret, String group, String label, boolean enumType, Set<String> enums,
                                 boolean oneOfType, Set<String> oneOffTypes, boolean asPredicate, String optionalPrefix, String prefix, boolean multiValue,
                                 String configurationClass, String configurationField) {
-        String typeName = JsonSchemaHelper.getType(type, enumType);
+        String typeName = JSonSchemaHelper.getType(type, enumType);
 
         StringBuilder sb = new StringBuilder();
         sb.append(Strings.doubleQuote(name));
@@ -79,7 +79,7 @@ public final class JsonSchemaHelper {
 
         sb.append(", \"type\": ");
         if ("enum".equals(typeName)) {
-            String actualType = JsonSchemaHelper.getType(type, false);
+            String actualType = JSonSchemaHelper.getType(type, false);
             sb.append(Strings.doubleQuote(actualType));
             sb.append(", \"javaType\": \"").append(type).append("\"");
             sb.append(", \"enum\": [ ");
@@ -349,24 +349,24 @@ public final class JsonSchemaHelper {
         try {
             JsonObject output = (JsonObject) Jsoner.deserialize(json);
             for (String key : output.keySet()) {
-                Map row = output.getMap(key);
+                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();
+                            Map.Entry<?, ?> entry = (Map.Entry<?, ?>) obj;
+                            Map<String, String> newRow = new LinkedHashMap<>();
                             newRow.put("name", entry.getKey().toString());
 
-                            Map newData = transformMap((Map) entry.getValue());
+                            Map<String, String> 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);
+                        Map<?, ?> newData = transformMap(row);
                         for (Object obj : newData.entrySet()) {
-                            Map.Entry entry = (Map.Entry) obj;
+                            Map.Entry<?, ?> entry = (Map.Entry<?, ?>) obj;
                             Map<String, String> newRow = new LinkedHashMap<>();
                             newRow.put(entry.getKey().toString(), entry.getValue().toString());
                             answer.add(newRow);
@@ -382,17 +382,41 @@ public final class JsonSchemaHelper {
         return answer;
     }
 
-    private static Map<String, String> transformMap(Map jsonMap) {
+    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
+            .replaceAll("\\\\r", "\\\\\\r")
+            .replaceAll("\\\\n", "\\\\\\n")
+            .replaceAll("\\\\t", "\\\\\\t");
+    }
+
+    /**
+     * The default value may need to be escaped to be safe for json
+     */
+    private static String safeDefaultValue(String value) {
+        if ("\"".equals(value)) {
+            return "\\\"";
+        } else if ("\\".equals(value)) {
+            return "\\\\";
+        } else {
+            return value;
+        }
+    }
+
+    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;
+            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<Object> list = (List) newValue;
-                newValue = list.stream().map(String::valueOf).collect(Collectors.joining(","));
+                List<?> list = (List<?>) newValue;
+                newValue = list.stream().map(Object::toString)
+                        .collect(Collectors.joining(","));
             }
             // ensure value is escaped
             String value = escapeJson(newValue.toString());
@@ -402,27 +426,96 @@ public final class JsonSchemaHelper {
         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
-            .replaceAll("\\\\r", "\\\\\\r")
-            .replaceAll("\\\\n", "\\\\\\n")
-            .replaceAll("\\\\t", "\\\\\\t");
+    /**
+     * Gets the value with the key in a safe way, eg returning an empty string if there was no value for the key.
+     */
+    public static String getSafeValue(String key, List<Map<String, String>> rows) {
+        for (Map<String, String> row : rows) {
+            String value = row.get(key);
+            if (value != null) {
+                return value;
+            }
+        }
+        return "";
     }
 
     /**
-     * The default value may need to be escaped to be safe for json
+     * Gets the value with the key in a safe way, eg returning an empty string if there was no value for the key.
      */
-    private static String safeDefaultValue(String value) {
-        if ("\"".equals(value)) {
-            return "\\\"";
-        } else if ("\\".equals(value)) {
-            return "\\\\";
-        } else {
+    public static String getSafeValue(String key, Map<String, String> rows) {
+        String value = rows.get(key);
+        if (value != null) {
             return value;
         }
+        return "";
+    }
+
+    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.equals(row.get("name"));
+            }
+            if (row.containsKey("defaultValue")) {
+                defaultValue = row.get("defaultValue");
+            }
+            if (found) {
+                return defaultValue;
+            }
+        }
+        return null;
+    }
+
+    public static String getPropertyDescriptionValue(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String description = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equals(row.get("name"));
+            }
+            if (row.containsKey("description")) {
+                description = row.get("description");
+            }
+            if (found) {
+                return description;
+            }
+        }
+        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.equals(row.get("name"));
+            }
+            if (row.containsKey("javaType")) {
+                javaType = row.get("javaType");
+            }
+            if (found) {
+                return javaType;
+            }
+        }
+        return null;
+    }
+
+    public static String getPropertyType(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.equals(row.get("name"));
+            }
+            if (row.containsKey("type")) {
+                type = row.get("type");
+            }
+            if (found) {
+                return type;
+            }
+        }
+        return null;
     }
 
 }
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageHelper.java b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/PackageHelper.java
similarity index 69%
rename from tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageHelper.java
rename to tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/PackageHelper.java
index 61bde68..9136f2b 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageHelper.java
+++ b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/PackageHelper.java
@@ -14,51 +14,34 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.maven.packaging;
+package org.apache.camel.tooling.util;
 
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileFilter;
-import java.io.FileOutputStream;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.LineNumberReader;
+import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
-import org.apache.maven.model.Resource;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
-import org.sonatype.plexus.build.incremental.BuildContext;
-
+/**
+ * Utility class to find, read json files.
+ */
 public final class PackageHelper {
 
+    public static final String JSON_SUFIX = ".json";
+
     private PackageHelper() {
     }
-    
-    public static boolean haveResourcesChanged(Log log, MavenProject project, BuildContext buildContext, String suffix) {
-        String baseDir = project.getBasedir().getAbsolutePath();
-        for (Resource r : project.getBuild().getResources()) {
-            File file = new File(r.getDirectory());
-            if (file.isAbsolute()) {
-                file = new File(r.getDirectory().substring(baseDir.length() + 1));
-            }
-            String path = file.getPath() + "/" + suffix;
-            if (log.isDebugEnabled()) {
-                log.debug("Checking  if " + path + " (" + r.getDirectory() + "/" + suffix + ") has changed.");
-            }
-            if (buildContext.hasDelta(path)) {
-                log.debug("Indeed " + suffix + " has changed.");
-                return true;
-            }
-        }
-        return false;
-    }
 
     /**
      * Loads the entire stream into memory as a String and returns it.
@@ -89,13 +72,12 @@ public final class PackageHelper {
         }
     }
 
+    public static String loadText(File file) throws IOException {
+        return loadText(new FileInputStream(file));
+    }
+
     public static void writeText(File file, String text) throws IOException {
-        FileOutputStream fos = new FileOutputStream(file, false);
-        try {
-            fos.write(text.getBytes());
-        } finally {
-            fos.close();
-        }
+        FileUtil.updateFile(file.toPath(), text);
     }
 
     public static String after(String text, String after) {
@@ -128,33 +110,48 @@ public final class PackageHelper {
         return answer;
     }
 
-    public static Set<File> findJsonFiles(File dir, FileFilter filter) {
-        Set<File> files = new TreeSet<>();
-        findJsonFiles(dir, files, filter);
+    public static String fileToString(File file) throws IOException {
+        byte[] encoded = Files.readAllBytes(Paths.get(file.toURI()));
+        return new String(encoded, Charset.defaultCharset());
+    }
 
-        return files;
+    public static Map<String, File> findJsonFiles(File rootDir) {
+        Map<String, File> results = new HashMap<>();
+        findJsonFiles0(rootDir, results, new CamelComponentsModelFilter());
+        return results;
     }
 
-    public static void findJsonFiles(File dir, Set<File> found, FileFilter filter) {
+    public static void findJsonFiles(File rootDir, Set<File> files, FileFilter filter) {
+        Map<String, File> results = new HashMap<>();
+        findJsonFiles0(rootDir, results, new CamelComponentsModelFilter());
+        files.addAll(results.values());
+    }
+
+    public static Map<String, File> findJsonFiles(File rootDir, FileFilter filter) {
+        Map<String, File> results = new HashMap<>();
+        findJsonFiles0(rootDir, results, filter);
+        return results;
+    }
+
+    private static void findJsonFiles0(File dir, Map<String, File> result, FileFilter filter) {
         File[] files = dir.listFiles(filter);
         if (files != null) {
             for (File file : files) {
                 // skip files in root dirs as Camel does not store information there but others may do
-                boolean jsonFile = file.isFile() && file.getName().endsWith(".json");
+                boolean jsonFile = file.isFile() && file.getName().endsWith(JSON_SUFIX);
                 if (jsonFile) {
-                    found.add(file);
+                    result.put(file.getName().replaceAll("\\" + JSON_SUFIX, ""), file);
                 } else if (file.isDirectory()) {
-                    findJsonFiles(file, found, filter);
+                    findJsonFiles0(file, result, filter);
                 }
             }
         }
     }
 
     public static class CamelComponentsModelFilter implements FileFilter {
-
         @Override
         public boolean accept(File pathname) {
-            return pathname.isDirectory() || pathname.getName().endsWith(".json");
+            return pathname.isDirectory() || pathname.getName().endsWith(JSON_SUFIX);
         }
     }
 
@@ -164,16 +161,16 @@ public final class PackageHelper {
         public boolean accept(File pathname) {
             String name = pathname.getName();
             boolean special = "camel-core-osgi".equals(name)
-                || "camel-core-xml".equals(name)
-                || "camel-http-base".equals(name)
-                || "camel-http-common".equals(name)
-                || "camel-jetty-common".equals(name);
+                    || "camel-core-xml".equals(name)
+                    || "camel-http-base".equals(name)
+                    || "camel-http-common".equals(name)
+                    || "camel-jetty-common".equals(name);
             boolean special2 = "camel-as2".equals(name)
-                || "camel-box".equals(name)
-                || "camel-olingo2".equals(name)
-                || "camel-olingo4".equals(name)
-                || "camel-salesforce".equals(name)
-                || "camel-debezium-common".equals(name);
+                    || "camel-box".equals(name)
+                    || "camel-olingo2".equals(name)
+                    || "camel-olingo4".equals(name)
+                    || "camel-salesforce".equals(name)
+                    || "camel-debezium-common".equals(name);
             if (special || special2) {
                 return false;
             }
diff --git a/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/Strings.java b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/Strings.java
new file mode 100644
index 0000000..949df76
--- /dev/null
+++ b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/Strings.java
@@ -0,0 +1,328 @@
+/*
+ * 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.tooling.util;
+
+import java.util.Collection;
+
+/**
+ * Some String helper methods
+ */
+public final class Strings {
+
+    private Strings() {
+        //Helper class
+    }
+
+    public static boolean isEmpty(String s) {
+        return s == null || s.trim().isEmpty();
+    }
+
+    /**
+     * Returns true if the given text is null or empty string or has <tt>null</tt> as the value
+     */
+    public static boolean isNullOrEmpty(String text) {
+        return text == null || text.length() == 0 || "null".equals(text);
+    }
+
+    public static String safeNull(String text) {
+        if (isNullOrEmpty(text)) {
+            return "";
+        } else {
+            return text;
+        }
+    }
+
+    /**
+     * Returns the value or the defaultValue if it is null
+     */
+    public static String getOrElse(String text, String defaultValue) {
+        return (text != null) ? text : defaultValue;
+    }
+
+    /**
+     * Returns the string after the given token
+     *
+     * @param text  the text
+     * @param after the token
+     * @return the text after the token, or <tt>null</tt> if text does not contain the token
+     */
+    public static String after(String text, String after) {
+        int index = text.indexOf(after);
+        if (index < 0) {
+            return null;
+        }
+        return text.substring(index + after.length());
+    }
+
+    /**
+     * Returns the canonical class name by removing any generic type information.
+     */
+    public static String canonicalClassName(String className) {
+        // remove generics
+        int pos = className.indexOf('<');
+        if (pos != -1) {
+            return className.substring(0, pos);
+        } else {
+            return className;
+        }
+    }
+
+    /**
+     * Returns the text wrapped double quotes
+     */
+    public static String doubleQuote(String text) {
+        return quote(text, "\"");
+    }
+
+    /**
+     * Returns the text wrapped single quotes
+     */
+    public static String singleQuote(String text) {
+        return quote(text, "'");
+    }
+
+    /**
+     * Wraps the text in the given quote text
+     *
+     * @param text the text to wrap in quotes
+     * @param quote the quote text added to the prefix and postfix of the text
+     *
+     * @return the text wrapped in the given quotes
+     */
+    public static String quote(String text, String quote) {
+        return quote + text + quote;
+    }
+
+    /**
+     * Clips the text between the start and end markers
+     */
+    public static String between(String text, String after, String before) {
+        text = after(text, after);
+        if (text == null) {
+            return null;
+        }
+        return before(text, before);
+    }
+
+    /**
+     * Capitalizes the name as a title
+     *
+     * @param name  the name
+     * @return as a title
+     */
+    public static String asTitle(String name) {
+        StringBuilder sb = new StringBuilder();
+        for (char c : name.toCharArray()) {
+            boolean upper = Character.isUpperCase(c);
+            boolean first = sb.length() == 0;
+            if (first) {
+                sb.append(Character.toUpperCase(c));
+            } else if (upper) {
+                char prev = sb.charAt(sb.length() - 1);
+                if (!Character.isUpperCase(prev)) {
+                    // append space if previous is not upper
+                    sb.append(' ');
+                }
+                sb.append(c);
+            } else {
+                sb.append(Character.toLowerCase(c));
+            }
+        }
+        return sb.toString().trim();
+    }
+
+    public static String before(String text, String before) {
+        int index = text.indexOf(before);
+        if (index < 0) {
+            return null;
+        }
+        return text.substring(0, index);
+    }
+
+    public static String indentCollection(String indent, Collection<String> list) {
+        StringBuilder sb = new StringBuilder();
+        for (String text : list) {
+            sb.append(indent).append(text);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Converts the value to use title style instead of dash cased
+     */
+    public static String camelDashToTitle(String value) {
+        StringBuilder sb = new StringBuilder(value.length());
+        boolean dash = false;
+
+        for (char c : value.toCharArray()) {
+            if ('-' == c) {
+                dash = true;
+                continue;
+            }
+
+            if (dash) {
+                sb.append(' ');
+                sb.append(Character.toUpperCase(c));
+            } else {
+                // upper case first
+                if (sb.length() == 0) {
+                    sb.append(Character.toUpperCase(c));
+                } else {
+                    sb.append(c);
+                }
+            }
+            dash = false;
+        }
+        return sb.toString();
+    }
+
+    public static String cutLastZeroDigit(String version) {
+        String answer = version;
+        // cut last digit so its not 2.18.0 but 2.18
+        String[] parts = version.split("\\.");
+        if (parts.length == 3 && parts[2].equals("0")) {
+            answer = parts[0] + "." + parts[1];
+        }
+        return answer;
+    }
+
+    /**
+     * To wrap long camel cased texts by words.
+     *
+     * @param option  the option which is camel cased.
+     * @param watermark a watermark to denote the size to cut after
+     * @param lineSep the new line to use when breaking into a new line
+     */
+    public static String wrapCamelCaseWords(String option, int watermark, String lineSep) {
+        String text = option.replaceAll("(?=[A-Z][a-z])", " ");
+        text = wrapWords(text, "", lineSep, watermark, false);
+        return Character.toUpperCase(text.charAt(0)) + text.substring(1);
+    }
+
+    /**
+     * To wrap a big line by words.
+     * @param line the big line
+     * @param wordSep the word separator
+     * @param lineSep the new line to use when breaking into a new line
+     * @param watermark a watermark to denote the size to cut after
+     * @param wrapLongWords whether to wrap long words
+     */
+    public static String wrapWords(String line, String wordSep, String lineSep, int watermark, boolean wrapLongWords) {
+        if (line == null) {
+            return null;
+        } else {
+            if (lineSep == null) {
+                lineSep = System.lineSeparator();
+            }
+            if (wordSep == null) {
+                wordSep = "";
+            }
+
+            if (watermark < 1) {
+                watermark = 1;
+            }
+
+            int inputLineLength = line.length();
+            int offset = 0;
+            StringBuilder sb = new StringBuilder(inputLineLength + 32);
+            int currentLength = 0;
+            while (offset < inputLineLength) {
+                if (line.charAt(offset) == ' ') {
+                    offset++;
+                    continue;
+                }
+                int next = line.indexOf(' ', offset);
+                if (next < 0) {
+                    next = inputLineLength;
+                    if (wrapLongWords && inputLineLength - offset > watermark) {
+                        if (currentLength > 0) {
+                            sb.append(wordSep);
+                            currentLength += wordSep.length();
+                        }
+                        sb.append(line, offset, watermark - currentLength);
+                        sb.append(lineSep);
+                        offset += watermark - currentLength;
+                    }
+                }
+                if (currentLength + (currentLength > 0 ? wordSep.length() : 0) + next - offset <= watermark) {
+                    if (currentLength > 0) {
+                        sb.append(wordSep);
+                        currentLength += wordSep.length();
+                    }
+                    sb.append(line, offset, next);
+                    currentLength += next - offset;
+                    offset = next + 1;
+                } else {
+                    sb.append(lineSep);
+                    sb.append(line, offset, next);
+                    currentLength = next - offset;
+                    offset = next + 1;
+                }
+            }
+            /*
+            while (inputLineLength - offset > watermark) {
+                if (line.charAt(offset) == ' ') {
+                    ++offset;
+                } else {
+                    int spaceToWrapAt = line.lastIndexOf(' ', watermark + offset);
+                    int spaces = 0;
+                    for (int i = offset; i < spaceToWrapAt; i++) {
+                        spaces += line.charAt(i) == ' ' ? 1 : 0;
+                    }
+                    if (spaceToWrapAt >= offset) {
+                        sb.append(line, offset, spaceToWrapAt);
+                        sb.append(newLine);
+                        offset = spaceToWrapAt + 1;
+                    } else if (wrapLongWords) {
+                        sb.append(line, offset, watermark + offset);
+                        sb.append(newLine);
+                        offset += watermark;
+                    } else {
+                        spaceToWrapAt = line.indexOf(' ', watermark + offset);
+                        if (spaceToWrapAt >= 0) {
+                            sb.append(line, offset, spaceToWrapAt);
+                            sb.append(newLine);
+                            offset = spaceToWrapAt + 1;
+                        } else {
+                            sb.append(line, offset, line.length());
+                            offset = inputLineLength;
+                        }
+                    }
+                }
+            }
+
+            sb.append(line, offset, line.length());
+            */
+            return sb.toString();
+        }
+    }
+
+    /**
+     * Returns the base class name, i.e. without package and generic related
+     * information.
+     *
+     * @param className The class name which base class is to be computed.
+     * @return the base class name, i.e. without package and generic related
+     *         information.
+     */
+    public static String getClassShortName(String className) {
+        if (className != null) {
+            return className.replaceAll("<.*>", "").replaceAll(".*[.]([^.]+)", "$1");
+        }
+        return className;
+    }
+}
diff --git a/tooling/camel-tooling-util/src/main/resources/META-INF/LICENSE.txt b/tooling/camel-tooling-util/src/main/resources/META-INF/LICENSE.txt
new file mode 100644
index 0000000..6b0b127
--- /dev/null
+++ b/tooling/camel-tooling-util/src/main/resources/META-INF/LICENSE.txt
@@ -0,0 +1,203 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff --git a/tooling/camel-tooling-util/src/main/resources/META-INF/NOTICE.txt b/tooling/camel-tooling-util/src/main/resources/META-INF/NOTICE.txt
new file mode 100644
index 0000000..0291ff5
--- /dev/null
+++ b/tooling/camel-tooling-util/src/main/resources/META-INF/NOTICE.txt
@@ -0,0 +1,14 @@
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the Apache Camel distribution.                    ==
+   =========================================================================
+
+   This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).
+
+   This product includes software developed by
+   Clifton Labs (https://github.com/cliftonlabs/json-simple).
+
+   Please read the different LICENSE files present in the licenses directory of
+   this distribution.
diff --git a/tooling/apt/src/test/java/org/apache/camel/tools/apt/JsonSchemaHelperTest.java b/tooling/camel-tooling-util/src/test/java/org/apache/camel/tooling/util/JSonSchemaHelperTest.java
similarity index 94%
rename from tooling/apt/src/test/java/org/apache/camel/tools/apt/JsonSchemaHelperTest.java
rename to tooling/camel-tooling-util/src/test/java/org/apache/camel/tooling/util/JSonSchemaHelperTest.java
index 1c267c4..9839431 100644
--- a/tooling/apt/src/test/java/org/apache/camel/tools/apt/JsonSchemaHelperTest.java
+++ b/tooling/camel-tooling-util/src/test/java/org/apache/camel/tooling/util/JSonSchemaHelperTest.java
@@ -14,13 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.tools.apt;
+package org.apache.camel.tooling.util;
 
-import org.apache.camel.tools.apt.helper.JsonSchemaHelper;
+import org.apache.camel.tooling.util.JSonSchemaHelper;
 import org.junit.Assert;
 import org.junit.Test;
 
-public class JsonSchemaHelperTest {
+public class JSonSchemaHelperTest {
 
     private static final String JAVADOC = ""
         + "     * When in streaming mode, then the splitter splits the original message on-demand, and each splitted\n"
@@ -72,13 +72,13 @@ public class JsonSchemaHelperTest {
     @Test
     public void testSanitizeJavaDoc() throws Exception {
         String s = "* more memory. The total size is provided in the {@link org.apache.camel.Exchange#SPLIT_SIZE} header.";
-        String s2 = JsonSchemaHelper.sanitizeDescription(s, false);
+        String s2 = JSonSchemaHelper.sanitizeDescription(s, false);
         Assert.assertEquals("more memory. The total size is provided in the org.apache.camel.Exchange#SPLIT_SIZE header.", s2);
 
-        String out = JsonSchemaHelper.sanitizeDescription(JAVADOC, false);
+        String out = JSonSchemaHelper.sanitizeDescription(JAVADOC, false);
         Assert.assertEquals(EXPECTED_OUT, out);
 
-        String out2 = JsonSchemaHelper.sanitizeDescription(JAVADOC2, false);
+        String out2 = JSonSchemaHelper.sanitizeDescription(JAVADOC2, false);
         Assert.assertEquals(EXPECTED_OUT2, out2);
     }
 }
diff --git a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/test/java/org/apache/camel/maven/PackageHelperTest.java b/tooling/camel-tooling-util/src/test/java/org/apache/camel/tooling/util/PackageHelperTest.java
similarity index 94%
rename from tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/test/java/org/apache/camel/maven/PackageHelperTest.java
rename to tooling/camel-tooling-util/src/test/java/org/apache/camel/tooling/util/PackageHelperTest.java
index 4ff82c0..5342097 100644
--- a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/test/java/org/apache/camel/maven/PackageHelperTest.java
+++ b/tooling/camel-tooling-util/src/test/java/org/apache/camel/tooling/util/PackageHelperTest.java
@@ -14,11 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.maven;
+package org.apache.camel.tooling.util;
 
 import java.io.File;
 import java.util.Map;
 
+import org.apache.camel.tooling.util.PackageHelper;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
diff --git a/tooling/apt/src/test/java/org/apache/camel/tools/apt/StringsTest.java b/tooling/camel-tooling-util/src/test/java/org/apache/camel/tooling/util/ResourceUtils.java
similarity index 53%
rename from tooling/apt/src/test/java/org/apache/camel/tools/apt/StringsTest.java
rename to tooling/camel-tooling-util/src/test/java/org/apache/camel/tooling/util/ResourceUtils.java
index 0012ff5..152d3ca 100644
--- a/tooling/apt/src/test/java/org/apache/camel/tools/apt/StringsTest.java
+++ b/tooling/camel-tooling-util/src/test/java/org/apache/camel/tooling/util/ResourceUtils.java
@@ -14,25 +14,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.tools.apt;
+package org.apache.camel.tooling.util;
 
-import org.junit.Test;
+import java.io.File;
 
-import static org.apache.camel.tools.apt.helper.Strings.asTitle;
-import static org.apache.camel.tools.apt.helper.Strings.between;
-import static org.junit.Assert.assertEquals;
+public final class ResourceUtils {
 
-public class StringsTest {
-
-    @Test
-    public void testBetween() {
-        assertEquals("org.apache.camel.model.OnCompletionDefinition", between("java.util.List<org.apache.camel.model.OnCompletionDefinition>", "<", ">"));
+    private ResourceUtils() {
+        // noop
     }
 
-    @Test
-    public void testAsTitle() {
-        assertEquals("Broker URL", asTitle("brokerURL"));
-        assertEquals("Expose All Queues", asTitle("exposeAllQueues"));
-        assertEquals("Reply To Concurrent Consumers", asTitle("replyToConcurrentConsumers"));
+    public static File getResourceAsFile(String pathToFile) throws Exception {
+        return new File(ResourceUtils.class.getClassLoader().getResource(pathToFile).getFile());
     }
+
 }
diff --git a/tooling/camel-tooling-util/src/test/java/org/apache/camel/tooling/util/StringsTest.java b/tooling/camel-tooling-util/src/test/java/org/apache/camel/tooling/util/StringsTest.java
new file mode 100644
index 0000000..14f8e9f
--- /dev/null
+++ b/tooling/camel-tooling-util/src/test/java/org/apache/camel/tooling/util/StringsTest.java
@@ -0,0 +1,40 @@
+package org.apache.camel.tooling.util;
+
+import org.junit.Test;
+
+import static org.apache.camel.tooling.util.Strings.asTitle;
+import static org.apache.camel.tooling.util.Strings.between;
+import static org.junit.Assert.assertEquals;
+
+public class StringsTest {
+
+    @Test
+    public void testBetween() {
+        assertEquals("org.apache.camel.model.OnCompletionDefinition", between("java.util.List<org.apache.camel.model.OnCompletionDefinition>", "<", ">"));
+    }
+
+    @Test
+    public void testAsTitle() {
+        assertEquals("Broker URL", asTitle("brokerURL"));
+        assertEquals("Expose All Queues", asTitle("exposeAllQueues"));
+        assertEquals("Reply To Concurrent Consumers", asTitle("replyToConcurrentConsumers"));
+    }
+
+    @Test
+    public void testWrap() {
+        assertEquals("Hello WorldFoo Nar", wrap("HelloWorldFooNar", 8));
+        assertEquals("UseMessageIDAs CorrelationID", wrap("useMessageIDAsCorrelationID", 25));
+        assertEquals("ReplyToCacheLevelName", wrap("replyToCacheLevelName", 25));
+        assertEquals("AllowReplyManagerQuick Stop", wrap("allowReplyManagerQuickStop", 25));
+        assertEquals("AcknowledgementModeName", wrap("acknowledgementModeName", 25));
+        assertEquals("ReplyToCacheLevelName", wrap("replyToCacheLevelName", 25));
+        assertEquals("ReplyToOnTimeoutMax ConcurrentConsumers", wrap("replyToOnTimeoutMaxConcurrentConsumers", 25));
+        assertEquals("ReplyToOnTimeoutMax ConcurrentConsumers", wrap("replyToOnTimeoutMaxConcurrentConsumers", 23));
+        assertEquals("ReplyToMaxConcurrent Consumers", wrap("replyToMaxConcurrentConsumers", 23));
+
+    }
+
+    private String wrap(String str, int watermark) {
+        return Strings.wrapCamelCaseWords(str, watermark, " ");
+    }
+}
diff --git a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/test/resources/filecontent/a.txt b/tooling/camel-tooling-util/src/test/resources/filecontent/a.txt
similarity index 100%
rename from tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/test/resources/filecontent/a.txt
rename to tooling/camel-tooling-util/src/test/resources/filecontent/a.txt
diff --git a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/test/resources/json/a.json b/tooling/camel-tooling-util/src/test/resources/json/a.json
similarity index 100%
rename from tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/test/resources/json/a.json
rename to tooling/camel-tooling-util/src/test/resources/json/a.json
diff --git a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/test/resources/json/aop.json b/tooling/camel-tooling-util/src/test/resources/json/aop.json
similarity index 100%
rename from tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/test/resources/json/aop.json
rename to tooling/camel-tooling-util/src/test/resources/json/aop.json
diff --git a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/test/resources/json/b.json b/tooling/camel-tooling-util/src/test/resources/json/b.json
similarity index 100%
rename from tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/test/resources/json/b.json
rename to tooling/camel-tooling-util/src/test/resources/json/b.json
diff --git a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/test/resources/json/c.txt b/tooling/camel-tooling-util/src/test/resources/json/c.txt
similarity index 100%
rename from tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/test/resources/json/c.txt
rename to tooling/camel-tooling-util/src/test/resources/json/c.txt
diff --git a/tooling/maven/bom-generator-maven-plugin/pom.xml b/tooling/maven/bom-generator-maven-plugin/pom.xml
index e7e0965..7a8e30e 100644
--- a/tooling/maven/bom-generator-maven-plugin/pom.xml
+++ b/tooling/maven/bom-generator-maven-plugin/pom.xml
@@ -107,6 +107,10 @@
             <artifactId>log4j-slf4j-impl</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-tooling-util</artifactId>
+        </dependency>
 
     </dependencies>
 
diff --git a/tooling/maven/bom-generator-maven-plugin/src/main/java/org/apache/camel/maven/bom/generator/BomGeneratorMojo.java b/tooling/maven/bom-generator-maven-plugin/src/main/java/org/apache/camel/maven/bom/generator/BomGeneratorMojo.java
index d1735f4..bc1d346 100644
--- a/tooling/maven/bom-generator-maven-plugin/src/main/java/org/apache/camel/maven/bom/generator/BomGeneratorMojo.java
+++ b/tooling/maven/bom-generator-maven-plugin/src/main/java/org/apache/camel/maven/bom/generator/BomGeneratorMojo.java
@@ -18,12 +18,10 @@ package org.apache.camel.maven.bom.generator;
 
 import java.io.File;
 import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -48,7 +46,7 @@ import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-import org.apache.commons.io.IOUtils;
+import org.apache.camel.tooling.util.FileUtil;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.repository.ArtifactRepository;
@@ -120,7 +118,7 @@ public class BomGeneratorMojo extends AbstractMojo {
      * List of Remote Repositories used by the resolver
      */
     @Parameter(property = "project.remoteArtifactRepositories", readonly = true, required = true)
-    protected List remoteRepositories;
+    protected List<ArtifactRepository> remoteRepositories;
 
     /**
      * Location of the local repository.
@@ -185,7 +183,7 @@ public class BomGeneratorMojo extends AbstractMojo {
             }
         }
 
-        Collections.sort(outDependencies, (d1, d2) -> (d1.getGroupId() + ":" + d1.getArtifactId()).compareTo(d2.getGroupId() + ":" + d2.getArtifactId()));
+        outDependencies.sort(Comparator.comparing(d -> d.getGroupId() + ":" + d.getArtifactId()));
 
         return outDependencies;
     }
@@ -234,8 +232,6 @@ public class BomGeneratorMojo extends AbstractMojo {
 
         DOMSource source = new DOMSource(pom);
 
-        targetPom.getParentFile().mkdirs();
-
         String content;
         try (StringWriter out = new StringWriter()) {
             StreamResult result = new StreamResult(out);
@@ -245,36 +241,9 @@ public class BomGeneratorMojo extends AbstractMojo {
 
         // Fix header formatting problem
         content = content.replaceFirst("-->", "-->\n");
-        writeFileIfChanged(content, targetPom);
-    }
-
-    private void writeFileIfChanged(String content, File file) throws IOException {
-        boolean write = true;
-
-        if (file.exists()) {
-            try (FileReader fr = new FileReader(file)) {
-                String oldContent = IOUtils.toString(fr);
-                if (!content.equals(oldContent)) {
-                    getLog().info("File: " + file.getAbsolutePath() + " is updated");
-                    fr.close();
-                } else {
-                    getLog().info("File " + file.getAbsolutePath() + " is not changed");
-                    write = false;
-                }
-            }
-        } else {
-            File parent = file.getParentFile();
-            parent.mkdirs();
-        }
-
-        if (write) {
-            try (FileWriter fw = new FileWriter(file)) {
-                IOUtils.write(content, fw);
-            }
-        }
+        FileUtil.updateFile(targetPom.toPath(), content);
     }
 
-
     private void overwriteDependencyManagement(Document pom, List<Dependency> dependencies) throws Exception {
         XPath xpath = XPathFactory.newInstance().newXPath();
         XPathExpression expr = xpath.compile("/project/dependencyManagement/dependencies");
diff --git a/tooling/maven/camel-api-component-maven-plugin/pom.xml b/tooling/maven/camel-api-component-maven-plugin/pom.xml
index 4058371..143327b 100644
--- a/tooling/maven/camel-api-component-maven-plugin/pom.xml
+++ b/tooling/maven/camel-api-component-maven-plugin/pom.xml
@@ -46,6 +46,11 @@
     <dependencies>
 
         <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-tooling-util</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>org.apache.maven</groupId>
             <artifactId>maven-core</artifactId>
             <exclusions>
diff --git a/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/AbstractGeneratorMojo.java b/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/AbstractGeneratorMojo.java
index 92cf19c..85c8aa2 100644
--- a/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/AbstractGeneratorMojo.java
+++ b/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/AbstractGeneratorMojo.java
@@ -20,16 +20,13 @@ import java.io.File;
 import java.io.IOError;
 import java.io.IOException;
 import java.io.StringWriter;
-import java.io.Writer;
 import java.net.URL;
 import java.net.URLClassLoader;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Date;
-import java.util.Objects;
 import java.util.Properties;
 
+import org.apache.camel.tooling.util.FileUtil;
 import org.apache.camel.util.function.ThrowingHelper;
 import org.apache.maven.artifact.DependencyResolutionRequiredException;
 import org.apache.maven.plugin.AbstractMojo;
@@ -180,22 +177,7 @@ public abstract class AbstractGeneratorMojo extends AbstractMojo {
 
     public static void updateResource(BuildContext buildContext, Path out, String data) {
         try {
-            if (data == null) {
-                if (Files.isRegularFile(out)) {
-                    Files.delete(out);
-                    refresh(buildContext, out);
-                }
-            } else {
-                if (Files.isRegularFile(out) && Files.isReadable(out)) {
-                    String content = new String(Files.readAllBytes(out), StandardCharsets.UTF_8);
-                    if (Objects.equals(content, data)) {
-                        return;
-                    }
-                }
-                Files.createDirectories(out.getParent());
-                try (Writer w = Files.newBufferedWriter(out, StandardCharsets.UTF_8)) {
-                    w.append(data);
-                }
+            if (FileUtil.updateFile(out, data)) {
                 refresh(buildContext, out);
             }
         } catch (IOException e) {
diff --git a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/pom.xml b/tooling/maven/camel-eip-documentation-enricher-maven-plugin/pom.xml
index d706560..6af52fc 100644
--- a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/pom.xml
+++ b/tooling/maven/camel-eip-documentation-enricher-maven-plugin/pom.xml
@@ -82,6 +82,14 @@
             <artifactId>camel-core</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-util-json</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-tooling-util</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
             <version>${commons-lang3-version}</version>
diff --git a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/DocumentationEnricher.java b/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/DocumentationEnricher.java
index 12d528d..e6cfd0a 100644
--- a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/DocumentationEnricher.java
+++ b/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/DocumentationEnricher.java
@@ -28,6 +28,7 @@ import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
 import org.apache.camel.support.JSonSchemaHelper;
+import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.text.WordUtils;
 import org.apache.maven.plugin.logging.Log;
diff --git a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/EipDocumentationEnricherMojo.java b/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/EipDocumentationEnricherMojo.java
index 11e8500..d440a20 100644
--- a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/EipDocumentationEnricherMojo.java
+++ b/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/EipDocumentationEnricherMojo.java
@@ -36,6 +36,7 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
+import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.camel.util.FileUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.plugin.AbstractMojo;
diff --git a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/PackageHelper.java b/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/PackageHelper.java
deleted file mode 100644
index 76268c9..0000000
--- a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/PackageHelper.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.maven;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Utility class to find, read json files.
- */
-public final class PackageHelper {
-
-    private PackageHelper() {
-    }
-
-    public static String fileToString(File file) throws IOException {
-        byte[] encoded = Files.readAllBytes(Paths.get(file.toURI()));
-        return new String(encoded, Charset.defaultCharset());
-    }
-
-    public static Map<String, File> findJsonFiles(File rootDir) {
-        Map<String, File> results = new HashMap<>();
-        findJsonFiles0(rootDir, results, new CamelComponentsModelFilter());
-        return results;
-    }
-
-    private static void findJsonFiles0(File dir, Map<String, File> result, FileFilter filter) {
-        File[] files = dir.listFiles(filter);
-        if (files != null) {
-            for (File file : files) {
-                // skip files in root dirs as Camel does not store information there but others may do
-                boolean jsonFile = file.isFile() && file.getName().endsWith(Constants.JSON_SUFIX);
-                if (jsonFile) {
-                    result.put(file.getName().replaceAll("\\" + Constants.JSON_SUFIX, ""), file);
-                } else if (file.isDirectory()) {
-                    findJsonFiles0(file, result, filter);
-                }
-            }
-        }
-    }
-
-    private static class CamelComponentsModelFilter implements FileFilter {
-        @Override
-        public boolean accept(File pathname) {
-            return pathname.isDirectory() || pathname.getName().endsWith(Constants.JSON_SUFIX);
-        }
-    }
-}
diff --git a/tooling/maven/camel-main-package-maven-plugin/pom.xml b/tooling/maven/camel-main-package-maven-plugin/pom.xml
index ba676ad..690ba37 100644
--- a/tooling/maven/camel-main-package-maven-plugin/pom.xml
+++ b/tooling/maven/camel-main-package-maven-plugin/pom.xml
@@ -88,6 +88,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
+            <artifactId>camel-tooling-util</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
             <artifactId>camel-util-json</artifactId>
         </dependency>
 
diff --git a/tooling/maven/camel-main-package-maven-plugin/src/main/java/org/apache/camel/maven/PrepareCamelMainMojo.java b/tooling/maven/camel-main-package-maven-plugin/src/main/java/org/apache/camel/maven/PrepareCamelMainMojo.java
index 3b04d36..819d513 100644
--- a/tooling/maven/camel-main-package-maven-plugin/src/main/java/org/apache/camel/maven/PrepareCamelMainMojo.java
+++ b/tooling/maven/camel-main-package-maven-plugin/src/main/java/org/apache/camel/maven/PrepareCamelMainMojo.java
@@ -17,7 +17,6 @@
 package org.apache.camel.maven;
 
 import java.io.File;
-import java.io.FileOutputStream;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.LinkedHashMap;
@@ -26,7 +25,7 @@ import java.util.Map;
 
 import org.apache.camel.main.parser.ConfigurationModel;
 import org.apache.camel.main.parser.MainConfigurationParser;
-import org.apache.camel.util.StringHelper;
+import org.apache.camel.tooling.util.FileUtil;
 import org.apache.camel.util.json.Jsoner;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -83,7 +82,7 @@ public class PrepareCamelMainMojo extends AbstractMojo {
                     prefix = "camel.main.";
                 }
                 final String namePrefix = prefix;
-                model.stream().forEach(m -> m.setName(namePrefix + m.getName()));
+                model.forEach(m -> m.setName(namePrefix + m.getName()));
                 data.addAll(model);
             } catch (Exception e) {
                 throw new MojoFailureException("Error parsing file " + file + " due " + e.getMessage(), e);
@@ -94,7 +93,7 @@ public class PrepareCamelMainMojo extends AbstractMojo {
         File restConfig = new File(buildDir, "../../camel-api/src/main/java/org/apache/camel/spi/RestConfiguration.java");
         try {
             List<ConfigurationModel> model = parser.parseConfigurationSource(restConfig);
-            model.stream().forEach(m -> m.setName("camel.rest." + m.getName()));
+            model.forEach(m -> m.setName("camel.rest." + m.getName()));
             data.addAll(model);
         } catch (Exception e) {
             throw new MojoFailureException("Error parsing file " + restConfig + " due " + e.getMessage(), e);
@@ -112,16 +111,15 @@ public class PrepareCamelMainMojo extends AbstractMojo {
         });
 
         if (!data.isEmpty()) {
-            List list = new ArrayList();
-            for (int i = 0; i < data.size(); i++) {
-                ConfigurationModel row = data.get(i);
+            List<Object> list = new ArrayList<>();
+            for (ConfigurationModel row : data) {
                 String name = camelCaseToDash(row.getName());
                 String javaType = row.getJavaType();
                 String desc = sanitizeDescription(row.getDescription(), false);
                 String sourceType = row.getSourceType();
                 String defaultValue = row.getDefaultValue();
 
-                Map p = new LinkedHashMap();
+                Map<String, Object> p = new LinkedHashMap<>();
                 p.put("name", name);
                 p.put("type", javaType);
                 p.put("sourceType", sourceType);
@@ -136,20 +134,20 @@ public class PrepareCamelMainMojo extends AbstractMojo {
                 list.add(p);
             }
 
-            List groups = new ArrayList();
-            Map group1 = new LinkedHashMap();
+            List<Object> groups = new ArrayList<>();
+            Map<String, Object> group1 = new LinkedHashMap<>();
             group1.put("name", "camel.main");
             group1.put("description", "camel-main configurations.");
             group1.put("sourceType", "org.apache.camel.main.DefaultConfigurationProperties");
-            Map group2 = new LinkedHashMap();
+            Map<String, Object> group2 = new LinkedHashMap<>();
             group2.put("name", "camel.hystrix");
             group2.put("description", "camel-hystrix configurations.");
             group2.put("sourceType", "org.apache.camel.main.HystrixConfigurationProperties");
-            Map group3 = new LinkedHashMap();
+            Map<String, Object> group3 = new LinkedHashMap<>();
             group3.put("name", "camel.resilience4j");
             group3.put("description", "camel-resilience4j configurations.");
             group3.put("sourceType", "org.apache.camel.main.Resilience4jConfigurationProperties");
-            Map group4 = new LinkedHashMap();
+            Map<String, Object> group4 = new LinkedHashMap<>();
             group4.put("name", "camel.rest");
             group4.put("description", "camel-rest configurations.");
             group4.put("sourceType", "org.apache.camel.spi.RestConfiguration");
@@ -158,20 +156,16 @@ public class PrepareCamelMainMojo extends AbstractMojo {
             groups.add(group3);
             groups.add(group4);
 
-            Map map = new LinkedHashMap();
+            Map<String, Object> map = new LinkedHashMap<>();
             map.put("groups", groups);
             map.put("properties", list);
 
             String json = Jsoner.serialize(map);
             json = Jsoner.prettyPrint(json);
 
-            outFolder.mkdirs();
             File file = new File(outFolder, "camel-main-configuration-metadata.json");
             try {
-                FileOutputStream fos = new FileOutputStream(file, false);
-                fos.write(json.getBytes());
-                fos.close();
-                getLog().info("Created file: " + file);
+                FileUtil.updateFile(file.toPath(), json);
             } catch (Throwable e) {
                 throw new MojoFailureException("Cannot write to file " + file + " due " + e.getMessage(), e);
             }
diff --git a/tooling/maven/camel-package-maven-plugin/pom.xml b/tooling/maven/camel-package-maven-plugin/pom.xml
index 4b4cf6f..088a435 100644
--- a/tooling/maven/camel-package-maven-plugin/pom.xml
+++ b/tooling/maven/camel-package-maven-plugin/pom.xml
@@ -49,7 +49,10 @@
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-util-json</artifactId>
-            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-tooling-util</artifactId>
         </dependency>
 
         <dependency>
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGeneratorMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGeneratorMojo.java
index 82c00e3..ab4a90f 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGeneratorMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/AbstractGeneratorMojo.java
@@ -16,16 +16,16 @@
  */
 package org.apache.camel.maven.packaging;
 
+import java.io.File;
 import java.io.IOError;
 import java.io.IOException;
-import java.io.Writer;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Collections;
-import java.util.Objects;
 
+import org.apache.camel.tooling.util.FileUtil;
+import org.apache.maven.model.Resource;
 import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
@@ -96,22 +96,7 @@ public abstract class AbstractGeneratorMojo extends AbstractMojo {
 
     public static void updateResource(BuildContext buildContext, Path out, String data) {
         try {
-            if (data == null) {
-                if (Files.isRegularFile(out)) {
-                    Files.delete(out);
-                    refresh(buildContext, out);
-                }
-            } else {
-                if (Files.isRegularFile(out) && Files.isReadable(out)) {
-                    String content = new String(Files.readAllBytes(out), StandardCharsets.UTF_8);
-                    if (Objects.equals(content, data)) {
-                        return;
-                    }
-                }
-                Files.createDirectories(out.getParent());
-                try (Writer w = Files.newBufferedWriter(out, StandardCharsets.UTF_8)) {
-                    w.append(data);
-                }
+            if (FileUtil.updateFile(out, data)) {
                 refresh(buildContext, out);
             }
         } catch (IOException e) {
@@ -119,4 +104,23 @@ public abstract class AbstractGeneratorMojo extends AbstractMojo {
         }
     }
 
+    public static boolean haveResourcesChanged(Log log, MavenProject project, BuildContext buildContext, String suffix) {
+        String baseDir = project.getBasedir().getAbsolutePath();
+        for (Resource r : project.getBuild().getResources()) {
+            File file = new File(r.getDirectory());
+            if (file.isAbsolute()) {
+                file = new File(r.getDirectory().substring(baseDir.length() + 1));
+            }
+            String path = file.getPath() + "/" + suffix;
+            if (log.isDebugEnabled()) {
+                log.debug("Checking  if " + path + " (" + r.getDirectory() + "/" + suffix + ") has changed.");
+            }
+            if (buildContext.hasDelta(path)) {
+                log.debug("Indeed " + suffix + " has changed.");
+                return true;
+            }
+        }
+        return false;
+    }
+
 }
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java
index 3cec9ca..aa7ea71 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java
@@ -17,7 +17,6 @@
 package org.apache.camel.maven.packaging;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOError;
 import java.io.IOException;
@@ -56,10 +55,14 @@ import org.apache.camel.maven.packaging.srcgen.GenericType;
 import org.apache.camel.maven.packaging.srcgen.GenericType.BoundType;
 import org.apache.camel.maven.packaging.srcgen.JavaClass;
 import org.apache.camel.maven.packaging.srcgen.Method;
+import org.apache.camel.tooling.util.JSonSchemaHelper;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriParams;
 import org.apache.camel.spi.UriPath;
+import org.apache.camel.tooling.util.PackageHelper;
+
+import org.apache.camel.tooling.util.Strings;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -68,12 +71,11 @@ import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.project.MavenProject;
-import org.jboss.forge.roaster.model.util.Strings;
 
 import static org.apache.camel.maven.packaging.AbstractGeneratorMojo.updateResource;
-import static org.apache.camel.maven.packaging.JSonSchemaHelper.getSafeValue;
-import static org.apache.camel.maven.packaging.PackageHelper.findCamelDirectory;
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.JSonSchemaHelper.getSafeValue;
+import static org.apache.camel.tooling.util.PackageHelper.findCamelDirectory;
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
 
 /**
  * Generate Endpoint DSL source files for Components.
@@ -140,7 +142,7 @@ public class EndpointDslMojo extends AbstractMojo {
             outputDir = findCamelDirectory(baseDir, "core/camel-endpointdsl/src/main/java");
         }
 
-        Map<File, Supplier<String>> files = PackageHelper.findJsonFiles(buildDir, p -> p.isDirectory() || p.getName().endsWith(".json")).stream()
+        Map<File, Supplier<String>> files = PackageHelper.findJsonFiles(buildDir, p -> p.isDirectory() || p.getName().endsWith(".json")).values().stream()
             .collect(Collectors.toMap(Function.identity(), s -> cache(() -> loadJson(s))));
 
         // generate component endpoint DSL files and write them
@@ -154,8 +156,8 @@ public class EndpointDslMojo extends AbstractMojo {
     }
 
     private static String loadJson(File file) {
-        try (InputStream is = new FileInputStream(file)) {
-            return loadText(is);
+        try {
+            return loadText(file);
         } catch (IOException e) {
             throw new IOError(e);
         }
@@ -319,7 +321,7 @@ public class EndpointDslMojo extends AbstractMojo {
         generateDummyClass(packageName + ".T");
 
         String doc = "Generated by camel-package-maven-plugin - do not edit this file!";
-        if (!Strings.isBlank(model.getDescription())) {
+        if (!Strings.isEmpty(model.getDescription())) {
             doc = model.getDescription() + "\n\n" + doc;
         }
         javaClass.getJavaDoc().setText(doc);
@@ -380,7 +382,7 @@ public class EndpointDslMojo extends AbstractMojo {
                 if ("true".equals(option.getDeprecated())) {
                     fluent.addAnnotation(Deprecated.class);
                 }
-                if (!Strings.isBlank(option.getDescription())) {
+                if (!Strings.isEmpty(option.getDescription())) {
                     String desc = option.getDescription();
                     if (!desc.endsWith(".")) {
                         desc += ".";
@@ -408,7 +410,7 @@ public class EndpointDslMojo extends AbstractMojo {
                     if ("true".equals(option.getDeprecated())) {
                         fluent.addAnnotation(Deprecated.class);
                     }
-                    if (!Strings.isBlank(option.getDescription())) {
+                    if (!Strings.isEmpty(option.getDescription())) {
                         String desc = option.getDescription();
                         if (!desc.endsWith(".")) {
                             desc += ".";
@@ -487,7 +489,7 @@ public class EndpointDslMojo extends AbstractMojo {
         final List<File> allComponentsDslEndpointFactories = loadAllComponentsDslEndpointFactoriesAsFile();
 
         CompilationUnit endpointBuilderUnit = new CompilationUnit();
-        endpointBuilderUnit.setPackageDeclaration(StringHelper.before(packageName, ".dsl"));
+        endpointBuilderUnit.setPackageDeclaration(Strings.before(packageName, ".dsl"));
         endpointBuilderUnit.addImport("java.util.List");
         endpointBuilderUnit.addImport("java.util.stream.Collectors");
         endpointBuilderUnit.addImport("java.util.stream.Stream");
@@ -579,7 +581,7 @@ public class EndpointDslMojo extends AbstractMojo {
         final List<File> allComponentsDslEndpointFactories = loadAllComponentsDslEndpointFactoriesAsFile();
 
         CompilationUnit endpointBuilderUnit = new CompilationUnit();
-        endpointBuilderUnit.setPackageDeclaration(StringHelper.before(packageName, ".dsl"));
+        endpointBuilderUnit.setPackageDeclaration(Strings.before(packageName, ".dsl"));
 
         endpointBuilderUnit.addOrphanComment(new LineComment("CHECKSTYLE:OFF"));
 
@@ -703,24 +705,20 @@ public class EndpointDslMojo extends AbstractMojo {
                     desc += " <strong>deprecated</strong>";
                 }
                 desc += "\n" + option.getDescription();
-                if (!StringHelper.isEmpty(option.getDefaultValue())) {
+                if (!Strings.isEmpty(option.getDefaultValue())) {
                     desc += "\nDefault value: " + option.getDefaultValue();
                 }
-                if (!StringHelper.isEmpty(option.getEnumValues())) {
-                    desc += "\nThe value can be one of: " + wrapEnumValues(option.getEnumValues(), 120);
+                if (!Strings.isEmpty(option.getEnumValues())) {
+                    desc += "\nThe value can be one of: " + wrapEnumValues(option.getEnumValues());
                 }
             }
         }
         return desc;
     }
 
-    private String wrapEnumValues(String enumValues, int watermark) {
+    private String wrapEnumValues(String enumValues) {
         // comma to space so we can wrap words (which uses space)
-        String text = enumValues.replace(',', ' ');
-        String wrapped = StringHelper.wrapWords(text, "\n", watermark, true);
-        // back to comma again
-        wrapped = wrapped.replaceAll("\\s", ", ");
-        return wrapped;
+        return enumValues.replaceAll(",",", ");
     }
 
     private String getEndpointName(String type) {
@@ -766,11 +764,11 @@ public class EndpointDslMojo extends AbstractMojo {
             for (Field f : cl.getDeclaredFields()) {
                 String n = f.getName();
                 UriPath path = f.getAnnotation(UriPath.class);
-                if (path != null && !Strings.isBlank(path.name())) {
+                if (path != null && !Strings.isEmpty(path.name())) {
                     n = path.name();
                 }
                 UriParam param = f.getAnnotation(UriParam.class);
-                if (param != null && !Strings.isBlank(param.name())) {
+                if (param != null && !Strings.isEmpty(param.name())) {
                     n = param.name();
                 }
                 if (n.equals(option.getName())) {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/JSonSchemaHelper.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/JSonSchemaHelper.java
deleted file mode 100644
index 7638755..0000000
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/JSonSchemaHelper.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.maven.packaging;
-
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import org.apache.camel.util.json.JsonObject;
-import org.apache.camel.util.json.Jsoner;
-
-public final class JSonSchemaHelper {
-
-    private JSonSchemaHelper() {
-    }
-
-    /**
-     * 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
-     */
-    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<String, String> 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
-            .replaceAll("\\\\r", "\\\\\\r")
-            .replaceAll("\\\\n", "\\\\\\n")
-            .replaceAll("\\\\t", "\\\\\\t");
-    }
-
-    /**
-     * Gets the value with the key in a safe way, eg returning an empty string if there was no value for the key.
-     */
-    public static String getSafeValue(String key, List<Map<String, String>> rows) {
-        for (Map<String, String> row : rows) {
-            String value = row.get(key);
-            if (value != null) {
-                return value;
-            }
-        }
-        return "";
-    }
-
-    /**
-     * Gets the value with the key in a safe way, eg returning an empty string if there was no value for the key.
-     */
-    public static String getSafeValue(String key, Map<String, String> rows) {
-        String value = rows.get(key);
-        if (value != null) {
-            return value;
-        }
-        return "";
-    }
-
-    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.equals(row.get("name"));
-            }
-            if (row.containsKey("defaultValue")) {
-                defaultValue = row.get("defaultValue");
-            }
-            if (found) {
-                return defaultValue;
-            }
-        }
-        return null;
-    }
-
-    public static String getPropertyDescriptionValue(List<Map<String, String>> rows, String name) {
-        for (Map<String, String> row : rows) {
-            String description = null;
-            boolean found = false;
-            if (row.containsKey("name")) {
-                found = name.equals(row.get("name"));
-            }
-            if (row.containsKey("description")) {
-                description = row.get("description");
-            }
-            if (found) {
-                return description;
-            }
-        }
-        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.equals(row.get("name"));
-            }
-            if (row.containsKey("javaType")) {
-                javaType = row.get("javaType");
-            }
-            if (found) {
-                return javaType;
-            }
-        }
-        return null;
-    }
-
-    public static String getPropertyType(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.equals(row.get("name"));
-            }
-            if (row.containsKey("type")) {
-                type = row.get("type");
-            }
-            if (found) {
-                return type;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageArchetypeCatalogMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageArchetypeCatalogMojo.java
index b09cb74..77d44b3 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageArchetypeCatalogMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageArchetypeCatalogMojo.java
@@ -35,8 +35,8 @@ import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 
-import static org.apache.camel.maven.packaging.PackageHelper.findCamelDirectory;
-import static org.apache.camel.maven.packaging.StringHelper.between;
+import static org.apache.camel.tooling.util.Strings.between;
+import static org.apache.camel.tooling.util.PackageHelper.findCamelDirectory;
 
 /**
  * Creates the Maven catalog for the Camel archetypes
@@ -192,7 +192,7 @@ public class PackageArchetypeCatalogMojo extends AbstractMojo {
 
                     List<String> includes = new ArrayList<>();
                     includes.add("archetype-catalog.xml");
-                    projectHelper.addResource(project, outDir.getPath(), includes, new ArrayList<String>());
+                    projectHelper.addResource(project, outDir.getPath(), includes, new ArrayList<>());
                     projectHelper.attachArtifact(project, "xml", "archetype-catalog", out);
                 }
             } catch (Exception e) {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageComponentMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageComponentMojo.java
index fb1253d..fd13e18 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageComponentMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageComponentMojo.java
@@ -17,13 +17,14 @@
 package org.apache.camel.maven.packaging;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
+import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.logging.Log;
@@ -33,7 +34,7 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 import org.sonatype.plexus.build.incremental.BuildContext;
 
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
 
 /**
  * Analyses the Camel plugins in a project and generates extra descriptor information for easier auto-discovery in Camel.
@@ -75,7 +76,7 @@ public class PackageComponentMojo extends AbstractGeneratorMojo {
             projectHelper.addResource(project, componentOutDir.getPath(), Collections.singletonList("**/component.properties"), Collections.emptyList());
         }
 
-        if (!PackageHelper.haveResourcesChanged(log, project, buildContext, "META-INF/services/org/apache/camel/component")) {
+        if (!haveResourcesChanged(log, project, buildContext, "META-INF/services/org/apache/camel/component")) {
             return 0;
         }
 
@@ -125,15 +126,15 @@ public class PackageComponentMojo extends AbstractGeneratorMojo {
     }
 
     private static void enrichComponentJsonFiles(Log log, MavenProject project, File buildDir, Set<String> components) throws MojoExecutionException {
-        final Set<File> files = PackageHelper.findJsonFiles(buildDir, p -> p.isDirectory() || p.getName().endsWith(".json"));
+        final Map<String, File> files = PackageHelper.findJsonFiles(buildDir, p -> p.isDirectory() || p.getName().endsWith(".json"));
 
-        for (File file : files) {
+        for (File file : files.values()) {
             // clip the .json suffix
             String name = file.getName().substring(0, file.getName().length() - 5);
             if (components.contains(name)) {
                 log.debug("Enriching component: " + name);
                 try {
-                    String text = loadText(new FileInputStream(file));
+                    String text = loadText(file);
                     text = text.replace("@@@DESCRIPTION@@@", project.getDescription());
                     text = text.replace("@@@GROUPID@@@", project.getGroupId());
                     text = text.replace("@@@ARTIFACTID@@@", project.getArtifactId());
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java
index ffdffb5..cba5a22 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageDataFormatMojo.java
@@ -17,15 +17,14 @@
 package org.apache.camel.maven.packaging;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.nio.file.Path;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.camel.tooling.util.JSonSchemaHelper;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.logging.Log;
@@ -35,10 +34,10 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 import org.sonatype.plexus.build.incremental.BuildContext;
 
-import static org.apache.camel.maven.packaging.PackageHelper.after;
-import static org.apache.camel.maven.packaging.PackageHelper.findCamelCoreDirectory;
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
-import static org.apache.camel.maven.packaging.PackageHelper.parseAsMap;
+import static org.apache.camel.tooling.util.PackageHelper.after;
+import static org.apache.camel.tooling.util.PackageHelper.findCamelCoreDirectory;
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.PackageHelper.parseAsMap;
 
 /**
  * Analyses the Camel plugins in a project and generates extra descriptor information for easier auto-discovery in Camel.
@@ -81,7 +80,7 @@ public class PackageDataFormatMojo extends AbstractGeneratorMojo {
             projectHelper.addResource(project, dataFormatOutDir.getPath(), Collections.singletonList("**/dataformat.properties"), Collections.emptyList());
         }
 
-        if (!PackageHelper.haveResourcesChanged(log, project, buildContext, "META-INF/services/org/apache/camel/dataformat")) {
+        if (!haveResourcesChanged(log, project, buildContext, "META-INF/services/org/apache/camel/dataformat")) {
             return 0;
         }
 
@@ -122,8 +121,7 @@ public class PackageDataFormatMojo extends AbstractGeneratorMojo {
                         String javaType = entry.getValue();
                         String modelName = asModelName(name);
 
-                        InputStream is = new FileInputStream(new File(core, "target/classes/org/apache/camel/model/dataformat/" + modelName + ".json"));
-                        String json = loadText(is);
+                        String json = loadText(new File(core, "target/classes/org/apache/camel/model/dataformat/" + modelName + ".json"));
 
                         DataFormatModel dataFormatModel = extractDataFormatModel(project, json, modelName, name, javaType);
                         if (log.isDebugEnabled()) {
@@ -173,7 +171,7 @@ public class PackageDataFormatMojo extends AbstractGeneratorMojo {
         return count;
     }
 
-    private static DataFormatModel extractDataFormatModel(MavenProject project, String json, String modelName, String name, String javaType) throws Exception {
+    private static DataFormatModel extractDataFormatModel(MavenProject project, String json, String modelName, String name, String javaType) {
         DataFormatModel dataFormatModel = new DataFormatModel();
         dataFormatModel.setName(name);
         dataFormatModel.setTitle("");
@@ -243,7 +241,6 @@ public class PackageDataFormatMojo extends AbstractGeneratorMojo {
         String jsonGson = "\"enum\": [ \"Gson\", \"Jackson\", \"Johnzon\", \"XStream\", \"Fastjson\" ], \"deprecated\": \"false\", \"secret\": \"false\", \"defaultValue\": \"Gson\"";
         String jsonJackson = "\"enum\": [ \"Gson\", \"Jackson\", \"Johnzon\", \"XStream\", \"Fastjson\" ], \"deprecated\": \"false\", \"secret\": \"false\", \"defaultValue\": \"Jackson\"";
         String jsonJohnzon = "\"enum\": [ \"Gson\", \"Jackson\", \"Johnzon\", \"XStream\", \"Fastjson\" ], \"deprecated\": \"false\", \"secret\": \"false\", \"defaultValue\": \"Johnzon\"";
-        String jsonXStream = "\"enum\": [ \"Gson\", \"Jackson\", \"Johnzon\", \"XStream\", \"Fastjson\" ], \"deprecated\": \"false\", \"secret\": \"false\", \"defaultValue\": \"XStream\"";
         String jsonFastjson = "\"enum\": [ \"Gson\", \"Jackson\", \"Johnzon\", \"XStream\", \"Fastjson\" ], \"deprecated\": \"false\", \"secret\": \"false\", \"defaultValue\": \"Fastjson\"";
 
         if ("json-gson".equals(name)) {
@@ -252,8 +249,6 @@ public class PackageDataFormatMojo extends AbstractGeneratorMojo {
             properties = properties.replace(json, jsonJackson);
         } else if ("json-johnzon".equals(name)) {
             properties = properties.replace(json, jsonJohnzon);
-        } else if ("json-xstream".equals(name)) {
-            properties = properties.replace(json, jsonXStream);
         } else if ("json-fastjson".equals(name)) {
             properties = properties.replace(json, jsonFastjson);
         }
@@ -300,7 +295,7 @@ public class PackageDataFormatMojo extends AbstractGeneratorMojo {
 
         // find out the javaType for each data format
         try {
-            String text = loadText(new FileInputStream(file));
+            String text = loadText(file);
             Map<String, String> map = parseAsMap(text);
             return map.get("class");
         } catch (IOException e) {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java
index c928b439..586ea9f 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageLanguageMojo.java
@@ -17,15 +17,15 @@
 package org.apache.camel.maven.packaging;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.nio.file.Path;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.camel.tooling.util.JSonSchemaHelper;
+import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.logging.Log;
@@ -35,10 +35,10 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 import org.sonatype.plexus.build.incremental.BuildContext;
 
-import static org.apache.camel.maven.packaging.PackageHelper.after;
-import static org.apache.camel.maven.packaging.PackageHelper.findCamelCoreDirectory;
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
-import static org.apache.camel.maven.packaging.PackageHelper.parseAsMap;
+import static org.apache.camel.tooling.util.PackageHelper.after;
+import static org.apache.camel.tooling.util.PackageHelper.findCamelCoreDirectory;
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.PackageHelper.parseAsMap;
 
 /**
  * Analyses the Camel plugins in a project and generates extra descriptor information for easier auto-discovery in Camel.
@@ -87,7 +87,7 @@ public class PackageLanguageMojo extends AbstractGeneratorMojo {
             projectHelper.addResource(project, languageOutDir.getPath(), Collections.singletonList("**/language.properties"), Collections.emptyList());
         }
 
-        if (!PackageHelper.haveResourcesChanged(log, project, buildContext, "META-INF/services/org/apache/camel/language")) {
+        if (!haveResourcesChanged(log, project, buildContext, "META-INF/services/org/apache/camel/language")) {
             return 0;
         }
 
@@ -140,8 +140,7 @@ public class PackageLanguageMojo extends AbstractGeneratorMojo {
                         languageModel.setArtifactId(project.getArtifactId());
                         languageModel.setVersion(project.getVersion());
 
-                        InputStream is = new FileInputStream(new File(core, "src/main/schema/" + modelName + ".json"));
-                        String json = loadText(is);
+                        String json = loadText(new File(core, "src/main/schema/" + modelName + ".json"));
                         List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("model", json, false);
                         for (Map<String, String> row : rows) {
                             if (row.containsKey("title")) {
@@ -237,7 +236,7 @@ public class PackageLanguageMojo extends AbstractGeneratorMojo {
 
         // find out the javaType for each data format
         try {
-            String text = loadText(new FileInputStream(file));
+            String text = loadText(file);
             Map<String, String> map = parseAsMap(text);
             return map.get("class");
         } catch (IOException e) {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageModelMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageModelMojo.java
index 5e3f89f..6084520 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageModelMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageModelMojo.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.Mojo;
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java
index 6b44ce8..3cfb72e 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PackageOtherMojo.java
@@ -29,7 +29,7 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 import org.sonatype.plexus.build.incremental.BuildContext;
 
-import static org.apache.camel.maven.packaging.StringHelper.camelDashToTitle;
+import static org.apache.camel.tooling.util.Strings.camelDashToTitle;
 
 /**
  * Analyses the Camel plugins in a project and generates extra descriptor information for easier auto-discovery in Camel.
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogKarafMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogKarafMojo.java
index 82573e1..a0c5c84 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogKarafMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogKarafMojo.java
@@ -19,14 +19,12 @@ package org.apache.camel.maven.packaging;
 import java.io.File;
 import java.io.FileFilter;
 import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.channels.FileChannel;
-import java.util.ArrayList;
-import java.util.Collections;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Collection;
 import java.util.LinkedHashSet;
-import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
 
@@ -37,6 +35,7 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
+import org.apache.camel.tooling.util.FileUtil;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -46,7 +45,7 @@ import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
 import static org.w3c.dom.Node.ELEMENT_NODE;
 
 /**
@@ -55,8 +54,6 @@ import static org.w3c.dom.Node.ELEMENT_NODE;
 @Mojo(name = "prepare-catalog-karaf", threadSafe = true)
 public class PrepareCatalogKarafMojo extends AbstractMojo {
 
-    public static final int BUFFER_SIZE = 128 * 1024;
-
     /**
      * The maven project.
      */
@@ -184,44 +181,10 @@ public class PrepareCatalogKarafMojo extends AbstractMojo {
         getLog().info("Found " + componentFiles.size() + " component.properties files");
         getLog().info("Found " + jsonFiles.size() + " component json files");
 
-        // make sure to create out dir
-        componentsOutDir.mkdirs();
-
-        for (File file : jsonFiles) {
-            File to = new File(componentsOutDir, file.getName());
-            try {
-                copyFile(file, to);
-            } catch (IOException e) {
-                throw new MojoFailureException("Cannot copy file from " + file + " -> " + to, e);
-            }
-        }
-
-        File all = new File(componentsOutDir, "../components.properties");
-        try {
-            FileOutputStream fos = new FileOutputStream(all, false);
-
-            String[] names = componentsOutDir.list();
-            List<String> components = new ArrayList<>();
-            // sort the names
-            for (String name : names) {
-                if (name.endsWith(".json")) {
-                    // strip out .json from the name
-                    String componentName = name.substring(0, name.length() - 5);
-                    components.add(componentName);
-                }
-            }
-
-            Collections.sort(components);
-            for (String name : components) {
-                fos.write(name.getBytes());
-                fos.write("\n".getBytes());
-            }
-
-            fos.close();
-
-        } catch (IOException e) {
-            throw new MojoFailureException("Error writing to file " + all);
-        }
+        // copy json files
+        Path outDir = componentsOutDir.toPath();
+        copyFiles(outDir, jsonFiles);
+        generateJsonList(outDir, "../components.properties");
     }
 
     protected void executeDataFormats(Set<String> features) throws MojoExecutionException, MojoFailureException {
@@ -263,44 +226,10 @@ public class PrepareCatalogKarafMojo extends AbstractMojo {
         getLog().info("Found " + dataFormatFiles.size() + " dataformat.properties files");
         getLog().info("Found " + jsonFiles.size() + " dataformat json files");
 
-        // make sure to create out dir
-        dataFormatsOutDir.mkdirs();
-
-        for (File file : jsonFiles) {
-            File to = new File(dataFormatsOutDir, file.getName());
-            try {
-                copyFile(file, to);
-            } catch (IOException e) {
-                throw new MojoFailureException("Cannot copy file from " + file + " -> " + to, e);
-            }
-        }
-
-        File all = new File(dataFormatsOutDir, "../dataformats.properties");
-        try {
-            FileOutputStream fos = new FileOutputStream(all, false);
-
-            String[] names = dataFormatsOutDir.list();
-            List<String> dataFormats = new ArrayList<>();
-            // sort the names
-            for (String name : names) {
-                if (name.endsWith(".json")) {
-                    // strip out .json from the name
-                    String dataFormatName = name.substring(0, name.length() - 5);
-                    dataFormats.add(dataFormatName);
-                }
-            }
-
-            Collections.sort(dataFormats);
-            for (String name : dataFormats) {
-                fos.write(name.getBytes());
-                fos.write("\n".getBytes());
-            }
-
-            fos.close();
-
-        } catch (IOException e) {
-            throw new MojoFailureException("Error writing to file " + all);
-        }
+        // copy json files
+        Path outDir = dataFormatsOutDir.toPath();
+        copyFiles(outDir, jsonFiles);
+        generateJsonList(outDir, "../dataformats.properties");
     }
 
     protected void executeLanguages(Set<String> features) throws MojoExecutionException, MojoFailureException {
@@ -347,44 +276,10 @@ public class PrepareCatalogKarafMojo extends AbstractMojo {
         getLog().info("Found " + languageFiles.size() + " language.properties files");
         getLog().info("Found " + jsonFiles.size() + " language json files");
 
-        // make sure to create out dir
-        languagesOutDir.mkdirs();
-
-        for (File file : jsonFiles) {
-            File to = new File(languagesOutDir, file.getName());
-            try {
-                copyFile(file, to);
-            } catch (IOException e) {
-                throw new MojoFailureException("Cannot copy file from " + file + " -> " + to, e);
-            }
-        }
-
-        File all = new File(languagesOutDir, "../languages.properties");
-        try {
-            FileOutputStream fos = new FileOutputStream(all, false);
-
-            String[] names = languagesOutDir.list();
-            List<String> languages = new ArrayList<>();
-            // sort the names
-            for (String name : names) {
-                if (name.endsWith(".json")) {
-                    // strip out .json from the name
-                    String languageName = name.substring(0, name.length() - 5);
-                    languages.add(languageName);
-                }
-            }
-
-            Collections.sort(languages);
-            for (String name : languages) {
-                fos.write(name.getBytes());
-                fos.write("\n".getBytes());
-            }
-
-            fos.close();
-
-        } catch (IOException e) {
-            throw new MojoFailureException("Error writing to file " + all);
-        }
+        // copy json files
+        Path outDir = languagesOutDir.toPath();
+        copyFiles(outDir, jsonFiles);
+        generateJsonList(outDir, "../languages.properties");
     }
 
     protected void executeOthers(Set<String> features) throws MojoExecutionException, MojoFailureException {
@@ -438,44 +333,10 @@ public class PrepareCatalogKarafMojo extends AbstractMojo {
         getLog().info("Found " + otherFiles.size() + " other.properties files");
         getLog().info("Found " + jsonFiles.size() + " other json files");
 
-        // make sure to create out dir
-        othersOutDir.mkdirs();
-
-        for (File file : jsonFiles) {
-            File to = new File(othersOutDir, file.getName());
-            try {
-                copyFile(file, to);
-            } catch (IOException e) {
-                throw new MojoFailureException("Cannot copy file from " + file + " -> " + to, e);
-            }
-        }
-
-        File all = new File(othersOutDir, "../others.properties");
-        try {
-            FileOutputStream fos = new FileOutputStream(all, false);
-
-            String[] names = othersOutDir.list();
-            List<String> others = new ArrayList<>();
-            // sort the names
-            for (String name : names) {
-                if (name.endsWith(".json")) {
-                    // strip out .json from the name
-                    String otherName = name.substring(0, name.length() - 5);
-                    others.add(otherName);
-                }
-            }
-
-            Collections.sort(others);
-            for (String name : others) {
-                fos.write(name.getBytes());
-                fos.write("\n".getBytes());
-            }
-
-            fos.close();
-
-        } catch (IOException e) {
-            throw new MojoFailureException("Error writing to file " + all);
-        }
+        // copy json files
+        Path outDir = othersOutDir.toPath();
+        copyFiles(outDir, jsonFiles);
+        generateJsonList(outDir, "../others.properties");
     }
 
     private void findComponentFilesRecursive(File dir, Set<File> found, Set<File> components, FileFilter filter) {
@@ -554,7 +415,7 @@ public class PrepareCatalogKarafMojo extends AbstractMojo {
         }
     }
 
-    private class CamelComponentsFileFilter implements FileFilter {
+    private static class CamelComponentsFileFilter implements FileFilter {
 
         @Override
         public boolean accept(File pathname) {
@@ -565,17 +426,18 @@ public class PrepareCatalogKarafMojo extends AbstractMojo {
             if (pathname.isFile() && pathname.getName().endsWith(".json")) {
                 // must be a components json file
                 try {
-                    String json = loadText(new FileInputStream(pathname));
-                    return json != null && json.contains("\"kind\": \"component\"");
+                    String json = loadText(pathname);
+                    return json.contains("\"kind\": \"component\"");
                 } catch (IOException e) {
                     // ignore
                 }
             }
-            return pathname.isDirectory() || (pathname.isFile() && pathname.getName().equals("component.properties"));
+            return pathname.isDirectory()
+                    || (pathname.isFile() && pathname.getName().equals("component.properties"));
         }
     }
 
-    private class CamelDataFormatsFileFilter implements FileFilter {
+    private static class CamelDataFormatsFileFilter implements FileFilter {
 
         @Override
         public boolean accept(File pathname) {
@@ -586,17 +448,18 @@ public class PrepareCatalogKarafMojo extends AbstractMojo {
             if (pathname.isFile() && pathname.getName().endsWith(".json")) {
                 // must be a dataformat json file
                 try {
-                    String json = loadText(new FileInputStream(pathname));
-                    return json != null && json.contains("\"kind\": \"dataformat\"");
+                    String json = loadText(pathname);
+                    return json.contains("\"kind\": \"dataformat\"");
                 } catch (IOException e) {
                     // ignore
                 }
             }
-            return pathname.isDirectory() || (pathname.isFile() && pathname.getName().equals("dataformat.properties"));
+            return pathname.isDirectory()
+                    || (pathname.isFile() && pathname.getName().equals("dataformat.properties"));
         }
     }
 
-    private class CamelLanguagesFileFilter implements FileFilter {
+    private static class CamelLanguagesFileFilter implements FileFilter {
 
         @Override
         public boolean accept(File pathname) {
@@ -607,57 +470,68 @@ public class PrepareCatalogKarafMojo extends AbstractMojo {
             if (pathname.isFile() && pathname.getName().endsWith(".json")) {
                 // must be a language json file
                 try {
-                    String json = loadText(new FileInputStream(pathname));
-                    return json != null && json.contains("\"kind\": \"language\"");
+                    String json = loadText(pathname);
+                    return json.contains("\"kind\": \"language\"");
                 } catch (IOException e) {
                     // ignore
                 }
             }
-            return pathname.isDirectory() || (pathname.isFile() && pathname.getName().equals("language.properties"));
+            return pathname.isDirectory()
+                    || (pathname.isFile() && pathname.getName().equals("language.properties"));
         }
     }
 
-    private class CamelOthersFileFilter implements FileFilter {
+    private static class CamelOthersFileFilter implements FileFilter {
 
         @Override
         public boolean accept(File pathname) {
             if (pathname.isFile() && pathname.getName().endsWith(".json")) {
                 // must be a language json file
                 try {
-                    String json = loadText(new FileInputStream(pathname));
-                    return json != null && json.contains("\"kind\": \"other\"");
+                    String json = loadText(pathname);
+                    return json.contains("\"kind\": \"other\"");
                 } catch (IOException e) {
                     // ignore
                 }
             }
-            return pathname.isDirectory() || (pathname.isFile() && pathname.getName().equals("other.properties"));
+            return pathname.isDirectory()
+                    || (pathname.isFile() && pathname.getName().equals("other.properties"));
         }
     }
 
-    public static void copyFile(File from, File to) throws IOException {
-        FileChannel in = null;
-        FileChannel out = null;
-        try (FileInputStream fis = new FileInputStream(from); FileOutputStream fos = new FileOutputStream(to)) {
+    public static void copyFiles(Path outDir, Collection<File> files) throws MojoFailureException {
+        for (File file : files) {
+            Path to = outDir.resolve(file.getName());
             try {
-                in = fis.getChannel();
-                out = fos.getChannel();
-
-                long size = in.size();
-                long position = 0;
-                while (position < size) {
-                    position += in.transferTo(position, BUFFER_SIZE, out);
-                }
-            } finally {
-                if (in != null) {
-                    in.close();
-                }
-                if (out != null) {
-                    out.close();
-                }
+                FileUtil.updateFile(file.toPath(), to);
+            } catch (IOException e) {
+                throw new MojoFailureException("Cannot copy file from " + file + " -> " + to, e);
             }
         }
     }
 
+    public static Set<String> generateJsonList(Path outDir, String outFile) throws MojoFailureException {
+        Path all = outDir.resolve(outFile);
+        try {
+            Set<String> answer = Files.list(outDir)
+                    .filter(p -> p.getFileName().toString().endsWith(".json"))
+                    .map(p -> p.getFileName().toString())
+                    // strip out .json from the name
+                    .map(n -> n.substring(0, n.length() - ".json".length()))
+                    .sorted()
+                    .collect(LinkedHashSet::new, LinkedHashSet::add, LinkedHashSet::addAll);
+            String data = String.join("\n", answer) + "\n";
+            FileUtil.updateFile(all, data);
+            return answer;
+        } catch (IOException e) {
+            throw new MojoFailureException("Error writing to file " + all);
+        }
+    }
+
+    public static void copyFile(File from, File to) throws IOException {
+        FileUtil.updateFile(from.toPath(), to.toPath());
+    }
+
     private Set<String> findKarafFeatures() throws MojoExecutionException, MojoFailureException {
         // load features.xml file and parse it
 
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java
index f602cad..3dc6cd3 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogMojo.java
@@ -18,12 +18,13 @@ package org.apache.camel.maven.packaging;
 
 import java.io.File;
 import java.io.FileFilter;
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.nio.channels.FileChannel;
 import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
@@ -35,6 +36,9 @@ import java.util.TreeSet;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.camel.tooling.util.FileUtil;
+import org.apache.camel.tooling.util.JSonSchemaHelper;
+import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.commons.io.FileUtils;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -47,7 +51,7 @@ import org.apache.maven.project.MavenProjectHelper;
 import org.asciidoctor.Asciidoctor;
 import org.asciidoctor.OptionsBuilder;
 
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
 
 /**
  * Prepares the camel catalog to include component, data format, and eip descriptors,
@@ -56,8 +60,6 @@ import static org.apache.camel.maven.packaging.PackageHelper.loadText;
 @Mojo(name = "prepare-catalog", threadSafe = true)
 public class PrepareCatalogMojo extends AbstractMojo {
 
-    public static final int BUFFER_SIZE = 128 * 1024;
-
     private static final String[] EXCLUDE_DOC_FILES = {
         "camel-core-osgi", "camel-core-xml",
         "camel-http-common", "camel-http-base", "camel-jetty-common",
@@ -262,7 +264,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
 
             try {
                 // check if we have a label as we want the eip to include labels
-                String text = loadText(new FileInputStream(file));
+                String text = loadText(file);
                 // just do a basic label check
                 if (text.contains("\"label\": \"\"")) {
                     missingLabels.add(file);
@@ -435,7 +437,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
 
             // check if we have a component label as we want the components to include labels
             try {
-                String text = loadText(new FileInputStream(file));
+                String text = loadText(file);
                 String name = asComponentName(file);
                 Matcher matcher = LABEL_PATTERN.matcher(text);
                 // grab the label, and remember it in the used labels
@@ -443,11 +445,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
                     String label = matcher.group(1);
                     String[] labels = label.split(",");
                     for (String s : labels) {
-                        Set<String> components = usedComponentLabels.get(s);
-                        if (components == null) {
-                            components = new TreeSet<>();
-                            usedComponentLabels.put(s, components);
-                        }
+                        Set<String> components = usedComponentLabels.computeIfAbsent(s, k -> new TreeSet<>());
                         components.add(name);
                     }
                 }
@@ -459,9 +457,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
 
                     if (label != null && !label.isEmpty()) {
                         String[] parts = label.split(",");
-                        for (String part : parts) {
-                            usedOptionLabels.add(part);
-                        }
+                        Collections.addAll(usedOptionLabels, parts);
                     }
                 }
 
@@ -472,9 +468,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
                     String label = row.get("label");
                     if (label != null && !label.isEmpty()) {
                         String[] parts = label.split(",");
-                        for (String part : parts) {
-                            usedOptionLabels.add(part);
-                        }
+                        usedOptionLabels.addAll(Arrays.asList(parts));
                     } else {
                         unused++;
                     }
@@ -490,11 +484,8 @@ public class PrepareCatalogMojo extends AbstractMojo {
                     String alternativeScheme = row.get("alternativeSchemes");
                     if (alternativeScheme != null && !alternativeScheme.isEmpty()) {
                         String[] parts = alternativeScheme.split(",");
-                        for (int i = 1; i < parts.length; i++) {
-                            // skip first as that is the regular scheme
-                            String part = parts[i];
-                            alternativeSchemes.add(part);
-                        }
+                        // skip first as that is the regular scheme
+                        alternativeSchemes.addAll(Arrays.asList(parts).subList(1, parts.length));
                     }
                 }
 
@@ -514,49 +505,14 @@ public class PrepareCatalogMojo extends AbstractMojo {
             }
         }
 
-        Set<String> componentNames = new LinkedHashSet<>();
-
-        File all = new File(componentsOutDir, "../components.properties");
-        try {
-            FileOutputStream fos = new FileOutputStream(all, false);
-
-            String[] names = componentsOutDir.list();
-            List<String> components = new ArrayList<>();
-            // sort the names
-            for (String name : names) {
-                if (name.endsWith(".json")) {
-                    // strip out .json from the name
-                    String componentName = name.substring(0, name.length() - 5);
-                    components.add(componentName);
-                }
-            }
-
-            Collections.sort(components);
-            for (String name : components) {
-                fos.write(name.getBytes());
-                fos.write("\n".getBytes());
-
-                // remember component name
-                componentNames.add(name);
-            }
-
-            fos.close();
-
-        } catch (IOException e) {
-            throw new MojoFailureException("Error writing to file " + all);
-        }
+        Set<String> componentNames =
+                generateJsonList(componentsOutDir.toPath(), "../components.properties");
 
         printComponentsReport(jsonFiles, duplicateJsonFiles, missingComponents, usedComponentLabels, usedOptionLabels, unlabeledOptions, missingFirstVersions);
 
         // filter out duplicate component names that are alternative scheme names
-        Set<String> answer = new LinkedHashSet<>();
-        for (String componentName : componentNames) {
-            if (!alternativeSchemes.contains(componentName)) {
-                answer.add(componentName);
-            }
-        }
-
-        return answer;
+        componentNames.removeAll(alternativeSchemes);
+        return componentNames;
     }
     // CHECKSTYLE:ON
 
@@ -625,7 +581,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
 
             // check if we have a label as we want the data format to include labels
             try {
-                String text = loadText(new FileInputStream(file));
+                String text = loadText(file);
                 String name = asComponentName(file);
                 Matcher matcher = LABEL_PATTERN.matcher(text);
                 // grab the label, and remember it in the used labels
@@ -633,11 +589,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
                     String label = matcher.group(1);
                     String[] labels = label.split(",");
                     for (String s : labels) {
-                        Set<String> dataFormats = usedLabels.get(s);
-                        if (dataFormats == null) {
-                            dataFormats = new TreeSet<>();
-                            usedLabels.put(s, dataFormats);
-                        }
+                        Set<String> dataFormats = usedLabels.computeIfAbsent(s, k -> new TreeSet<>());
                         dataFormats.add(name);
                     }
                 }
@@ -659,37 +611,8 @@ public class PrepareCatalogMojo extends AbstractMojo {
             }
         }
 
-        Set<String> answer = new LinkedHashSet<>();
-
-        File all = new File(dataFormatsOutDir, "../dataformats.properties");
-        try {
-            FileOutputStream fos = new FileOutputStream(all, false);
-
-            String[] names = dataFormatsOutDir.list();
-            List<String> dataFormats = new ArrayList<>();
-            // sort the names
-            for (String name : names) {
-                if (name.endsWith(".json")) {
-                    // strip out .json from the name
-                    String dataFormatName = name.substring(0, name.length() - 5);
-                    dataFormats.add(dataFormatName);
-                }
-            }
-
-            Collections.sort(dataFormats);
-            for (String name : dataFormats) {
-                fos.write(name.getBytes());
-                fos.write("\n".getBytes());
-
-                // remember dataformat name
-                answer.add(name);
-            }
-
-            fos.close();
-
-        } catch (IOException e) {
-            throw new MojoFailureException("Error writing to file " + all);
-        }
+        Set<String> answer =
+                generateJsonList(dataFormatsOutDir.toPath(), "../dataformats.properties");
 
         printDataFormatsReport(jsonFiles, duplicateJsonFiles, usedLabels, missingFirstVersions);
 
@@ -760,7 +683,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
 
             // check if we have a label as we want the data format to include labels
             try {
-                String text = loadText(new FileInputStream(file));
+                String text = loadText(file);
                 String name = asComponentName(file);
                 Matcher matcher = LABEL_PATTERN.matcher(text);
                 // grab the label, and remember it in the used labels
@@ -768,11 +691,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
                     String label = matcher.group(1);
                     String[] labels = label.split(",");
                     for (String s : labels) {
-                        Set<String> languages = usedLabels.get(s);
-                        if (languages == null) {
-                            languages = new TreeSet<>();
-                            usedLabels.put(s, languages);
-                        }
+                        Set<String> languages = usedLabels.computeIfAbsent(s, k -> new TreeSet<>());
                         languages.add(name);
                     }
                 }
@@ -794,37 +713,8 @@ public class PrepareCatalogMojo extends AbstractMojo {
             }
         }
 
-        Set<String> answer = new LinkedHashSet<>();
-
-        File all = new File(languagesOutDir, "../languages.properties");
-        try {
-            FileOutputStream fos = new FileOutputStream(all, false);
-
-            String[] names = languagesOutDir.list();
-            List<String> languages = new ArrayList<>();
-            // sort the names
-            for (String name : names) {
-                if (name.endsWith(".json")) {
-                    // strip out .json from the name
-                    String languageName = name.substring(0, name.length() - 5);
-                    languages.add(languageName);
-                }
-            }
-
-            Collections.sort(languages);
-            for (String name : languages) {
-                fos.write(name.getBytes());
-                fos.write("\n".getBytes());
-
-                // remember language name
-                answer.add(name);
-            }
-
-            fos.close();
-
-        } catch (IOException e) {
-            throw new MojoFailureException("Error writing to file " + all);
-        }
+        Set<String> answer =
+                generateJsonList(languagesOutDir.toPath(), "../languages.properties");
 
         printLanguagesReport(jsonFiles, duplicateJsonFiles, usedLabels, missingFirstVersions);
 
@@ -910,7 +800,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
 
             // check if we have a label as we want the other to include labels
             try {
-                String text = loadText(new FileInputStream(file));
+                String text = loadText(file);
                 String name = asComponentName(file);
                 Matcher matcher = LABEL_PATTERN.matcher(text);
                 // grab the label, and remember it in the used labels
@@ -918,11 +808,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
                     String label = matcher.group(1);
                     String[] labels = label.split(",");
                     for (String s : labels) {
-                        Set<String> others = usedLabels.get(s);
-                        if (others == null) {
-                            others = new TreeSet<>();
-                            usedLabels.put(s, others);
-                        }
+                        Set<String> others = usedLabels.computeIfAbsent(s, k -> new TreeSet<>());
                         others.add(name);
                     }
                 }
@@ -944,37 +830,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
             }
         }
 
-        Set<String> answer = new LinkedHashSet<>();
-
-        File all = new File(othersOutDir, "../others.properties");
-        try {
-            FileOutputStream fos = new FileOutputStream(all, false);
-
-            String[] names = othersOutDir.list();
-            List<String> others = new ArrayList<>();
-            // sort the names
-            for (String name : names) {
-                if (name.endsWith(".json")) {
-                    // strip out .json from the name
-                    String otherName = name.substring(0, name.length() - 5);
-                    others.add(otherName);
-                }
-            }
-
-            Collections.sort(others);
-            for (String name : others) {
-                fos.write(name.getBytes());
-                fos.write("\n".getBytes());
-
-                // remember other name
-                answer.add(name);
-            }
-
-            fos.close();
-
-        } catch (IOException e) {
-            throw new MojoFailureException("Error writing to file " + all);
-        }
+        Set<String> answer = generateJsonList(othersOutDir.toPath(), "../others.properties");
 
         printOthersReport(jsonFiles, duplicateJsonFiles, usedLabels, missingFirstVersions);
 
@@ -1640,7 +1496,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
             if (pathname.isFile() && pathname.getName().endsWith(".json")) {
                 // must be a components json file
                 try {
-                    String json = loadText(new FileInputStream(pathname));
+                    String json = loadText(pathname);
                     return json != null && json.contains("\"kind\": \"component\"");
                 } catch (IOException e) {
                     // ignore
@@ -1661,7 +1517,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
             if (pathname.isFile() && pathname.getName().endsWith(".json")) {
                 // must be a dataformat json file
                 try {
-                    String json = loadText(new FileInputStream(pathname));
+                    String json = loadText(pathname);
                     return json != null && json.contains("\"kind\": \"dataformat\"");
                 } catch (IOException e) {
                     // ignore
@@ -1682,7 +1538,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
             if (pathname.isFile() && pathname.getName().endsWith(".json")) {
                 // must be a language json file
                 try {
-                    String json = loadText(new FileInputStream(pathname));
+                    String json = loadText(pathname);
                     return json != null && json.contains("\"kind\": \"language\"");
                 } catch (IOException e) {
                     // ignore
@@ -1699,7 +1555,7 @@ public class PrepareCatalogMojo extends AbstractMojo {
             if (pathname.isFile() && pathname.getName().endsWith(".json")) {
                 // must be a language json file
                 try {
-                    String json = loadText(new FileInputStream(pathname));
+                    String json = loadText(pathname);
                     return json != null && json.contains("\"kind\": \"other\"");
                 } catch (IOException e) {
                     // ignore
@@ -1717,30 +1573,29 @@ public class PrepareCatalogMojo extends AbstractMojo {
         }
     }
 
-    public static void copyFile(File from, File to) throws IOException {
-        FileChannel in = null;
-        FileChannel out = null;
-        try (FileInputStream fis = new FileInputStream(from); FileOutputStream fos = new FileOutputStream(to)) {
-            try {
-                in = fis.getChannel();
-                out = fos.getChannel();
-
-                long size = in.size();
-                long position = 0;
-                while (position < size) {
-                    position += in.transferTo(position, BUFFER_SIZE, out);
-                }
-            } finally {
-                if (in != null) {
-                    in.close();
-                }
-                if (out != null) {
-                    out.close();
-                }
-            }
+    public static Set<String> generateJsonList(Path outDir, String outFile) throws MojoFailureException {
+        Set<String> answer;
+        Path all = outDir.resolve(outFile);
+        try {
+            answer = Files.list(outDir)
+                    .filter(p -> p.getFileName().toString().endsWith(".json"))
+                    .map(p -> p.getFileName().toString())
+                    // strip out .json from the name
+                    .map(n -> n.substring(0, n.length() - ".json".length()))
+                    .sorted()
+                    .collect(LinkedHashSet::new, LinkedHashSet::add, LinkedHashSet::addAll);
+            String data = String.join("\n", answer) + "\n";
+            FileUtil.updateFile(all, data);
+            return answer;
+        } catch (IOException e) {
+            throw new MojoFailureException("Error writing to file " + all);
         }
     }
 
+    public static void copyFile(File from, File to) throws IOException {
+        FileUtil.updateFile(from.toPath(), to.toPath());
+    }
+
     private static boolean excludeDocumentDir(String name) {
         for (String exclude : EXCLUDE_DOC_FILES) {
             if (exclude.equals(name)) {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareExampleMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareExampleMojo.java
index 78d151a..923f9dd 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareExampleMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareExampleMojo.java
@@ -17,7 +17,6 @@
 package org.apache.camel.maven.packaging;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.nio.charset.Charset;
 import java.nio.file.Paths;
@@ -32,6 +31,7 @@ import java.util.Set;
 import java.util.TreeSet;
 
 import org.apache.camel.maven.packaging.model.ExampleModel;
+import org.apache.camel.tooling.util.Strings;
 import org.apache.commons.io.FileUtils;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -43,8 +43,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;
 
 /**
  * Prepares the readme.md files content up to date with all the examples that Apache Camel ships.
@@ -104,10 +104,10 @@ public class PrepareExampleMojo extends AbstractMojo {
                         ExampleModel model = new ExampleModel();
                         model.setFileName(file.getName());
 
-                        String name = StringHelper.between(existing, "<name>", "</name>");
-                        String title = StringHelper.between(existing, "<title>", "</title>");
-                        String description = StringHelper.between(existing, "<description>", "</description>");
-                        String category = StringHelper.between(existing, "<category>", "</category>");
+                        String name = Strings.between(existing, "<name>", "</name>");
+                        String title = Strings.between(existing, "<title>", "</title>");
+                        String description = Strings.between(existing, "<description>", "</description>");
+                        String category = Strings.between(existing, "<category>", "</category>");
 
                         if (title != null) {
                             model.setTitle(title);
@@ -139,7 +139,7 @@ public class PrepareExampleMojo extends AbstractMojo {
             }
 
             // sort the models
-            Collections.sort(models, new ExampleComparator());
+            models.sort(new ExampleComparator());
 
             // how many deprecated
             long deprecated = models.stream()
@@ -186,9 +186,9 @@ public class PrepareExampleMojo extends AbstractMojo {
         }
 
         try {
-            String text = loadText(new FileInputStream(file));
+            String text = loadText(file);
 
-            String existing = StringHelper.between(text, "// examples: START", "// examples: END");
+            String existing = Strings.between(text, "// examples: START", "// examples: END");
             if (existing != null) {
                 // remove leading line breaks etc
                 existing = existing.trim();
@@ -196,8 +196,8 @@ public class PrepareExampleMojo extends AbstractMojo {
                 if (existing.equals(changed)) {
                     return false;
                 } else {
-                    String before = StringHelper.before(text, "// examples: START");
-                    String after = StringHelper.after(text, "// examples: END");
+                    String before = Strings.before(text, "// examples: START");
+                    String after = Strings.after(text, "// examples: END");
                     text = before + "// examples: START\n" + changed + "\n// examples: END" + after;
                     writeText(file, text);
                     return true;
@@ -234,7 +234,7 @@ public class PrepareExampleMojo extends AbstractMojo {
         if (answer.startsWith("camel-example-")) {
             answer = answer.substring(14);
         }
-        answer = StringHelper.camelDashToTitle(answer);
+        answer = Strings.camelDashToTitle(answer);
         return answer;
     }
 
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareParentPomMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareParentPomMojo.java
index 1f6ce8e..103a12b 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareParentPomMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareParentPomMojo.java
@@ -17,13 +17,13 @@
 package org.apache.camel.maven.packaging;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
+import org.apache.camel.tooling.util.Strings;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -33,10 +33,10 @@ import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 
-import static org.apache.camel.maven.packaging.PackageHelper.after;
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
-import static org.apache.camel.maven.packaging.PackageHelper.writeText;
-import static org.apache.camel.maven.packaging.StringHelper.between;
+import static org.apache.camel.tooling.util.PackageHelper.after;
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.PackageHelper.writeText;
+import static org.apache.camel.tooling.util.Strings.between;
 
 /**
  * Prepares the parent/pom.xml to keep the Camel artifacts up-to-date.
@@ -131,7 +131,7 @@ public class PrepareParentPomMojo extends AbstractMojo {
     }
 
     private String asArtifactId(File pom) throws IOException {
-        String text = loadText(new FileInputStream(pom));
+        String text = loadText(pom);
         text = after(text, "</parent>");
         if (text != null) {
             text = between(text, "<artifactId>", "</artifactId>");
@@ -149,7 +149,7 @@ public class PrepareParentPomMojo extends AbstractMojo {
         }
 
         try {
-            String text = loadText(new FileInputStream(file));
+            String text = loadText(file);
 
             String existing = between(text, start, end);
             if (existing != null) {
@@ -159,8 +159,8 @@ public class PrepareParentPomMojo extends AbstractMojo {
                 if (existing.equals(changed)) {
                     return false;
                 } else {
-                    String before = StringHelper.before(text, start);
-                    String after = StringHelper.after(text, end);
+                    String before = Strings.before(text, start);
+                    String after = Strings.after(text, end);
                     text = before + start + "\n      " + changed + "\n      " + end + after;
                     writeText(file, text);
                     return true;
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareReleasePomMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareReleasePomMojo.java
index 56fe00a..5874462 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareReleasePomMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareReleasePomMojo.java
@@ -17,13 +17,13 @@
 package org.apache.camel.maven.packaging;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
+import org.apache.camel.tooling.util.Strings;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -33,10 +33,10 @@ import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 
-import static org.apache.camel.maven.packaging.PackageHelper.after;
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
-import static org.apache.camel.maven.packaging.PackageHelper.writeText;
-import static org.apache.camel.maven.packaging.StringHelper.between;
+import static org.apache.camel.tooling.util.PackageHelper.after;
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.PackageHelper.writeText;
+import static org.apache.camel.tooling.util.Strings.between;
 
 /**
  * Prepares the apache-camel/pom.xml and common-bin to keep the Camel artifacts up-to-date.
@@ -153,10 +153,10 @@ public class PrepareReleasePomMojo extends AbstractMojo {
     }
 
     private String asArtifactId(File pom) throws IOException {
-        String text = loadText(new FileInputStream(pom));
+        String text = loadText(pom);
         text = after(text, "</parent>");
         if (text != null) {
-            return between(text, "<artifactId>", "</artifactId>");
+            return Strings.between(text, "<artifactId>", "</artifactId>");
         }
         return null;
     }
@@ -174,7 +174,7 @@ public class PrepareReleasePomMojo extends AbstractMojo {
         }
 
         try {
-            String text = loadText(new FileInputStream(file));
+            String text = loadText(file);
 
             String existing = between(text, start, end);
             if (existing != null) {
@@ -184,8 +184,8 @@ public class PrepareReleasePomMojo extends AbstractMojo {
                 if (existing.equals(changed)) {
                     return false;
                 } else {
-                    String before = StringHelper.before(text, start);
-                    String after = StringHelper.after(text, end);
+                    String before = Strings.before(text, start);
+                    String after = Strings.after(text, end);
                     text = before + start + "\n" + spaces + changed + "\n" + spaces + end + after;
                     writeText(file, text);
                     return true;
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareUserGuideMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareUserGuideMojo.java
index b5409bb..75f14c4 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareUserGuideMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareUserGuideMojo.java
@@ -17,7 +17,6 @@
 package org.apache.camel.maven.packaging;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -32,6 +31,8 @@ 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.tooling.util.JSonSchemaHelper;
+import org.apache.camel.tooling.util.Strings;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -41,8 +42,10 @@ import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 
-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;
+import static org.apache.camel.tooling.util.JSonSchemaHelper.getSafeValue;
+import static org.apache.camel.tooling.util.JSonSchemaHelper.parseJsonSchema;
 
 /**
  * Prepares the user guide to keep the table of content up to date with the components, data formats, and languages.
@@ -120,7 +123,7 @@ public class PrepareUserGuideMojo extends AbstractMojo {
         try {
             List<ComponentModel> models = new ArrayList<>();
             for (File file : componentFiles) {
-                String json = loadText(new FileInputStream(file));
+                String json = loadText(file);
                 ComponentModel model = generateComponentModel(json);
 
                 // filter out alternative schemas which reuses documentation
@@ -188,7 +191,7 @@ public class PrepareUserGuideMojo extends AbstractMojo {
         try {
             List<OtherModel> models = new ArrayList<>();
             for (File file : otherFiles) {
-                String json = loadText(new FileInputStream(file));
+                String json = loadText(file);
                 OtherModel model = generateOtherModel(json);
                 models.add(model);
             }
@@ -232,7 +235,7 @@ public class PrepareUserGuideMojo extends AbstractMojo {
         try {
             List<DataFormatModel> models = new ArrayList<>();
             for (File file : dataFormatFiles) {
-                String json = loadText(new FileInputStream(file));
+                String json = loadText(file);
                 DataFormatModel model = generateDataFormatModel(json);
                 models.add(model);
             }
@@ -276,7 +279,7 @@ public class PrepareUserGuideMojo extends AbstractMojo {
         try {
             List<LanguageModel> models = new ArrayList<>();
             for (File file : languageFiles) {
-                String json = loadText(new FileInputStream(file));
+                String json = loadText(file);
                 LanguageModel model = generateLanguageModel(json);
                 models.add(model);
             }
@@ -313,9 +316,9 @@ public class PrepareUserGuideMojo extends AbstractMojo {
         }
 
         try {
-            String text = loadText(new FileInputStream(file));
+            String text = loadText(file);
 
-            String existing = StringHelper.between(text, "<!-- core components: START -->", "<!-- core components: END -->");
+            String existing = Strings.between(text, "<!-- core components: START -->", "<!-- core components: END -->");
             if (existing != null) {
                 // remove leading line breaks etc
                 existing = existing.trim();
@@ -323,8 +326,8 @@ public class PrepareUserGuideMojo extends AbstractMojo {
                 if (existing.equals(changed)) {
                     return false;
                 } else {
-                    String before = StringHelper.before(text, "<!-- core components: START -->");
-                    String after = StringHelper.after(text, "<!-- core components: END -->");
+                    String before = Strings.before(text, "<!-- core components: START -->");
+                    String after = Strings.after(text, "<!-- core components: END -->");
                     text = before + "<!-- core components: START -->\n" + changed + "\n<!-- core components: END -->" + after;
                     writeText(file, text);
                     return true;
@@ -347,9 +350,9 @@ public class PrepareUserGuideMojo extends AbstractMojo {
         }
 
         try {
-            String text = loadText(new FileInputStream(file));
+            String text = loadText(file);
 
-            String existing = StringHelper.between(text, "<!-- components: START -->", "<!-- components: END -->");
+            String existing = Strings.between(text, "<!-- components: START -->", "<!-- components: END -->");
             if (existing != null) {
                 // remove leading line breaks etc
                 existing = existing.trim();
@@ -357,8 +360,8 @@ public class PrepareUserGuideMojo extends AbstractMojo {
                 if (existing.equals(changed)) {
                     return false;
                 } else {
-                    String before = StringHelper.before(text, "<!-- components: START -->");
-                    String after = StringHelper.after(text, "<!-- components: END -->");
+                    String before = Strings.before(text, "<!-- components: START -->");
+                    String after = Strings.after(text, "<!-- components: END -->");
                     text = before + "<!-- components: START -->\n" + changed + "\n<!-- components: END -->" + after;
                     writeText(file, text);
                     return true;
@@ -381,9 +384,9 @@ public class PrepareUserGuideMojo extends AbstractMojo {
         }
 
         try {
-            String text = loadText(new FileInputStream(file));
+            String text = loadText(file);
 
-            String existing = StringHelper.between(text, "<!-- others: START -->", "<!-- others: END -->");
+            String existing = Strings.between(text, "<!-- others: START -->", "<!-- others: END -->");
             if (existing != null) {
                 // remove leading line breaks etc
                 existing = existing.trim();
@@ -391,8 +394,8 @@ public class PrepareUserGuideMojo extends AbstractMojo {
                 if (existing.equals(changed)) {
                     return false;
                 } else {
-                    String before = StringHelper.before(text, "<!-- others: START -->");
-                    String after = StringHelper.after(text, "<!-- others: END -->");
+                    String before = Strings.before(text, "<!-- others: START -->");
+                    String after = Strings.after(text, "<!-- others: END -->");
                     text = before + "<!-- others: START -->\n" + changed + "\n<!-- others: END -->" + after;
                     writeText(file, text);
                     return true;
@@ -415,9 +418,9 @@ public class PrepareUserGuideMojo extends AbstractMojo {
         }
 
         try {
-            String text = loadText(new FileInputStream(file));
+            String text = loadText(file);
 
-            String existing = StringHelper.between(text, "<!-- dataformats: START -->", "<!-- dataformats: END -->");
+            String existing = Strings.between(text, "<!-- dataformats: START -->", "<!-- dataformats: END -->");
             if (existing != null) {
                 // remove leading line breaks etc
                 existing = existing.trim();
@@ -425,8 +428,8 @@ public class PrepareUserGuideMojo extends AbstractMojo {
                 if (existing.equals(changed)) {
                     return false;
                 } else {
-                    String before = StringHelper.before(text, "<!-- dataformats: START -->");
-                    String after = StringHelper.after(text, "<!-- dataformats: END -->");
+                    String before = Strings.before(text, "<!-- dataformats: START -->");
+                    String after = Strings.after(text, "<!-- dataformats: END -->");
                     text = before + "<!-- dataformats: START -->\n" + changed + "\n<!-- dataformats: END -->" + after;
                     writeText(file, text);
                     return true;
@@ -449,9 +452,9 @@ public class PrepareUserGuideMojo extends AbstractMojo {
         }
 
         try {
-            String text = loadText(new FileInputStream(file));
+            String text = loadText(file);
 
-            String existing = StringHelper.between(text, "<!-- languages: START -->", "<!-- languages: END -->");
+            String existing = Strings.between(text, "<!-- languages: START -->", "<!-- languages: END -->");
             if (existing != null) {
                 // remove leading line breaks etc
                 existing = existing.trim();
@@ -459,8 +462,8 @@ public class PrepareUserGuideMojo extends AbstractMojo {
                 if (existing.equals(changed)) {
                     return false;
                 } else {
-                    String before = StringHelper.before(text, "<!-- languages: START -->");
-                    String after = StringHelper.after(text, "<!-- languages: END -->");
+                    String before = Strings.before(text, "<!-- languages: START -->");
+                    String after = Strings.after(text, "<!-- languages: END -->");
                     text = before + "<!-- languages: START -->\n" + changed + "\n<!-- languages: END -->" + after;
                     writeText(file, text);
                     return true;
@@ -541,25 +544,25 @@ public class PrepareUserGuideMojo extends AbstractMojo {
     }
 
     private ComponentModel generateComponentModel(String json) {
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("component", json, false);
+        List<Map<String, String>> rows = 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(getSafeValue("scheme", rows));
+        component.setSyntax(getSafeValue("syntax", rows));
+        component.setAlternativeSyntax(getSafeValue("alternativeSyntax", rows));
+        component.setAlternativeSchemes(getSafeValue("alternativeSchemes", rows));
+        component.setTitle(getSafeValue("title", rows));
+        component.setDescription(getSafeValue("description", rows));
+        component.setFirstVersion(getSafeValue("firstVersion", rows));
+        component.setLabel(getSafeValue("label", rows));
+        component.setDeprecated(getSafeValue("deprecated", rows));
+        component.setDeprecationNote(getSafeValue("deprecationNote", rows));
+        component.setConsumerOnly(getSafeValue("consumerOnly", rows));
+        component.setProducerOnly(getSafeValue("producerOnly", rows));
+        component.setJavaType(getSafeValue("javaType", rows));
+        component.setGroupId(getSafeValue("groupId", rows));
+        component.setArtifactId(getSafeValue("artifactId", rows));
+        component.setVersion(getSafeValue("version", rows));
 
         return component;
     }
@@ -568,16 +571,16 @@ public class PrepareUserGuideMojo 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(getSafeValue("name", rows));
+        other.setTitle(getSafeValue("title", rows));
+        other.setDescription(getSafeValue("description", rows));
+        other.setFirstVersion(getSafeValue("firstVersion", rows));
+        other.setLabel(getSafeValue("label", rows));
+        other.setDeprecated(getSafeValue("deprecated", rows));
+        other.setDeprecationNote(getSafeValue("deprecationNote", rows));
+        other.setGroupId(getSafeValue("groupId", rows));
+        other.setArtifactId(getSafeValue("artifactId", rows));
+        other.setVersion(getSafeValue("version", rows));
 
         return other;
     }
@@ -586,18 +589,18 @@ public class PrepareUserGuideMojo 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(getSafeValue("name", rows));
+        dataFormat.setTitle(getSafeValue("title", rows));
+        dataFormat.setModelName(getSafeValue("modelName", rows));
+        dataFormat.setDescription(getSafeValue("description", rows));
+        dataFormat.setFirstVersion(getSafeValue("firstVersion", rows));
+        dataFormat.setLabel(getSafeValue("label", rows));
+        dataFormat.setDeprecated(getSafeValue("deprecated", rows));
+        dataFormat.setDeprecationNote(getSafeValue("deprecationNote", rows));
+        dataFormat.setJavaType(getSafeValue("javaType", rows));
+        dataFormat.setGroupId(getSafeValue("groupId", rows));
+        dataFormat.setArtifactId(getSafeValue("artifactId", rows));
+        dataFormat.setVersion(getSafeValue("version", rows));
 
         return dataFormat;
     }
@@ -606,18 +609,18 @@ public class PrepareUserGuideMojo 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(getSafeValue("title", rows));
+        language.setName(getSafeValue("name", rows));
+        language.setModelName(getSafeValue("modelName", rows));
+        language.setDescription(getSafeValue("description", rows));
+        language.setFirstVersion(getSafeValue("firstVersion", rows));
+        language.setLabel(getSafeValue("label", rows));
+        language.setDeprecated(getSafeValue("deprecated", rows));
+        language.setDeprecationNote(getSafeValue("deprecationNote", rows));
+        language.setJavaType(getSafeValue("javaType", rows));
+        language.setGroupId(getSafeValue("groupId", rows));
+        language.setArtifactId(getSafeValue("artifactId", rows));
+        language.setVersion(getSafeValue("version", rows));
 
         return language;
     }
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/StringHelper.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/StringHelper.java
deleted file mode 100644
index 468c115..0000000
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/StringHelper.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.maven.packaging;
-
-import java.util.Collection;
-
-import com.google.common.base.CaseFormat;
-
-public final class StringHelper {
-
-    private StringHelper() {
-        // Utils Class
-    }
-
-    public static boolean isEmpty(String s) {
-        return s == null || s.trim().isEmpty();
-    }
-
-    public static String after(String text, String after) {
-        if (!text.contains(after)) {
-            return null;
-        }
-        return text.substring(text.indexOf(after) + after.length());
-    }
-
-    public static String before(String text, String before) {
-        if (!text.contains(before)) {
-            return null;
-        }
-        return text.substring(0, text.indexOf(before));
-    }
-
-    public static String between(String text, String after, String before) {
-        text = after(text, after);
-        if (text == null) {
-            return null;
-        }
-        return before(text, before);
-    }
-
-    public static String indentCollection(String indent, Collection<String> list) {
-        StringBuilder sb = new StringBuilder();
-        for (String text : list) {
-            sb.append(indent).append(text);
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Converts the value to use title style instead of dash cased
-     */
-    public static String camelDashToTitle(String value) {
-        StringBuilder sb = new StringBuilder(value.length());
-        boolean dash = false;
-
-        for (char c : value.toCharArray()) {
-            if ('-' == c) {
-                dash = true;
-                continue;
-            }
-
-            if (dash) {
-                sb.append(' ');
-                sb.append(Character.toUpperCase(c));
-            } else {
-                // upper case first
-                if (sb.length() == 0) {
-                    sb.append(Character.toUpperCase(c));
-                } else {
-                    sb.append(c);
-                }
-            }
-            dash = false;
-        }
-        return sb.toString();
-    }
-
-    public static String cutLastZeroDigit(String version) {
-        String answer = version;
-        // cut last digit so its not 2.18.0 but 2.18
-        String[] parts = version.split("\\.");
-        if (parts.length == 3 && parts[2].equals("0")) {
-            answer = parts[0] + "." + parts[1];
-        }
-        return answer;
-    }
-
-    /**
-     * To wrap long camel cased texts by words.
-     *
-     * @param option  the option which is camel cased.
-     * @param watermark a watermark to denote the size to cut after
-     * @param newLine the new line to use when breaking into a new line
-     */
-    public static String wrapCamelCaseWords(String option, int watermark, String newLine) {
-        String text = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, option);
-        text = text.replace('-', ' ');
-        text = wrapWords(text, "\n", watermark, false);
-        text = text.replace(' ', '-');
-        text = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, text);
-
-        // upper case first char on each line
-        String[] lines = text.split("\n");
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < lines.length; i++) {
-            String line = lines[i];
-            line = Character.toUpperCase(line.charAt(0)) + line.substring(1);
-            sb.append(line);
-            if (i < lines.length - 1) {
-                sb.append(newLine);
-            }
-        }
-        return sb.toString();
-    }
-
-    /**
-     * To wrap a big line by words.
-     *
-     * @param line the big line
-     * @param newLine the new line to use when breaking into a new line
-     * @param watermark a watermark to denote the size to cut after
-     * @param wrapLongWords whether to wrap long words
-     */
-    public static String wrapWords(String line, String newLine, int watermark, boolean wrapLongWords) {
-        if (line == null) {
-            return null;
-        } else {
-            if (newLine == null) {
-                newLine = System.lineSeparator();
-            }
-
-            if (watermark < 1) {
-                watermark = 1;
-            }
-
-            int inputLineLength = line.length();
-            int offset = 0;
-            StringBuilder sb = new StringBuilder(inputLineLength + 32);
-
-            while (inputLineLength - offset > watermark) {
-                if (line.charAt(offset) == 32) {
-                    ++offset;
-                } else {
-                    int spaceToWrapAt = line.lastIndexOf(32, watermark + offset);
-                    if (spaceToWrapAt >= offset) {
-                        sb.append(line.substring(offset, spaceToWrapAt));
-                        sb.append(newLine);
-                        offset = spaceToWrapAt + 1;
-                    } else if (wrapLongWords) {
-                        sb.append(line.substring(offset, watermark + offset));
-                        sb.append(newLine);
-                        offset += watermark;
-                    } else {
-                        spaceToWrapAt = line.indexOf(32, watermark + offset);
-                        if (spaceToWrapAt >= 0) {
-                            sb.append(line.substring(offset, spaceToWrapAt));
-                            sb.append(newLine);
-                            offset = spaceToWrapAt + 1;
-                        } else {
-                            sb.append(line.substring(offset));
-                            offset = inputLineLength;
-                        }
-                    }
-                }
-            }
-
-            sb.append(line.substring(offset));
-            return sb.toString();
-        }
-    }
-
-    /**
-     * Returns the base class name, i.e. without package and generic related
-     * information.
-     * 
-     * @param className The class name which base class is to be computed.
-     * @return the base class name, i.e. without package and generic related
-     *         information.
-     */
-    public static String getClassShortName(String className) {
-        if (className != null) {
-            return className.replaceAll("<.*>", "").replaceAll(".*[.]([^.]+)", "$1");
-        }
-        return className;
-    }
-}
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateDocComponentListMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateDocComponentListMojo.java
index 0a2834e..36c7cce 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateDocComponentListMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateDocComponentListMojo.java
@@ -17,7 +17,6 @@
 package org.apache.camel.maven.packaging;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -34,6 +33,7 @@ import org.apache.camel.maven.packaging.model.DataFormatModel;
 import org.apache.camel.maven.packaging.model.EipModel;
 import org.apache.camel.maven.packaging.model.LanguageModel;
 import org.apache.camel.maven.packaging.model.OtherModel;
+import org.apache.camel.tooling.util.Strings;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -44,9 +44,10 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 import org.mvel2.templates.TemplateRuntime;
 
-import static java.util.stream.Collectors.toSet;
-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;
+import static org.apache.camel.tooling.util.JSonSchemaHelper.getSafeValue;
+import static org.apache.camel.tooling.util.JSonSchemaHelper.parseJsonSchema;
 
 /**
  * Updates the website docs with the component list to be up to date with all the artifacts that Apache Camel ships.
@@ -124,7 +125,7 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
         try {
             List<ComponentModel> models = new ArrayList<>();
             for (File file : componentFiles) {
-                String json = loadText(new FileInputStream(file));
+                String json = loadText(file);
                 ComponentModel model = generateComponentModel(json);
 
                 // filter out alternative schemas which reuses documentation
@@ -147,12 +148,13 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
             }
 
             // sort the models
-            Collections.sort(models, new ComponentComparator());
+            models.sort(new ComponentComparator());
 
             // how many different artifacts
-            int count = models.stream()
+            long count = models.stream()
                     .map(ComponentModel::getArtifactId)
-                    .collect(toSet()).size();
+                    .distinct()
+                    .count();
 
             // how many deprecated
             long deprecated = models.stream()
@@ -189,18 +191,19 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
         try {
             List<OtherModel> others = new ArrayList<>();
             for (File file : otherFiles) {
-                String json = loadText(new FileInputStream(file));
+                String json = loadText(file);
                 OtherModel model = generateOtherModel(json);
                 others.add(model);
             }
 
             // sort the models
-            Collections.sort(others, new OtherComparator());
+            others.sort(new OtherComparator());
 
             // how many different artifacts
-            int count = others.stream()
+            long count = others.stream()
                     .map(OtherModel::getArtifactId)
-                    .collect(toSet()).size();
+                    .distinct()
+                    .count();
 
             // how many deprecated
             long deprecated = others.stream()
@@ -238,7 +241,7 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
         try {
             List<DataFormatModel> models = new ArrayList<>();
             for (File file : dataFormatFiles) {
-                String json = loadText(new FileInputStream(file));
+                String json = loadText(file);
                 DataFormatModel model = generateDataFormatModel(json);
 
                 // special for bindy as we have one common file
@@ -250,12 +253,13 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
             }
 
             // sort the models
-            Collections.sort(models, new DataFormatComparator());
+            models.sort(new DataFormatComparator());
 
             // how many different artifacts
-            int count = models.stream()
+            long count = models.stream()
                     .map(DataFormatModel::getArtifactId)
-                    .collect(toSet()).size();
+                    .distinct()
+                    .count();
 
             // how many deprecated
             long deprecated = models.stream()
@@ -293,18 +297,19 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
         try {
             List<LanguageModel> models = new ArrayList<>();
             for (File file : languageFiles) {
-                String json = loadText(new FileInputStream(file));
+                String json = loadText(file);
                 LanguageModel model = generateLanguageModel(json);
                 models.add(model);
             }
 
             // sort the models
-            Collections.sort(models, new LanguageComparator());
+            models.sort(new LanguageComparator());
 
             // how many different artifacts
-            int count = models.stream()
+            long count = models.stream()
                     .map(LanguageModel::getArtifactId)
-                    .collect(toSet()).size();
+                    .distinct()
+                    .count();
 
             // how many deprecated
             long deprecated = models.stream()
@@ -329,9 +334,9 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
         }
     }
 
-    private String templateComponents(List<ComponentModel> models, int artifacts, long deprecated) throws MojoExecutionException {
+    private String templateComponents(List<ComponentModel> models, long artifacts, long deprecated) throws MojoExecutionException {
         try {
-            String template = loadText(UpdateReadmeMojo.class.getClassLoader().getResourceAsStream("website-components-list.mvel"));
+            String template = loadResource("website-components-list.mvel");
             Map<String, Object> map = new HashMap<>();
             map.put("components", models);
             map.put("numberOfArtifacts", artifacts);
@@ -343,9 +348,9 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
         }
     }
 
-    private String templateOthers(List<OtherModel> models, int artifacts, long deprecated) throws MojoExecutionException {
+    private String templateOthers(List<OtherModel> models, long artifacts, long deprecated) throws MojoExecutionException {
         try {
-            String template = loadText(UpdateReadmeMojo.class.getClassLoader().getResourceAsStream("website-others-list.mvel"));
+            String template = loadResource("website-others-list.mvel");
             Map<String, Object> map = new HashMap<>();
             map.put("others", models);
             map.put("numberOfArtifacts", artifacts);
@@ -357,9 +362,9 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
         }
     }
 
-    private String templateDataFormats(List<DataFormatModel> models, int artifacts, long deprecated) throws MojoExecutionException {
+    private String templateDataFormats(List<DataFormatModel> models, long artifacts, long deprecated) throws MojoExecutionException {
         try {
-            String template = loadText(UpdateReadmeMojo.class.getClassLoader().getResourceAsStream("website-dataformats-list.mvel"));
+            String template = loadResource("website-dataformats-list.mvel");
             Map<String, Object> map = new HashMap<>();
             map.put("dataformats", models);
             map.put("numberOfArtifacts", artifacts);
@@ -371,9 +376,9 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
         }
     }
 
-    private String templateLanguages(List<LanguageModel> models, int artifacts, long deprecated) throws MojoExecutionException {
+    private String templateLanguages(List<LanguageModel> models, long artifacts, long deprecated) throws MojoExecutionException {
         try {
-            String template = loadText(UpdateReadmeMojo.class.getClassLoader().getResourceAsStream("website-languages-list.mvel"));
+            String template = loadResource("website-languages-list.mvel");
             Map<String, Object> map = new HashMap<>();
             map.put("languages", models);
             map.put("numberOfArtifacts", artifacts);
@@ -385,15 +390,19 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
         }
     }
 
+    private String loadResource(String name) throws IOException {
+        return loadText(UpdateReadmeMojo.class.getClassLoader().getResourceAsStream(name));
+    }
+
     private boolean updateComponents(File file, String changed) throws MojoExecutionException {
         if (!file.exists()) {
             return false;
         }
 
         try {
-            String text = loadText(new FileInputStream(file));
+            String text = loadText(file);
 
-            String existing = StringHelper.between(text, "// components: START", "// components: END");
+            String existing = Strings.between(text, "// components: START", "// components: END");
             if (existing != null) {
                 // remove leading line breaks etc
                 existing = existing.trim();
@@ -401,8 +410,8 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
                 if (existing.equals(changed)) {
                     return false;
                 } else {
-                    String before = StringHelper.before(text, "// components: START");
-                    String after = StringHelper.after(text, "// components: END");
+                    String before = Strings.before(text, "// components: START");
+                    String after = Strings.after(text, "// components: END");
                     text = before + "// components: START\n" + changed + "\n// components: END" + after;
                     writeText(file, text);
                     return true;
@@ -425,9 +434,9 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
         }
 
         try {
-            String text = loadText(new FileInputStream(file));
+            String text = loadText(file);
 
-            String existing = StringHelper.between(text, "// others: START", "// others: END");
+            String existing = Strings.between(text, "// others: START", "// others: END");
             if (existing != null) {
                 // remove leading line breaks etc
                 existing = existing.trim();
@@ -435,8 +444,8 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
                 if (existing.equals(changed)) {
                     return false;
                 } else {
-                    String before = StringHelper.before(text, "// others: START");
-                    String after = StringHelper.after(text, "// others: END");
+                    String before = Strings.before(text, "// others: START");
+                    String after = Strings.after(text, "// others: END");
                     text = before + "// others: START\n" + changed + "\n// others: END" + after;
                     writeText(file, text);
                     return true;
@@ -459,9 +468,9 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
         }
 
         try {
-            String text = loadText(new FileInputStream(file));
+            String text = loadText(file);
 
-            String existing = StringHelper.between(text, "// dataformats: START", "// dataformats: END");
+            String existing = Strings.between(text, "// dataformats: START", "// dataformats: END");
             if (existing != null) {
                 // remove leading line breaks etc
                 existing = existing.trim();
@@ -469,8 +478,8 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
                 if (existing.equals(changed)) {
                     return false;
                 } else {
-                    String before = StringHelper.before(text, "// dataformats: START");
-                    String after = StringHelper.after(text, "// dataformats: END");
+                    String before = Strings.before(text, "// dataformats: START");
+                    String after = Strings.after(text, "// dataformats: END");
                     text = before + "// dataformats: START\n" + changed + "\n// dataformats: END" + after;
                     writeText(file, text);
                     return true;
@@ -493,9 +502,9 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
         }
 
         try {
-            String text = loadText(new FileInputStream(file));
+            String text = loadText(file);
 
-            String existing = StringHelper.between(text, "// languages: START", "// languages: END");
+            String existing = Strings.between(text, "// languages: START", "// languages: END");
             if (existing != null) {
                 // remove leading line breaks etc
                 existing = existing.trim();
@@ -503,8 +512,8 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
                 if (existing.equals(changed)) {
                     return false;
                 } else {
-                    String before = StringHelper.before(text, "// languages: START");
-                    String after = StringHelper.after(text, "// languages: END");
+                    String before = Strings.before(text, "// languages: START");
+                    String after = Strings.after(text, "// languages: END");
                     text = before + "// languages: START\n" + changed + "\n// languages: END" + after;
                     writeText(file, text);
                     return true;
@@ -567,100 +576,100 @@ public class UpdateDocComponentListMojo extends AbstractMojo {
     }
 
     private EipModel generateEipModel(String json) {
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("model", json, false);
+        List<Map<String, String>> rows = parseJsonSchema("model", json, false);
 
         EipModel eip = new EipModel();
-        eip.setName(JSonSchemaHelper.getSafeValue("name", rows));
-        eip.setTitle(JSonSchemaHelper.getSafeValue("title", rows));
-        eip.setDescription(JSonSchemaHelper.getSafeValue("description", rows));
-        eip.setJavaType(JSonSchemaHelper.getSafeValue("javaType", rows));
-        eip.setLabel(JSonSchemaHelper.getSafeValue("label", rows));
-        eip.setDeprecated("true".equals(JSonSchemaHelper.getSafeValue("deprecated", rows)));
-        eip.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", rows));
-        eip.setInput("true".equals(JSonSchemaHelper.getSafeValue("input", rows)));
-        eip.setOutput("true".equals(JSonSchemaHelper.getSafeValue("output", rows)));
+        eip.setName(getSafeValue("name", rows));
+        eip.setTitle(getSafeValue("title", rows));
+        eip.setDescription(getSafeValue("description", rows));
+        eip.setJavaType(getSafeValue("javaType", rows));
+        eip.setLabel(getSafeValue("label", rows));
+        eip.setDeprecated("true".equals(getSafeValue("deprecated", rows)));
+        eip.setDeprecationNote(getSafeValue("deprecationNote", rows));
+        eip.setInput("true".equals(getSafeValue("input", rows)));
+        eip.setOutput("true".equals(getSafeValue("output", rows)));
 
         return eip;
     }
 
     private ComponentModel generateComponentModel(String json) {
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("component", json, false);
+        List<Map<String, String>> rows = 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(getSafeValue("scheme", rows));
+        component.setSyntax(getSafeValue("syntax", rows));
+        component.setAlternativeSyntax(getSafeValue("alternativeSyntax", rows));
+        component.setAlternativeSchemes(getSafeValue("alternativeSchemes", rows));
+        component.setTitle(getSafeValue("title", rows));
+        component.setDescription(getSafeValue("description", rows));
+        component.setFirstVersion(getSafeValue("firstVersion", rows));
+        component.setLabel(getSafeValue("label", rows));
+        component.setDeprecated(getSafeValue("deprecated", rows));
+        component.setDeprecationNote(getSafeValue("deprecationNote", rows));
+        component.setConsumerOnly(getSafeValue("consumerOnly", rows));
+        component.setProducerOnly(getSafeValue("producerOnly", rows));
+        component.setJavaType(getSafeValue("javaType", rows));
+        component.setGroupId(getSafeValue("groupId", rows));
+        component.setArtifactId(getSafeValue("artifactId", rows));
+        component.setVersion(getSafeValue("version", rows));
 
         return component;
     }
 
     private OtherModel generateOtherModel(String json) {
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("other", json, false);
+        List<Map<String, String>> rows = 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(getSafeValue("name", rows));
+        other.setTitle(getSafeValue("title", rows));
+        other.setDescription(getSafeValue("description", rows));
+        other.setFirstVersion(getSafeValue("firstVersion", rows));
+        other.setLabel(getSafeValue("label", rows));
+        other.setDeprecated(getSafeValue("deprecated", rows));
+        other.setDeprecationNote(getSafeValue("deprecationNote", rows));
+        other.setGroupId(getSafeValue("groupId", rows));
+        other.setArtifactId(getSafeValue("artifactId", rows));
+        other.setVersion(getSafeValue("version", rows));
 
         return other;
     }
 
     private DataFormatModel generateDataFormatModel(String json) {
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("dataformat", json, false);
+        List<Map<String, String>> rows = 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(getSafeValue("name", rows));
+        dataFormat.setTitle(getSafeValue("title", rows));
+        dataFormat.setModelName(getSafeValue("modelName", rows));
+        dataFormat.setDescription(getSafeValue("description", rows));
+        dataFormat.setFirstVersion(getSafeValue("firstVersion", rows));
+        dataFormat.setLabel(getSafeValue("label", rows));
+        dataFormat.setDeprecated(getSafeValue("deprecated", rows));
+        dataFormat.setDeprecationNote(getSafeValue("deprecationNote", rows));
+        dataFormat.setJavaType(getSafeValue("javaType", rows));
+        dataFormat.setGroupId(getSafeValue("groupId", rows));
+        dataFormat.setArtifactId(getSafeValue("artifactId", rows));
+        dataFormat.setVersion(getSafeValue("version", rows));
 
         return dataFormat;
     }
 
     private LanguageModel generateLanguageModel(String json) {
-        List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("language", json, false);
+        List<Map<String, String>> rows = 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(getSafeValue("title", rows));
+        language.setName(getSafeValue("name", rows));
+        language.setModelName(getSafeValue("modelName", rows));
+        language.setDescription(getSafeValue("description", rows));
+        language.setFirstVersion(getSafeValue("firstVersion", rows));
+        language.setLabel(getSafeValue("label", rows));
+        language.setDeprecated(getSafeValue("deprecated", rows));
+        language.setDeprecationNote(getSafeValue("deprecationNote", rows));
+        language.setJavaType(getSafeValue("javaType", rows));
+        language.setGroupId(getSafeValue("groupId", rows));
+        language.setArtifactId(getSafeValue("artifactId", rows));
+        language.setVersion(getSafeValue("version", rows));
 
         return language;
     }
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateReadmeMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateReadmeMojo.java
index e0bec70..bce8cb1 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateReadmeMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateReadmeMojo.java
@@ -17,7 +17,6 @@
 package org.apache.camel.maven.packaging;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Paths;
@@ -39,6 +38,8 @@ import org.apache.camel.maven.packaging.model.EipOptionModel;
 import org.apache.camel.maven.packaging.model.EndpointOptionModel;
 import org.apache.camel.maven.packaging.model.LanguageModel;
 import org.apache.camel.maven.packaging.model.LanguageOptionModel;
+import org.apache.camel.tooling.util.PackageHelper;
+import org.apache.camel.tooling.util.Strings;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Component;
@@ -48,11 +49,11 @@ import org.apache.maven.project.MavenProject;
 import org.mvel2.templates.TemplateRuntime;
 import org.sonatype.plexus.build.incremental.BuildContext;
 
-import static org.apache.camel.maven.packaging.JSonSchemaHelper.getSafeValue;
-import static org.apache.camel.maven.packaging.JSonSchemaHelper.parseJsonSchema;
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
-import static org.apache.camel.maven.packaging.PackageHelper.writeText;
-import static org.apache.camel.maven.packaging.StringHelper.isEmpty;
+import static org.apache.camel.tooling.util.JSonSchemaHelper.getSafeValue;
+import static org.apache.camel.tooling.util.JSonSchemaHelper.parseJsonSchema;
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.PackageHelper.writeText;
+import static org.apache.camel.tooling.util.Strings.isEmpty;
 
 /**
  * Generate or updates the component/dataformat/language/eip readme.md and .adoc files in the project root directory.
@@ -381,10 +382,9 @@ public class UpdateReadmeMojo extends AbstractMojo {
 
         boolean updated = false;
 
-        try (InputStream fileStream = new FileInputStream(file)) {
+        try {
             List<String> newLines = new ArrayList<>();
-
-            String text = loadText(fileStream);
+            String text = loadText(file);
             String[] lines = text.split("\n");
             for (int i = 0; i < lines.length; i++) {
                 String line = lines[i];
@@ -422,10 +422,10 @@ public class UpdateReadmeMojo extends AbstractMojo {
 
         boolean updated = false;
 
-        try (InputStream fileStream = new FileInputStream(file)) {
+        try {
             List<String> newLines = new ArrayList<>();
 
-            String text = loadText(fileStream);
+            String text = loadText(file);
             String[] lines = text.split("\n");
             // line 0 is the link
             for (int i = 1; i < lines.length; i++) {
@@ -490,10 +490,10 @@ public class UpdateReadmeMojo extends AbstractMojo {
 
         final String headerText = generateHeaderTextData(model);
 
-        try (InputStream fileStream = new FileInputStream(file)) {
-            final String loadedText = loadText(fileStream);
+        try {
+            final String loadedText = loadText(file);
 
-            String existing = StringHelper.between(loadedText, markerStart, markerEnd);
+            String existing = Strings.between(loadedText, markerStart, markerEnd);
 
             if (existing != null) {
                 // remove leading line breaks etc
@@ -502,8 +502,8 @@ public class UpdateReadmeMojo extends AbstractMojo {
                     return false;
                 }
 
-                final String before = StringHelper.before(loadedText, markerStart);
-                final String after = StringHelper.after(loadedText, markerEnd);
+                final String before = Strings.before(loadedText, markerStart);
+                final String after = Strings.after(loadedText, markerEnd);
                 final String updatedHeaderText = before + markerStart + "\n" + headerText + "\n" + markerEnd + after;
 
                 writeText(file, updatedHeaderText);
@@ -511,8 +511,8 @@ public class UpdateReadmeMojo extends AbstractMojo {
             } else {
                 // so we don't have the marker, so we add it somewhere after the camel version
                 final String sinceVersion = "*Since Camel " + shortenVersion(model.getFirstVersion()) + "*";
-                final String before = StringHelper.before(loadedText, sinceVersion);
-                final String after = StringHelper.after(loadedText, sinceVersion);
+                final String before = Strings.before(loadedText, sinceVersion);
+                final String after = Strings.after(loadedText, sinceVersion);
                 final String updatedHeaderText = before + sinceVersion + "\n\n" + markerStart + "\n" + headerText + "\n" + markerEnd + after;
 
                 writeText(file, updatedHeaderText);
@@ -547,8 +547,8 @@ public class UpdateReadmeMojo extends AbstractMojo {
 
         boolean updated = false;
 
-        try (InputStream fileStream = new FileInputStream(file)) {
-            String text = loadText(fileStream);
+        try {
+            String text = loadText(file);
 
             String[] lines = text.split("\n");
 
@@ -613,10 +613,10 @@ public class UpdateReadmeMojo extends AbstractMojo {
         }
 
         final String updated = changed.trim();
-        try (InputStream fileStream = new FileInputStream(file)) {
-            String text = loadText(fileStream);
+        try {
+            String text = loadText(file);
 
-            String existing = StringHelper.between(text, "// " + kind + " options: START", "// " + kind + " options: END");
+            String existing = Strings.between(text, "// " + kind + " options: START", "// " + kind + " options: END");
             if (existing != null) {
                 // remove leading line breaks etc
                 existing = existing.trim();
@@ -624,8 +624,8 @@ public class UpdateReadmeMojo extends AbstractMojo {
                     return false;
                 }
 
-                String before = StringHelper.before(text, "// " + kind  + " options: START");
-                String after = StringHelper.after(text, "// " + kind + " options: END");
+                String before = Strings.before(text, "// " + kind  + " options: START");
+                String after = Strings.after(text, "// " + kind + " options: END");
                 text = before + "// " + kind + " options: START\n" + updated + "\n// " + kind + " options: END" + after;
                 writeText(file, text);
                 return true;
@@ -647,8 +647,8 @@ public class UpdateReadmeMojo extends AbstractMojo {
     private static String loadJsonFrom(Set<File> jsonFiles, String kind, String name) {
         for (File file : jsonFiles) {
             if (file.getName().equals(name + ".json")) {
-                try (InputStream fileStream = new FileInputStream(file)) {
-                    String json = loadText(fileStream);
+                try {
+                    String json = loadText(file);
                     boolean isRequestedKind = json.contains("\"kind\": \"" + kind + "\"");
                     if (isRequestedKind) {
                         return json;
@@ -663,8 +663,8 @@ public class UpdateReadmeMojo extends AbstractMojo {
     }
 
     private static String loadEipJson(File file) {
-        try (InputStream fileStream = new FileInputStream(file)) {
-            String json = loadText(fileStream);
+        try {
+            String json = loadText(file);
             boolean isEip = json.contains("\"kind\": \"model\"");
             if (isEip) {
                 return json;
@@ -722,7 +722,7 @@ public class UpdateReadmeMojo extends AbstractMojo {
             if ("true".equals(option.getDeprecated())) {
                 String desc = "*Deprecated* " + option.getDescription();
                 option.setDescription(desc);
-                if (!StringHelper.isEmpty(option.getDeprecationNote())) {
+                if (!Strings.isEmpty(option.getDeprecationNote())) {
                     desc = option.getDescription();
                     if (!desc.endsWith(".")) {
                         desc = desc + ". Deprecation note: " + option.getDeprecationNote();
@@ -769,7 +769,7 @@ public class UpdateReadmeMojo extends AbstractMojo {
             if ("true".equals(option.getDeprecated())) {
                 String desc = "*Deprecated* " + option.getDescription();
                 option.setDescription(desc);
-                if (!StringHelper.isEmpty(option.getDeprecationNote())) {
+                if (!Strings.isEmpty(option.getDeprecationNote())) {
                     desc = option.getDescription();
                     if (!desc.endsWith(".")) {
                         desc = desc + ". Deprecation note: " + option.getDeprecationNote();
@@ -838,7 +838,7 @@ public class UpdateReadmeMojo extends AbstractMojo {
             if ("true".equals(option.getDeprecated())) {
                 String desc = "*Deprecated* " + option.getDescription();
                 option.setDescription(desc);
-                if (!StringHelper.isEmpty(option.getDeprecationNote())) {
+                if (!Strings.isEmpty(option.getDeprecationNote())) {
                     desc = option.getDescription();
                     if (!desc.endsWith(".")) {
                         desc = desc + ". Deprecation note: " + option.getDeprecationNote();
@@ -895,7 +895,7 @@ public class UpdateReadmeMojo extends AbstractMojo {
             if ("true".equals(option.getDeprecated())) {
                 String desc = "*Deprecated* " + option.getDescription();
                 option.setDescription(desc);
-                if (!StringHelper.isEmpty(option.getDeprecationNote())) {
+                if (!Strings.isEmpty(option.getDeprecationNote())) {
                     desc = option.getDescription();
                     if (!desc.endsWith(".")) {
                         desc = desc + ". Deprecation note: " + option.getDeprecationNote();
@@ -955,7 +955,7 @@ public class UpdateReadmeMojo extends AbstractMojo {
             if (option.isDeprecated()) {
                 String desc = "*Deprecated* " + option.getDescription();
                 option.setDescription(desc);
-                if (!StringHelper.isEmpty(option.getDeprecationNote())) {
+                if (!Strings.isEmpty(option.getDeprecationNote())) {
                     desc = option.getDescription();
                     if (!desc.endsWith(".")) {
                         desc = desc + ". Deprecation note: " + option.getDeprecationNote();
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ValidateComponentMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ValidateComponentMojo.java
index c660a1f..deb896f 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ValidateComponentMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ValidateComponentMojo.java
@@ -18,11 +18,11 @@ package org.apache.camel.maven.packaging;
 
 import java.io.File;
 import java.io.FileFilter;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.apache.camel.tooling.util.PackageHelper;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -33,8 +33,8 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 import org.sonatype.plexus.build.incremental.BuildContext;
 
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
-import static org.apache.camel.maven.packaging.StringHelper.indentCollection;
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.Strings.indentCollection;
 import static org.apache.camel.maven.packaging.ValidateHelper.asName;
 import static org.apache.camel.maven.packaging.ValidateHelper.validate;
 
@@ -150,8 +150,8 @@ public class ValidateComponentMojo extends AbstractMojo {
             if (pathname.isFile() && pathname.getName().endsWith(".json")) {
                 // must be a components json file
                 try {
-                    String json = loadText(new FileInputStream(pathname));
-                    return json != null && json.contains("\"kind\": \"component\"");
+                    String json = loadText(pathname);
+                    return json.contains("\"kind\": \"component\"");
                 } catch (IOException e) {
                     // ignore
                 }
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ValidateHelper.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ValidateHelper.java
index 5309af8..72c1851 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ValidateHelper.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ValidateHelper.java
@@ -17,12 +17,14 @@
 package org.apache.camel.maven.packaging;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
+import org.apache.camel.tooling.util.JSonSchemaHelper;
+import org.apache.camel.tooling.util.Strings;
+
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
 
 /**
  * Validation helper for validating components, data formats and languages
@@ -40,7 +42,7 @@ public final class ValidateHelper {
      */
     public static void validate(File file, ErrorDetail errorDetail) {
         try {
-            String json = loadText(new FileInputStream(file));
+            String json = loadText(file);
 
             boolean isComponent = json.contains("\"kind\": \"component\"");
             boolean isDataFormat = json.contains("\"kind\": \"dataformat\"");
@@ -65,15 +67,15 @@ public final class ValidateHelper {
             boolean syntax = false;
             for (Map<String, String> row : rows) {
                 String value = row.get("label");
-                if (!StringHelper.isEmpty(value)) {
+                if (!Strings.isEmpty(value)) {
                     label = true;
                 }
                 value = row.get("description");
-                if (!StringHelper.isEmpty(value)) {
+                if (!Strings.isEmpty(value)) {
                     description = true;
                 }
                 value = row.get("syntax");
-                if (!StringHelper.isEmpty(value)) {
+                if (!Strings.isEmpty(value)) {
                     syntax = true;
                 }
             }
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/ComponentModel.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/ComponentModel.java
index 6d87840..5cd1cea 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/ComponentModel.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/ComponentModel.java
@@ -19,9 +19,9 @@ package org.apache.camel.maven.packaging.model;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.camel.maven.packaging.StringHelper;
+import org.apache.camel.tooling.util.Strings;
 
-import static org.apache.camel.maven.packaging.StringHelper.cutLastZeroDigit;
+import static org.apache.camel.tooling.util.Strings.cutLastZeroDigit;
 
 public class ComponentModel {
 
@@ -207,7 +207,7 @@ public class ComponentModel {
     }
 
     public String getShortJavaType() {
-        return StringHelper.getClassShortName(javaType);
+        return Strings.getClassShortName(javaType);
     }
 
     public String getFirstVersionShort() {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/ComponentOptionModel.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/ComponentOptionModel.java
index 1fafbdb..1ea7a71 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/ComponentOptionModel.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/ComponentOptionModel.java
@@ -16,9 +16,9 @@
  */
 package org.apache.camel.maven.packaging.model;
 
-import org.apache.camel.maven.packaging.StringHelper;
+import org.apache.camel.tooling.util.Strings;
 
-import static org.apache.camel.maven.packaging.StringHelper.wrapCamelCaseWords;
+import static org.apache.camel.tooling.util.Strings.wrapCamelCaseWords;
 
 public class ComponentOptionModel {
 
@@ -152,13 +152,13 @@ public class ComponentOptionModel {
     }
 
     public String getShortJavaType() {
-        return StringHelper.getClassShortName(javaType);
+        return Strings.getClassShortName(javaType);
     }
 
     @Deprecated
     public String getShortJavaType(int watermark) {
 
-        String text = StringHelper.getClassShortName(javaType);
+        String text = Strings.getClassShortName(javaType);
 
         // if its some kind of java object then lets wrap it as its long
         if ("object".equals(type)) {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/DataFormatModel.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/DataFormatModel.java
index b6dfd82..a6dbd58 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/DataFormatModel.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/DataFormatModel.java
@@ -19,9 +19,9 @@ package org.apache.camel.maven.packaging.model;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.camel.maven.packaging.StringHelper;
+import org.apache.camel.tooling.util.Strings;
 
-import static org.apache.camel.maven.packaging.StringHelper.cutLastZeroDigit;
+import static org.apache.camel.tooling.util.Strings.cutLastZeroDigit;
 
 public class DataFormatModel {
 
@@ -153,7 +153,7 @@ public class DataFormatModel {
     }
 
     public String getShortJavaType() {
-        return StringHelper.getClassShortName(javaType);
+        return Strings.getClassShortName(javaType);
     }
 
     public String getFirstVersionShort() {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/DataFormatOptionModel.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/DataFormatOptionModel.java
index d209a00..9dd5dee 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/DataFormatOptionModel.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/DataFormatOptionModel.java
@@ -16,7 +16,7 @@
  */
 package org.apache.camel.maven.packaging.model;
 
-import org.apache.camel.maven.packaging.StringHelper;
+import org.apache.camel.tooling.util.Strings;
 
 public class DataFormatOptionModel {
 
@@ -112,7 +112,7 @@ public class DataFormatOptionModel {
     }
 
     public String getShortJavaType() {
-        return StringHelper.getClassShortName(javaType);
+        return Strings.getClassShortName(javaType);
     }
 
 }
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/EipOptionModel.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/EipOptionModel.java
index 64c4a33..5e2ee91 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/EipOptionModel.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/EipOptionModel.java
@@ -16,9 +16,9 @@
  */
 package org.apache.camel.maven.packaging.model;
 
-import org.apache.camel.maven.packaging.StringHelper;
+import org.apache.camel.tooling.util.Strings;
 
-import static org.apache.camel.maven.packaging.StringHelper.wrapCamelCaseWords;
+import static org.apache.camel.tooling.util.Strings.wrapCamelCaseWords;
 
 public class EipOptionModel {
 
@@ -149,13 +149,13 @@ public class EipOptionModel {
     }
 
     public String getShortJavaType() {
-        return StringHelper.getClassShortName(javaType);
+        return Strings.getClassShortName(javaType);
     }
 
     @Deprecated
     public String getShortJavaType(int watermark) {
 
-        String text = StringHelper.getClassShortName(javaType);
+        String text = Strings.getClassShortName(javaType);
 
         // if its some kind of java object then lets wrap it as its long
         if ("object".equals(type)) {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/EndpointOptionModel.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/EndpointOptionModel.java
index 754d06a..068786e 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/EndpointOptionModel.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/EndpointOptionModel.java
@@ -16,9 +16,9 @@
  */
 package org.apache.camel.maven.packaging.model;
 
-import org.apache.camel.maven.packaging.StringHelper;
+import org.apache.camel.tooling.util.Strings;
 
-import static org.apache.camel.maven.packaging.StringHelper.wrapCamelCaseWords;
+import static org.apache.camel.tooling.util.Strings.wrapCamelCaseWords;
 
 public class EndpointOptionModel {
 
@@ -188,13 +188,13 @@ public class EndpointOptionModel {
     }
 
     public String getShortJavaType() {
-        return StringHelper.getClassShortName(javaType);
+        return Strings.getClassShortName(javaType);
     }
 
     @Deprecated
     public String getShortJavaType(int watermark) {
 
-        String text = StringHelper.getClassShortName(javaType);
+        String text = Strings.getClassShortName(javaType);
 
         // if its some kind of java object then lets wrap it as its long
         if ("object".equals(type)) {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/LanguageModel.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/LanguageModel.java
index ac47855..d57d03f 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/LanguageModel.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/LanguageModel.java
@@ -19,9 +19,9 @@ package org.apache.camel.maven.packaging.model;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.camel.maven.packaging.StringHelper;
+import org.apache.camel.tooling.util.Strings;
 
-import static org.apache.camel.maven.packaging.StringHelper.cutLastZeroDigit;
+import static org.apache.camel.tooling.util.Strings.cutLastZeroDigit;
 
 public class LanguageModel {
 
@@ -153,7 +153,7 @@ public class LanguageModel {
     }
 
     public String getShortJavaType() {
-        return StringHelper.getClassShortName(javaType);
+        return Strings.getClassShortName(javaType);
     }
 
     public String getFirstVersionShort() {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/LanguageOptionModel.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/LanguageOptionModel.java
index db7b015..bbd696f 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/LanguageOptionModel.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/LanguageOptionModel.java
@@ -16,7 +16,7 @@
  */
 package org.apache.camel.maven.packaging.model;
 
-import org.apache.camel.maven.packaging.StringHelper;
+import org.apache.camel.tooling.util.Strings;
 
 public class LanguageOptionModel {
 
@@ -112,7 +112,7 @@ public class LanguageOptionModel {
     }
 
     public String getShortJavaType() {
-        return StringHelper.getClassShortName(javaType);
+        return Strings.getClassShortName(javaType);
     }
 
 }
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/OtherModel.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/OtherModel.java
index e51941c..234aa28 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/OtherModel.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/OtherModel.java
@@ -19,9 +19,9 @@ package org.apache.camel.maven.packaging.model;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.camel.maven.packaging.StringHelper;
+import org.apache.camel.tooling.util.Strings;
 
-import static org.apache.camel.maven.packaging.StringHelper.cutLastZeroDigit;
+import static org.apache.camel.tooling.util.Strings.cutLastZeroDigit;
 
 public class OtherModel {
 
@@ -148,6 +148,6 @@ public class OtherModel {
     }
 
     public String getShortJavaType() {
-        return StringHelper.getClassShortName(javaType);
+        return Strings.getClassShortName(javaType);
     }
 }
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/OtherOptionModel.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/OtherOptionModel.java
index 1ac49e3..b7af1c7 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/OtherOptionModel.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/OtherOptionModel.java
@@ -16,9 +16,9 @@
  */
 package org.apache.camel.maven.packaging.model;
 
-import org.apache.camel.maven.packaging.StringHelper;
+import org.apache.camel.tooling.util.Strings;
 
-import static org.apache.camel.maven.packaging.StringHelper.wrapCamelCaseWords;
+import static org.apache.camel.tooling.util.Strings.wrapCamelCaseWords;
 
 public class OtherOptionModel {
 
@@ -152,13 +152,13 @@ public class OtherOptionModel {
     }
 
     public String getShortJavaType() {
-        return StringHelper.getClassShortName(javaType);
+        return Strings.getClassShortName(javaType);
     }
 
     @Deprecated
     public String getShortJavaType(int watermark) {
 
-        String text = StringHelper.getClassShortName(javaType);
+        String text = Strings.getClassShortName(javaType);
 
         // if its some kind of java object then lets wrap it as its long
         if ("object".equals(type)) {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/SpringBootAutoConfigureOptionModel.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/SpringBootAutoConfigureOptionModel.java
index 958527b..d07f627 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/SpringBootAutoConfigureOptionModel.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/model/SpringBootAutoConfigureOptionModel.java
@@ -16,9 +16,9 @@
  */
 package org.apache.camel.maven.packaging.model;
 
-import org.apache.camel.maven.packaging.StringHelper;
+import org.apache.camel.tooling.util.Strings;
 
-import static org.apache.camel.maven.packaging.StringHelper.wrapCamelCaseWords;
+import static org.apache.camel.tooling.util.Strings.wrapCamelCaseWords;
 
 public class SpringBootAutoConfigureOptionModel {
 
@@ -60,13 +60,13 @@ public class SpringBootAutoConfigureOptionModel {
     }
 
     public String getShortJavaType() {
-        return StringHelper.getClassShortName(javaType);
+        return Strings.getClassShortName(javaType);
     }
 
     @Deprecated
     public String getShortJavaType(int watermark) {
 
-        String text = StringHelper.getClassShortName(javaType);
+        String text = Strings.getClassShortName(javaType);
 
         // if its some kind of custom java object then lets wrap it as its long
         if (!javaType.startsWith("java.")) {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/resources/component-options.mvel b/tooling/maven/camel-package-maven-plugin/src/main/resources/component-options.mvel
index 8165777..3fdc729 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/resources/component-options.mvel
+++ b/tooling/maven/camel-package-maven-plugin/src/main/resources/component-options.mvel
@@ -8,6 +8,6 @@ The @{title} component supports @{componentOptions.size()} options, which are li
 [width="100%",cols="2,5,^1,2",options="header"]
 |===@comment{ Render table cells. If description contains newline, prefix cell with `a`, so the content is rendered with formatting. }
 | Name | Description | Default | Type
-@foreach{row : componentOptions}| *@{row.getShortName(25)}* (@{row.shortGroup}) @{row.description.?contains("\n") ? "a" : ""}| @{util.escape(row.description)} | @{row.getShortDefaultValue(20)} | @{row.getShortJavaType()}
+@foreach{row : componentOptions}| *@{row.getShortName(30)}* (@{row.shortGroup}) @{row.description.?contains("\n") ? "a" : ""}| @{util.escape(row.description)} | @{row.getShortDefaultValue(20)} | @{row.getShortJavaType()}
 @end{}|===
 @end{}
diff --git a/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/model/StringHelperTest.java b/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/model/StringHelperTest.java
index e13144a..560f91f 100644
--- a/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/model/StringHelperTest.java
+++ b/tooling/maven/camel-package-maven-plugin/src/test/java/org/apache/camel/maven/packaging/model/StringHelperTest.java
@@ -18,7 +18,7 @@ package org.apache.camel.maven.packaging.model;
 
 import java.util.stream.Stream;
 
-import org.apache.camel.maven.packaging.StringHelper;
+import org.apache.camel.tooling.util.Strings;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
@@ -46,6 +46,6 @@ public class StringHelperTest {
     @ParameterizedTest
     @MethodSource("getClassShortNameTypeVarations")
     public void getClassShortName(String expectedBaseClassName, String className) {
-        Assertions.assertEquals(expectedBaseClassName, StringHelper.getClassShortName(className));
+        Assertions.assertEquals(expectedBaseClassName, Strings.getClassShortName(className));
     }
 }
diff --git a/tooling/pom.xml b/tooling/pom.xml
index 52eb485..d1d0f9c 100644
--- a/tooling/pom.xml
+++ b/tooling/pom.xml
@@ -39,6 +39,7 @@
         <module>spi-annotations</module>
         <module>apt</module>
         <module>camel-util-json</module>
+        <module>camel-tooling-util</module>
         <module>camel-bundle-plugin</module>
         <module>swagger-rest-dsl-generator</module>
         <module>openapi-rest-dsl-generator</module>


[camel] 06/07: Regen doc

Posted by gn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit d3908e028f38e7d5d41b1403a5be8dc3efc18679
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Wed Jan 15 17:06:13 2020 +0100

    Regen doc
---
 .../src/main/docs/activemq-component.adoc          | 62 +++++++++++-----------
 .../src/main/docs/ahc-ws-component.adoc            |  4 +-
 .../camel-ahc/src/main/docs/ahc-component.adoc     |  4 +-
 .../camel-amqp/src/main/docs/amqp-component.adoc   | 62 +++++++++++-----------
 .../main/docs/atmosphere-websocket-component.adoc  |  6 +--
 .../src/main/docs/aws-ddbstream-component.adoc     |  2 +-
 .../src/main/docs/aws-s3-component.adoc            |  2 +-
 .../src/main/docs/aws-sqs-component.adoc           |  6 +--
 .../src/main/docs/aws-swf-component.adoc           |  8 +--
 .../src/main/docs/bean-validator-component.adoc    |  4 +-
 .../src/main/docs/beanstalk-component.adoc         |  2 +-
 .../src/main/docs/cometd-component.adoc            |  2 +-
 .../src/main/docs/consul-component.adoc            |  2 +-
 .../src/main/docs/crypto-cms-component.adoc        |  6 +--
 .../camel-cxf/src/main/docs/cxf-component.adoc     |  4 +-
 .../camel-cxf/src/main/docs/cxfrs-component.adoc   |  4 +-
 .../src/main/docs/debezium-mongodb-component.adoc  |  4 +-
 .../src/main/docs/debezium-mysql-component.adoc    | 14 ++---
 .../src/main/docs/debezium-postgres-component.adoc |  2 +-
 .../main/docs/debezium-sqlserver-component.adoc    |  8 +--
 .../src/main/docs/disruptor-component.adoc         |  4 +-
 .../src/main/docs/ehcache-component.adoc           |  2 +-
 .../src/main/docs/elytron-component.adoc           |  2 +-
 .../camel-etcd/src/main/docs/etcd-component.adoc   |  2 +-
 .../camel-file/src/main/docs/file-component.adoc   | 10 ++--
 .../camel-ftp/src/main/docs/ftp-component.adoc     | 12 ++---
 .../camel-ftp/src/main/docs/ftps-component.adoc    | 18 +++----
 .../camel-ftp/src/main/docs/sftp-component.adoc    | 14 ++---
 .../camel-http/src/main/docs/http-component.adoc   |  8 +--
 .../src/main/docs/iec60870-client-component.adoc   |  4 +-
 .../src/main/docs/iec60870-server-component.adoc   |  4 +-
 .../src/main/docs/ignite-cache-component.adoc      |  2 +-
 .../src/main/docs/ignite-compute-component.adoc    |  2 +-
 .../src/main/docs/ignite-events-component.adoc     |  2 +-
 .../src/main/docs/ignite-idgen-component.adoc      |  2 +-
 .../src/main/docs/ignite-messaging-component.adoc  |  2 +-
 .../src/main/docs/ignite-queue-component.adoc      |  2 +-
 .../src/main/docs/ignite-set-component.adoc        |  2 +-
 .../camel-irc/src/main/docs/irc-component.adoc     |  2 +-
 .../src/main/docs/jcache-component.adoc            |  4 +-
 .../camel-jdbc/src/main/docs/jdbc-component.adoc   |  2 +-
 .../camel-jetty/src/main/docs/jetty-component.adoc | 12 ++---
 .../camel-jms/src/main/docs/jms-component.adoc     | 62 +++++++++++-----------
 .../camel-jmx/src/main/docs/jmx-component.adoc     |  2 +-
 .../camel-kafka/src/main/docs/kafka-component.adoc |  8 +--
 .../src/main/docs/lumberjack-component.adoc        |  2 +-
 .../camel-mail/src/main/docs/mail-component.adoc   |  6 +--
 .../src/main/docs/milo-server-component.adoc       | 10 ++--
 .../camel-mina/src/main/docs/mina-component.adoc   |  2 +-
 .../camel-nats/src/main/docs/nats-component.adoc   |  2 +-
 .../src/main/docs/netty-http-component.adoc        |  8 +--
 .../camel-netty/src/main/docs/netty-component.adoc |  8 +--
 .../camel-nsq/src/main/docs/nsq-component.adoc     |  2 +-
 .../src/main/docs/olingo2-component.adoc           |  2 +-
 .../src/main/docs/olingo4-component.adoc           |  2 +-
 .../src/main/docs/pulsar-component.adoc            |  6 +--
 .../src/main/docs/quartz-component.adoc            |  6 +--
 .../src/main/docs/rabbitmq-component.adoc          | 12 ++---
 .../src/main/docs/reactive-streams-component.adoc  |  2 +-
 .../src/main/docs/rest-openapi-component.adoc      |  2 +-
 .../src/main/docs/rest-swagger-component.adoc      |  2 +-
 .../src/main/docs/servicenow-component.adoc        |  4 +-
 .../src/main/docs/servlet-component.adoc           |  6 +--
 .../src/main/docs/sjms-batch-component.adoc        |  2 +-
 .../camel-sjms/src/main/docs/sjms-component.adoc   |  4 +-
 .../camel-sjms2/src/main/docs/sjms2-component.adoc |  4 +-
 .../camel-solr/src/main/docs/solr-component.adoc   |  2 +-
 .../src/main/docs/soroush-component.adoc           |  2 +-
 .../src/main/docs/splunk-component.adoc            |  2 +-
 .../src/main/docs/spring-ws-component.adoc         |  2 +-
 .../camel-stomp/src/main/docs/stomp-component.adoc |  2 +-
 .../src/main/docs/undertow-component.adoc          |  2 +-
 .../src/main/docs/weather-component.adoc           |  2 +-
 .../src/main/docs/websocket-component.adoc         |  2 +-
 .../camel-xj/src/main/docs/xj-component.adoc       |  2 +-
 .../src/main/docs/xmlsecurity-component.adoc       |  2 +-
 .../src/main/docs/xslt-saxon-component.adoc        |  2 +-
 .../src/main/docs/zookeeper-master-component.adoc  |  2 +-
 .../builder/endpoint/EndpointBuilderFactory.java   | 15 ++----
 .../camel/builder/endpoint/EndpointBuilders.java   | 15 ++----
 .../modules/ROOT/pages/activemq-component.adoc     | 62 +++++++++++-----------
 .../modules/ROOT/pages/ahc-component.adoc          |  4 +-
 .../modules/ROOT/pages/ahc-ws-component.adoc       |  4 +-
 .../modules/ROOT/pages/amqp-component.adoc         | 62 +++++++++++-----------
 .../ROOT/pages/atmosphere-websocket-component.adoc |  6 +--
 .../ROOT/pages/aws-ddbstream-component.adoc        |  2 +-
 .../modules/ROOT/pages/aws-s3-component.adoc       |  2 +-
 .../modules/ROOT/pages/aws-sqs-component.adoc      |  6 +--
 .../modules/ROOT/pages/aws-swf-component.adoc      |  8 +--
 .../ROOT/pages/bean-validator-component.adoc       |  4 +-
 .../modules/ROOT/pages/beanstalk-component.adoc    |  2 +-
 .../modules/ROOT/pages/cometd-component.adoc       |  2 +-
 .../modules/ROOT/pages/consul-component.adoc       |  2 +-
 .../modules/ROOT/pages/crypto-cms-component.adoc   |  6 +--
 .../modules/ROOT/pages/cxf-component.adoc          |  4 +-
 .../modules/ROOT/pages/cxfrs-component.adoc        |  4 +-
 .../ROOT/pages/debezium-mongodb-component.adoc     |  4 +-
 .../ROOT/pages/debezium-mysql-component.adoc       | 14 ++---
 .../ROOT/pages/debezium-postgres-component.adoc    |  2 +-
 .../ROOT/pages/debezium-sqlserver-component.adoc   |  8 +--
 .../modules/ROOT/pages/disruptor-component.adoc    |  4 +-
 .../modules/ROOT/pages/ehcache-component.adoc      |  2 +-
 .../modules/ROOT/pages/elytron-component.adoc      |  2 +-
 .../modules/ROOT/pages/etcd-component.adoc         |  2 +-
 .../modules/ROOT/pages/file-component.adoc         | 10 ++--
 .../modules/ROOT/pages/ftp-component.adoc          | 12 ++---
 .../modules/ROOT/pages/ftps-component.adoc         | 18 +++----
 .../modules/ROOT/pages/http-component.adoc         |  8 +--
 .../ROOT/pages/iec60870-client-component.adoc      |  4 +-
 .../ROOT/pages/iec60870-server-component.adoc      |  4 +-
 .../modules/ROOT/pages/ignite-cache-component.adoc |  2 +-
 .../ROOT/pages/ignite-compute-component.adoc       |  2 +-
 .../ROOT/pages/ignite-events-component.adoc        |  2 +-
 .../modules/ROOT/pages/ignite-idgen-component.adoc |  2 +-
 .../ROOT/pages/ignite-messaging-component.adoc     |  2 +-
 .../modules/ROOT/pages/ignite-queue-component.adoc |  2 +-
 .../modules/ROOT/pages/ignite-set-component.adoc   |  2 +-
 docs/components/modules/ROOT/pages/index.adoc      |  6 +--
 .../modules/ROOT/pages/ipfs-component.adoc         | 10 ++--
 .../modules/ROOT/pages/irc-component.adoc          |  2 +-
 .../modules/ROOT/pages/jcache-component.adoc       |  4 +-
 .../modules/ROOT/pages/jdbc-component.adoc         |  2 +-
 .../modules/ROOT/pages/jetty-component.adoc        | 12 ++---
 .../modules/ROOT/pages/jms-component.adoc          | 62 +++++++++++-----------
 .../modules/ROOT/pages/jmx-component.adoc          |  2 +-
 .../modules/ROOT/pages/kafka-component.adoc        |  8 +--
 .../modules/ROOT/pages/lumberjack-component.adoc   |  2 +-
 .../modules/ROOT/pages/mail-component.adoc         |  6 +--
 .../modules/ROOT/pages/milo-server-component.adoc  | 10 ++--
 .../modules/ROOT/pages/mina-component.adoc         |  2 +-
 .../modules/ROOT/pages/nats-component.adoc         |  2 +-
 .../modules/ROOT/pages/netty-component.adoc        |  8 +--
 .../modules/ROOT/pages/netty-http-component.adoc   |  8 +--
 .../modules/ROOT/pages/nsq-component.adoc          |  2 +-
 .../modules/ROOT/pages/olingo2-component.adoc      |  2 +-
 .../modules/ROOT/pages/olingo4-component.adoc      |  2 +-
 .../modules/ROOT/pages/pulsar-component.adoc       |  6 +--
 .../modules/ROOT/pages/quartz-component.adoc       |  6 +--
 .../modules/ROOT/pages/rabbitmq-component.adoc     | 12 ++---
 .../ROOT/pages/reactive-streams-component.adoc     |  2 +-
 .../modules/ROOT/pages/rest-openapi-component.adoc |  2 +-
 .../modules/ROOT/pages/rest-swagger-component.adoc |  2 +-
 .../modules/ROOT/pages/servicenow-component.adoc   |  4 +-
 .../modules/ROOT/pages/servlet-component.adoc      |  6 +--
 .../modules/ROOT/pages/sftp-component.adoc         | 14 ++---
 .../modules/ROOT/pages/sjms-batch-component.adoc   |  2 +-
 .../modules/ROOT/pages/sjms-component.adoc         |  4 +-
 .../modules/ROOT/pages/sjms2-component.adoc        |  4 +-
 .../modules/ROOT/pages/solr-component.adoc         |  2 +-
 .../modules/ROOT/pages/soroush-component.adoc      |  2 +-
 .../modules/ROOT/pages/splunk-component.adoc       |  2 +-
 .../modules/ROOT/pages/spring-ws-component.adoc    |  2 +-
 .../modules/ROOT/pages/stomp-component.adoc        |  2 +-
 .../modules/ROOT/pages/undertow-component.adoc     |  2 +-
 .../modules/ROOT/pages/weather-component.adoc      |  2 +-
 .../modules/ROOT/pages/websocket-component.adoc    |  2 +-
 .../modules/ROOT/pages/xj-component.adoc           |  2 +-
 .../modules/ROOT/pages/xmlsecurity-component.adoc  |  2 +-
 .../modules/ROOT/pages/xslt-saxon-component.adoc   |  2 +-
 .../ROOT/pages/zookeeper-master-component.adoc     |  2 +-
 160 files changed, 530 insertions(+), 540 deletions(-)

diff --git a/components/camel-activemq/src/main/docs/activemq-component.adoc b/components/camel-activemq/src/main/docs/activemq-component.adoc
index 143ed11..8d37f23 100644
--- a/components/camel-activemq/src/main/docs/activemq-component.adoc
+++ b/components/camel-activemq/src/main/docs/activemq-component.adoc
@@ -60,13 +60,13 @@ The ActiveMQ component supports 88 options, which are listed below.
 | *usePooledConnection* (common) | Enables or disables whether a PooledConnectionFactory will be used so that when messages are sent to ActiveMQ from outside of a message consuming thread, pooling will be used rather than the default with the Spring JmsTemplate which will create a new connection, session, producer for each message then close them all down again. The default value is true. | false | boolean
 | *useSingleConnection* (common) | Enables or disables whether a Spring SingleConnectionFactory will be used so that when messages are sent to ActiveMQ from outside of a message consuming thread, pooling will be used rather than the default with the Spring JmsTemplate which will create a new connection, session, producer for each message then close them all down again. The default value is false and a pooled connection is used by default. | false | boolean
 | *configuration* (common) | Configuration of ActiveMQ |  | JmsConfiguration
-| *allowAutoWired ConnectionFactory* (advanced) | Whether to auto-discover ConnectionFactory from the registry, if no connection factory has been configured. If only one instance of ConnectionFactory is found then it will be used. This is enabled by default. | false | boolean
-| *allowAutoWired DestinationResolver* (advanced) | Whether to auto-discover DestinationResolver from the registry, if no destination resolver has been configured. If only one instance of DestinationResolver is found then it will be used. This is enabled by default. | false | boolean
-| *acceptMessagesWhile Stopping* (consumer) | Specifies whether the consumer accept messages while it is stopping. You may consider enabling this option, if you start and stop JMS routes at runtime, while there are still messages enqueued on the queue. If this option is false, and you stop the JMS route, then messages may be rejected, and the JMS broker would have to attempt redeliveries, which yet again may be rejected, and eventually the message may be moved at a dead letter queue on t [...]
-| *allowReplyManagerQuick Stop* (consumer) | Whether the DefaultMessageListenerContainer used in the reply managers for request-reply messaging allow the DefaultMessageListenerContainer.runningAllowed flag to quick stop in case JmsConfiguration#isAcceptMessagesWhileStopping is enabled, and org.apache.camel.CamelContext is currently being stopped. This quick stop ability is enabled by default in the regular JMS consumers but to enable for reply managers you must enable this flag. | false  [...]
+| *allowAutoWiredConnection Factory* (advanced) | Whether to auto-discover ConnectionFactory from the registry, if no connection factory has been configured. If only one instance of ConnectionFactory is found then it will be used. This is enabled by default. | false | boolean
+| *allowAutoWiredDestination Resolver* (advanced) | Whether to auto-discover DestinationResolver from the registry, if no destination resolver has been configured. If only one instance of DestinationResolver is found then it will be used. This is enabled by default. | false | boolean
+| *acceptMessagesWhileStopping* (consumer) | Specifies whether the consumer accept messages while it is stopping. You may consider enabling this option, if you start and stop JMS routes at runtime, while there are still messages enqueued on the queue. If this option is false, and you stop the JMS route, then messages may be rejected, and the JMS broker would have to attempt redeliveries, which yet again may be rejected, and eventually the message may be moved at a dead letter queue on th [...]
+| *allowReplyManagerQuickStop* (consumer) | Whether the DefaultMessageListenerContainer used in the reply managers for request-reply messaging allow the DefaultMessageListenerContainer.runningAllowed flag to quick stop in case JmsConfiguration#isAcceptMessagesWhileStopping is enabled, and org.apache.camel.CamelContext is currently being stopped. This quick stop ability is enabled by default in the regular JMS consumers but to enable for reply managers you must enable this flag. | false | [...]
 | *acknowledgementMode* (consumer) | The JMS acknowledgement mode defined as an Integer. Allows you to set vendor-specific extensions to the acknowledgment mode. For the regular modes, it is preferable to use the acknowledgementModeName instead. |  | int
 | *eagerPoisonBody* (consumer) | If eagerLoadingOfProperties is enabled and the JMS message payload (JMS body or JMS properties) (cannot be read/mapped), then set this text as the message body instead so the message can be processed (the cause of the poison are already stored as exception on the Exchange). This can be turned off by setting eagerPoisonBody=false. See also the option eagerLoadingOfProperties. | Poison JMS message due to ${exception.message} | String
-| *eagerLoadingOf Properties* (consumer) | Enables eager loading of JMS properties as soon as a message is loaded which generally is inefficient as the JMS properties may not be required but sometimes can catch early any issues with the underlying JMS provider and the use of JMS properties. See also the option eagerLoadingOfBody. | false | boolean
+| *eagerLoadingOfProperties* (consumer) | Enables eager loading of JMS properties as soon as a message is loaded which generally is inefficient as the JMS properties may not be required but sometimes can catch early any issues with the underlying JMS provider and the use of JMS properties. See also the option eagerLoadingOfBody. | false | boolean
 | *acknowledgementModeName* (consumer) | The JMS acknowledgement name, which is one of: SESSION_TRANSACTED, CLIENT_ACKNOWLEDGE, AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE | AUTO_ACKNOWLEDGE | String
 | *autoStartup* (consumer) | Specifies whether the consumer container should auto-startup. | true | boolean
 | *cacheLevel* (consumer) | Sets the cache level by ID for the underlying JMS resources. See cacheLevelName option for more details. |  | int
@@ -74,7 +74,7 @@ The ActiveMQ component supports 88 options, which are listed below.
 | *replyToCacheLevelName* (producer) | Sets the cache level by name for the reply consumer when doing request/reply over JMS. This option only applies when using fixed reply queues (not temporary). Camel will by default use: CACHE_CONSUMER for exclusive or shared w/ replyToSelectorName. And CACHE_SESSION for shared without replyToSelectorName. Some JMS brokers such as IBM WebSphere may require to set the replyToCacheLevelName=CACHE_NONE to work. Note: If using temporary queues then CACHE [...]
 | *clientId* (common) | Sets the JMS client ID to use. Note that this value, if specified, must be unique and can only be used by a single JMS connection instance. It is typically only required for durable topic subscriptions. If using Apache ActiveMQ you may prefer to use Virtual Topics instead. |  | String
 | *concurrentConsumers* (consumer) | Specifies the default number of concurrent consumers when consuming from JMS (not for request/reply over JMS). See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. When doing request/reply over JMS then the option replyToConcurrentConsumers is used to control number of concurrent consumers on the reply message listener. | 1 | int
-| *replyToConcurrent Consumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
+| *replyToConcurrentConsumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
 | *connectionFactory* (common) | The connection factory to be use. A connection factory must be configured either on the component or endpoint. |  | ConnectionFactory
 | *username* (security) | Username to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *password* (security) | Password to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
@@ -83,22 +83,22 @@ The ActiveMQ component supports 88 options, which are listed below.
 | *durableSubscriptionName* (common) | The durable subscriber name for specifying durable topic subscriptions. The clientId option must be configured as well. |  | String
 | *exceptionListener* (advanced) | Specifies the JMS Exception Listener that is to be notified of any underlying JMS exceptions. |  | ExceptionListener
 | *errorHandler* (advanced) | Specifies a org.springframework.util.ErrorHandler to be invoked in case of any uncaught exceptions thrown while processing a Message. By default these exceptions will be logged at the WARN level, if no errorHandler has been configured. You can configure logging level and whether stack traces should be logged using errorHandlerLoggingLevel and errorHandlerLogStackTrace options. This makes it much easier to configure, than having to code a custom errorHandler. [...]
-| *errorHandlerLogging Level* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
-| *errorHandlerLogStack Trace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
+| *errorHandlerLoggingLevel* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
+| *errorHandlerLogStackTrace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
 | *explicitQosEnabled* (producer) | Set if the deliveryMode, priority or timeToLive qualities of service should be used when sending messages. This option is based on Spring's JmsTemplate. The deliveryMode, priority and timeToLive options are applied to the current endpoint. This contrasts with the preserveMessageQos option, which operates at message granularity, reading QoS properties exclusively from the Camel In message headers. | false | boolean
 | *exposeListenerSession* (consumer) | Specifies whether the listener session should be exposed when consuming messages. | false | boolean
 | *idleTaskExecutionLimit* (advanced) | Specifies the limit for idle executions of a receive task, not having received any message within its execution. If this limit is reached, the task will shut down and leave receiving to other executing tasks (in the case of dynamic scheduling; see the maxConcurrentConsumers setting). There is additional doc available from Spring. | 1 | int
 | *idleConsumerLimit* (advanced) | Specify the limit for the number of consumers that are allowed to be idle at any given time. | 1 | int
 | *maxConcurrentConsumers* (consumer) | Specifies the maximum number of concurrent consumers when consuming from JMS (not for request/reply over JMS). See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. When doing request/reply over JMS then the option replyToMaxConcurrentConsumers is used to control number of concurrent consumers on the reply message listener. |  | int
-| *replyToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
-| *replyOnTimeoutToMax ConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
+| *replyToMaxConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
+| *replyOnTimeoutToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
 | *maxMessagesPerTask* (advanced) | The number of messages per task. -1 is unlimited. If you use a range for concurrent consumers (eg min max), then this option can be used to set a value to eg 100 to control how fast the consumers will shrink when less work is required. | -1 | int
 | *messageConverter* (advanced) | To use a custom Spring org.springframework.jms.support.converter.MessageConverter so you can be in control how to map to/from a javax.jms.Message. |  | MessageConverter
 | *mapJmsMessage* (advanced) | Specifies whether Camel should auto map the received JMS message to a suited payload type, such as javax.jms.TextMessage to a String etc. See section about how mapping works below for more details. | true | boolean
 | *messageIdEnabled* (advanced) | When sending, specifies whether message IDs should be added. This is just an hint to the JMS Broker. If the JMS provider accepts this hint, these messages must have the message ID set to null; if the provider ignores the hint, the message ID must be set to its normal unique value. | true | boolean
 | *messageTimestampEnabled* (advanced) | Specifies whether timestamps should be enabled by default on sending messages. This is just an hint to the JMS broker. If the JMS provider accepts this hint, these messages must have the timestamp set to zero; if the provider ignores the hint the timestamp must be set to its normal value. | true | boolean
 | *alwaysCopyMessage* (producer) | If true, Camel will always make a JMS message copy of the message when it is passed to the producer for sending. Copying the message is needed in some situations, such as when a replyToDestinationSelectorName is set (incidentally, Camel will set the alwaysCopyMessage option to true, if a replyToDestinationSelectorName is set). | false | boolean
-| *useMessageIDAs CorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
+| *useMessageIDAsCorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
 | *priority* (producer) | Values greater than 1 specify the message priority when sending (where 0 is the lowest priority and 9 is the highest). The explicitQosEnabled option must also be enabled in order for this option to have any effect. | 4 | int
 | *pubSubNoLocal* (advanced) | Specifies whether to inhibit the delivery of messages published by its own connection. | false | boolean
 | *receiveTimeout* (advanced) | The timeout for receiving messages (in milliseconds). | 1000 | long
@@ -106,16 +106,16 @@ The ActiveMQ component supports 88 options, which are listed below.
 | *taskExecutor* (consumer) | Allows you to specify a custom task executor for consuming messages. |  | TaskExecutor
 | *timeToLive* (producer) | When sending messages, specifies the time-to-live of the message (in milliseconds). | -1 | long
 | *transacted* (transaction) | Specifies whether to use transacted mode | false | boolean
-| *lazyCreateTransaction Manager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
+| *lazyCreateTransactionManager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
 | *transactionManager* (transaction) | The Spring transaction manager to use. |  | PlatformTransactionManager
 | *transactionName* (transaction) | The name of the transaction to use. |  | String
 | *transactionTimeout* (transaction) | The timeout value of the transaction (in seconds), if using transacted mode. | -1 | int
-| *testConnectionOn Startup* (common) | Specifies whether to test the connection on startup. This ensures that when Camel starts that all the JMS consumers have a valid connection to the JMS broker. If a connection cannot be granted then Camel throws an exception on startup. This ensures that Camel is not started with failed connections. The JMS producers is tested as well. | false | boolean
+| *testConnectionOnStartup* (common) | Specifies whether to test the connection on startup. This ensures that when Camel starts that all the JMS consumers have a valid connection to the JMS broker. If a connection cannot be granted then Camel throws an exception on startup. This ensures that Camel is not started with failed connections. The JMS producers is tested as well. | false | boolean
 | *asyncStartListener* (advanced) | Whether to startup the JmsConsumer message listener asynchronously, when starting a route. For example if a JmsConsumer cannot get a connection to a remote JMS broker, then it may block while retrying and/or failover. This will cause Camel to block while starting routes. By setting this option to true, you will let routes startup, while the JmsConsumer connects to the JMS broker using a dedicated thread in asynchronous mode. If this option is used, the [...]
 | *asyncStopListener* (advanced) | Whether to stop the JmsConsumer message listener asynchronously, when stopping a route. | false | boolean
-| *forceSendOriginal Message* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
+| *forceSendOriginalMessage* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
 | *requestTimeout* (producer) | The timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds). The default is 20 seconds. You can include the header CamelJmsRequestTimeout to override this endpoint configured timeout value, and thus have per message individual timeout values. See also the requestTimeoutCheckerInterval option. | 20000 | long
-| *requestTimeoutChecker Interval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
 | *transferExchange* (advanced) | You can transfer the exchange over the wire instead of just the body and headers. The following fields are transferred: In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. You must enable this option on both the producer and consumer side, so Camel knows the payloads is an E [...]
 | *transferException* (advanced) | If enabled and you are using Request Reply messaging (InOut) and an Exchange failed on the consumer side, then the caused Exception will be send back in response as a javax.jms.ObjectMessage. If the client is Camel, the returned Exception is rethrown. This allows you to use Camel JMS as a bridge in your routing - for example, using persistent queues to enable robust routing. Notice that if you also have transferExchange enabled, this option takes preced [...]
 | *jmsOperations* (advanced) | Allows you to use your own implementation of the org.springframework.jms.core.JmsOperations interface. Camel uses JmsTemplate as default. Can be used for testing purpose, but not used much as stated in the spring API docs. |  | JmsOperations
@@ -124,21 +124,21 @@ The ActiveMQ component supports 88 options, which are listed below.
 | *preserveMessageQos* (producer) | Set to true, if you want to send message using the QoS settings specified on the message, instead of the QoS settings on the JMS endpoint. The following three headers are considered JMSPriority, JMSDeliveryMode, and JMSExpiration. You can provide all or only some of them. If not provided, Camel will fall back to use the values from the endpoint instead. So, when using this option, the headers override the values from the endpoint. The explicitQosEnable [...]
 | *asyncConsumer* (consumer) | Whether the JmsConsumer processes the Exchange asynchronously. If enabled then the JmsConsumer may pickup the next message from the JMS queue, while the previous message is being processed asynchronously (by the Asynchronous Routing Engine). This means that messages may be processed not 100% strictly in order. If disabled (as default) then the Exchange is fully processed before the JmsConsumer will pickup the next message from the JMS queue. Note if transac [...]
 | *allowNullBody* (producer) | Whether to allow sending messages with no body. If this option is false and the message body is null, then an JMSException is thrown. | true | boolean
-| *includeSentJMS MessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
-| *includeAllJMSX Properties* (advanced) | Whether to include all JMSXxxx properties when mapping from JMS to Camel Message. Setting this to true will include properties such as JMSXAppID, and JMSXUserID etc. Note: If you are using a custom headerFilterStrategy then this option does not apply. | false | boolean
-| *defaultTaskExecutor Type* (consumer) | Specifies what default TaskExecutor type to use in the DefaultMessageListenerContainer, for both consumer endpoints and the ReplyTo consumer of producer endpoints. Possible values: SimpleAsync (uses Spring's SimpleAsyncTaskExecutor) or ThreadPool (uses Spring's ThreadPoolTaskExecutor with optimal values - cached threadpool-like). If not set, it defaults to the previous behaviour, which uses a cached thread pool for consumer endpoints and SimpleAs [...]
+| *includeSentJMSMessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
+| *includeAllJMSXProperties* (advanced) | Whether to include all JMSXxxx properties when mapping from JMS to Camel Message. Setting this to true will include properties such as JMSXAppID, and JMSXUserID etc. Note: If you are using a custom headerFilterStrategy then this option does not apply. | false | boolean
+| *defaultTaskExecutorType* (consumer) | Specifies what default TaskExecutor type to use in the DefaultMessageListenerContainer, for both consumer endpoints and the ReplyTo consumer of producer endpoints. Possible values: SimpleAsync (uses Spring's SimpleAsyncTaskExecutor) or ThreadPool (uses Spring's ThreadPoolTaskExecutor with optimal values - cached threadpool-like). If not set, it defaults to the previous behaviour, which uses a cached thread pool for consumer endpoints and SimpleAsy [...]
 | *jmsKeyFormatStrategy* (advanced) | Pluggable strategy for encoding and decoding JMS keys so they can be compliant with the JMS specification. Camel provides two implementations out of the box: default and passthrough. The default strategy will safely marshal dots and hyphens (. and -). The passthrough strategy leaves the key as is. Can be used for JMS brokers which do not care whether JMS header keys contain illegal characters. You can provide your own implementation of the org.apache [...]
 | *allowAdditionalHeaders* (producer) | This option is used to allow additional headers which may have values that are invalid according to JMS specification. For example some message systems such as WMQ do this with header names using prefix JMS_IBM_MQMD_ containing values with byte array or other invalid types. You can specify multiple header names separated by comma, and use as suffix for wildcard matching. |  | String
 | *queueBrowseStrategy* (advanced) | To use a custom QueueBrowseStrategy when browsing queues |  | QueueBrowseStrategy
 | *messageCreatedStrategy* (advanced) | To use the given MessageCreatedStrategy which are invoked when Camel creates new instances of javax.jms.Message objects when Camel is sending a JMS message. |  | MessageCreatedStrategy
-| *waitForProvision CorrelationToBeUpdated Counter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
-| *waitForProvision CorrelationToBeUpdated ThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
+| *waitForProvisionCorrelationTo BeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
+| *waitForProvisionCorrelationTo BeUpdatedThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
 | *correlationProperty* (producer) | Use this JMS property to correlate messages in InOut exchange pattern (request-reply) instead of JMSCorrelationID property. This allows you to exchange messages with systems that do not correlate messages using JMSCorrelationID JMS property. If used JMSCorrelationID will not be used or set by Camel. The value of here named property will be generated if not supplied in the header of the message under the same name. |  | String
 | *subscriptionDurable* (consumer) | Set whether to make the subscription durable. The durable subscription name to be used can be specified through the subscriptionName property. Default is false. Set this to true to register a durable subscription, typically in combination with a subscriptionName value (unless your message listener class name is good enough as subscription name). Only makes sense when listening to a topic (pub-sub domain), therefore this method switches the pubSubDomai [...]
 | *subscriptionShared* (consumer) | Set whether to make the subscription shared. The shared subscription name to be used can be specified through the subscriptionName property. Default is false. Set this to true to register a shared subscription, typically in combination with a subscriptionName value (unless your message listener class name is good enough as subscription name). Note that shared subscriptions may also be durable, so this flag can (and often will) be combined with subscrip [...]
 | *subscriptionName* (consumer) | Set the name of a subscription to create. To be applied in case of a topic (pub-sub domain) with a shared or durable subscription. The subscription name needs to be unique within this client's JMS client id. Default is the class name of the specified message listener. Note: Only 1 concurrent consumer (which is the default of this message listener container) is allowed for each subscription, except for a shared subscription (which requires JMS 2.0). |  | String
-| *streamMessageType Enabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until n [...]
-| *formatDateHeadersTo Iso8601* (producer) | Sets whether date headers should be formatted according to the ISO 8601 standard. | false | boolean
+| *streamMessageTypeEnabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until no [...]
+| *formatDateHeadersToIso8601* (producer) | Sets whether date headers should be formatted according to the ISO 8601 standard. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -203,7 +203,7 @@ with the following path and query parameters:
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
 | *exposeListenerSession* (consumer) | Specifies whether the listener session should be exposed when consuming messages. | false | boolean
-| *replyToSameDestination Allowed* (consumer) | Whether a JMS consumer is allowed to send a reply message to the same destination that the consumer is using to consume from. This prevents an endless loop by consuming and sending back the same message to itself. | false | boolean
+| *replyToSameDestinationAllowed* (consumer) | Whether a JMS consumer is allowed to send a reply message to the same destination that the consumer is using to consume from. This prevents an endless loop by consuming and sending back the same message to itself. | false | boolean
 | *taskExecutor* (consumer) | Allows you to specify a custom task executor for consuming messages. |  | TaskExecutor
 | *deliveryDelay* (producer) | Sets delivery delay to use for send calls for JMS. This option requires JMS 2.0 compliant broker. | -1 | long
 | *deliveryMode* (producer) | Specifies the delivery mode to be used. Possibles values are those defined by javax.jms.DeliveryMode. NON_PERSISTENT = 1 and PERSISTENT = 2. |  | Integer
@@ -214,8 +214,8 @@ with the following path and query parameters:
 | *preserveMessageQos* (producer) | Set to true, if you want to send message using the QoS settings specified on the message, instead of the QoS settings on the JMS endpoint. The following three headers are considered JMSPriority, JMSDeliveryMode, and JMSExpiration. You can provide all or only some of them. If not provided, Camel will fall back to use the values from the endpoint instead. So, when using this option, the headers override the values from the endpoint. The explicitQosEnable [...]
 | *priority* (producer) | Values greater than 1 specify the message priority when sending (where 0 is the lowest priority and 9 is the highest). The explicitQosEnabled option must also be enabled in order for this option to have any effect. | 4 | int
 | *replyToConcurrentConsumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
-| *replyToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
-| *replyToOnTimeoutMax ConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
+| *replyToMaxConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
+| *replyToOnTimeoutMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
 | *replyToOverride* (producer) | Provides an explicit ReplyTo destination in the JMS message, which overrides the setting of replyTo. It is useful if you want to forward the message to a remote Queue and receive the reply message from the ReplyTo destination. |  | String
 | *replyToType* (producer) | Allows for explicitly specifying which kind of strategy to use for replyTo queues when doing request/reply over JMS. Possible values are: Temporary, Shared, or Exclusive. By default Camel will use temporary queues. However if replyTo has been configured, then Shared is used by default. This option allows you to use exclusive queues instead of shared ones. See Camel JMS documentation for more details, and especially the notes about the implications if running  [...]
 | *requestTimeout* (producer) | The timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds). The default is 20 seconds. You can include the header CamelJmsRequestTimeout to override this endpoint configured timeout value, and thus have per message individual timeout values. See also the requestTimeoutCheckerInterval option. | 20000 | long
@@ -228,7 +228,7 @@ with the following path and query parameters:
 | *forceSendOriginalMessage* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
 | *includeSentJMSMessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
 | *replyToCacheLevelName* (producer) | Sets the cache level by name for the reply consumer when doing request/reply over JMS. This option only applies when using fixed reply queues (not temporary). Camel will by default use: CACHE_CONSUMER for exclusive or shared w/ replyToSelectorName. And CACHE_SESSION for shared without replyToSelectorName. Some JMS brokers such as IBM WebSphere may require to set the replyToCacheLevelName=CACHE_NONE to work. Note: If using temporary queues then CACHE [...]
-| *replyToDestinationSelector Name* (producer) | Sets the JMS Selector using the fixed name to be used so you can filter out your own replies from the others when using a shared queue (that is, if you are not using a temporary reply queue). |  | String
+| *replyToDestinationSelectorName* (producer) | Sets the JMS Selector using the fixed name to be used so you can filter out your own replies from the others when using a shared queue (that is, if you are not using a temporary reply queue). |  | String
 | *streamMessageTypeEnabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until no [...]
 | *allowSerializedHeaders* (advanced) | Controls whether or not to include serialized headers. Applies only when isTransferExchange() is true. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. | false | boolean
 | *asyncStartListener* (advanced) | Whether to startup the JmsConsumer message listener asynchronously, when starting a route. For example if a JmsConsumer cannot get a connection to a remote JMS broker, then it may block while retrying and/or failover. This will cause Camel to block while starting routes. By setting this option to true, you will let routes startup, while the JmsConsumer connects to the JMS broker using a dedicated thread in asynchronous mode. If this option is used, the [...]
@@ -252,19 +252,19 @@ with the following path and query parameters:
 | *pubSubNoLocal* (advanced) | Specifies whether to inhibit the delivery of messages published by its own connection. | false | boolean
 | *receiveTimeout* (advanced) | The timeout for receiving messages (in milliseconds). | 1000 | long
 | *recoveryInterval* (advanced) | Specifies the interval between recovery attempts, i.e. when a connection is being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds. | 5000 | long
-| *requestTimeoutChecker Interval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *transferException* (advanced) | If enabled and you are using Request Reply messaging (InOut) and an Exchange failed on the consumer side, then the caused Exception will be send back in response as a javax.jms.ObjectMessage. If the client is Camel, the returned Exception is rethrown. This allows you to use Camel JMS as a bridge in your routing - for example, using persistent queues to enable robust routing. Notice that if you also have transferExchange enabled, this option takes preced [...]
 | *transferExchange* (advanced) | You can transfer the exchange over the wire instead of just the body and headers. The following fields are transferred: In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. You must enable this option on both the producer and consumer side, so Camel knows the payloads is an E [...]
-| *useMessageIDAsCorrelation ID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
-| *waitForProvisionCorrelation ToBeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
-| *waitForProvisionCorrelation ToBeUpdatedThreadSleeping Time* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
+| *useMessageIDAsCorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
+| *waitForProvisionCorrelationTo BeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
+| *waitForProvisionCorrelationTo BeUpdatedThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
 | *errorHandlerLoggingLevel* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
 | *errorHandlerLogStackTrace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
 | *password* (security) | Password to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *username* (security) | Username to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *transacted* (transaction) | Specifies whether to use transacted mode | false | boolean
-| *lazyCreateTransaction Manager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
+| *lazyCreateTransactionManager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
 | *transactionManager* (transaction) | The Spring transaction manager to use. |  | PlatformTransactionManager
 | *transactionName* (transaction) | The name of the transaction to use. |  | String
 | *transactionTimeout* (transaction) | The timeout value of the transaction (in seconds), if using transacted mode. | -1 | int
diff --git a/components/camel-ahc-ws/src/main/docs/ahc-ws-component.adoc b/components/camel-ahc-ws/src/main/docs/ahc-ws-component.adoc
index 68023cf..813b541 100644
--- a/components/camel-ahc-ws/src/main/docs/ahc-ws-component.adoc
+++ b/components/camel-ahc-ws/src/main/docs/ahc-ws-component.adoc
@@ -58,8 +58,8 @@ The AHC Websocket component supports 9 options, which are listed below.
 | *binding* (advanced) | To use a custom AhcBinding which allows to control how to bind between AHC and Camel. |  | AhcBinding
 | *clientConfig* (advanced) | To configure the AsyncHttpClient to use a custom com.ning.http.client.AsyncHttpClientConfig instance. |  | AsyncHttpClientConfig
 | *sslContextParameters* (security) | Reference to a org.apache.camel.support.jsse.SSLContextParameters in the Registry. Note that configuring this option will override any SSL/TLS configuration options provided through the clientConfig option at the endpoint or component level. |  | SSLContextParameters
-| *allowJavaSerialized Object* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *allowJavaSerializedObject* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
diff --git a/components/camel-ahc/src/main/docs/ahc-component.adoc b/components/camel-ahc/src/main/docs/ahc-component.adoc
index 148ec70..1dc1c11 100644
--- a/components/camel-ahc/src/main/docs/ahc-component.adoc
+++ b/components/camel-ahc/src/main/docs/ahc-component.adoc
@@ -157,8 +157,8 @@ The AHC component supports 9 options, which are listed below.
 | *binding* (advanced) | To use a custom AhcBinding which allows to control how to bind between AHC and Camel. |  | AhcBinding
 | *clientConfig* (advanced) | To configure the AsyncHttpClient to use a custom com.ning.http.client.AsyncHttpClientConfig instance. |  | AsyncHttpClientConfig
 | *sslContextParameters* (security) | Reference to a org.apache.camel.support.jsse.SSLContextParameters in the Registry. Note that configuring this option will override any SSL/TLS configuration options provided through the clientConfig option at the endpoint or component level. |  | SSLContextParameters
-| *allowJavaSerialized Object* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *allowJavaSerializedObject* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
diff --git a/components/camel-amqp/src/main/docs/amqp-component.adoc b/components/camel-amqp/src/main/docs/amqp-component.adoc
index 3881f33..f28730c 100644
--- a/components/camel-amqp/src/main/docs/amqp-component.adoc
+++ b/components/camel-amqp/src/main/docs/amqp-component.adoc
@@ -48,14 +48,14 @@ The AMQP component supports 85 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *includeAmqpAnnotations* (common) | Whether to include AMQP annotations when mapping from AMQP to Camel Message. Setting this to true will map AMQP message annotations to message headers. Due to limitations in Apache Qpid JMS API, currently delivery annotations are ignored. | false | boolean
-| *allowAutoWired ConnectionFactory* (advanced) | Whether to auto-discover ConnectionFactory from the registry, if no connection factory has been configured. If only one instance of ConnectionFactory is found then it will be used. This is enabled by default. | false | boolean
-| *allowAutoWired DestinationResolver* (advanced) | Whether to auto-discover DestinationResolver from the registry, if no destination resolver has been configured. If only one instance of DestinationResolver is found then it will be used. This is enabled by default. | false | boolean
+| *allowAutoWiredConnection Factory* (advanced) | Whether to auto-discover ConnectionFactory from the registry, if no connection factory has been configured. If only one instance of ConnectionFactory is found then it will be used. This is enabled by default. | false | boolean
+| *allowAutoWiredDestination Resolver* (advanced) | Whether to auto-discover DestinationResolver from the registry, if no destination resolver has been configured. If only one instance of DestinationResolver is found then it will be used. This is enabled by default. | false | boolean
 | *configuration* (advanced) | To use a shared JMS configuration |  | JmsConfiguration
-| *acceptMessagesWhile Stopping* (consumer) | Specifies whether the consumer accept messages while it is stopping. You may consider enabling this option, if you start and stop JMS routes at runtime, while there are still messages enqueued on the queue. If this option is false, and you stop the JMS route, then messages may be rejected, and the JMS broker would have to attempt redeliveries, which yet again may be rejected, and eventually the message may be moved at a dead letter queue on t [...]
-| *allowReplyManagerQuick Stop* (consumer) | Whether the DefaultMessageListenerContainer used in the reply managers for request-reply messaging allow the DefaultMessageListenerContainer.runningAllowed flag to quick stop in case JmsConfiguration#isAcceptMessagesWhileStopping is enabled, and org.apache.camel.CamelContext is currently being stopped. This quick stop ability is enabled by default in the regular JMS consumers but to enable for reply managers you must enable this flag. | false  [...]
+| *acceptMessagesWhileStopping* (consumer) | Specifies whether the consumer accept messages while it is stopping. You may consider enabling this option, if you start and stop JMS routes at runtime, while there are still messages enqueued on the queue. If this option is false, and you stop the JMS route, then messages may be rejected, and the JMS broker would have to attempt redeliveries, which yet again may be rejected, and eventually the message may be moved at a dead letter queue on th [...]
+| *allowReplyManagerQuickStop* (consumer) | Whether the DefaultMessageListenerContainer used in the reply managers for request-reply messaging allow the DefaultMessageListenerContainer.runningAllowed flag to quick stop in case JmsConfiguration#isAcceptMessagesWhileStopping is enabled, and org.apache.camel.CamelContext is currently being stopped. This quick stop ability is enabled by default in the regular JMS consumers but to enable for reply managers you must enable this flag. | false | [...]
 | *acknowledgementMode* (consumer) | The JMS acknowledgement mode defined as an Integer. Allows you to set vendor-specific extensions to the acknowledgment mode. For the regular modes, it is preferable to use the acknowledgementModeName instead. |  | int
 | *eagerPoisonBody* (consumer) | If eagerLoadingOfProperties is enabled and the JMS message payload (JMS body or JMS properties) (cannot be read/mapped), then set this text as the message body instead so the message can be processed (the cause of the poison are already stored as exception on the Exchange). This can be turned off by setting eagerPoisonBody=false. See also the option eagerLoadingOfProperties. | Poison JMS message due to ${exception.message} | String
-| *eagerLoadingOf Properties* (consumer) | Enables eager loading of JMS properties as soon as a message is loaded which generally is inefficient as the JMS properties may not be required but sometimes can catch early any issues with the underlying JMS provider and the use of JMS properties. See also the option eagerLoadingOfBody. | false | boolean
+| *eagerLoadingOfProperties* (consumer) | Enables eager loading of JMS properties as soon as a message is loaded which generally is inefficient as the JMS properties may not be required but sometimes can catch early any issues with the underlying JMS provider and the use of JMS properties. See also the option eagerLoadingOfBody. | false | boolean
 | *acknowledgementModeName* (consumer) | The JMS acknowledgement name, which is one of: SESSION_TRANSACTED, CLIENT_ACKNOWLEDGE, AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE | AUTO_ACKNOWLEDGE | String
 | *autoStartup* (consumer) | Specifies whether the consumer container should auto-startup. | true | boolean
 | *cacheLevel* (consumer) | Sets the cache level by ID for the underlying JMS resources. See cacheLevelName option for more details. |  | int
@@ -63,7 +63,7 @@ The AMQP component supports 85 options, which are listed below.
 | *replyToCacheLevelName* (producer) | Sets the cache level by name for the reply consumer when doing request/reply over JMS. This option only applies when using fixed reply queues (not temporary). Camel will by default use: CACHE_CONSUMER for exclusive or shared w/ replyToSelectorName. And CACHE_SESSION for shared without replyToSelectorName. Some JMS brokers such as IBM WebSphere may require to set the replyToCacheLevelName=CACHE_NONE to work. Note: If using temporary queues then CACHE [...]
 | *clientId* (common) | Sets the JMS client ID to use. Note that this value, if specified, must be unique and can only be used by a single JMS connection instance. It is typically only required for durable topic subscriptions. If using Apache ActiveMQ you may prefer to use Virtual Topics instead. |  | String
 | *concurrentConsumers* (consumer) | Specifies the default number of concurrent consumers when consuming from JMS (not for request/reply over JMS). See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. When doing request/reply over JMS then the option replyToConcurrentConsumers is used to control number of concurrent consumers on the reply message listener. | 1 | int
-| *replyToConcurrent Consumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
+| *replyToConcurrentConsumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
 | *connectionFactory* (common) | The connection factory to be use. A connection factory must be configured either on the component or endpoint. |  | ConnectionFactory
 | *username* (security) | Username to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *password* (security) | Password to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
@@ -72,22 +72,22 @@ The AMQP component supports 85 options, which are listed below.
 | *durableSubscriptionName* (common) | The durable subscriber name for specifying durable topic subscriptions. The clientId option must be configured as well. |  | String
 | *exceptionListener* (advanced) | Specifies the JMS Exception Listener that is to be notified of any underlying JMS exceptions. |  | ExceptionListener
 | *errorHandler* (advanced) | Specifies a org.springframework.util.ErrorHandler to be invoked in case of any uncaught exceptions thrown while processing a Message. By default these exceptions will be logged at the WARN level, if no errorHandler has been configured. You can configure logging level and whether stack traces should be logged using errorHandlerLoggingLevel and errorHandlerLogStackTrace options. This makes it much easier to configure, than having to code a custom errorHandler. [...]
-| *errorHandlerLogging Level* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
-| *errorHandlerLogStack Trace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
+| *errorHandlerLoggingLevel* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
+| *errorHandlerLogStackTrace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
 | *explicitQosEnabled* (producer) | Set if the deliveryMode, priority or timeToLive qualities of service should be used when sending messages. This option is based on Spring's JmsTemplate. The deliveryMode, priority and timeToLive options are applied to the current endpoint. This contrasts with the preserveMessageQos option, which operates at message granularity, reading QoS properties exclusively from the Camel In message headers. | false | boolean
 | *exposeListenerSession* (consumer) | Specifies whether the listener session should be exposed when consuming messages. | false | boolean
 | *idleTaskExecutionLimit* (advanced) | Specifies the limit for idle executions of a receive task, not having received any message within its execution. If this limit is reached, the task will shut down and leave receiving to other executing tasks (in the case of dynamic scheduling; see the maxConcurrentConsumers setting). There is additional doc available from Spring. | 1 | int
 | *idleConsumerLimit* (advanced) | Specify the limit for the number of consumers that are allowed to be idle at any given time. | 1 | int
 | *maxConcurrentConsumers* (consumer) | Specifies the maximum number of concurrent consumers when consuming from JMS (not for request/reply over JMS). See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. When doing request/reply over JMS then the option replyToMaxConcurrentConsumers is used to control number of concurrent consumers on the reply message listener. |  | int
-| *replyToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
-| *replyOnTimeoutToMax ConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
+| *replyToMaxConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
+| *replyOnTimeoutToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
 | *maxMessagesPerTask* (advanced) | The number of messages per task. -1 is unlimited. If you use a range for concurrent consumers (eg min max), then this option can be used to set a value to eg 100 to control how fast the consumers will shrink when less work is required. | -1 | int
 | *messageConverter* (advanced) | To use a custom Spring org.springframework.jms.support.converter.MessageConverter so you can be in control how to map to/from a javax.jms.Message. |  | MessageConverter
 | *mapJmsMessage* (advanced) | Specifies whether Camel should auto map the received JMS message to a suited payload type, such as javax.jms.TextMessage to a String etc. See section about how mapping works below for more details. | true | boolean
 | *messageIdEnabled* (advanced) | When sending, specifies whether message IDs should be added. This is just an hint to the JMS Broker. If the JMS provider accepts this hint, these messages must have the message ID set to null; if the provider ignores the hint, the message ID must be set to its normal unique value. | true | boolean
 | *messageTimestampEnabled* (advanced) | Specifies whether timestamps should be enabled by default on sending messages. This is just an hint to the JMS broker. If the JMS provider accepts this hint, these messages must have the timestamp set to zero; if the provider ignores the hint the timestamp must be set to its normal value. | true | boolean
 | *alwaysCopyMessage* (producer) | If true, Camel will always make a JMS message copy of the message when it is passed to the producer for sending. Copying the message is needed in some situations, such as when a replyToDestinationSelectorName is set (incidentally, Camel will set the alwaysCopyMessage option to true, if a replyToDestinationSelectorName is set). | false | boolean
-| *useMessageIDAs CorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
+| *useMessageIDAsCorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
 | *priority* (producer) | Values greater than 1 specify the message priority when sending (where 0 is the lowest priority and 9 is the highest). The explicitQosEnabled option must also be enabled in order for this option to have any effect. | 4 | int
 | *pubSubNoLocal* (advanced) | Specifies whether to inhibit the delivery of messages published by its own connection. | false | boolean
 | *receiveTimeout* (advanced) | The timeout for receiving messages (in milliseconds). | 1000 | long
@@ -95,16 +95,16 @@ The AMQP component supports 85 options, which are listed below.
 | *taskExecutor* (consumer) | Allows you to specify a custom task executor for consuming messages. |  | TaskExecutor
 | *timeToLive* (producer) | When sending messages, specifies the time-to-live of the message (in milliseconds). | -1 | long
 | *transacted* (transaction) | Specifies whether to use transacted mode | false | boolean
-| *lazyCreateTransaction Manager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
+| *lazyCreateTransactionManager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
 | *transactionManager* (transaction) | The Spring transaction manager to use. |  | PlatformTransactionManager
 | *transactionName* (transaction) | The name of the transaction to use. |  | String
 | *transactionTimeout* (transaction) | The timeout value of the transaction (in seconds), if using transacted mode. | -1 | int
-| *testConnectionOn Startup* (common) | Specifies whether to test the connection on startup. This ensures that when Camel starts that all the JMS consumers have a valid connection to the JMS broker. If a connection cannot be granted then Camel throws an exception on startup. This ensures that Camel is not started with failed connections. The JMS producers is tested as well. | false | boolean
+| *testConnectionOnStartup* (common) | Specifies whether to test the connection on startup. This ensures that when Camel starts that all the JMS consumers have a valid connection to the JMS broker. If a connection cannot be granted then Camel throws an exception on startup. This ensures that Camel is not started with failed connections. The JMS producers is tested as well. | false | boolean
 | *asyncStartListener* (advanced) | Whether to startup the JmsConsumer message listener asynchronously, when starting a route. For example if a JmsConsumer cannot get a connection to a remote JMS broker, then it may block while retrying and/or failover. This will cause Camel to block while starting routes. By setting this option to true, you will let routes startup, while the JmsConsumer connects to the JMS broker using a dedicated thread in asynchronous mode. If this option is used, the [...]
 | *asyncStopListener* (advanced) | Whether to stop the JmsConsumer message listener asynchronously, when stopping a route. | false | boolean
-| *forceSendOriginal Message* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
+| *forceSendOriginalMessage* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
 | *requestTimeout* (producer) | The timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds). The default is 20 seconds. You can include the header CamelJmsRequestTimeout to override this endpoint configured timeout value, and thus have per message individual timeout values. See also the requestTimeoutCheckerInterval option. | 20000 | long
-| *requestTimeoutChecker Interval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
 | *transferExchange* (advanced) | You can transfer the exchange over the wire instead of just the body and headers. The following fields are transferred: In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. You must enable this option on both the producer and consumer side, so Camel knows the payloads is an E [...]
 | *transferException* (advanced) | If enabled and you are using Request Reply messaging (InOut) and an Exchange failed on the consumer side, then the caused Exception will be send back in response as a javax.jms.ObjectMessage. If the client is Camel, the returned Exception is rethrown. This allows you to use Camel JMS as a bridge in your routing - for example, using persistent queues to enable robust routing. Notice that if you also have transferExchange enabled, this option takes preced [...]
 | *jmsOperations* (advanced) | Allows you to use your own implementation of the org.springframework.jms.core.JmsOperations interface. Camel uses JmsTemplate as default. Can be used for testing purpose, but not used much as stated in the spring API docs. |  | JmsOperations
@@ -113,21 +113,21 @@ The AMQP component supports 85 options, which are listed below.
 | *preserveMessageQos* (producer) | Set to true, if you want to send message using the QoS settings specified on the message, instead of the QoS settings on the JMS endpoint. The following three headers are considered JMSPriority, JMSDeliveryMode, and JMSExpiration. You can provide all or only some of them. If not provided, Camel will fall back to use the values from the endpoint instead. So, when using this option, the headers override the values from the endpoint. The explicitQosEnable [...]
 | *asyncConsumer* (consumer) | Whether the JmsConsumer processes the Exchange asynchronously. If enabled then the JmsConsumer may pickup the next message from the JMS queue, while the previous message is being processed asynchronously (by the Asynchronous Routing Engine). This means that messages may be processed not 100% strictly in order. If disabled (as default) then the Exchange is fully processed before the JmsConsumer will pickup the next message from the JMS queue. Note if transac [...]
 | *allowNullBody* (producer) | Whether to allow sending messages with no body. If this option is false and the message body is null, then an JMSException is thrown. | true | boolean
-| *includeSentJMS MessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
-| *includeAllJMSX Properties* (advanced) | Whether to include all JMSXxxx properties when mapping from JMS to Camel Message. Setting this to true will include properties such as JMSXAppID, and JMSXUserID etc. Note: If you are using a custom headerFilterStrategy then this option does not apply. | false | boolean
-| *defaultTaskExecutor Type* (consumer) | Specifies what default TaskExecutor type to use in the DefaultMessageListenerContainer, for both consumer endpoints and the ReplyTo consumer of producer endpoints. Possible values: SimpleAsync (uses Spring's SimpleAsyncTaskExecutor) or ThreadPool (uses Spring's ThreadPoolTaskExecutor with optimal values - cached threadpool-like). If not set, it defaults to the previous behaviour, which uses a cached thread pool for consumer endpoints and SimpleAs [...]
+| *includeSentJMSMessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
+| *includeAllJMSXProperties* (advanced) | Whether to include all JMSXxxx properties when mapping from JMS to Camel Message. Setting this to true will include properties such as JMSXAppID, and JMSXUserID etc. Note: If you are using a custom headerFilterStrategy then this option does not apply. | false | boolean
+| *defaultTaskExecutorType* (consumer) | Specifies what default TaskExecutor type to use in the DefaultMessageListenerContainer, for both consumer endpoints and the ReplyTo consumer of producer endpoints. Possible values: SimpleAsync (uses Spring's SimpleAsyncTaskExecutor) or ThreadPool (uses Spring's ThreadPoolTaskExecutor with optimal values - cached threadpool-like). If not set, it defaults to the previous behaviour, which uses a cached thread pool for consumer endpoints and SimpleAsy [...]
 | *jmsKeyFormatStrategy* (advanced) | Pluggable strategy for encoding and decoding JMS keys so they can be compliant with the JMS specification. Camel provides two implementations out of the box: default and passthrough. The default strategy will safely marshal dots and hyphens (. and -). The passthrough strategy leaves the key as is. Can be used for JMS brokers which do not care whether JMS header keys contain illegal characters. You can provide your own implementation of the org.apache [...]
 | *allowAdditionalHeaders* (producer) | This option is used to allow additional headers which may have values that are invalid according to JMS specification. For example some message systems such as WMQ do this with header names using prefix JMS_IBM_MQMD_ containing values with byte array or other invalid types. You can specify multiple header names separated by comma, and use as suffix for wildcard matching. |  | String
 | *queueBrowseStrategy* (advanced) | To use a custom QueueBrowseStrategy when browsing queues |  | QueueBrowseStrategy
 | *messageCreatedStrategy* (advanced) | To use the given MessageCreatedStrategy which are invoked when Camel creates new instances of javax.jms.Message objects when Camel is sending a JMS message. |  | MessageCreatedStrategy
-| *waitForProvision CorrelationToBeUpdated Counter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
-| *waitForProvision CorrelationToBeUpdated ThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
+| *waitForProvisionCorrelationTo BeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
+| *waitForProvisionCorrelationTo BeUpdatedThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
 | *correlationProperty* (producer) | Use this JMS property to correlate messages in InOut exchange pattern (request-reply) instead of JMSCorrelationID property. This allows you to exchange messages with systems that do not correlate messages using JMSCorrelationID JMS property. If used JMSCorrelationID will not be used or set by Camel. The value of here named property will be generated if not supplied in the header of the message under the same name. |  | String
 | *subscriptionDurable* (consumer) | Set whether to make the subscription durable. The durable subscription name to be used can be specified through the subscriptionName property. Default is false. Set this to true to register a durable subscription, typically in combination with a subscriptionName value (unless your message listener class name is good enough as subscription name). Only makes sense when listening to a topic (pub-sub domain), therefore this method switches the pubSubDomai [...]
 | *subscriptionShared* (consumer) | Set whether to make the subscription shared. The shared subscription name to be used can be specified through the subscriptionName property. Default is false. Set this to true to register a shared subscription, typically in combination with a subscriptionName value (unless your message listener class name is good enough as subscription name). Note that shared subscriptions may also be durable, so this flag can (and often will) be combined with subscrip [...]
 | *subscriptionName* (consumer) | Set the name of a subscription to create. To be applied in case of a topic (pub-sub domain) with a shared or durable subscription. The subscription name needs to be unique within this client's JMS client id. Default is the class name of the specified message listener. Note: Only 1 concurrent consumer (which is the default of this message listener container) is allowed for each subscription, except for a shared subscription (which requires JMS 2.0). |  | String
-| *streamMessageType Enabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until n [...]
-| *formatDateHeadersTo Iso8601* (producer) | Sets whether date headers should be formatted according to the ISO 8601 standard. | false | boolean
+| *streamMessageTypeEnabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until no [...]
+| *formatDateHeadersToIso8601* (producer) | Sets whether date headers should be formatted according to the ISO 8601 standard. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -195,7 +195,7 @@ with the following path and query parameters:
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
 | *exposeListenerSession* (consumer) | Specifies whether the listener session should be exposed when consuming messages. | false | boolean
-| *replyToSameDestination Allowed* (consumer) | Whether a JMS consumer is allowed to send a reply message to the same destination that the consumer is using to consume from. This prevents an endless loop by consuming and sending back the same message to itself. | false | boolean
+| *replyToSameDestinationAllowed* (consumer) | Whether a JMS consumer is allowed to send a reply message to the same destination that the consumer is using to consume from. This prevents an endless loop by consuming and sending back the same message to itself. | false | boolean
 | *taskExecutor* (consumer) | Allows you to specify a custom task executor for consuming messages. |  | TaskExecutor
 | *deliveryDelay* (producer) | Sets delivery delay to use for send calls for JMS. This option requires JMS 2.0 compliant broker. | -1 | long
 | *deliveryMode* (producer) | Specifies the delivery mode to be used. Possibles values are those defined by javax.jms.DeliveryMode. NON_PERSISTENT = 1 and PERSISTENT = 2. |  | Integer
@@ -206,8 +206,8 @@ with the following path and query parameters:
 | *preserveMessageQos* (producer) | Set to true, if you want to send message using the QoS settings specified on the message, instead of the QoS settings on the JMS endpoint. The following three headers are considered JMSPriority, JMSDeliveryMode, and JMSExpiration. You can provide all or only some of them. If not provided, Camel will fall back to use the values from the endpoint instead. So, when using this option, the headers override the values from the endpoint. The explicitQosEnable [...]
 | *priority* (producer) | Values greater than 1 specify the message priority when sending (where 0 is the lowest priority and 9 is the highest). The explicitQosEnabled option must also be enabled in order for this option to have any effect. | 4 | int
 | *replyToConcurrentConsumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
-| *replyToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
-| *replyToOnTimeoutMax ConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
+| *replyToMaxConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
+| *replyToOnTimeoutMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
 | *replyToOverride* (producer) | Provides an explicit ReplyTo destination in the JMS message, which overrides the setting of replyTo. It is useful if you want to forward the message to a remote Queue and receive the reply message from the ReplyTo destination. |  | String
 | *replyToType* (producer) | Allows for explicitly specifying which kind of strategy to use for replyTo queues when doing request/reply over JMS. Possible values are: Temporary, Shared, or Exclusive. By default Camel will use temporary queues. However if replyTo has been configured, then Shared is used by default. This option allows you to use exclusive queues instead of shared ones. See Camel JMS documentation for more details, and especially the notes about the implications if running  [...]
 | *requestTimeout* (producer) | The timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds). The default is 20 seconds. You can include the header CamelJmsRequestTimeout to override this endpoint configured timeout value, and thus have per message individual timeout values. See also the requestTimeoutCheckerInterval option. | 20000 | long
@@ -220,7 +220,7 @@ with the following path and query parameters:
 | *forceSendOriginalMessage* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
 | *includeSentJMSMessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
 | *replyToCacheLevelName* (producer) | Sets the cache level by name for the reply consumer when doing request/reply over JMS. This option only applies when using fixed reply queues (not temporary). Camel will by default use: CACHE_CONSUMER for exclusive or shared w/ replyToSelectorName. And CACHE_SESSION for shared without replyToSelectorName. Some JMS brokers such as IBM WebSphere may require to set the replyToCacheLevelName=CACHE_NONE to work. Note: If using temporary queues then CACHE [...]
-| *replyToDestinationSelector Name* (producer) | Sets the JMS Selector using the fixed name to be used so you can filter out your own replies from the others when using a shared queue (that is, if you are not using a temporary reply queue). |  | String
+| *replyToDestinationSelectorName* (producer) | Sets the JMS Selector using the fixed name to be used so you can filter out your own replies from the others when using a shared queue (that is, if you are not using a temporary reply queue). |  | String
 | *streamMessageTypeEnabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until no [...]
 | *allowSerializedHeaders* (advanced) | Controls whether or not to include serialized headers. Applies only when isTransferExchange() is true. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. | false | boolean
 | *asyncStartListener* (advanced) | Whether to startup the JmsConsumer message listener asynchronously, when starting a route. For example if a JmsConsumer cannot get a connection to a remote JMS broker, then it may block while retrying and/or failover. This will cause Camel to block while starting routes. By setting this option to true, you will let routes startup, while the JmsConsumer connects to the JMS broker using a dedicated thread in asynchronous mode. If this option is used, the [...]
@@ -244,19 +244,19 @@ with the following path and query parameters:
 | *pubSubNoLocal* (advanced) | Specifies whether to inhibit the delivery of messages published by its own connection. | false | boolean
 | *receiveTimeout* (advanced) | The timeout for receiving messages (in milliseconds). | 1000 | long
 | *recoveryInterval* (advanced) | Specifies the interval between recovery attempts, i.e. when a connection is being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds. | 5000 | long
-| *requestTimeoutChecker Interval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *transferException* (advanced) | If enabled and you are using Request Reply messaging (InOut) and an Exchange failed on the consumer side, then the caused Exception will be send back in response as a javax.jms.ObjectMessage. If the client is Camel, the returned Exception is rethrown. This allows you to use Camel JMS as a bridge in your routing - for example, using persistent queues to enable robust routing. Notice that if you also have transferExchange enabled, this option takes preced [...]
 | *transferExchange* (advanced) | You can transfer the exchange over the wire instead of just the body and headers. The following fields are transferred: In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. You must enable this option on both the producer and consumer side, so Camel knows the payloads is an E [...]
-| *useMessageIDAsCorrelation ID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
-| *waitForProvisionCorrelation ToBeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
-| *waitForProvisionCorrelation ToBeUpdatedThreadSleeping Time* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
+| *useMessageIDAsCorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
+| *waitForProvisionCorrelationTo BeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
+| *waitForProvisionCorrelationTo BeUpdatedThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
 | *errorHandlerLoggingLevel* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
 | *errorHandlerLogStackTrace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
 | *password* (security) | Password to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *username* (security) | Username to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *transacted* (transaction) | Specifies whether to use transacted mode | false | boolean
-| *lazyCreateTransaction Manager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
+| *lazyCreateTransactionManager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
 | *transactionManager* (transaction) | The Spring transaction manager to use. |  | PlatformTransactionManager
 | *transactionName* (transaction) | The name of the transaction to use. |  | String
 | *transactionTimeout* (transaction) | The timeout value of the transaction (in seconds), if using transacted mode. | -1 | int
diff --git a/components/camel-atmosphere-websocket/src/main/docs/atmosphere-websocket-component.adoc b/components/camel-atmosphere-websocket/src/main/docs/atmosphere-websocket-component.adoc
index 9252f45..5407801 100644
--- a/components/camel-atmosphere-websocket/src/main/docs/atmosphere-websocket-component.adoc
+++ b/components/camel-atmosphere-websocket/src/main/docs/atmosphere-websocket-component.adoc
@@ -48,11 +48,11 @@ The Atmosphere Websocket component supports 10 options, which are listed below.
 | Name | Description | Default | Type
 | *servletName* (consumer) | Default name of servlet to use. The default name is CamelServlet. | CamelServlet | String
 | *httpRegistry* (consumer) | To use a custom org.apache.camel.component.servlet.HttpRegistry. |  | HttpRegistry
-| *attachmentMultipart Binding* (consumer) | Whether to automatic bind multipart/form-data as attachments on the Camel Exchange. The options attachmentMultipartBinding=true and disableStreamCache=false cannot work together. Remove disableStreamCache to use AttachmentMultipartBinding. This is turn off by default as this may require servlet specific configuration to enable this when using Servlet's. | false | boolean
+| *attachmentMultipartBinding* (consumer) | Whether to automatic bind multipart/form-data as attachments on the Camel Exchange. The options attachmentMultipartBinding=true and disableStreamCache=false cannot work together. Remove disableStreamCache to use AttachmentMultipartBinding. This is turn off by default as this may require servlet specific configuration to enable this when using Servlet's. | false | boolean
 | *fileNameExtWhitelist* (consumer) | Whitelist of accepted filename extensions for accepting uploaded files. Multiple extensions can be separated by comma, such as txt,xml. |  | String
 | *httpBinding* (advanced) | To use a custom HttpBinding to control the mapping between Camel message and HttpClient. |  | HttpBinding
 | *httpConfiguration* (advanced) | To use the shared HttpConfiguration as base configuration. |  | HttpConfiguration
-| *allowJavaSerialized Object* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
+| *allowJavaSerializedObject* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -110,7 +110,7 @@ with the following path and query parameters:
 | *traceEnabled* (consumer) | Specifies whether to enable HTTP TRACE for this Servlet consumer. By default TRACE is turned off. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *mapHttpMessageBody* (advanced) | If this option is true then IN exchange Body of the exchange will be mapped to HTTP body. Setting this to false will avoid the HTTP mapping. | true | boolean
-| *mapHttpMessageFormUrl EncodedBody* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
+| *mapHttpMessageFormUrlEncoded Body* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
 | *mapHttpMessageHeaders* (advanced) | If this option is true then IN exchange Headers of the exchange will be mapped to HTTP headers. Setting this to false will avoid the HTTP Headers mapping. | true | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 |===
diff --git a/components/camel-aws-ddb/src/main/docs/aws-ddbstream-component.adoc b/components/camel-aws-ddb/src/main/docs/aws-ddbstream-component.adoc
index 23176eb..08ecc51 100644
--- a/components/camel-aws-ddb/src/main/docs/aws-ddbstream-component.adoc
+++ b/components/camel-aws-ddb/src/main/docs/aws-ddbstream-component.adoc
@@ -77,7 +77,7 @@ with the following path and query parameters:
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *amazonDynamoDbStreams Client* (consumer) | Amazon DynamoDB client to use for all requests for this endpoint |  | AmazonDynamoDBStreams
+| *amazonDynamoDbStreamsClient* (consumer) | Amazon DynamoDB client to use for all requests for this endpoint |  | AmazonDynamoDBStreams
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
 | *iteratorType* (consumer) | Defines where in the DynaboDB stream to start getting records. Note that using TRIM_HORIZON can cause a significant delay before the stream has caught up to real-time. if {AT,AFTER}_SEQUENCE_NUMBER are used, then a sequenceNumberProvider MUST be supplied. | LATEST | ShardIteratorType
 | *maxResultsPerRequest* (consumer) | Maximum number of records that will be fetched in each poll |  | int
diff --git a/components/camel-aws-s3/src/main/docs/aws-s3-component.adoc b/components/camel-aws-s3/src/main/docs/aws-s3-component.adoc
index 0b8d687..855413c 100644
--- a/components/camel-aws-s3/src/main/docs/aws-s3-component.adoc
+++ b/components/camel-aws-s3/src/main/docs/aws-s3-component.adoc
@@ -131,7 +131,7 @@ with the following path and query parameters:
 | *accelerateModeEnabled* ( advanced) | Define if Accelerate Mode enabled is true or false | false | boolean
 | *chunkedEncodingDisabled* ( advanced) | Define if disabled Chunked Encoding is true or false | false | boolean
 | *dualstackEnabled* ( advanced) | Define if Dualstack enabled is true or false | false | boolean
-| *forceGlobalBucketAccess Enabled* ( advanced) | Define if Force Global Bucket Access enabled is true or false | false | boolean
+| *forceGlobalBucketAccessEnabled* ( advanced) | Define if Force Global Bucket Access enabled is true or false | false | boolean
 | *payloadSigningEnabled* ( advanced) | Define if Payload Signing enabled is true or false | false | boolean
 | *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. |  | int
 | *backoffIdleThreshold* (scheduler) | The number of subsequent idle polls that should happen before the backoffMultipler should kick-in. |  | int
diff --git a/components/camel-aws-sqs/src/main/docs/aws-sqs-component.adoc b/components/camel-aws-sqs/src/main/docs/aws-sqs-component.adoc
index 7c17d7d..e5a2328 100644
--- a/components/camel-aws-sqs/src/main/docs/aws-sqs-component.adoc
+++ b/components/camel-aws-sqs/src/main/docs/aws-sqs-component.adoc
@@ -95,7 +95,7 @@ with the following path and query parameters:
 | *deleteAfterRead* (consumer) | Delete message from SQS after it has been read | true | boolean
 | *deleteIfFiltered* (consumer) | Whether or not to send the DeleteMessage to the SQS queue if an exchange fails to get through a filter. If 'false' and exchange does not make it through a Camel filter upstream in the route, then don't send DeleteMessage. | true | boolean
 | *extendMessageVisibility* (consumer) | If enabled then a scheduled background task will keep extending the message visibility on SQS. This is needed if it takes a long time to process the message. If set to true defaultVisibilityTimeout must be set. See details at Amazon docs. | false | boolean
-| *kmsDataKeyReusePeriod Seconds* (consumer) | The length of time, in seconds, for which Amazon SQS can reuse a data key to encrypt or decrypt messages before calling AWS KMS again. An integer representing seconds, between 60 seconds (1 minute) and 86,400 seconds (24 hours). Default: 300 (5 minutes). |  | Integer
+| *kmsDataKeyReusePeriodSeconds* (consumer) | The length of time, in seconds, for which Amazon SQS can reuse a data key to encrypt or decrypt messages before calling AWS KMS again. An integer representing seconds, between 60 seconds (1 minute) and 86,400 seconds (24 hours). Default: 300 (5 minutes). |  | Integer
 | *kmsMasterKeyId* (consumer) | The ID of an AWS-managed customer master key (CMK) for Amazon SQS or a custom CMK. |  | String
 | *maxMessagesPerPoll* (consumer) | Gets the maximum number of messages as a limit to poll at each polling. Is default unlimited, but use 0 or negative number to disable it as unlimited. |  | int
 | *messageAttributeNames* (consumer) | A list of message attribute names to receive when consuming. Multiple names can be separated by comma. |  | String
@@ -108,7 +108,7 @@ with the following path and query parameters:
 | *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
 | *delaySeconds* (producer) | Delay sending messages for a number of seconds. |  | Integer
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
-| *messageDeduplicationId Strategy* (producer) | Only for FIFO queues. Strategy for setting the messageDeduplicationId on the message. Can be one of the following options: useExchangeId, useContentBasedDeduplication. For the useContentBasedDeduplication option, no messageDeduplicationId will be set on the message. | useExchangeId | MessageDeduplicationIdStrategy
+| *messageDeduplicationIdStrategy* (producer) | Only for FIFO queues. Strategy for setting the messageDeduplicationId on the message. Can be one of the following options: useExchangeId, useContentBasedDeduplication. For the useContentBasedDeduplication option, no messageDeduplicationId will be set on the message. | useExchangeId | MessageDeduplicationIdStrategy
 | *messageGroupIdStrategy* (producer) | Only for FIFO queues. Strategy for setting the messageGroupId on the message. Can be one of the following options: useConstant, useExchangeId, usePropertyValue. For the usePropertyValue option, the value of property CamelAwsMessageGroupId will be used. |  | MessageGroupIdStrategy
 | *operation* (producer) | The operation to do in case the user don't want to send only a message |  | SqsOperations
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
@@ -134,7 +134,7 @@ with the following path and query parameters:
 | *maximumMessageSize* (queue) | The maximumMessageSize (in bytes) an SQS message can contain for this queue. |  | Integer
 | *messageRetentionPeriod* (queue) | The messageRetentionPeriod (in seconds) a message will be retained by SQS for this queue. |  | Integer
 | *policy* (queue) | The policy for this queue |  | String
-| *receiveMessageWaitTime Seconds* (queue) | If you do not specify WaitTimeSeconds in the request, the queue attribute ReceiveMessageWaitTimeSeconds is used to determine how long to wait. |  | Integer
+| *receiveMessageWaitTimeSeconds* (queue) | If you do not specify WaitTimeSeconds in the request, the queue attribute ReceiveMessageWaitTimeSeconds is used to determine how long to wait. |  | Integer
 | *redrivePolicy* (queue) | Specify the policy that send message to DeadLetter queue. See detail at Amazon docs. |  | String
 | *accessKey* (security) | Amazon AWS Access Key |  | String
 | *secretKey* (security) | Amazon AWS Secret Key |  | String
diff --git a/components/camel-aws-swf/src/main/docs/aws-swf-component.adoc b/components/camel-aws-swf/src/main/docs/aws-swf-component.adoc
index 7b3a0cb..5e419f9 100644
--- a/components/camel-aws-swf/src/main/docs/aws-swf-component.adoc
+++ b/components/camel-aws-swf/src/main/docs/aws-swf-component.adoc
@@ -86,17 +86,17 @@ with the following path and query parameters:
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
-| *clientConfiguration Parameters* (advanced) | To configure the ClientConfiguration using the key/values from the Map. |  | Map
-| *startWorkflowOptions Parameters* (advanced) | To configure the StartWorkflowOptions using the key/values from the Map. |  | Map
+| *clientConfigurationParameters* (advanced) | To configure the ClientConfiguration using the key/values from the Map. |  | Map
+| *startWorkflowOptionsParameters* (advanced) | To configure the StartWorkflowOptions using the key/values from the Map. |  | Map
 | *sWClientParameters* (advanced) | To configure the AmazonSimpleWorkflowClient using the key/values from the Map. |  | Map
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *activityList* (activity) | The list name to consume activities from. |  | String
 | *activitySchedulingOptions* (activity) | Activity scheduling options |  | ActivitySchedulingOptions
 | *activityThreadPoolSize* (activity) | Maximum number of threads in work pool for activity. | 100 | int
-| *activityTypeExecution Options* (activity) | Activity execution options |  | ActivityTypeExecutionOptions
+| *activityTypeExecutionOptions* (activity) | Activity execution options |  | ActivityTypeExecutionOptions
 | *activityTypeRegistration Options* (activity) | Activity registration options |  | ActivityTypeRegistrationOptions
 | *childPolicy* (workflow) | The policy to use on child workflows when terminating a workflow. |  | String
-| *executionStartToClose Timeout* (workflow) | Set the execution start to close timeout. | 3600 | String
+| *executionStartToCloseTimeout* (workflow) | Set the execution start to close timeout. | 3600 | String
 | *operation* (workflow) | Workflow operation | START | String
 | *signalName* (workflow) | The name of the signal to send to the workflow. |  | String
 | *stateResultType* (workflow) | The type of the result when a workflow state is queried. |  | String
diff --git a/components/camel-bean-validator/src/main/docs/bean-validator-component.adoc b/components/camel-bean-validator/src/main/docs/bean-validator-component.adoc
index d29a598..004c49f 100644
--- a/components/camel-bean-validator/src/main/docs/bean-validator-component.adoc
+++ b/components/camel-bean-validator/src/main/docs/bean-validator-component.adoc
@@ -57,10 +57,10 @@ The Bean Validator component supports 7 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *ignoreXmlConfiguration* (producer) | Whether to ignore data from the META-INF/validation.xml file. | false | boolean
-| *validationProvider Resolver* (advanced) | To use a a custom ValidationProviderResolver |  | ValidationProviderResolver
+| *validationProviderResolver* (advanced) | To use a a custom ValidationProviderResolver |  | ValidationProviderResolver
 | *messageInterpolator* (advanced) | To use a custom MessageInterpolator |  | MessageInterpolator
 | *traversableResolver* (advanced) | To use a custom TraversableResolver |  | TraversableResolver
-| *constraintValidator Factory* (advanced) | To use a custom ConstraintValidatorFactory |  | ConstraintValidatorFactory
+| *constraintValidatorFactory* (advanced) | To use a custom ConstraintValidatorFactory |  | ConstraintValidatorFactory
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 |===
diff --git a/components/camel-beanstalk/src/main/docs/beanstalk-component.adoc b/components/camel-beanstalk/src/main/docs/beanstalk-component.adoc
index 69c6224..c0b2df3 100644
--- a/components/camel-beanstalk/src/main/docs/beanstalk-component.adoc
+++ b/components/camel-beanstalk/src/main/docs/beanstalk-component.adoc
@@ -68,7 +68,7 @@ The Beanstalk component supports 4 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *connectionSettings Factory* (common) | Custom ConnectionSettingsFactory. Specify which ConnectionSettingsFactory to use to make connections to Beanstalkd. Especially useful for unit testing without beanstalkd daemon (you can mock ConnectionSettings) |  | ConnectionSettingsFactory
+| *connectionSettingsFactory* (common) | Custom ConnectionSettingsFactory. Specify which ConnectionSettingsFactory to use to make connections to Beanstalkd. Especially useful for unit testing without beanstalkd daemon (you can mock ConnectionSettings) |  | ConnectionSettingsFactory
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/components/camel-cometd/src/main/docs/cometd-component.adoc b/components/camel-cometd/src/main/docs/cometd-component.adoc
index fc16532..bdb56b7 100644
--- a/components/camel-cometd/src/main/docs/cometd-component.adoc
+++ b/components/camel-cometd/src/main/docs/cometd-component.adoc
@@ -66,7 +66,7 @@ The CometD component supports 10 options, which are listed below.
 | *securityPolicy* (security) | To use a custom configured SecurityPolicy to control authorization |  | SecurityPolicy
 | *extensions* (common) | To use a list of custom BayeuxServer.Extension that allows modifying incoming and outgoing requests. |  | List
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/components/camel-consul/src/main/docs/consul-component.adoc b/components/camel-consul/src/main/docs/consul-component.adoc
index 4f4f689..fb56f84 100644
--- a/components/camel-consul/src/main/docs/consul-component.adoc
+++ b/components/camel-consul/src/main/docs/consul-component.adoc
@@ -50,7 +50,7 @@ The Consul component supports 11 options, which are listed below.
 | *url* (common) | The Consul agent URL |  | String
 | *datacenter* (common) | The data center |  | String
 | *sslContextParameters* (common) | SSL configuration using an org.apache.camel.support.jsse.SSLContextParameters instance. |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *aclToken* (common) | Sets the ACL token to be used with Consul |  | String
 | *userName* (common) | Sets the username to be used for basic authentication |  | String
 | *password* (common) | Sets the password to be used for basic authentication |  | String
diff --git a/components/camel-crypto-cms/src/main/docs/crypto-cms-component.adoc b/components/camel-crypto-cms/src/main/docs/crypto-cms-component.adoc
index 7719ca2..a749393 100644
--- a/components/camel-crypto-cms/src/main/docs/crypto-cms-component.adoc
+++ b/components/camel-crypto-cms/src/main/docs/crypto-cms-component.adoc
@@ -89,15 +89,15 @@ with the following path and query parameters:
 | *password* (decrypt) | Sets the password of the private keys. It is assumed that all private keys in the keystore have the same password. If not set then it is assumed that the password of the private keys is given by the keystore password given in the KeyStoreParameters. |  | char[]
 | *fromBase64* (decrypt_verify) | If true then the CMS message is base 64 encoded and must be decoded during the processing. Default value is false. | false | boolean
 | *contentEncryptionAlgorithm* (encrypt) | Encryption algorithm, for example DESede/CBC/PKCS5Padding. Further possible values: DESede/CBC/PKCS5Padding, AES/CBC/PKCS5Padding, Camellia/CBC/PKCS5Padding, CAST5/CBC/PKCS5Padding. |  | String
-| *originatorInformation Provider* (encrypt) | Provider for the originator info. See \https://tools.ietf.org/html/rfc5652#section-6.1. The default value is null. |  | OriginatorInformationProvider
+| *originatorInformationProvider* (encrypt) | Provider for the originator info. See \https://tools.ietf.org/html/rfc5652#section-6.1. The default value is null. |  | OriginatorInformationProvider
 | *recipient* (encrypt) | Recipient Info: reference to a bean which implements the interface org.apache.camel.component.crypto.cms.api.TransRecipientInfo |  | List
 | *secretKeyLength* (encrypt) | Key length for the secret symmetric key used for the content encryption. Only used if the specified content-encryption algorithm allows keys of different sizes. If contentEncryptionAlgorithm=AES/CBC/PKCS5Padding or Camellia/CBC/PKCS5Padding then 128; if contentEncryptionAlgorithm=DESede/CBC/PKCS5Padding then 192, 128; if strong encryption is enabled then for AES/CBC/PKCS5Padding and Camellia/CBC/PKCS5Padding also the key lengths 192 and 256 are possible. |  | int
-| *unprotectedAttributes GeneratorProvider* (encrypt) | Provider of the generator for the unprotected attributes. The default value is null which means no unprotected attribute is added to the Enveloped Data object. See \https://tools.ietf.org/html/rfc5652#section-6.1. |  | AttributesGeneratorProvider
+| *unprotectedAttributesGenerator Provider* (encrypt) | Provider of the generator for the unprotected attributes. The default value is null which means no unprotected attribute is added to the Enveloped Data object. See \https://tools.ietf.org/html/rfc5652#section-6.1. |  | AttributesGeneratorProvider
 | *toBase64* (encrypt_sign) | Indicates whether the Signed Data or Enveloped Data instance shall be base 64 encoded. Default value is false. | false | Boolean
 | *includeContent* (sign) | Indicates whether the signed content should be included into the Signed Data instance. If false then a detached Signed Data instance is created in the header CamelCryptoCmsSignedData. | true | Boolean
 | *signer* (sign) | Signer information: reference to bean(s) which implements org.apache.camel.component.crypto.cms.api.SignerInfo. Multiple values can be separated by comma |  | String
 | *signedDataHeaderBase64* (verify) | Indicates whether the value in the header CamelCryptoCmsSignedData is base64 encoded. Default value is false. Only relevant for detached signatures. In the detached signature case, the header contains the Signed Data object. | false | boolean
-| *verifySignaturesOfAll Signers* (verify) | If true then the signatures of all signers contained in the Signed Data object are verified. If false then only one signature whose signer info matches with one of the specified certificates is verified. Default value is true. | true | boolean
+| *verifySignaturesOfAllSigners* (verify) | If true then the signatures of all signers contained in the Signed Data object are verified. If false then only one signature whose signer info matches with one of the specified certificates is verified. Default value is true. | true | boolean
 |===
 // endpoint options: END
 // spring-boot-auto-configure options: START
diff --git a/components/camel-cxf/src/main/docs/cxf-component.adoc b/components/camel-cxf/src/main/docs/cxf-component.adoc
index c1dc222..51620c2 100644
--- a/components/camel-cxf/src/main/docs/cxf-component.adoc
+++ b/components/camel-cxf/src/main/docs/cxf-component.adoc
@@ -96,7 +96,7 @@ The CXF component supports 6 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *allowStreaming* (advanced) | This option controls whether the CXF component, when running in PAYLOAD mode, will DOM parse the incoming messages into DOM Elements or keep the payload as a javax.xml.transform.Source object that would allow streaming in some cases. |  | Boolean
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -157,7 +157,7 @@ with the following path and query parameters:
 | *mergeProtocolHeaders* (advanced) | Whether to merge protocol headers. If enabled then propagating headers between Camel and CXF becomes more consistent and similar. For more details see CAMEL-6393. | false | boolean
 | *mtomEnabled* (advanced) | To enable MTOM (attachments). This requires to use POJO or PAYLOAD data format mode. | false | boolean
 | *properties* (advanced) | To set additional CXF options using the key/value pairs from the Map. For example to turn on stacktraces in SOAP faults, properties.faultStackTraceEnabled=true |  | Map
-| *skipPayloadMessagePart Check* (advanced) | Sets whether SOAP message validation should be disabled. | false | boolean
+| *skipPayloadMessagePartCheck* (advanced) | Sets whether SOAP message validation should be disabled. | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *loggingFeatureEnabled* (logging) | This option enables CXF Logging Feature which writes inbound and outbound SOAP messages to log. | false | boolean
 | *loggingSizeLimit* (logging) | To limit the total size of number of bytes the logger will output when logging feature has been enabled and -1 for no limit. | 49152 | int
diff --git a/components/camel-cxf/src/main/docs/cxfrs-component.adoc b/components/camel-cxf/src/main/docs/cxfrs-component.adoc
index 98909e5..ba97c8e 100644
--- a/components/camel-cxf/src/main/docs/cxfrs-component.adoc
+++ b/components/camel-cxf/src/main/docs/cxfrs-component.adoc
@@ -59,7 +59,7 @@ The CXF-RS component supports 5 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -116,7 +116,7 @@ with the following path and query parameters:
 | *sslContextParameters* (producer) | The Camel SSL setting reference. Use the # notation to reference the SSL Context. |  | SSLContextParameters
 | *throwExceptionOnFailure* (producer) | This option tells the CxfRsProducer to inspect return codes and will generate an Exception if the return code is larger than 207. | true | boolean
 | *httpClientAPI* (producer) | If it is true, the CxfRsProducer will use the HttpClientAPI to invoke the service. If it is false, the CxfRsProducer will use the ProxyClientAPI to invoke the service | true | boolean
-| *ignoreDeleteMethodMessage Body* (producer) | This option is used to tell CxfRsProducer to ignore the message body of the DELETE method when using HTTP API. | false | boolean
+| *ignoreDeleteMethodMessageBody* (producer) | This option is used to tell CxfRsProducer to ignore the message body of the DELETE method when using HTTP API. | false | boolean
 | *maxClientCacheSize* (producer) | This option allows you to configure the maximum size of the cache. The implementation caches CXF clients or ClientFactoryBean in CxfProvider and CxfRsProvider. | 10 | int
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *binding* (advanced) | To use a custom CxfBinding to control the binding between Camel Message and CXF Message. |  | CxfRsBinding
diff --git a/components/camel-debezium-mongodb/src/main/docs/debezium-mongodb-component.adoc b/components/camel-debezium-mongodb/src/main/docs/debezium-mongodb-component.adoc
index 129a833..e22e36e 100644
--- a/components/camel-debezium-mongodb/src/main/docs/debezium-mongodb-component.adoc
+++ b/components/camel-debezium-mongodb/src/main/docs/debezium-mongodb-component.adoc
@@ -90,7 +90,7 @@ with the following path and query parameters:
 | *offsetStorage* (consumer) | The name of the Java class that is responsible for persistence of connector offsets. | org.apache.kafka.connect.storage.FileOffsetBackingStore | String
 | *offsetStorageFileName* (consumer) | Path to file where offsets are to be stored. Required when offset.storage is set to the FileOffsetBackingStore |  | String
 | *offsetStoragePartitions* (consumer) | The number of partitions used when creating the offset storage topic. Required when offset.storage is set to the 'KafkaOffsetBackingStore'. |  | int
-| *offsetStorageReplication Factor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
+| *offsetStorageReplicationFactor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
 | *offsetStorageTopic* (consumer) | The name of the Kafka topic where offsets are to be stored. Required when offset.storage is set to the KafkaOffsetBackingStore. |  | String
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
@@ -98,7 +98,7 @@ with the following path and query parameters:
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *collectionBlacklist* (mongodb) | Description is not available here, please check Debezium website for corresponding key 'collection.blacklist' description. |  | String
 | *collectionWhitelist* (mongodb) | The collections for which changes are to be captured |  | String
-| *connectBackoffInitialDelay Ms* (mongodb) | The initial delay when trying to reconnect to a primary after a connection cannot be made or when no primary is available. Defaults to 1 second (1000 ms). | 1000 | long
+| *connectBackoffInitialDelayMs* (mongodb) | The initial delay when trying to reconnect to a primary after a connection cannot be made or when no primary is available. Defaults to 1 second (1000 ms). | 1000 | long
 | *connectBackoffMaxDelayMs* (mongodb) | The maximum delay when trying to reconnect to a primary after a connection cannot be made or when no primary is available. Defaults to 120 second (120,000 ms). | 120000 | long
 | *connectMaxAttempts* (mongodb) | Maximum number of failed connection attempts to a replica set primary before an exception occurs and task is aborted. Defaults to 16, which with the defaults for 'connect.backoff.initial.delay.ms' and 'connect.backoff.max.delay.ms' results in just over 20 minutes of attempts before failing. | 16 | int
 | *databaseBlacklist* (mongodb) | The databases for which changes are to be excluded |  | String
diff --git a/components/camel-debezium-mysql/src/main/docs/debezium-mysql-component.adoc b/components/camel-debezium-mysql/src/main/docs/debezium-mysql-component.adoc
index b83c3a9..43de3a7 100644
--- a/components/camel-debezium-mysql/src/main/docs/debezium-mysql-component.adoc
+++ b/components/camel-debezium-mysql/src/main/docs/debezium-mysql-component.adoc
@@ -97,7 +97,7 @@ with the following path and query parameters:
 | *offsetStorage* (consumer) | The name of the Java class that is responsible for persistence of connector offsets. | org.apache.kafka.connect.storage.FileOffsetBackingStore | String
 | *offsetStorageFileName* (consumer) | Path to file where offsets are to be stored. Required when offset.storage is set to the FileOffsetBackingStore |  | String
 | *offsetStoragePartitions* (consumer) | The number of partitions used when creating the offset storage topic. Required when offset.storage is set to the 'KafkaOffsetBackingStore'. |  | int
-| *offsetStorageReplication Factor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
+| *offsetStorageReplicationFactor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
 | *offsetStorageTopic* (consumer) | The name of the Kafka topic where offsets are to be stored. Required when offset.storage is set to the KafkaOffsetBackingStore. |  | String
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
@@ -112,11 +112,11 @@ with the following path and query parameters:
 | *databaseBlacklist* (mysql) | Description is not available here, please check Debezium website for corresponding key 'database.blacklist' description. |  | String
 | *databaseHistory* (mysql) | The name of the DatabaseHistory class that should be used to store and recover database schema changes. The configuration properties for the history are prefixed with the 'database.history.' string. | io.debezium.relational.history.FileDatabaseHistory | String
 | *databaseHistoryFileFilename* (mysql) | The path to the file that will be used to record the database history |  | String
-| *databaseHistoryKafka BootstrapServers* (mysql) | A list of host/port pairs that the connector will use for establishing the initial connection to the Kafka cluster for retrieving database schema history previously stored by the connector. This should point to the same Kafka cluster used by the Kafka Connect process. |  | String
-| *databaseHistoryKafka RecoveryAttempts* (mysql) | The number of attempts in a row that no data are returned from Kafka before recover completes. The maximum amount of time to wait after receiving no data is (recovery.attempts) x (recovery.poll.interval.ms). | 100 | int
-| *databaseHistoryKafka RecoveryPollIntervalMs* (mysql) | The number of milliseconds to wait while polling for persisted data during recovery. | 100 | int
+| *databaseHistoryKafkaBootstrap Servers* (mysql) | A list of host/port pairs that the connector will use for establishing the initial connection to the Kafka cluster for retrieving database schema history previously stored by the connector. This should point to the same Kafka cluster used by the Kafka Connect process. |  | String
+| *databaseHistoryKafkaRecovery Attempts* (mysql) | The number of attempts in a row that no data are returned from Kafka before recover completes. The maximum amount of time to wait after receiving no data is (recovery.attempts) x (recovery.poll.interval.ms). | 100 | int
+| *databaseHistoryKafkaRecovery PollIntervalMs* (mysql) | The number of milliseconds to wait while polling for persisted data during recovery. | 100 | int
 | *databaseHistoryKafkaTopic* (mysql) | The name of the topic for the database schema history |  | String
-| *databaseHistorySkip UnparseableDdl* (mysql) | Controls the action Debezium will take when it meets a DDL statement in binlog, that it cannot parse.By default the connector will stop operating but by changing the setting it can ignore the statements which it cannot parse. If skipping is enabled then Debezium can miss metadata changes. | false | boolean
+| *databaseHistorySkipUnparseable Ddl* (mysql) | Controls the action Debezium will take when it meets a DDL statement in binlog, that it cannot parse.By default the connector will stop operating but by changing the setting it can ignore the statements which it cannot parse. If skipping is enabled then Debezium can miss metadata changes. | false | boolean
 | *databaseHistoryStoreOnly MonitoredTablesDdl* (mysql) | Controls what DDL will Debezium store in database history.By default (false) Debezium will store all incoming DDL statements. If set to truethen only DDL that manipulates a monitored table will be stored. | false | boolean
 | *databaseHostname* (mysql) | Resolvable hostname or IP address of the MySQL database server. |  | String
 | *databaseInitialStatements* (mysql) | A semicolon separated list of SQL statements to be executed when a JDBC connection (not binlog reading connection) to the database is established. Note that the connector may establish JDBC connections at its own discretion, so this should typically be used for configuration of session parameters only,but not for executing DML statements. Use doubled semicolon (';;') to use a semicolon as a character and not as a delimiter. |  | String
@@ -130,7 +130,7 @@ with the following path and query parameters:
 | *databaseSslKeystorePassword* (mysql) | Password to access the private key from the keystore file specified by 'ssl.keystore' configuration property or the 'javax.net.ssl.keyStore' system or JVM property. This password is used to unlock the keystore file (store password), and to decrypt the private key stored in the keystore (key password). |  | String
 | *databaseSslMode* (mysql) | Whether to use an encrypted connection to MySQL. Options include'disabled' (the default) to use an unencrypted connection; 'preferred' to establish a secure (encrypted) connection if the server supports secure connections, but fall back to an unencrypted connection otherwise; 'required' to use a secure (encrypted) connection, and fail if one cannot be established; 'verify_ca' like 'required' but additionally verify the server TLS certificate against the conf [...]
 | *databaseSslTruststore* (mysql) | Location of the Java truststore file containing the collection of CA certificates trusted by this application process (trust store). |  | String
-| *databaseSslTruststore Password* (mysql) | Password to unlock the keystore file (store password) specified by 'ssl.trustore' configuration property or the 'javax.net.ssl.trustStore' system or JVM property. |  | String
+| *databaseSslTruststorePassword* (mysql) | Password to unlock the keystore file (store password) specified by 'ssl.trustore' configuration property or the 'javax.net.ssl.trustStore' system or JVM property. |  | String
 | *databaseUser* (mysql) | Name of the MySQL database user to be used when connecting to the database. |  | String
 | *databaseWhitelist* (mysql) | The databases for which changes are to be captured |  | String
 | *decimalHandlingMode* (mysql) | Specify how DECIMAL and NUMERIC columns should be represented in change events, including:'precise' (the default) uses java.math.BigDecimal to represent values, which are encoded in the change events using a binary representation and Kafka Connect's 'org.apache.kafka.connect.data.Decimal' type; 'string' uses string to represent values; 'double' represents values using Java's 'double', which may not offer the precision but will be far easier to use in con [...]
@@ -144,7 +144,7 @@ with the following path and query parameters:
 | *heartbeatTopicsPrefix* (mysql) | The prefix that is used to name heartbeat topics.Defaults to __debezium-heartbeat. | __debezium-heartbeat | String
 | *includeQuery* (mysql) | Whether the connector should include the original SQL query that generated the change event. Note: This option requires MySQL be configured with the binlog_rows_query_log_events option set to ON. Query will not be present for events generated from snapshot. WARNING: Enabling this option may expose tables or fields explicitly blacklisted or masked by including the original SQL statement in the change event. For this reason the default value is 'false'. | false | [...]
 | *includeSchemaChanges* (mysql) | Whether the connector should publish changes in the database schema to a Kafka topic with the same name as the database server ID. Each schema change will be recorded using a key that contains the database name and whose value includes the DDL statement(s).The default is 'true'. This is independent of how the connector internally records database history. | true | boolean
-| *inconsistentSchemaHandling Mode* (mysql) | Specify how binlog events that belong to a table missing from internal schema representation (i.e. internal representation is not consistent with database) should be handled, including:'fail' (the default) an exception indicating the problematic event and its binlog position is raised, causing the connector to be stopped; 'warn' the problematic event and its binlog position will be logged and the event will be skipped;'ignore' the problematic [...]
+| *inconsistentSchemaHandlingMode* (mysql) | Specify how binlog events that belong to a table missing from internal schema representation (i.e. internal representation is not consistent with database) should be handled, including:'fail' (the default) an exception indicating the problematic event and its binlog position is raised, causing the connector to be stopped; 'warn' the problematic event and its binlog position will be logged and the event will be skipped;'ignore' the problematic  [...]
 | *maxBatchSize* (mysql) | Maximum size of each batch of source records. Defaults to 2048. | 2048 | int
 | *maxQueueSize* (mysql) | Maximum size of the queue for change events read from the database log but not yet recorded or forwarded. Defaults to 8192, and should always be larger than the maximum batch size. | 8192 | int
 | *messageKeyColumns* (mysql) | A semicolon-separated list of expressions that match fully-qualified tables and column(s) to be used as message key. Each expression must match the pattern ':',where the table names could be defined as (DB_NAME.TABLE_NAME) or (SCHEMA_NAME.TABLE_NAME), depending on the specific connector,and the key columns are a comma-separated list of columns representing the custom key. For any table without an explicit key configuration the table's primary key column(s) [...]
diff --git a/components/camel-debezium-postgres/src/main/docs/debezium-postgres-component.adoc b/components/camel-debezium-postgres/src/main/docs/debezium-postgres-component.adoc
index 1653919..6a0c357 100644
--- a/components/camel-debezium-postgres/src/main/docs/debezium-postgres-component.adoc
+++ b/components/camel-debezium-postgres/src/main/docs/debezium-postgres-component.adoc
@@ -88,7 +88,7 @@ with the following path and query parameters:
 | *offsetStorage* (consumer) | The name of the Java class that is responsible for persistence of connector offsets. | org.apache.kafka.connect.storage.FileOffsetBackingStore | String
 | *offsetStorageFileName* (consumer) | Path to file where offsets are to be stored. Required when offset.storage is set to the FileOffsetBackingStore |  | String
 | *offsetStoragePartitions* (consumer) | The number of partitions used when creating the offset storage topic. Required when offset.storage is set to the 'KafkaOffsetBackingStore'. |  | int
-| *offsetStorageReplication Factor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
+| *offsetStorageReplicationFactor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
 | *offsetStorageTopic* (consumer) | The name of the Kafka topic where offsets are to be stored. Required when offset.storage is set to the KafkaOffsetBackingStore. |  | String
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
diff --git a/components/camel-debezium-sqlserver/src/main/docs/debezium-sqlserver-component.adoc b/components/camel-debezium-sqlserver/src/main/docs/debezium-sqlserver-component.adoc
index 4725be2..5411351 100644
--- a/components/camel-debezium-sqlserver/src/main/docs/debezium-sqlserver-component.adoc
+++ b/components/camel-debezium-sqlserver/src/main/docs/debezium-sqlserver-component.adoc
@@ -87,7 +87,7 @@ with the following path and query parameters:
 | *offsetStorage* (consumer) | The name of the Java class that is responsible for persistence of connector offsets. | org.apache.kafka.connect.storage.FileOffsetBackingStore | String
 | *offsetStorageFileName* (consumer) | Path to file where offsets are to be stored. Required when offset.storage is set to the FileOffsetBackingStore |  | String
 | *offsetStoragePartitions* (consumer) | The number of partitions used when creating the offset storage topic. Required when offset.storage is set to the 'KafkaOffsetBackingStore'. |  | int
-| *offsetStorageReplication Factor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
+| *offsetStorageReplicationFactor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
 | *offsetStorageTopic* (consumer) | The name of the Kafka topic where offsets are to be stored. Required when offset.storage is set to the KafkaOffsetBackingStore. |  | String
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
@@ -97,9 +97,9 @@ with the following path and query parameters:
 | *databaseDbname* (sqlserver) | The name of the database the connector should be monitoring. When working with a multi-tenant set-up, must be set to the CDB name. |  | String
 | *databaseHistory* (sqlserver) | The name of the DatabaseHistory class that should be used to store and recover database schema changes. The configuration properties for the history are prefixed with the 'database.history.' string. | io.debezium.relational.history.FileDatabaseHistory | String
 | *databaseHistoryFileFilename* (sqlserver) | The path to the file that will be used to record the database history |  | String
-| *databaseHistoryKafka BootstrapServers* (sqlserver) | A list of host/port pairs that the connector will use for establishing the initial connection to the Kafka cluster for retrieving database schema history previously stored by the connector. This should point to the same Kafka cluster used by the Kafka Connect process. |  | String
-| *databaseHistoryKafka RecoveryAttempts* (sqlserver) | The number of attempts in a row that no data are returned from Kafka before recover completes. The maximum amount of time to wait after receiving no data is (recovery.attempts) x (recovery.poll.interval.ms). | 100 | int
-| *databaseHistoryKafka RecoveryPollIntervalMs* (sqlserver) | The number of milliseconds to wait while polling for persisted data during recovery. | 100 | int
+| *databaseHistoryKafkaBootstrap Servers* (sqlserver) | A list of host/port pairs that the connector will use for establishing the initial connection to the Kafka cluster for retrieving database schema history previously stored by the connector. This should point to the same Kafka cluster used by the Kafka Connect process. |  | String
+| *databaseHistoryKafkaRecovery Attempts* (sqlserver) | The number of attempts in a row that no data are returned from Kafka before recover completes. The maximum amount of time to wait after receiving no data is (recovery.attempts) x (recovery.poll.interval.ms). | 100 | int
+| *databaseHistoryKafkaRecovery PollIntervalMs* (sqlserver) | The number of milliseconds to wait while polling for persisted data during recovery. | 100 | int
 | *databaseHistoryKafkaTopic* (sqlserver) | The name of the topic for the database schema history |  | String
 | *databaseHostname* (sqlserver) | Resolvable hostname or IP address of the SQL Server database server. |  | String
 | *databasePassword* (sqlserver) | *Required* Password of the SQL Server database user to be used when connecting to the database. |  | String
diff --git a/components/camel-disruptor/src/main/docs/disruptor-component.adoc b/components/camel-disruptor/src/main/docs/disruptor-component.adoc
index 4d0dc53..c959dff 100644
--- a/components/camel-disruptor/src/main/docs/disruptor-component.adoc
+++ b/components/camel-disruptor/src/main/docs/disruptor-component.adoc
@@ -106,8 +106,8 @@ The Disruptor component supports 10 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *defaultConcurrent Consumers* (consumer) | To configure the default number of concurrent consumers | 1 | int
-| *defaultMultiple Consumers* (consumer) | To configure the default value for multiple consumers | false | boolean
+| *defaultConcurrentConsumers* (consumer) | To configure the default number of concurrent consumers | 1 | int
+| *defaultMultipleConsumers* (consumer) | To configure the default value for multiple consumers | false | boolean
 | *defaultProducerType* (producer) | To configure the default value for DisruptorProducerType The default value is Multi. | Multi | DisruptorProducerType
 | *defaultWaitStrategy* (consumer) | To configure the default value for DisruptorWaitStrategy The default value is Blocking. | Blocking | DisruptorWaitStrategy
 | *defaultBlockWhenFull* (producer) | To configure the default value for block when full The default value is true. | true | boolean
diff --git a/components/camel-ehcache/src/main/docs/ehcache-component.adoc b/components/camel-ehcache/src/main/docs/ehcache-component.adoc
index 78a42bd..ce7ef8e 100644
--- a/components/camel-ehcache/src/main/docs/ehcache-component.adoc
+++ b/components/camel-ehcache/src/main/docs/ehcache-component.adoc
@@ -51,7 +51,7 @@ The Ehcache component supports 9 options, which are listed below.
 | Name | Description | Default | Type
 | *configuration* (advanced) | Sets the global component configuration |  | EhcacheConfiguration
 | *cacheManager* (common) | The cache manager |  | CacheManager
-| *cacheManager Configuration* (common) | The cache manager configuration |  | Configuration
+| *cacheManagerConfiguration* (common) | The cache manager configuration |  | Configuration
 | *cacheConfiguration* (common) | The default cache configuration to be used to create caches. |  | CacheConfiguration
 | *cachesConfigurations* (common) | A map of caches configurations to be used to create caches. |  | Map
 | *cacheConfigurationUri* (common) | URI pointing to the Ehcache XML configuration file's location |  | String
diff --git a/components/camel-elytron/src/main/docs/elytron-component.adoc b/components/camel-elytron/src/main/docs/elytron-component.adoc
index fca83a5..251b1a7 100644
--- a/components/camel-elytron/src/main/docs/elytron-component.adoc
+++ b/components/camel-elytron/src/main/docs/elytron-component.adoc
@@ -61,7 +61,7 @@ The Elytron component supports 11 options, which are listed below.
 | *elytronProvider* (advanced) | Elytron security provider, has to support mechanism from parameter mechanismName. | instance of WildFlyElytronHttpBearerProvider | WildFlyElytronBaseProvider
 | *undertowHttpBinding* (advanced) | To use a custom HttpBinding to control the mapping between Camel message and HttpClient. |  | UndertowHttpBinding
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *hostOptions* (advanced) | To configure common options, such as thread pools |  | UndertowHostOptions
 | *muteException* (consumer) | If enabled and an Exchange failed processing on the consumer side the response's body won't contain the exception's stack trace. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
diff --git a/components/camel-etcd/src/main/docs/etcd-component.adoc b/components/camel-etcd/src/main/docs/etcd-component.adoc
index fffa988..18a1a13 100644
--- a/components/camel-etcd/src/main/docs/etcd-component.adoc
+++ b/components/camel-etcd/src/main/docs/etcd-component.adoc
@@ -34,7 +34,7 @@ The Etcd component supports 9 options, which are listed below.
 | *userName* (common) | The user name to use for basic authentication. |  | String
 | *password* (common) | The password to use for basic authentication. |  | String
 | *configuration* (advanced) | Sets the common configuration shared among endpoints |  | EtcdConfiguration
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/components/camel-file/src/main/docs/file-component.adoc b/components/camel-file/src/main/docs/file-component.adoc
index 6df7af7..8694d51 100644
--- a/components/camel-file/src/main/docs/file-component.adoc
+++ b/components/camel-file/src/main/docs/file-component.adoc
@@ -113,7 +113,7 @@ with the following path and query parameters:
 | *extendedAttributes* (consumer) | To define which file attributes of interest. Like posix:permissions,posix:owner,basic:lastAccessTime, it supports basic wildcard like posix:, basic:lastAccessTime |  | String
 | *inProgressRepository* (consumer) | A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files being consumed. By default a memory based repository is used. |  | IdempotentRepository
 | *localWorkDirectory* (consumer) | When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume a very big remote file and thus can conserve memory. |  | String
-| *onCompletionException Handler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
+| *onCompletionExceptionHandler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
 | *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
 | *probeContentType* (consumer) | Whether to enable probing of the content type. If enable then the consumer uses Files#probeContentType(java.nio.file.Path) to determine the content-type of the file, and store that as a header with key Exchange#FILE_CONTENT_TYPE on the Message. | false | boolean
 | *processStrategy* (consumer) | A pluggable org.apache.camel.component.file.GenericFileProcessStrategy allowing you to implement your own readLock option or similar. Can also be used when special conditions must be met before a file can be consumed, such as a special ready file exists. If this option is set then the readLock option does not apply. |  | GenericFileProcessStrategy
@@ -176,10 +176,10 @@ with the following path and query parameters:
  
 Notice: The various read locks is not all suited to work in clustered mode, where concurrent consumers on different nodes is competing for the same files on a shared file system. The markerFile using a close to atomic operation to create the empty marker file, but its not guaranteed to work in a cluster. The fileLock may work better but then the file system need to support distributed file locks, and so on. Using the idempotent read lock can support clustering if the idempotent repositor [...]
 | *readLockCheckInterval* (lock) | Interval in millis for the read-lock, if supported by the read lock. This interval is used for sleeping between attempts to acquire the read lock. For example when using the changed read lock, you can set a higher interval period to cater for slow writes. The default of 1 sec. may be too fast if the producer is very slow writing the file. Notice: For FTP the default readLockCheckInterval is 5000. The readLockTimeout value must be higher than readLockChe [...]
-| *readLockDeleteOrphanLock Files* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
-| *readLockIdempotentRelease Async* (lock) | Whether the delayed release task should be synchronous or asynchronous. See more details at the readLockIdempotentReleaseDelay option. | false | boolean
-| *readLockIdempotentRelease AsyncPoolSize* (lock) | The number of threads in the scheduled thread pool when using asynchronous release tasks. Using a default of 1 core threads should be sufficient in almost all use-cases, only set this to a higher value if either updating the idempotent repository is slow, or there are a lot of files to process. This option is not in-use if you use a shared thread pool by configuring the readLockIdempotentReleaseExecutorService option. See more details  [...]
-| *readLockIdempotentRelease Delay* (lock) | Whether to delay the release task for a period of millis. This can be used to delay the release tasks to expand the window when a file is regarded as read-locked, in an active/active cluster scenario with a shared idempotent repository, to ensure other nodes cannot potentially scan and acquire the same file, due to race-conditions. By expanding the time-window of the release tasks helps prevents these situations. Note delaying is only needed i [...]
+| *readLockDeleteOrphanLockFiles* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
+| *readLockIdempotentReleaseAsync* (lock) | Whether the delayed release task should be synchronous or asynchronous. See more details at the readLockIdempotentReleaseDelay option. | false | boolean
+| *readLockIdempotentReleaseAsync PoolSize* (lock) | The number of threads in the scheduled thread pool when using asynchronous release tasks. Using a default of 1 core threads should be sufficient in almost all use-cases, only set this to a higher value if either updating the idempotent repository is slow, or there are a lot of files to process. This option is not in-use if you use a shared thread pool by configuring the readLockIdempotentReleaseExecutorService option. See more details  [...]
+| *readLockIdempotentReleaseDelay* (lock) | Whether to delay the release task for a period of millis. This can be used to delay the release tasks to expand the window when a file is regarded as read-locked, in an active/active cluster scenario with a shared idempotent repository, to ensure other nodes cannot potentially scan and acquire the same file, due to race-conditions. By expanding the time-window of the release tasks helps prevents these situations. Note delaying is only needed if [...]
 | *readLockIdempotentRelease ExecutorService* (lock) | To use a custom and shared thread pool for asynchronous release tasks. See more details at the readLockIdempotentReleaseDelay option. |  | ScheduledExecutorService
 | *readLockLoggingLevel* (lock) | Logging level used when a read lock could not be acquired. By default a DEBUG is logged. You can change this level, for example to OFF to not have any logging. This option is only applicable for readLock of types: changed, fileLock, idempotent, idempotent-changed, idempotent-rename, rename. | DEBUG | LoggingLevel
 | *readLockMarkerFile* (lock) | Whether to use marker file with the changed, rename, or exclusive read lock types. By default a marker file is used as well to guard against other processes picking up the same files. This behavior can be turned off by setting this option to false. For example if you do not want to write marker files to the file systems by the Camel application. | true | boolean
diff --git a/components/camel-ftp/src/main/docs/ftp-component.adoc b/components/camel-ftp/src/main/docs/ftp-component.adoc
index 96879e8..2822740 100644
--- a/components/camel-ftp/src/main/docs/ftp-component.adoc
+++ b/components/camel-ftp/src/main/docs/ftp-component.adoc
@@ -120,7 +120,7 @@ with the following path and query parameters:
 | *fileName* (common) | Use Expression such as File Language to dynamically set the filename. For consumers, it's used as a filename filter. For producers, it's used to evaluate the filename to write. If an expression is set, it take precedence over the CamelFileName header. (Note: The header itself can also be an Expression). The expression options support both String and Expression types. If the expression is a String type, it is always evaluated using the File Language. If the express [...]
 | *passiveMode* (common) | Sets passive mode connections. Default is active mode connections. | false | boolean
 | *separator* (common) | Sets the path separator to be used. UNIX = Uses unix style path separator Windows = Uses windows style path separator Auto = (is default) Use existing path separator in file name | UNIX | PathSeparator
-| *transferLoggingInterval Seconds* (common) | Configures the interval in seconds to use when logging the progress of upload and download operations that are in-flight. This is used for logging progress when operations takes longer time. | 5 | int
+| *transferLoggingIntervalSeconds* (common) | Configures the interval in seconds to use when logging the progress of upload and download operations that are in-flight. This is used for logging progress when operations takes longer time. | 5 | int
 | *transferLoggingLevel* (common) | Configure the logging level to use when logging the progress of upload and download operations. | DEBUG | LoggingLevel
 | *transferLoggingVerbose* (common) | Configures whether the perform verbose (fine grained) logging of the progress of upload and download operations. | false | boolean
 | *fastExistsCheck* (common) | If set this option to be true, camel-\ftp will use the list file directly to check if the file exists. Since some FTP server may not support to list the file directly, if the option is false, camel-\ftp will use the old way to list the directory and check if the file exists. This option also influences readLock=changed to control whether it performs a fast check to update file information or not. This can be used to speed up the process if the FTP server ha [...]
@@ -137,11 +137,11 @@ with the following path and query parameters:
 | *download* (consumer) | Whether the FTP consumer should download the file. If this option is set to false, then the message body will be null, but the consumer will still trigger a Camel Exchange that has details about the file such as file name, file size, etc. It's just that the file will not be downloaded. | false | boolean
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
-| *handleDirectoryParser AbsoluteResult* (consumer) | Allows you to set how the consumer will handle subfolders and files in the path if the directory parser results in with absolute paths The reason for this is that some FTP servers may return file names with absolute paths, and if so then the FTP component needs to handle this by converting the returned path into a relative path. | false | boolean
-| *ignoreFileNotFoundOr PermissionError* (consumer) | Whether to ignore when (trying to list files in directories or when downloading a file), which does not exist or due to permission error. By default when a directory or file does not exists or insufficient permission, then an exception is thrown. Setting this option to true allows to ignore that instead. | false | boolean
+| *handleDirectoryParserAbsolute Result* (consumer) | Allows you to set how the consumer will handle subfolders and files in the path if the directory parser results in with absolute paths The reason for this is that some FTP servers may return file names with absolute paths, and if so then the FTP component needs to handle this by converting the returned path into a relative path. | false | boolean
+| *ignoreFileNotFoundOrPermission Error* (consumer) | Whether to ignore when (trying to list files in directories or when downloading a file), which does not exist or due to permission error. By default when a directory or file does not exists or insufficient permission, then an exception is thrown. Setting this option to true allows to ignore that instead. | false | boolean
 | *inProgressRepository* (consumer) | A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files being consumed. By default a memory based repository is used. |  | IdempotentRepository
 | *localWorkDirectory* (consumer) | When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume a very big remote file and thus can conserve memory. |  | String
-| *onCompletionException Handler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
+| *onCompletionExceptionHandler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
 | *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
 | *processStrategy* (consumer) | A pluggable org.apache.camel.component.file.GenericFileProcessStrategy allowing you to implement your own readLock option or similar. Can also be used when special conditions must be met before a file can be consumed, such as a special ready file exists. If this option is set then the readLock option does not apply. |  | GenericFileProcessStrategy
 | *useList* (consumer) | Whether to allow using LIST command when downloading a file. Default is true. In some use cases you may want to download a specific file and are not allowed to use the LIST command, and therefore you can set this option to false. Notice when using this option, then the specific file to download does not include meta-data information such as file size, timestamp, permissions etc, because those information is only possible to retrieve when LIST command is in use. | [...]
@@ -174,7 +174,7 @@ with the following path and query parameters:
 | *soTimeout* (advanced) | Sets the so timeout FTP and FTPS Only for Camel 2.4. SFTP for Camel 2.14.3/2.15.3/2.16 onwards. Is the SocketOptions.SO_TIMEOUT value in millis. Recommended option is to set this to 300000 so as not have a hanged connection. On SFTP this option is set as timeout on the JSCH Session instance. | 300000 | int
 | *stepwise* (advanced) | Sets whether we should stepwise change directories while traversing file structures when downloading files, or as well when uploading a file to a directory. You can disable this if you for example are in a situation where you cannot change directory on the FTP server due security reasons. | true | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
-| *throwExceptionOnConnect Failed* (advanced) | Should an exception be thrown if connection failed (exhausted) By default exception is not thrown and a WARN is logged. You can use this to enable exception being thrown and handle the thrown exception from the org.apache.camel.spi.PollingConsumerPollStrategy rollback method. | false | boolean
+| *throwExceptionOnConnectFailed* (advanced) | Should an exception be thrown if connection failed (exhausted) By default exception is not thrown and a WARN is logged. You can use this to enable exception being thrown and handle the thrown exception from the org.apache.camel.spi.PollingConsumerPollStrategy rollback method. | false | boolean
 | *timeout* (advanced) | Sets the data timeout for waiting for reply Used only by FTPClient | 30000 | int
 | *antExclude* (filter) | Ant style filter exclusion. If both antInclude and antExclude are used, antExclude takes precedence over antInclude. Multiple exclusions may be specified in comma-delimited format. |  | String
 | *antFilterCaseSensitive* (filter) | Sets case sensitive flag on ant filter | true | boolean
@@ -195,7 +195,7 @@ with the following path and query parameters:
 | *exclusiveReadLockStrategy* (lock) | Pluggable read-lock as a org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy implementation. |  | GenericFileExclusiveReadLockStrategy
 | *readLock* (lock) | Used by consumer, to only poll the files if it has exclusive read-lock on the file (i.e. the file is not in-progress or being written). Camel will wait until the file lock is granted. This option provides the build in strategies: - none - No read lock is in use - markerFile - Camel creates a marker file (fileName.camelLock) and then holds a lock on it. This option is not available for the FTP component - changed - Changed is using file length/modification timestamp  [...]
 | *readLockCheckInterval* (lock) | Interval in millis for the read-lock, if supported by the read lock. This interval is used for sleeping between attempts to acquire the read lock. For example when using the changed read lock, you can set a higher interval period to cater for slow writes. The default of 1 sec. may be too fast if the producer is very slow writing the file. Notice: For FTP the default readLockCheckInterval is 5000. The readLockTimeout value must be higher than readLockChe [...]
-| *readLockDeleteOrphanLock Files* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
+| *readLockDeleteOrphanLockFiles* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
 | *readLockLoggingLevel* (lock) | Logging level used when a read lock could not be acquired. By default a DEBUG is logged. You can change this level, for example to OFF to not have any logging. This option is only applicable for readLock of types: changed, fileLock, idempotent, idempotent-changed, idempotent-rename, rename. | DEBUG | LoggingLevel
 | *readLockMarkerFile* (lock) | Whether to use marker file with the changed, rename, or exclusive read lock types. By default a marker file is used as well to guard against other processes picking up the same files. This behavior can be turned off by setting this option to false. For example if you do not want to write marker files to the file systems by the Camel application. | true | boolean
 | *readLockMinAge* (lock) | This option is applied only for readLock=changed. It allows to specify a minimum age the file must be before attempting to acquire the read lock. For example use readLockMinAge=300s to require the file is at last 5 minutes old. This can speedup the changed read lock as it will only attempt to acquire files which are at least that given age. | 0 | long
diff --git a/components/camel-ftp/src/main/docs/ftps-component.adoc b/components/camel-ftp/src/main/docs/ftps-component.adoc
index 4431291..29ba2b9 100644
--- a/components/camel-ftp/src/main/docs/ftps-component.adoc
+++ b/components/camel-ftp/src/main/docs/ftps-component.adoc
@@ -37,7 +37,7 @@ The FTPS component supports 4 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -79,7 +79,7 @@ with the following path and query parameters:
 | *fileName* (common) | Use Expression such as File Language to dynamically set the filename. For consumers, it's used as a filename filter. For producers, it's used to evaluate the filename to write. If an expression is set, it take precedence over the CamelFileName header. (Note: The header itself can also be an Expression). The expression options support both String and Expression types. If the expression is a String type, it is always evaluated using the File Language. If the express [...]
 | *passiveMode* (common) | Sets passive mode connections. Default is active mode connections. | false | boolean
 | *separator* (common) | Sets the path separator to be used. UNIX = Uses unix style path separator Windows = Uses windows style path separator Auto = (is default) Use existing path separator in file name | UNIX | PathSeparator
-| *transferLoggingInterval Seconds* (common) | Configures the interval in seconds to use when logging the progress of upload and download operations that are in-flight. This is used for logging progress when operations takes longer time. | 5 | int
+| *transferLoggingIntervalSeconds* (common) | Configures the interval in seconds to use when logging the progress of upload and download operations that are in-flight. This is used for logging progress when operations takes longer time. | 5 | int
 | *transferLoggingLevel* (common) | Configure the logging level to use when logging the progress of upload and download operations. | DEBUG | LoggingLevel
 | *transferLoggingVerbose* (common) | Configures whether the perform verbose (fine grained) logging of the progress of upload and download operations. | false | boolean
 | *fastExistsCheck* (common) | If set this option to be true, camel-\ftp will use the list file directly to check if the file exists. Since some FTP server may not support to list the file directly, if the option is false, camel-\ftp will use the old way to list the directory and check if the file exists. This option also influences readLock=changed to control whether it performs a fast check to update file information or not. This can be used to speed up the process if the FTP server ha [...]
@@ -96,11 +96,11 @@ with the following path and query parameters:
 | *download* (consumer) | Whether the FTP consumer should download the file. If this option is set to false, then the message body will be null, but the consumer will still trigger a Camel Exchange that has details about the file such as file name, file size, etc. It's just that the file will not be downloaded. | false | boolean
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
-| *handleDirectoryParser AbsoluteResult* (consumer) | Allows you to set how the consumer will handle subfolders and files in the path if the directory parser results in with absolute paths The reason for this is that some FTP servers may return file names with absolute paths, and if so then the FTP component needs to handle this by converting the returned path into a relative path. | false | boolean
-| *ignoreFileNotFoundOr PermissionError* (consumer) | Whether to ignore when (trying to list files in directories or when downloading a file), which does not exist or due to permission error. By default when a directory or file does not exists or insufficient permission, then an exception is thrown. Setting this option to true allows to ignore that instead. | false | boolean
+| *handleDirectoryParserAbsolute Result* (consumer) | Allows you to set how the consumer will handle subfolders and files in the path if the directory parser results in with absolute paths The reason for this is that some FTP servers may return file names with absolute paths, and if so then the FTP component needs to handle this by converting the returned path into a relative path. | false | boolean
+| *ignoreFileNotFoundOrPermission Error* (consumer) | Whether to ignore when (trying to list files in directories or when downloading a file), which does not exist or due to permission error. By default when a directory or file does not exists or insufficient permission, then an exception is thrown. Setting this option to true allows to ignore that instead. | false | boolean
 | *inProgressRepository* (consumer) | A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files being consumed. By default a memory based repository is used. |  | IdempotentRepository
 | *localWorkDirectory* (consumer) | When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume a very big remote file and thus can conserve memory. |  | String
-| *onCompletionException Handler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
+| *onCompletionExceptionHandler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
 | *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
 | *processStrategy* (consumer) | A pluggable org.apache.camel.component.file.GenericFileProcessStrategy allowing you to implement your own readLock option or similar. Can also be used when special conditions must be met before a file can be consumed, such as a special ready file exists. If this option is set then the readLock option does not apply. |  | GenericFileProcessStrategy
 | *useList* (consumer) | Whether to allow using LIST command when downloading a file. Default is true. In some use cases you may want to download a specific file and are not allowed to use the LIST command, and therefore you can set this option to false. Notice when using this option, then the specific file to download does not include meta-data information such as file size, timestamp, permissions etc, because those information is only possible to retrieve when LIST command is in use. | [...]
@@ -133,7 +133,7 @@ with the following path and query parameters:
 | *soTimeout* (advanced) | Sets the so timeout FTP and FTPS Only for Camel 2.4. SFTP for Camel 2.14.3/2.15.3/2.16 onwards. Is the SocketOptions.SO_TIMEOUT value in millis. Recommended option is to set this to 300000 so as not have a hanged connection. On SFTP this option is set as timeout on the JSCH Session instance. | 300000 | int
 | *stepwise* (advanced) | Sets whether we should stepwise change directories while traversing file structures when downloading files, or as well when uploading a file to a directory. You can disable this if you for example are in a situation where you cannot change directory on the FTP server due security reasons. | true | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
-| *throwExceptionOnConnect Failed* (advanced) | Should an exception be thrown if connection failed (exhausted) By default exception is not thrown and a WARN is logged. You can use this to enable exception being thrown and handle the thrown exception from the org.apache.camel.spi.PollingConsumerPollStrategy rollback method. | false | boolean
+| *throwExceptionOnConnectFailed* (advanced) | Should an exception be thrown if connection failed (exhausted) By default exception is not thrown and a WARN is logged. You can use this to enable exception being thrown and handle the thrown exception from the org.apache.camel.spi.PollingConsumerPollStrategy rollback method. | false | boolean
 | *timeout* (advanced) | Sets the data timeout for waiting for reply Used only by FTPClient | 30000 | int
 | *antExclude* (filter) | Ant style filter exclusion. If both antInclude and antExclude are used, antExclude takes precedence over antInclude. Multiple exclusions may be specified in comma-delimited format. |  | String
 | *antFilterCaseSensitive* (filter) | Sets case sensitive flag on ant filter | true | boolean
@@ -154,7 +154,7 @@ with the following path and query parameters:
 | *exclusiveReadLockStrategy* (lock) | Pluggable read-lock as a org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy implementation. |  | GenericFileExclusiveReadLockStrategy
 | *readLock* (lock) | Used by consumer, to only poll the files if it has exclusive read-lock on the file (i.e. the file is not in-progress or being written). Camel will wait until the file lock is granted. This option provides the build in strategies: - none - No read lock is in use - markerFile - Camel creates a marker file (fileName.camelLock) and then holds a lock on it. This option is not available for the FTP component - changed - Changed is using file length/modification timestamp  [...]
 | *readLockCheckInterval* (lock) | Interval in millis for the read-lock, if supported by the read lock. This interval is used for sleeping between attempts to acquire the read lock. For example when using the changed read lock, you can set a higher interval period to cater for slow writes. The default of 1 sec. may be too fast if the producer is very slow writing the file. Notice: For FTP the default readLockCheckInterval is 5000. The readLockTimeout value must be higher than readLockChe [...]
-| *readLockDeleteOrphanLock Files* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
+| *readLockDeleteOrphanLockFiles* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
 | *readLockLoggingLevel* (lock) | Logging level used when a read lock could not be acquired. By default a DEBUG is logged. You can change this level, for example to OFF to not have any logging. This option is only applicable for readLock of types: changed, fileLock, idempotent, idempotent-changed, idempotent-rename, rename. | DEBUG | LoggingLevel
 | *readLockMarkerFile* (lock) | Whether to use marker file with the changed, rename, or exclusive read lock types. By default a marker file is used as well to guard against other processes picking up the same files. This behavior can be turned off by setting this option to false. For example if you do not want to write marker files to the file systems by the Camel application. | true | boolean
 | *readLockMinAge* (lock) | This option is applied only for readLock=changed. It allows to specify a minimum age the file must be before attempting to acquire the read lock. For example use readLockMinAge=300s to require the file is at last 5 minutes old. This can speedup the changed read lock as it will only attempt to acquire files which are at least that given age. | 0 | long
@@ -183,8 +183,8 @@ with the following path and query parameters:
 | *disableSecureDataChannel Defaults* (security) | Use this option to disable default options when using secure data channel. This allows you to be in full control what the execPbsz and execProt setting should be used. Default is false | false | boolean
 | *execPbsz* (security) | When using secure data channel you can set the exec protection buffer size |  | Long
 | *execProt* (security) | The exec protection level PROT command. C - Clear S - Safe(SSL protocol only) E - Confidential(SSL protocol only) P - Private |  | String
-| *ftpClientKeyStore Parameters* (security) | Set the key store parameters |  | Map
-| *ftpClientTrustStore Parameters* (security) | Set the trust store parameters |  | Map
+| *ftpClientKeyStoreParameters* (security) | Set the key store parameters |  | Map
+| *ftpClientTrustStoreParameters* (security) | Set the trust store parameters |  | Map
 | *implicit* (security) | Set the security mode (Implicit/Explicit). true - Implicit Mode / False - Explicit Mode | false | boolean
 | *password* (security) | Password to use for login |  | String
 | *securityProtocol* (security) | Set the underlying security protocol. | TLSv1.2 | String
diff --git a/components/camel-ftp/src/main/docs/sftp-component.adoc b/components/camel-ftp/src/main/docs/sftp-component.adoc
index 066bca8..1eaa017 100644
--- a/components/camel-ftp/src/main/docs/sftp-component.adoc
+++ b/components/camel-ftp/src/main/docs/sftp-component.adoc
@@ -90,10 +90,10 @@ with the following path and query parameters:
 | *download* (consumer) | Whether the FTP consumer should download the file. If this option is set to false, then the message body will be null, but the consumer will still trigger a Camel Exchange that has details about the file such as file name, file size, etc. It's just that the file will not be downloaded. | false | boolean
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
-| *ignoreFileNotFoundOr PermissionError* (consumer) | Whether to ignore when (trying to list files in directories or when downloading a file), which does not exist or due to permission error. By default when a directory or file does not exists or insufficient permission, then an exception is thrown. Setting this option to true allows to ignore that instead. | false | boolean
+| *ignoreFileNotFoundOrPermission Error* (consumer) | Whether to ignore when (trying to list files in directories or when downloading a file), which does not exist or due to permission error. By default when a directory or file does not exists or insufficient permission, then an exception is thrown. Setting this option to true allows to ignore that instead. | false | boolean
 | *inProgressRepository* (consumer) | A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files being consumed. By default a memory based repository is used. |  | IdempotentRepository
 | *localWorkDirectory* (consumer) | When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume a very big remote file and thus can conserve memory. |  | String
-| *onCompletionException Handler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
+| *onCompletionExceptionHandler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
 | *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
 | *processStrategy* (consumer) | A pluggable org.apache.camel.component.file.GenericFileProcessStrategy allowing you to implement your own readLock option or similar. Can also be used when special conditions must be met before a file can be consumed, such as a special ready file exists. If this option is set then the readLock option does not apply. |  | GenericFileProcessStrategy
 | *useList* (consumer) | Whether to allow using LIST command when downloading a file. Default is true. In some use cases you may want to download a specific file and are not allowed to use the LIST command, and therefore you can set this option to false. Notice when using this option, then the specific file to download does not include meta-data information such as file size, timestamp, permissions etc, because those information is only possible to retrieve when LIST command is in use. | [...]
@@ -125,7 +125,7 @@ with the following path and query parameters:
 | *soTimeout* (advanced) | Sets the so timeout FTP and FTPS Only for Camel 2.4. SFTP for Camel 2.14.3/2.15.3/2.16 onwards. Is the SocketOptions.SO_TIMEOUT value in millis. Recommended option is to set this to 300000 so as not have a hanged connection. On SFTP this option is set as timeout on the JSCH Session instance. | 300000 | int
 | *stepwise* (advanced) | Sets whether we should stepwise change directories while traversing file structures when downloading files, or as well when uploading a file to a directory. You can disable this if you for example are in a situation where you cannot change directory on the FTP server due security reasons. | true | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
-| *throwExceptionOnConnect Failed* (advanced) | Should an exception be thrown if connection failed (exhausted) By default exception is not thrown and a WARN is logged. You can use this to enable exception being thrown and handle the thrown exception from the org.apache.camel.spi.PollingConsumerPollStrategy rollback method. | false | boolean
+| *throwExceptionOnConnectFailed* (advanced) | Should an exception be thrown if connection failed (exhausted) By default exception is not thrown and a WARN is logged. You can use this to enable exception being thrown and handle the thrown exception from the org.apache.camel.spi.PollingConsumerPollStrategy rollback method. | false | boolean
 | *timeout* (advanced) | Sets the data timeout for waiting for reply Used only by FTPClient | 30000 | int
 | *antExclude* (filter) | Ant style filter exclusion. If both antInclude and antExclude are used, antExclude takes precedence over antInclude. Multiple exclusions may be specified in comma-delimited format. |  | String
 | *antFilterCaseSensitive* (filter) | Sets case sensitive flag on ant filter | true | boolean
@@ -146,10 +146,10 @@ with the following path and query parameters:
 | *exclusiveReadLockStrategy* (lock) | Pluggable read-lock as a org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy implementation. |  | GenericFileExclusiveReadLockStrategy
 | *readLock* (lock) | Used by consumer, to only poll the files if it has exclusive read-lock on the file (i.e. the file is not in-progress or being written). Camel will wait until the file lock is granted. This option provides the build in strategies: - none - No read lock is in use - markerFile - Camel creates a marker file (fileName.camelLock) and then holds a lock on it. This option is not available for the FTP component - changed - Changed is using file length/modification timestamp  [...]
 | *readLockCheckInterval* (lock) | Interval in millis for the read-lock, if supported by the read lock. This interval is used for sleeping between attempts to acquire the read lock. For example when using the changed read lock, you can set a higher interval period to cater for slow writes. The default of 1 sec. may be too fast if the producer is very slow writing the file. Notice: For FTP the default readLockCheckInterval is 5000. The readLockTimeout value must be higher than readLockChe [...]
-| *readLockDeleteOrphanLock Files* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
-| *readLockIdempotentRelease Async* (lock) | Whether the delayed release task should be synchronous or asynchronous. See more details at the readLockIdempotentReleaseDelay option. | false | boolean
-| *readLockIdempotentRelease AsyncPoolSize* (lock) | The number of threads in the scheduled thread pool when using asynchronous release tasks. Using a default of 1 core threads should be sufficient in almost all use-cases, only set this to a higher value if either updating the idempotent repository is slow, or there are a lot of files to process. This option is not in-use if you use a shared thread pool by configuring the readLockIdempotentReleaseExecutorService option. See more details  [...]
-| *readLockIdempotentRelease Delay* (lock) | Whether to delay the release task for a period of millis. This can be used to delay the release tasks to expand the window when a file is regarded as read-locked, in an active/active cluster scenario with a shared idempotent repository, to ensure other nodes cannot potentially scan and acquire the same file, due to race-conditions. By expanding the time-window of the release tasks helps prevents these situations. Note delaying is only needed i [...]
+| *readLockDeleteOrphanLockFiles* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
+| *readLockIdempotentReleaseAsync* (lock) | Whether the delayed release task should be synchronous or asynchronous. See more details at the readLockIdempotentReleaseDelay option. | false | boolean
+| *readLockIdempotentReleaseAsync PoolSize* (lock) | The number of threads in the scheduled thread pool when using asynchronous release tasks. Using a default of 1 core threads should be sufficient in almost all use-cases, only set this to a higher value if either updating the idempotent repository is slow, or there are a lot of files to process. This option is not in-use if you use a shared thread pool by configuring the readLockIdempotentReleaseExecutorService option. See more details  [...]
+| *readLockIdempotentReleaseDelay* (lock) | Whether to delay the release task for a period of millis. This can be used to delay the release tasks to expand the window when a file is regarded as read-locked, in an active/active cluster scenario with a shared idempotent repository, to ensure other nodes cannot potentially scan and acquire the same file, due to race-conditions. By expanding the time-window of the release tasks helps prevents these situations. Note delaying is only needed if [...]
 | *readLockIdempotentRelease ExecutorService* (lock) | To use a custom and shared thread pool for asynchronous release tasks. See more details at the readLockIdempotentReleaseDelay option. |  | ScheduledExecutorService
 | *readLockLoggingLevel* (lock) | Logging level used when a read lock could not be acquired. By default a DEBUG is logged. You can change this level, for example to OFF to not have any logging. This option is only applicable for readLock of types: changed, fileLock, idempotent, idempotent-changed, idempotent-rename, rename. | DEBUG | LoggingLevel
 | *readLockMarkerFile* (lock) | Whether to use marker file with the changed, rename, or exclusive read lock types. By default a marker file is used as well to guard against other processes picking up the same files. This behavior can be turned off by setting this option to false. For example if you do not want to write marker files to the file systems by the Camel application. | true | boolean
diff --git a/components/camel-http/src/main/docs/http-component.adoc b/components/camel-http/src/main/docs/http-component.adoc
index 33c0e71..2b582a5 100644
--- a/components/camel-http/src/main/docs/http-component.adoc
+++ b/components/camel-http/src/main/docs/http-component.adoc
@@ -60,18 +60,18 @@ The HTTP component supports 19 options, which are listed below.
 | *clientConnectionManager* (advanced) | To use a custom and shared HttpClientConnectionManager to manage connections. If this has been configured then this is always used for all endpoints created by this component. |  | HttpClientConnectionManager
 | *httpContext* (advanced) | To use a custom org.apache.http.protocol.HttpContext when executing requests. |  | HttpContext
 | *sslContextParameters* (security) | To configure security using SSLContextParameters. Important: Only one instance of org.apache.camel.support.jsse.SSLContextParameters is supported per HttpComponent. If you need to use 2 or more different instances, you need to define a new HttpComponent per instance you need. |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *x509HostnameVerifier* (security) | To use a custom X509HostnameVerifier such as DefaultHostnameVerifier or NoopHostnameVerifier. |  | HostnameVerifier
 | *maxTotalConnections* (advanced) | The maximum number of connections. | 200 | int
 | *connectionsPerRoute* (advanced) | The maximum number of connections per route. | 20 | int
 | *connectionTimeToLive* (advanced) | The time for connection to live, the time unit is millisecond, the default value is always keep alive. |  | long
 | *cookieStore* (producer) | To use a custom org.apache.http.client.CookieStore. By default the org.apache.http.impl.client.BasicCookieStore is used which is an in-memory only cookie store. Notice if bridgeEndpoint=true then the cookie store is forced to be a noop cookie store as cookie shouldn't be stored as we are just bridging (eg acting as a proxy). |  | CookieStore
-| *connectionRequest Timeout* (timeout) | The timeout in milliseconds used when requesting a connection from the connection manager. A timeout value of zero is interpreted as an infinite timeout. A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). Default: -1 | -1 | int
+| *connectionRequestTimeout* (timeout) | The timeout in milliseconds used when requesting a connection from the connection manager. A timeout value of zero is interpreted as an infinite timeout. A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). Default: -1 | -1 | int
 | *connectTimeout* (timeout) | Determines the timeout in milliseconds until a connection is established. A timeout value of zero is interpreted as an infinite timeout. A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). Default: -1 | -1 | int
 | *socketTimeout* (timeout) | Defines the socket timeout (SO_TIMEOUT) in milliseconds, which is the timeout for waiting for data or, put differently, a maximum period inactivity between two consecutive data packets). A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). Default: -1 | -1 | int
 | *httpBinding* (advanced) | To use a custom HttpBinding to control the mapping between Camel message and HttpClient. |  | HttpBinding
 | *httpConfiguration* (advanced) | To use the shared HttpConfiguration as base configuration. |  | HttpConfiguration
-| *allowJavaSerialized Object* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
+| *allowJavaSerializedObject* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -141,7 +141,7 @@ with the following path and query parameters:
 | *httpClientOptions* (advanced) | To configure the HttpClient using the key/values from the Map. |  | Map
 | *httpContext* (advanced) | To use a custom HttpContext instance |  | HttpContext
 | *mapHttpMessageBody* (advanced) | If this option is true then IN exchange Body of the exchange will be mapped to HTTP body. Setting this to false will avoid the HTTP mapping. | true | boolean
-| *mapHttpMessageFormUrl EncodedBody* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
+| *mapHttpMessageFormUrlEncoded Body* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
 | *mapHttpMessageHeaders* (advanced) | If this option is true then IN exchange Headers of the exchange will be mapped to HTTP headers. Setting this to false will avoid the HTTP Headers mapping. | true | boolean
 | *maxTotalConnections* (advanced) | The maximum number of connections. | 200 | int
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
diff --git a/components/camel-iec60870/src/main/docs/iec60870-client-component.adoc b/components/camel-iec60870/src/main/docs/iec60870-client-component.adoc
index acb70c7..92343fe 100644
--- a/components/camel-iec60870/src/main/docs/iec60870-client-component.adoc
+++ b/components/camel-iec60870/src/main/docs/iec60870-client-component.adoc
@@ -31,7 +31,7 @@ The IEC 60870 Client component supports 4 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *defaultConnection Options* (common) | Default connection options |  | ClientOptions
+| *defaultConnectionOptions* (common) | Default connection options |  | ClientOptions
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -94,7 +94,7 @@ with the following path and query parameters:
 | *acknowledgeWindow* (connection) | Parameter W - Acknowledgment window. | 10 | short
 | *adsuAddressType* (connection) | The common ASDU address size. May be either SIZE_1 or SIZE_2. |  | ASDUAddressType
 | *causeOfTransmissionType* (connection) | The cause of transmission type. May be either SIZE_1 or SIZE_2. |  | CauseOfTransmissionType
-| *informationObjectAddress Type* (connection) | The information address size. May be either SIZE_1, SIZE_2 or SIZE_3. |  | InformationObjectAddressType
+| *informationObjectAddressType* (connection) | The information address size. May be either SIZE_1, SIZE_2 or SIZE_3. |  | InformationObjectAddressType
 | *maxUnacknowledged* (connection) | Parameter K - Maximum number of un-acknowledged messages. | 15 | short
 | *timeout1* (connection) | Timeout T1 in milliseconds. | 15000 | int
 | *timeout2* (connection) | Timeout T2 in milliseconds. | 10000 | int
diff --git a/components/camel-iec60870/src/main/docs/iec60870-server-component.adoc b/components/camel-iec60870/src/main/docs/iec60870-server-component.adoc
index 401f323..2dfcd9f 100644
--- a/components/camel-iec60870/src/main/docs/iec60870-server-component.adoc
+++ b/components/camel-iec60870/src/main/docs/iec60870-server-component.adoc
@@ -32,7 +32,7 @@ The IEC 60870 Server component supports 4 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *defaultConnection Options* (common) | Default connection options |  | ServerOptions
+| *defaultConnectionOptions* (common) | Default connection options |  | ServerOptions
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -98,7 +98,7 @@ with the following path and query parameters:
 | *acknowledgeWindow* (connection) | Parameter W - Acknowledgment window. | 10 | short
 | *adsuAddressType* (connection) | The common ASDU address size. May be either SIZE_1 or SIZE_2. |  | ASDUAddressType
 | *causeOfTransmissionType* (connection) | The cause of transmission type. May be either SIZE_1 or SIZE_2. |  | CauseOfTransmissionType
-| *informationObjectAddress Type* (connection) | The information address size. May be either SIZE_1, SIZE_2 or SIZE_3. |  | InformationObjectAddressType
+| *informationObjectAddressType* (connection) | The information address size. May be either SIZE_1, SIZE_2 or SIZE_3. |  | InformationObjectAddressType
 | *maxUnacknowledged* (connection) | Parameter K - Maximum number of un-acknowledged messages. | 15 | short
 | *timeout1* (connection) | Timeout T1 in milliseconds. | 15000 | int
 | *timeout2* (connection) | Timeout T2 in milliseconds. | 10000 | int
diff --git a/components/camel-ignite/src/main/docs/ignite-cache-component.adoc b/components/camel-ignite/src/main/docs/ignite-cache-component.adoc
index 9fe5db9..ab305d4 100644
--- a/components/camel-ignite/src/main/docs/ignite-cache-component.adoc
+++ b/components/camel-ignite/src/main/docs/ignite-cache-component.adoc
@@ -59,7 +59,7 @@ with the following path and query parameters:
 |===
 | Name | Description | Default | Type
 | *propagateIncomingBodyIfNo ReturnValue* (common) | Sets whether to propagate the incoming body if the return type of the underlying Ignite operation is void. | true | boolean
-| *treatCollectionsAsCache Objects* (common) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
+| *treatCollectionsAsCacheObjects* (common) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
 | *autoUnsubscribe* (consumer) | Whether auto unsubscribe is enabled in the Continuous Query Consumer. | true | boolean
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
 | *fireExistingQueryResults* (consumer) | Whether to process existing results that match the query. Used on initialization of the Continuous Query Consumer. | false | boolean
diff --git a/components/camel-ignite/src/main/docs/ignite-compute-component.adoc b/components/camel-ignite/src/main/docs/ignite-compute-component.adoc
index e0f1a75..efb8423 100644
--- a/components/camel-ignite/src/main/docs/ignite-compute-component.adoc
+++ b/components/camel-ignite/src/main/docs/ignite-compute-component.adoc
@@ -65,7 +65,7 @@ with the following path and query parameters:
 | *propagateIncomingBodyIfNo ReturnValue* (producer) | Sets whether to propagate the incoming body if the return type of the underlying Ignite operation is void. | true | boolean
 | *taskName* (producer) | The task name, only applicable if using the IgniteComputeExecutionType#EXECUTE execution type. |  | String
 | *timeoutMillis* (producer) | The timeout interval for triggered jobs, in milliseconds, which will be set via IgniteCompute#withTimeout(long). |  | Long
-| *treatCollectionsAsCache Objects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
+| *treatCollectionsAsCacheObjects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 |===
diff --git a/components/camel-ignite/src/main/docs/ignite-events-component.adoc b/components/camel-ignite/src/main/docs/ignite-events-component.adoc
index 3a321a1..858e38c 100644
--- a/components/camel-ignite/src/main/docs/ignite-events-component.adoc
+++ b/components/camel-ignite/src/main/docs/ignite-events-component.adoc
@@ -59,7 +59,7 @@ with the following path and query parameters:
 | *clusterGroupExpression* (consumer) | The cluster group expression. |  | ClusterGroupExpression
 | *events* (consumer) | The event types to subscribe to as a comma-separated string of event constants as defined in EventType. For example: EVT_CACHE_ENTRY_CREATED,EVT_CACHE_OBJECT_REMOVED,EVT_IGFS_DIR_CREATED. | EVTS_ALL | String
 | *propagateIncomingBodyIfNo ReturnValue* (consumer) | Sets whether to propagate the incoming body if the return type of the underlying Ignite operation is void. | true | boolean
-| *treatCollectionsAsCache Objects* (consumer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
+| *treatCollectionsAsCacheObjects* (consumer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
diff --git a/components/camel-ignite/src/main/docs/ignite-idgen-component.adoc b/components/camel-ignite/src/main/docs/ignite-idgen-component.adoc
index e2868a4..a075680 100644
--- a/components/camel-ignite/src/main/docs/ignite-idgen-component.adoc
+++ b/components/camel-ignite/src/main/docs/ignite-idgen-component.adoc
@@ -59,7 +59,7 @@ with the following path and query parameters:
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *operation* (producer) | The operation to invoke on the Ignite ID Generator. Superseded by the IgniteConstants.IGNITE_IDGEN_OPERATION header in the IN message. Possible values: ADD_AND_GET, GET, GET_AND_ADD, GET_AND_INCREMENT, INCREMENT_AND_GET. |  | IgniteIdGenOperation
 | *propagateIncomingBodyIfNo ReturnValue* (producer) | Sets whether to propagate the incoming body if the return type of the underlying Ignite operation is void. | true | boolean
-| *treatCollectionsAsCache Objects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
+| *treatCollectionsAsCacheObjects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 |===
diff --git a/components/camel-ignite/src/main/docs/ignite-messaging-component.adoc b/components/camel-ignite/src/main/docs/ignite-messaging-component.adoc
index 6f55f69..0c632af 100644
--- a/components/camel-ignite/src/main/docs/ignite-messaging-component.adoc
+++ b/components/camel-ignite/src/main/docs/ignite-messaging-component.adoc
@@ -56,7 +56,7 @@ with the following path and query parameters:
 |===
 | Name | Description | Default | Type
 | *propagateIncomingBodyIfNo ReturnValue* (common) | Sets whether to propagate the incoming body if the return type of the underlying Ignite operation is void. | true | boolean
-| *treatCollectionsAsCache Objects* (common) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
+| *treatCollectionsAsCacheObjects* (common) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
diff --git a/components/camel-ignite/src/main/docs/ignite-queue-component.adoc b/components/camel-ignite/src/main/docs/ignite-queue-component.adoc
index e52aacc..798afd2 100644
--- a/components/camel-ignite/src/main/docs/ignite-queue-component.adoc
+++ b/components/camel-ignite/src/main/docs/ignite-queue-component.adoc
@@ -60,7 +60,7 @@ with the following path and query parameters:
 | *operation* (producer) | The operation to invoke on the Ignite Queue. Superseded by the IgniteConstants.IGNITE_QUEUE_OPERATION header in the IN message. Possible values: CONTAINS, ADD, SIZE, REMOVE, ITERATOR, CLEAR, RETAIN_ALL, ARRAY, DRAIN, ELEMENT, PEEK, OFFER, POLL, TAKE, PUT. |  | IgniteQueueOperation
 | *propagateIncomingBodyIfNo ReturnValue* (producer) | Sets whether to propagate the incoming body if the return type of the underlying Ignite operation is void. | true | boolean
 | *timeoutMillis* (producer) | The queue timeout in milliseconds. Default: no timeout. |  | Long
-| *treatCollectionsAsCache Objects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
+| *treatCollectionsAsCacheObjects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 |===
diff --git a/components/camel-ignite/src/main/docs/ignite-set-component.adoc b/components/camel-ignite/src/main/docs/ignite-set-component.adoc
index 75d59d9..b0bb960 100644
--- a/components/camel-ignite/src/main/docs/ignite-set-component.adoc
+++ b/components/camel-ignite/src/main/docs/ignite-set-component.adoc
@@ -58,7 +58,7 @@ with the following path and query parameters:
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *operation* (producer) | The operation to invoke on the Ignite Set. Superseded by the IgniteConstants.IGNITE_SETS_OPERATION header in the IN message. Possible values: CONTAINS, ADD, SIZE, REMOVE, ITERATOR, CLEAR, RETAIN_ALL, ARRAY.The set operation to perform. |  | IgniteSetOperation
 | *propagateIncomingBodyIfNo ReturnValue* (producer) | Sets whether to propagate the incoming body if the return type of the underlying Ignite operation is void. | true | boolean
-| *treatCollectionsAsCache Objects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
+| *treatCollectionsAsCacheObjects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 |===
diff --git a/components/camel-irc/src/main/docs/irc-component.adoc b/components/camel-irc/src/main/docs/irc-component.adoc
index a884606..963b6e9 100644
--- a/components/camel-irc/src/main/docs/irc-component.adoc
+++ b/components/camel-irc/src/main/docs/irc-component.adoc
@@ -35,7 +35,7 @@ The IRC component supports 4 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/components/camel-jcache/src/main/docs/jcache-component.adoc b/components/camel-jcache/src/main/docs/jcache-component.adoc
index 04c727c..94e94a2 100644
--- a/components/camel-jcache/src/main/docs/jcache-component.adoc
+++ b/components/camel-jcache/src/main/docs/jcache-component.adoc
@@ -122,8 +122,8 @@ The JCache component supports 8 options, which are listed below.
 | Name | Description | Default | Type
 | *cachingProvider* (common) | The fully qualified class name of the javax.cache.spi.CachingProvider |  | String
 | *cacheConfiguration* (common) | A Configuration for the Cache |  | Configuration
-| *cacheConfiguration Properties* (common) | Properties to configure jcache |  | Map
-| *cacheConfiguration PropertiesRef* (common) | References to an existing Properties or Map to lookup in the registry to use for configuring jcache. |  | String
+| *cacheConfigurationProperties* (common) | Properties to configure jcache |  | Map
+| *cacheConfigurationProperties Ref* (common) | References to an existing Properties or Map to lookup in the registry to use for configuring jcache. |  | String
 | *configurationUri* (common) | An implementation specific URI for the CacheManager |  | String
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
diff --git a/components/camel-jdbc/src/main/docs/jdbc-component.adoc b/components/camel-jdbc/src/main/docs/jdbc-component.adoc
index b0ed459..e15c383 100644
--- a/components/camel-jdbc/src/main/docs/jdbc-component.adoc
+++ b/components/camel-jdbc/src/main/docs/jdbc-component.adoc
@@ -97,7 +97,7 @@ with the following path and query parameters:
 | *transacted* (producer) | Whether transactions are in use. | false | boolean
 | *useGetBytesForBlob* (producer) | To read BLOB columns as bytes instead of string data. This may be needed for certain databases such as Oracle where you must read BLOB columns as bytes. | false | boolean
 | *useHeadersAsParameters* (producer) | Set this option to true to use the prepareStatementStrategy with named parameters. This allows to define queries with named placeholders, and use headers with the dynamic values for the query placeholders. | false | boolean
-| *useJDBC4ColumnNameAnd LabelSemantics* (producer) | Sets whether to use JDBC 4 or JDBC 3.0 or older semantic when retrieving column name. JDBC 4.0 uses columnLabel to get the column name where as JDBC 3.0 uses both columnName or columnLabel. Unfortunately JDBC drivers behave differently so you can use this option to work out issues around your JDBC driver if you get problem using this component This option is default true. | true | boolean
+| *useJDBC4ColumnNameAndLabel Semantics* (producer) | Sets whether to use JDBC 4 or JDBC 3.0 or older semantic when retrieving column name. JDBC 4.0 uses columnLabel to get the column name where as JDBC 3.0 uses both columnName or columnLabel. Unfortunately JDBC drivers behave differently so you can use this option to work out issues around your JDBC driver if you get problem using this component This option is default true. | true | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *beanRowMapper* (advanced) | To use a custom org.apache.camel.component.jdbc.BeanRowMapper when using outputClass. The default implementation will lower case the row names and skip underscores, and dashes. For example CUST_ID is mapped as custId. |  | BeanRowMapper
 | *prepareStatementStrategy* (advanced) | Allows the plugin to use a custom org.apache.camel.component.jdbc.JdbcPrepareStatementStrategy to control preparation of the query and prepared statement. |  | JdbcPrepareStatementStrategy
diff --git a/components/camel-jetty/src/main/docs/jetty-component.adoc b/components/camel-jetty/src/main/docs/jetty-component.adoc
index 7bf798f..afc395b 100644
--- a/components/camel-jetty/src/main/docs/jetty-component.adoc
+++ b/components/camel-jetty/src/main/docs/jetty-component.adoc
@@ -74,21 +74,21 @@ The Jetty component supports 32 options, which are listed below.
 | *httpBinding* (advanced) | Not to be used - use JettyHttpBinding instead. |  | HttpBinding
 | *httpConfiguration* (advanced) | Jetty component does not use HttpConfiguration. |  | HttpConfiguration
 | *mbContainer* (advanced) | To use a existing configured org.eclipse.jetty.jmx.MBeanContainer if JMX is enabled that Jetty uses for registering mbeans. |  | MBeanContainer
-| *sslSocketConnector Properties* (security) | A map which contains general SSL connector properties. |  | Map
-| *socketConnector Properties* (security) | A map which contains general HTTP connector properties. Uses the same principle as sslSocketConnectorProperties. |  | Map
+| *sslSocketConnectorProperties* (security) | A map which contains general SSL connector properties. |  | Map
+| *socketConnectorProperties* (security) | A map which contains general HTTP connector properties. Uses the same principle as sslSocketConnectorProperties. |  | Map
 | *continuationTimeout* (consumer) | Allows to set a timeout in millis when using Jetty as consumer (server). By default Jetty uses 30000. You can use a value of = 0 to never expire. If a timeout occurs then the request will be expired and Jetty will return back a http error 503 to the client. This option is only in use when using Jetty with the Asynchronous Routing Engine. | 30000 | Long
 | *useContinuation* (consumer) | Whether or not to use Jetty continuations for the Jetty Server. | true | boolean
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters | false | boolean
 | *responseBufferSize* (consumer) | Allows to configure a custom value of the response buffer size on the Jetty connectors. |  | Integer
 | *requestBufferSize* (consumer) | Allows to configure a custom value of the request buffer size on the Jetty connectors. |  | Integer
 | *requestHeaderSize* (consumer) | Allows to configure a custom value of the request header size on the Jetty connectors. |  | Integer
 | *responseHeaderSize* (consumer) | Allows to configure a custom value of the response header size on the Jetty connectors. |  | Integer
 | *proxyHost* (proxy) | To use a http proxy to configure the hostname. |  | String
 | *proxyPort* (proxy) | To use a http proxy to configure the port number. |  | Integer
-| *useXForwardedFor Header* (consumer) | To use the X-Forwarded-For header in HttpServletRequest.getRemoteAddr. | false | boolean
+| *useXForwardedForHeader* (consumer) | To use the X-Forwarded-For header in HttpServletRequest.getRemoteAddr. | false | boolean
 | *sendServerVersion* (consumer) | If the option is true, jetty will send the server header with the jetty version information to the client which sends the request. NOTE please make sure there is no any other camel-jetty endpoint is share the same port, otherwise this option may not work as expected. | true | boolean
-| *allowJavaSerialized Object* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
+| *allowJavaSerializedObject* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -158,7 +158,7 @@ with the following path and query parameters:
 | *traceEnabled* (consumer) | Specifies whether to enable HTTP TRACE for this Servlet consumer. By default TRACE is turned off. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *mapHttpMessageBody* (advanced) | If this option is true then IN exchange Body of the exchange will be mapped to HTTP body. Setting this to false will avoid the HTTP mapping. | true | boolean
-| *mapHttpMessageFormUrl EncodedBody* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
+| *mapHttpMessageFormUrlEncoded Body* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
 | *mapHttpMessageHeaders* (advanced) | If this option is true then IN exchange Headers of the exchange will be mapped to HTTP headers. Setting this to false will avoid the HTTP Headers mapping. | true | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
diff --git a/components/camel-jms/src/main/docs/jms-component.adoc b/components/camel-jms/src/main/docs/jms-component.adoc
index d8b13ff..8fea22c 100644
--- a/components/camel-jms/src/main/docs/jms-component.adoc
+++ b/components/camel-jms/src/main/docs/jms-component.adoc
@@ -189,14 +189,14 @@ The JMS component supports 84 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *allowAutoWired ConnectionFactory* (advanced) | Whether to auto-discover ConnectionFactory from the registry, if no connection factory has been configured. If only one instance of ConnectionFactory is found then it will be used. This is enabled by default. | false | boolean
-| *allowAutoWired DestinationResolver* (advanced) | Whether to auto-discover DestinationResolver from the registry, if no destination resolver has been configured. If only one instance of DestinationResolver is found then it will be used. This is enabled by default. | false | boolean
+| *allowAutoWiredConnection Factory* (advanced) | Whether to auto-discover ConnectionFactory from the registry, if no connection factory has been configured. If only one instance of ConnectionFactory is found then it will be used. This is enabled by default. | false | boolean
+| *allowAutoWiredDestination Resolver* (advanced) | Whether to auto-discover DestinationResolver from the registry, if no destination resolver has been configured. If only one instance of DestinationResolver is found then it will be used. This is enabled by default. | false | boolean
 | *configuration* (advanced) | To use a shared JMS configuration |  | JmsConfiguration
-| *acceptMessagesWhile Stopping* (consumer) | Specifies whether the consumer accept messages while it is stopping. You may consider enabling this option, if you start and stop JMS routes at runtime, while there are still messages enqueued on the queue. If this option is false, and you stop the JMS route, then messages may be rejected, and the JMS broker would have to attempt redeliveries, which yet again may be rejected, and eventually the message may be moved at a dead letter queue on t [...]
-| *allowReplyManagerQuick Stop* (consumer) | Whether the DefaultMessageListenerContainer used in the reply managers for request-reply messaging allow the DefaultMessageListenerContainer.runningAllowed flag to quick stop in case JmsConfiguration#isAcceptMessagesWhileStopping is enabled, and org.apache.camel.CamelContext is currently being stopped. This quick stop ability is enabled by default in the regular JMS consumers but to enable for reply managers you must enable this flag. | false  [...]
+| *acceptMessagesWhileStopping* (consumer) | Specifies whether the consumer accept messages while it is stopping. You may consider enabling this option, if you start and stop JMS routes at runtime, while there are still messages enqueued on the queue. If this option is false, and you stop the JMS route, then messages may be rejected, and the JMS broker would have to attempt redeliveries, which yet again may be rejected, and eventually the message may be moved at a dead letter queue on th [...]
+| *allowReplyManagerQuickStop* (consumer) | Whether the DefaultMessageListenerContainer used in the reply managers for request-reply messaging allow the DefaultMessageListenerContainer.runningAllowed flag to quick stop in case JmsConfiguration#isAcceptMessagesWhileStopping is enabled, and org.apache.camel.CamelContext is currently being stopped. This quick stop ability is enabled by default in the regular JMS consumers but to enable for reply managers you must enable this flag. | false | [...]
 | *acknowledgementMode* (consumer) | The JMS acknowledgement mode defined as an Integer. Allows you to set vendor-specific extensions to the acknowledgment mode. For the regular modes, it is preferable to use the acknowledgementModeName instead. |  | int
 | *eagerPoisonBody* (consumer) | If eagerLoadingOfProperties is enabled and the JMS message payload (JMS body or JMS properties) (cannot be read/mapped), then set this text as the message body instead so the message can be processed (the cause of the poison are already stored as exception on the Exchange). This can be turned off by setting eagerPoisonBody=false. See also the option eagerLoadingOfProperties. | Poison JMS message due to ${exception.message} | String
-| *eagerLoadingOf Properties* (consumer) | Enables eager loading of JMS properties as soon as a message is loaded which generally is inefficient as the JMS properties may not be required but sometimes can catch early any issues with the underlying JMS provider and the use of JMS properties. See also the option eagerLoadingOfBody. | false | boolean
+| *eagerLoadingOfProperties* (consumer) | Enables eager loading of JMS properties as soon as a message is loaded which generally is inefficient as the JMS properties may not be required but sometimes can catch early any issues with the underlying JMS provider and the use of JMS properties. See also the option eagerLoadingOfBody. | false | boolean
 | *acknowledgementModeName* (consumer) | The JMS acknowledgement name, which is one of: SESSION_TRANSACTED, CLIENT_ACKNOWLEDGE, AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE | AUTO_ACKNOWLEDGE | String
 | *autoStartup* (consumer) | Specifies whether the consumer container should auto-startup. | true | boolean
 | *cacheLevel* (consumer) | Sets the cache level by ID for the underlying JMS resources. See cacheLevelName option for more details. |  | int
@@ -204,7 +204,7 @@ The JMS component supports 84 options, which are listed below.
 | *replyToCacheLevelName* (producer) | Sets the cache level by name for the reply consumer when doing request/reply over JMS. This option only applies when using fixed reply queues (not temporary). Camel will by default use: CACHE_CONSUMER for exclusive or shared w/ replyToSelectorName. And CACHE_SESSION for shared without replyToSelectorName. Some JMS brokers such as IBM WebSphere may require to set the replyToCacheLevelName=CACHE_NONE to work. Note: If using temporary queues then CACHE [...]
 | *clientId* (common) | Sets the JMS client ID to use. Note that this value, if specified, must be unique and can only be used by a single JMS connection instance. It is typically only required for durable topic subscriptions. If using Apache ActiveMQ you may prefer to use Virtual Topics instead. |  | String
 | *concurrentConsumers* (consumer) | Specifies the default number of concurrent consumers when consuming from JMS (not for request/reply over JMS). See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. When doing request/reply over JMS then the option replyToConcurrentConsumers is used to control number of concurrent consumers on the reply message listener. | 1 | int
-| *replyToConcurrent Consumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
+| *replyToConcurrentConsumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
 | *connectionFactory* (common) | The connection factory to be use. A connection factory must be configured either on the component or endpoint. |  | ConnectionFactory
 | *username* (security) | Username to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *password* (security) | Password to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
@@ -213,22 +213,22 @@ The JMS component supports 84 options, which are listed below.
 | *durableSubscriptionName* (common) | The durable subscriber name for specifying durable topic subscriptions. The clientId option must be configured as well. |  | String
 | *exceptionListener* (advanced) | Specifies the JMS Exception Listener that is to be notified of any underlying JMS exceptions. |  | ExceptionListener
 | *errorHandler* (advanced) | Specifies a org.springframework.util.ErrorHandler to be invoked in case of any uncaught exceptions thrown while processing a Message. By default these exceptions will be logged at the WARN level, if no errorHandler has been configured. You can configure logging level and whether stack traces should be logged using errorHandlerLoggingLevel and errorHandlerLogStackTrace options. This makes it much easier to configure, than having to code a custom errorHandler. [...]
-| *errorHandlerLogging Level* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
-| *errorHandlerLogStack Trace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
+| *errorHandlerLoggingLevel* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
+| *errorHandlerLogStackTrace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
 | *explicitQosEnabled* (producer) | Set if the deliveryMode, priority or timeToLive qualities of service should be used when sending messages. This option is based on Spring's JmsTemplate. The deliveryMode, priority and timeToLive options are applied to the current endpoint. This contrasts with the preserveMessageQos option, which operates at message granularity, reading QoS properties exclusively from the Camel In message headers. | false | boolean
 | *exposeListenerSession* (consumer) | Specifies whether the listener session should be exposed when consuming messages. | false | boolean
 | *idleTaskExecutionLimit* (advanced) | Specifies the limit for idle executions of a receive task, not having received any message within its execution. If this limit is reached, the task will shut down and leave receiving to other executing tasks (in the case of dynamic scheduling; see the maxConcurrentConsumers setting). There is additional doc available from Spring. | 1 | int
 | *idleConsumerLimit* (advanced) | Specify the limit for the number of consumers that are allowed to be idle at any given time. | 1 | int
 | *maxConcurrentConsumers* (consumer) | Specifies the maximum number of concurrent consumers when consuming from JMS (not for request/reply over JMS). See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. When doing request/reply over JMS then the option replyToMaxConcurrentConsumers is used to control number of concurrent consumers on the reply message listener. |  | int
-| *replyToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
-| *replyOnTimeoutToMax ConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
+| *replyToMaxConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
+| *replyOnTimeoutToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
 | *maxMessagesPerTask* (advanced) | The number of messages per task. -1 is unlimited. If you use a range for concurrent consumers (eg min max), then this option can be used to set a value to eg 100 to control how fast the consumers will shrink when less work is required. | -1 | int
 | *messageConverter* (advanced) | To use a custom Spring org.springframework.jms.support.converter.MessageConverter so you can be in control how to map to/from a javax.jms.Message. |  | MessageConverter
 | *mapJmsMessage* (advanced) | Specifies whether Camel should auto map the received JMS message to a suited payload type, such as javax.jms.TextMessage to a String etc. See section about how mapping works below for more details. | true | boolean
 | *messageIdEnabled* (advanced) | When sending, specifies whether message IDs should be added. This is just an hint to the JMS Broker. If the JMS provider accepts this hint, these messages must have the message ID set to null; if the provider ignores the hint, the message ID must be set to its normal unique value. | true | boolean
 | *messageTimestampEnabled* (advanced) | Specifies whether timestamps should be enabled by default on sending messages. This is just an hint to the JMS broker. If the JMS provider accepts this hint, these messages must have the timestamp set to zero; if the provider ignores the hint the timestamp must be set to its normal value. | true | boolean
 | *alwaysCopyMessage* (producer) | If true, Camel will always make a JMS message copy of the message when it is passed to the producer for sending. Copying the message is needed in some situations, such as when a replyToDestinationSelectorName is set (incidentally, Camel will set the alwaysCopyMessage option to true, if a replyToDestinationSelectorName is set). | false | boolean
-| *useMessageIDAs CorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
+| *useMessageIDAsCorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
 | *priority* (producer) | Values greater than 1 specify the message priority when sending (where 0 is the lowest priority and 9 is the highest). The explicitQosEnabled option must also be enabled in order for this option to have any effect. | 4 | int
 | *pubSubNoLocal* (advanced) | Specifies whether to inhibit the delivery of messages published by its own connection. | false | boolean
 | *receiveTimeout* (advanced) | The timeout for receiving messages (in milliseconds). | 1000 | long
@@ -236,16 +236,16 @@ The JMS component supports 84 options, which are listed below.
 | *taskExecutor* (consumer) | Allows you to specify a custom task executor for consuming messages. |  | TaskExecutor
 | *timeToLive* (producer) | When sending messages, specifies the time-to-live of the message (in milliseconds). | -1 | long
 | *transacted* (transaction) | Specifies whether to use transacted mode | false | boolean
-| *lazyCreateTransaction Manager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
+| *lazyCreateTransactionManager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
 | *transactionManager* (transaction) | The Spring transaction manager to use. |  | PlatformTransactionManager
 | *transactionName* (transaction) | The name of the transaction to use. |  | String
 | *transactionTimeout* (transaction) | The timeout value of the transaction (in seconds), if using transacted mode. | -1 | int
-| *testConnectionOn Startup* (common) | Specifies whether to test the connection on startup. This ensures that when Camel starts that all the JMS consumers have a valid connection to the JMS broker. If a connection cannot be granted then Camel throws an exception on startup. This ensures that Camel is not started with failed connections. The JMS producers is tested as well. | false | boolean
+| *testConnectionOnStartup* (common) | Specifies whether to test the connection on startup. This ensures that when Camel starts that all the JMS consumers have a valid connection to the JMS broker. If a connection cannot be granted then Camel throws an exception on startup. This ensures that Camel is not started with failed connections. The JMS producers is tested as well. | false | boolean
 | *asyncStartListener* (advanced) | Whether to startup the JmsConsumer message listener asynchronously, when starting a route. For example if a JmsConsumer cannot get a connection to a remote JMS broker, then it may block while retrying and/or failover. This will cause Camel to block while starting routes. By setting this option to true, you will let routes startup, while the JmsConsumer connects to the JMS broker using a dedicated thread in asynchronous mode. If this option is used, the [...]
 | *asyncStopListener* (advanced) | Whether to stop the JmsConsumer message listener asynchronously, when stopping a route. | false | boolean
-| *forceSendOriginal Message* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
+| *forceSendOriginalMessage* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
 | *requestTimeout* (producer) | The timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds). The default is 20 seconds. You can include the header CamelJmsRequestTimeout to override this endpoint configured timeout value, and thus have per message individual timeout values. See also the requestTimeoutCheckerInterval option. | 20000 | long
-| *requestTimeoutChecker Interval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
 | *transferExchange* (advanced) | You can transfer the exchange over the wire instead of just the body and headers. The following fields are transferred: In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. You must enable this option on both the producer and consumer side, so Camel knows the payloads is an E [...]
 | *transferException* (advanced) | If enabled and you are using Request Reply messaging (InOut) and an Exchange failed on the consumer side, then the caused Exception will be send back in response as a javax.jms.ObjectMessage. If the client is Camel, the returned Exception is rethrown. This allows you to use Camel JMS as a bridge in your routing - for example, using persistent queues to enable robust routing. Notice that if you also have transferExchange enabled, this option takes preced [...]
 | *jmsOperations* (advanced) | Allows you to use your own implementation of the org.springframework.jms.core.JmsOperations interface. Camel uses JmsTemplate as default. Can be used for testing purpose, but not used much as stated in the spring API docs. |  | JmsOperations
@@ -254,21 +254,21 @@ The JMS component supports 84 options, which are listed below.
 | *preserveMessageQos* (producer) | Set to true, if you want to send message using the QoS settings specified on the message, instead of the QoS settings on the JMS endpoint. The following three headers are considered JMSPriority, JMSDeliveryMode, and JMSExpiration. You can provide all or only some of them. If not provided, Camel will fall back to use the values from the endpoint instead. So, when using this option, the headers override the values from the endpoint. The explicitQosEnable [...]
 | *asyncConsumer* (consumer) | Whether the JmsConsumer processes the Exchange asynchronously. If enabled then the JmsConsumer may pickup the next message from the JMS queue, while the previous message is being processed asynchronously (by the Asynchronous Routing Engine). This means that messages may be processed not 100% strictly in order. If disabled (as default) then the Exchange is fully processed before the JmsConsumer will pickup the next message from the JMS queue. Note if transac [...]
 | *allowNullBody* (producer) | Whether to allow sending messages with no body. If this option is false and the message body is null, then an JMSException is thrown. | true | boolean
-| *includeSentJMS MessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
-| *includeAllJMSX Properties* (advanced) | Whether to include all JMSXxxx properties when mapping from JMS to Camel Message. Setting this to true will include properties such as JMSXAppID, and JMSXUserID etc. Note: If you are using a custom headerFilterStrategy then this option does not apply. | false | boolean
-| *defaultTaskExecutor Type* (consumer) | Specifies what default TaskExecutor type to use in the DefaultMessageListenerContainer, for both consumer endpoints and the ReplyTo consumer of producer endpoints. Possible values: SimpleAsync (uses Spring's SimpleAsyncTaskExecutor) or ThreadPool (uses Spring's ThreadPoolTaskExecutor with optimal values - cached threadpool-like). If not set, it defaults to the previous behaviour, which uses a cached thread pool for consumer endpoints and SimpleAs [...]
+| *includeSentJMSMessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
+| *includeAllJMSXProperties* (advanced) | Whether to include all JMSXxxx properties when mapping from JMS to Camel Message. Setting this to true will include properties such as JMSXAppID, and JMSXUserID etc. Note: If you are using a custom headerFilterStrategy then this option does not apply. | false | boolean
+| *defaultTaskExecutorType* (consumer) | Specifies what default TaskExecutor type to use in the DefaultMessageListenerContainer, for both consumer endpoints and the ReplyTo consumer of producer endpoints. Possible values: SimpleAsync (uses Spring's SimpleAsyncTaskExecutor) or ThreadPool (uses Spring's ThreadPoolTaskExecutor with optimal values - cached threadpool-like). If not set, it defaults to the previous behaviour, which uses a cached thread pool for consumer endpoints and SimpleAsy [...]
 | *jmsKeyFormatStrategy* (advanced) | Pluggable strategy for encoding and decoding JMS keys so they can be compliant with the JMS specification. Camel provides two implementations out of the box: default and passthrough. The default strategy will safely marshal dots and hyphens (. and -). The passthrough strategy leaves the key as is. Can be used for JMS brokers which do not care whether JMS header keys contain illegal characters. You can provide your own implementation of the org.apache [...]
 | *allowAdditionalHeaders* (producer) | This option is used to allow additional headers which may have values that are invalid according to JMS specification. For example some message systems such as WMQ do this with header names using prefix JMS_IBM_MQMD_ containing values with byte array or other invalid types. You can specify multiple header names separated by comma, and use as suffix for wildcard matching. |  | String
 | *queueBrowseStrategy* (advanced) | To use a custom QueueBrowseStrategy when browsing queues |  | QueueBrowseStrategy
 | *messageCreatedStrategy* (advanced) | To use the given MessageCreatedStrategy which are invoked when Camel creates new instances of javax.jms.Message objects when Camel is sending a JMS message. |  | MessageCreatedStrategy
-| *waitForProvision CorrelationToBeUpdated Counter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
-| *waitForProvision CorrelationToBeUpdated ThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
+| *waitForProvisionCorrelationTo BeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
+| *waitForProvisionCorrelationTo BeUpdatedThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
 | *correlationProperty* (producer) | Use this JMS property to correlate messages in InOut exchange pattern (request-reply) instead of JMSCorrelationID property. This allows you to exchange messages with systems that do not correlate messages using JMSCorrelationID JMS property. If used JMSCorrelationID will not be used or set by Camel. The value of here named property will be generated if not supplied in the header of the message under the same name. |  | String
 | *subscriptionDurable* (consumer) | Set whether to make the subscription durable. The durable subscription name to be used can be specified through the subscriptionName property. Default is false. Set this to true to register a durable subscription, typically in combination with a subscriptionName value (unless your message listener class name is good enough as subscription name). Only makes sense when listening to a topic (pub-sub domain), therefore this method switches the pubSubDomai [...]
 | *subscriptionShared* (consumer) | Set whether to make the subscription shared. The shared subscription name to be used can be specified through the subscriptionName property. Default is false. Set this to true to register a shared subscription, typically in combination with a subscriptionName value (unless your message listener class name is good enough as subscription name). Note that shared subscriptions may also be durable, so this flag can (and often will) be combined with subscrip [...]
 | *subscriptionName* (consumer) | Set the name of a subscription to create. To be applied in case of a topic (pub-sub domain) with a shared or durable subscription. The subscription name needs to be unique within this client's JMS client id. Default is the class name of the specified message listener. Note: Only 1 concurrent consumer (which is the default of this message listener container) is allowed for each subscription, except for a shared subscription (which requires JMS 2.0). |  | String
-| *streamMessageType Enabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until n [...]
-| *formatDateHeadersTo Iso8601* (producer) | Sets whether date headers should be formatted according to the ISO 8601 standard. | false | boolean
+| *streamMessageTypeEnabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until no [...]
+| *formatDateHeadersToIso8601* (producer) | Sets whether date headers should be formatted according to the ISO 8601 standard. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -347,7 +347,7 @@ with the following path and query parameters:
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
 | *exposeListenerSession* (consumer) | Specifies whether the listener session should be exposed when consuming messages. | false | boolean
-| *replyToSameDestination Allowed* (consumer) | Whether a JMS consumer is allowed to send a reply message to the same destination that the consumer is using to consume from. This prevents an endless loop by consuming and sending back the same message to itself. | false | boolean
+| *replyToSameDestinationAllowed* (consumer) | Whether a JMS consumer is allowed to send a reply message to the same destination that the consumer is using to consume from. This prevents an endless loop by consuming and sending back the same message to itself. | false | boolean
 | *taskExecutor* (consumer) | Allows you to specify a custom task executor for consuming messages. |  | TaskExecutor
 | *deliveryDelay* (producer) | Sets delivery delay to use for send calls for JMS. This option requires JMS 2.0 compliant broker. | -1 | long
 | *deliveryMode* (producer) | Specifies the delivery mode to be used. Possibles values are those defined by javax.jms.DeliveryMode. NON_PERSISTENT = 1 and PERSISTENT = 2. |  | Integer
@@ -358,8 +358,8 @@ with the following path and query parameters:
 | *preserveMessageQos* (producer) | Set to true, if you want to send message using the QoS settings specified on the message, instead of the QoS settings on the JMS endpoint. The following three headers are considered JMSPriority, JMSDeliveryMode, and JMSExpiration. You can provide all or only some of them. If not provided, Camel will fall back to use the values from the endpoint instead. So, when using this option, the headers override the values from the endpoint. The explicitQosEnable [...]
 | *priority* (producer) | Values greater than 1 specify the message priority when sending (where 0 is the lowest priority and 9 is the highest). The explicitQosEnabled option must also be enabled in order for this option to have any effect. | 4 | int
 | *replyToConcurrentConsumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
-| *replyToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
-| *replyToOnTimeoutMax ConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
+| *replyToMaxConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
+| *replyToOnTimeoutMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
 | *replyToOverride* (producer) | Provides an explicit ReplyTo destination in the JMS message, which overrides the setting of replyTo. It is useful if you want to forward the message to a remote Queue and receive the reply message from the ReplyTo destination. |  | String
 | *replyToType* (producer) | Allows for explicitly specifying which kind of strategy to use for replyTo queues when doing request/reply over JMS. Possible values are: Temporary, Shared, or Exclusive. By default Camel will use temporary queues. However if replyTo has been configured, then Shared is used by default. This option allows you to use exclusive queues instead of shared ones. See Camel JMS documentation for more details, and especially the notes about the implications if running  [...]
 | *requestTimeout* (producer) | The timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds). The default is 20 seconds. You can include the header CamelJmsRequestTimeout to override this endpoint configured timeout value, and thus have per message individual timeout values. See also the requestTimeoutCheckerInterval option. | 20000 | long
@@ -372,7 +372,7 @@ with the following path and query parameters:
 | *forceSendOriginalMessage* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
 | *includeSentJMSMessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
 | *replyToCacheLevelName* (producer) | Sets the cache level by name for the reply consumer when doing request/reply over JMS. This option only applies when using fixed reply queues (not temporary). Camel will by default use: CACHE_CONSUMER for exclusive or shared w/ replyToSelectorName. And CACHE_SESSION for shared without replyToSelectorName. Some JMS brokers such as IBM WebSphere may require to set the replyToCacheLevelName=CACHE_NONE to work. Note: If using temporary queues then CACHE [...]
-| *replyToDestinationSelector Name* (producer) | Sets the JMS Selector using the fixed name to be used so you can filter out your own replies from the others when using a shared queue (that is, if you are not using a temporary reply queue). |  | String
+| *replyToDestinationSelectorName* (producer) | Sets the JMS Selector using the fixed name to be used so you can filter out your own replies from the others when using a shared queue (that is, if you are not using a temporary reply queue). |  | String
 | *streamMessageTypeEnabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until no [...]
 | *allowSerializedHeaders* (advanced) | Controls whether or not to include serialized headers. Applies only when isTransferExchange() is true. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. | false | boolean
 | *asyncStartListener* (advanced) | Whether to startup the JmsConsumer message listener asynchronously, when starting a route. For example if a JmsConsumer cannot get a connection to a remote JMS broker, then it may block while retrying and/or failover. This will cause Camel to block while starting routes. By setting this option to true, you will let routes startup, while the JmsConsumer connects to the JMS broker using a dedicated thread in asynchronous mode. If this option is used, the [...]
@@ -396,19 +396,19 @@ with the following path and query parameters:
 | *pubSubNoLocal* (advanced) | Specifies whether to inhibit the delivery of messages published by its own connection. | false | boolean
 | *receiveTimeout* (advanced) | The timeout for receiving messages (in milliseconds). | 1000 | long
 | *recoveryInterval* (advanced) | Specifies the interval between recovery attempts, i.e. when a connection is being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds. | 5000 | long
-| *requestTimeoutChecker Interval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *transferException* (advanced) | If enabled and you are using Request Reply messaging (InOut) and an Exchange failed on the consumer side, then the caused Exception will be send back in response as a javax.jms.ObjectMessage. If the client is Camel, the returned Exception is rethrown. This allows you to use Camel JMS as a bridge in your routing - for example, using persistent queues to enable robust routing. Notice that if you also have transferExchange enabled, this option takes preced [...]
 | *transferExchange* (advanced) | You can transfer the exchange over the wire instead of just the body and headers. The following fields are transferred: In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. You must enable this option on both the producer and consumer side, so Camel knows the payloads is an E [...]
-| *useMessageIDAsCorrelation ID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
-| *waitForProvisionCorrelation ToBeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
-| *waitForProvisionCorrelation ToBeUpdatedThreadSleeping Time* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
+| *useMessageIDAsCorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
+| *waitForProvisionCorrelationTo BeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
+| *waitForProvisionCorrelationTo BeUpdatedThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
 | *errorHandlerLoggingLevel* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
 | *errorHandlerLogStackTrace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
 | *password* (security) | Password to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *username* (security) | Username to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *transacted* (transaction) | Specifies whether to use transacted mode | false | boolean
-| *lazyCreateTransaction Manager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
+| *lazyCreateTransactionManager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
 | *transactionManager* (transaction) | The Spring transaction manager to use. |  | PlatformTransactionManager
 | *transactionName* (transaction) | The name of the transaction to use. |  | String
 | *transactionTimeout* (transaction) | The timeout value of the transaction (in seconds), if using transacted mode. | -1 | int
diff --git a/components/camel-jmx/src/main/docs/jmx-component.adoc b/components/camel-jmx/src/main/docs/jmx-component.adoc
index 5965bd9..f492ecb 100644
--- a/components/camel-jmx/src/main/docs/jmx-component.adoc
+++ b/components/camel-jmx/src/main/docs/jmx-component.adoc
@@ -70,7 +70,7 @@ with the following path and query parameters:
 | *notificationFilter* (advanced) | Reference to a bean that implements the NotificationFilter. |  | NotificationFilter
 | *objectProperties* (advanced) | Properties for the object name. These values will be used if the objectName param is not set |  | Map
 | *reconnectDelay* (advanced) | The number of seconds to wait before attempting to retry establishment of the initial connection or attempt to reconnect a lost connection | 10 | int
-| *reconnectOnConnection Failure* (advanced) | If true the consumer will attempt to reconnect to the JMX server when any connection failure occurs. The consumer will attempt to re-establish the JMX connection every 'x' seconds until the connection is made-- where 'x' is the configured reconnectionDelay | false | boolean
+| *reconnectOnConnectionFailure* (advanced) | If true the consumer will attempt to reconnect to the JMX server when any connection failure occurs. The consumer will attempt to re-establish the JMX connection every 'x' seconds until the connection is made-- where 'x' is the configured reconnectionDelay | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *testConnectionOnStartup* (advanced) | If true the consumer will throw an exception if unable to establish the JMX connection upon startup. If false, the consumer will attempt to establish the JMX connection every 'x' seconds until the connection is made -- where 'x' is the configured reconnectionDelay | true | boolean
 | *notifyDiffer* (string) | If true, will fire a notification when the string attribute differs from the string to compare (string monitor or consumer). By default the consumer will notify match if observed attribute and string to compare has been configured. | false | boolean
diff --git a/components/camel-kafka/src/main/docs/kafka-component.adoc b/components/camel-kafka/src/main/docs/kafka-component.adoc
index 555a0e2..8fcab89 100644
--- a/components/camel-kafka/src/main/docs/kafka-component.adoc
+++ b/components/camel-kafka/src/main/docs/kafka-component.adoc
@@ -47,10 +47,10 @@ The Kafka component supports 10 options, which are listed below.
 | *configuration* (common) | Allows to pre-configure the Kafka component with common options that the endpoints will reuse. |  | KafkaConfiguration
 | *brokers* (common) | URL of the Kafka brokers to use. The format is host1:port1,host2:port2, and the list can be a subset of brokers or a VIP pointing to a subset of brokers. This option is known as bootstrap.servers in the Kafka documentation. |  | String
 | *workerPool* (advanced) | To use a shared custom worker pool for continue routing Exchange after kafka server has acknowledge the message that was sent to it from KafkaProducer using asynchronous non-blocking processing. If using this option then you must handle the lifecycle of the thread pool to shut the pool down when no longer needed. |  | ExecutorService
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *breakOnFirstError* (consumer) | This options controls what happens when a consumer is processing an exchange and it fails. If the option is false then the consumer continues to the next message and processes it. If the option is true then the consumer breaks out, and will seek back to offset of the message that caused a failure, and then re-attempt to process this message. However this can lead to endless processing of the same message if its bound to fail every time, eg a poison mess [...]
 | *allowManualCommit* (consumer) | Whether to allow doing manual commits via KafkaManualCommit. If this option is enabled then an instance of KafkaManualCommit is stored on the Exchange message header, which allows end users to access this API and perform manual offset commits via the Kafka consumer. | false | boolean
-| *kafkaManualCommit Factory* (consumer) | Factory to use for creating KafkaManualCommit instances. This allows to plugin a custom factory to create custom KafkaManualCommit instances in case special logic is needed when doing manual commits that deviates from the default implementation that comes out of the box. |  | KafkaManualCommitFactory
+| *kafkaManualCommitFactory* (consumer) | Factory to use for creating KafkaManualCommit instances. This allows to plugin a custom factory to create custom KafkaManualCommit instances in case special logic is needed when doing manual commits that deviates from the default implementation that comes out of the box. |  | KafkaManualCommitFactory
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -155,9 +155,9 @@ with the following path and query parameters:
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *interceptorClasses* (monitoring) | Sets interceptors for producer or consumers. Producer interceptors have to be classes implementing org.apache.kafka.clients.producer.ProducerInterceptor Consumer interceptors have to be classes implementing org.apache.kafka.clients.consumer.ConsumerInterceptor Note that if you use Producer interceptor on a consumer it will throw a class cast exception in runtime |  | String
-| *kerberosBeforeReloginMin Time* (security) | Login thread sleep time between refresh attempts. | 60000 | Integer
+| *kerberosBeforeReloginMinTime* (security) | Login thread sleep time between refresh attempts. | 60000 | Integer
 | *kerberosInitCmd* (security) | Kerberos kinit command path. Default is /usr/bin/kinit | /usr/bin/kinit | String
-| *kerberosPrincipalToLocal Rules* (security) | A list of rules for mapping from principal names to short names (typically operating system usernames). The rules are evaluated in order and the first rule that matches a principal name is used to map it to a short name. Any later rules in the list are ignored. By default, principal names of the form \{username\}/\{hostname\}\{REALM\} are mapped to \{username\}. For more details on the format please see the security authorization and acls d [...]
+| *kerberosPrincipalToLocalRules* (security) | A list of rules for mapping from principal names to short names (typically operating system usernames). The rules are evaluated in order and the first rule that matches a principal name is used to map it to a short name. Any later rules in the list are ignored. By default, principal names of the form \{username\}/\{hostname\}\{REALM\} are mapped to \{username\}. For more details on the format please see the security authorization and acls do [...]
 | *kerberosRenewJitter* (security) | Percentage of random jitter added to the renewal time. | 0.05 | Double
 | *kerberosRenewWindowFactor* (security) | Login thread will sleep until the specified window factor of time from last refresh to ticket's expiry has been reached, at which time it will try to renew the ticket. | 0.8 | Double
 | *saslJaasConfig* (security) | Expose the kafka sasl.jaas.config parameter Example: org.apache.kafka.common.security.plain.PlainLoginModule required username=USERNAME password=PASSWORD; |  | String
diff --git a/components/camel-lumberjack/src/main/docs/lumberjack-component.adoc b/components/camel-lumberjack/src/main/docs/lumberjack-component.adoc
index 9bf0058..3aa10e6 100644
--- a/components/camel-lumberjack/src/main/docs/lumberjack-component.adoc
+++ b/components/camel-lumberjack/src/main/docs/lumberjack-component.adoc
@@ -50,7 +50,7 @@ The Lumberjack component supports 4 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *sslContextParameters* (security) | Sets the default SSL configuration to use for all the endpoints. You can also configure it directly at the endpoint level. |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
 |===
diff --git a/components/camel-mail/src/main/docs/mail-component.adoc b/components/camel-mail/src/main/docs/mail-component.adoc
index 9b41358..095f772 100644
--- a/components/camel-mail/src/main/docs/mail-component.adoc
+++ b/components/camel-mail/src/main/docs/mail-component.adoc
@@ -102,7 +102,7 @@ The Mail component supports 7 options, which are listed below.
 | Name | Description | Default | Type
 | *configuration* (advanced) | Sets the Mail configuration |  | MailConfiguration
 | *contentTypeResolver* (advanced) | Resolver to determine Content-Type for file attachments. |  | ContentTypeResolver
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -169,7 +169,7 @@ with the following path and query parameters:
 | *subject* (producer) | The Subject of the message being sent. Note: Setting the subject in the header takes precedence over this option. |  | String
 | *to* (producer) | Sets the To email address. Separate multiple email addresses with comma. |  | String
 | *javaMailSender* (producer) | To use a custom org.apache.camel.component.mail.JavaMailSender for sending emails. |  | JavaMailSender
-| *additionalJavaMail Properties* (advanced) | Sets additional java mail properties, that will append/override any default properties that is set based on all the other options. This is useful if you need to add some special options but want to keep the others as is. |  | Properties
+| *additionalJavaMailProperties* (advanced) | Sets additional java mail properties, that will append/override any default properties that is set based on all the other options. This is useful if you need to add some special options but want to keep the others as is. |  | Properties
 | *alternativeBodyHeader* (advanced) | Specifies the key to an IN message header that contains an alternative email body. For example, if you send emails in text/html format and want to provide an alternative mail body for non-HTML email clients, set the alternative mail body with this key as a header. | CamelMailAlternativeBody | String
 | *attachmentsContentTransfer EncodingResolver* (advanced) | To use a custom AttachmentsContentTransferEncodingResolver to resolve what content-type-encoding to use for attachments. |  | AttachmentsContentTransferEncodingResolver
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
@@ -185,7 +185,7 @@ with the following path and query parameters:
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *useInlineAttachments* (advanced) | Whether to use disposition inline or attachment. | false | boolean
 | *idempotentRepository* (filter) | A pluggable repository org.apache.camel.spi.IdempotentRepository which allows to cluster consuming from the same mailbox, and let the repository coordinate whether a mail message is valid for the consumer to process. By default no repository is in use. |  | IdempotentRepository
-| *idempotentRepositoryRemove OnCommit* (filter) | When using idempotent repository, then when the mail message has been successfully processed and is committed, should the message id be removed from the idempotent repository (default) or be kept in the repository. By default its assumed the message id is unique and has no value to be kept in the repository, because the mail message will be marked as seen/moved or deleted to prevent it from being consumed again. And therefore having the  [...]
+| *idempotentRepositoryRemoveOn Commit* (filter) | When using idempotent repository, then when the mail message has been successfully processed and is committed, should the message id be removed from the idempotent repository (default) or be kept in the repository. By default its assumed the message id is unique and has no value to be kept in the repository, because the mail message will be marked as seen/moved or deleted to prevent it from being consumed again. And therefore having the  [...]
 | *searchTerm* (filter) | Refers to a javax.mail.search.SearchTerm which allows to filter mails based on search criteria such as subject, body, from, sent after a certain date etc. |  | SearchTerm
 | *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. |  | int
 | *backoffIdleThreshold* (scheduler) | The number of subsequent idle polls that should happen before the backoffMultipler should kick-in. |  | int
diff --git a/components/camel-milo/src/main/docs/milo-server-component.adoc b/components/camel-milo/src/main/docs/milo-server-component.adoc
index 69b1150..555a1e5 100644
--- a/components/camel-milo/src/main/docs/milo-server-component.adoc
+++ b/components/camel-milo/src/main/docs/milo-server-component.adoc
@@ -42,20 +42,20 @@ The OPC UA Server component supports 22 options, which are listed below.
 | *applicationUri* (common) | The application URI |  | String
 | *productUri* (common) | The product URI |  | String
 | *bindPort* (common) | The TCP port the server binds to |  | int
-| *strictEndpointUrls Enabled* (common) | Set whether strict endpoint URLs are enforced | false | boolean
+| *strictEndpointUrlsEnabled* (common) | Set whether strict endpoint URLs are enforced | false | boolean
 | *serverName* (common) | Server name |  | String
 | *hostname* (common) | Server hostname |  | String
 | *securityPolicies* (common) | Security policies |  | Set
 | *securityPoliciesById* (common) | Security policies by URI or name |  | Collection
-| *userAuthentication Credentials* (common) | Set user password combinations in the form of user1:pwd1,user2:pwd2 Usernames and passwords will be URL decoded |  | String
-| *enableAnonymous Authentication* (common) | Enable anonymous authentication, disabled by default | false | boolean
-| *usernameSecurityPolicy Uri* (common) | Set the UserTokenPolicy used when |  | SecurityPolicy
+| *userAuthenticationCredentials* (common) | Set user password combinations in the form of user1:pwd1,user2:pwd2 Usernames and passwords will be URL decoded |  | String
+| *enableAnonymousAuthentication* (common) | Enable anonymous authentication, disabled by default | false | boolean
+| *usernameSecurityPolicyUri* (common) | Set the UserTokenPolicy used when |  | SecurityPolicy
 | *bindAddresses* (common) | Set the addresses of the local addresses the server should bind to |  | String
 | *buildInfo* (common) | Server build info |  | BuildInfo
 | *serverCertificate* (common) | Server certificate |  | Result
 | *certificateManager* (common) | Server certificate manager |  | CertificateManager
 | *certificateValidator* (common) | Validator for client certificates |  | Supplier
-| *defaultCertificate Validator* (common) | Validator for client certificates using default file based approach |  | File
+| *defaultCertificateValidator* (common) | Validator for client certificates using default file based approach |  | File
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/components/camel-mina/src/main/docs/mina-component.adoc b/components/camel-mina/src/main/docs/mina-component.adoc
index 8810624..cde64ab 100644
--- a/components/camel-mina/src/main/docs/mina-component.adoc
+++ b/components/camel-mina/src/main/docs/mina-component.adoc
@@ -79,7 +79,7 @@ The Mina component supports 5 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *configuration* (advanced) | To use the shared mina configuration. |  | MinaConfiguration
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/components/camel-nats/src/main/docs/nats-component.adoc b/components/camel-nats/src/main/docs/nats-component.adoc
index bc340ac..ee8c490 100644
--- a/components/camel-nats/src/main/docs/nats-component.adoc
+++ b/components/camel-nats/src/main/docs/nats-component.adoc
@@ -43,7 +43,7 @@ The Nats component supports 5 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *servers* (common) | URLs to one or more NAT servers. Use comma to separate URLs when specifying multiple servers. |  | String
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/components/camel-netty-http/src/main/docs/netty-http-component.adoc b/components/camel-netty-http/src/main/docs/netty-http-component.adoc
index 1a8237f..c8aa5c2 100644
--- a/components/camel-netty-http/src/main/docs/netty-http-component.adoc
+++ b/components/camel-netty-http/src/main/docs/netty-http-component.adoc
@@ -103,7 +103,7 @@ The Netty HTTP component supports 11 options, which are listed below.
 | *configuration* (common) | To use the NettyConfiguration as configuration when creating endpoints. |  | NettyHttpConfiguration
 | *headerFilterStrategy* (advanced) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter headers. |  | HeaderFilterStrategy
 | *securityConfiguration* (security) | Refers to a org.apache.camel.component.netty.http.NettyHttpSecurityConfiguration for configuring secure web resources. |  | NettyHttpSecurityConfiguration
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *maximumPoolSize* (consumer) | Sets a maximum thread pool size for the netty consumer ordered thread pool. The default size is 2 x cpu core 1. Setting this value to eg 10 will then use 10 threads unless 2 x cpu core 1 is a higher value, which then will override and be used. For example if there are 8 cores, then the consumer thread pool will be 17. This thread pool is used to route messages received from Netty by Camel. We use a separate thread pool to ensure ordering of messages and a [...]
 | *executorService* (consumer) | To use the given EventExecutorGroup. |  | EventExecutorGroup
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
@@ -173,8 +173,8 @@ with the following path and query parameters:
 | *nettyServerBootstrapFactory* (consumer) | To use a custom NettyServerBootstrapFactory |  | NettyServerBootstrapFactory
 | *nettySharedHttpServer* (consumer) | To use a shared Netty HTTP server. See Netty HTTP Server Example for more details. |  | NettySharedHttpServer
 | *noReplyLogLevel* (consumer) | If sync is enabled this option dictates NettyConsumer which logging level to use when logging a there is no reply to send back. | WARN | LoggingLevel
-| *serverClosedChannel ExceptionCaughtLogLevel* (consumer) | If the server (NettyConsumer) catches an java.nio.channels.ClosedChannelException then its logged using this logging level. This is used to avoid logging the closed channel exceptions, as clients can disconnect abruptly and then cause a flood of closed exceptions in the Netty server. | DEBUG | LoggingLevel
-| *serverExceptionCaughtLog Level* (consumer) | If the server (NettyConsumer) catches an exception then its logged using this logging level. | WARN | LoggingLevel
+| *serverClosedChannelException CaughtLogLevel* (consumer) | If the server (NettyConsumer) catches an java.nio.channels.ClosedChannelException then its logged using this logging level. This is used to avoid logging the closed channel exceptions, as clients can disconnect abruptly and then cause a flood of closed exceptions in the Netty server. | DEBUG | LoggingLevel
+| *serverExceptionCaughtLogLevel* (consumer) | If the server (NettyConsumer) catches an exception then its logged using this logging level. | WARN | LoggingLevel
 | *serverInitializerFactory* (consumer) | To use a custom ServerInitializerFactory |  | ServerInitializerFactory
 | *traceEnabled* (consumer) | Specifies whether to enable HTTP TRACE for this Netty HTTP consumer. By default TRACE is turned off. | false | boolean
 | *urlDecodeHeaders* (consumer) | If this option is enabled, then during binding from Netty to Camel Message then the header values will be URL decoded (eg %20 will be a space character. Notice this option is used by the default org.apache.camel.component.netty.http.NettyHttpBinding and therefore if you implement a custom org.apache.camel.component.netty.http.NettyHttpBinding then you would need to decode the headers accordingly to this option. | false | boolean
@@ -189,7 +189,7 @@ with the following path and query parameters:
 | *producerPoolEnabled* (producer) | Whether producer pool is enabled or not. Important: If you turn this off then a single shared connection is used for the producer, also if you are doing request/reply. That means there is a potential issue with interleaved responses if replies comes back out-of-order. Therefore you need to have a correlation id in both the request and reply messages so you can properly correlate the replies to the Camel callback that is responsible for continue proces [...]
 | *producerPoolMaxActive* (producer) | Sets the cap on the number of objects that can be allocated by the pool (checked out to clients, or idle awaiting checkout) at a given time. Use a negative value for no limit. | -1 | int
 | *producerPoolMaxIdle* (producer) | Sets the cap on the number of idle instances in the pool. | 100 | int
-| *producerPoolMinEvictable Idle* (producer) | Sets the minimum amount of time (value in millis) an object may sit idle in the pool before it is eligible for eviction by the idle object evictor. | 300000 | long
+| *producerPoolMinEvictableIdle* (producer) | Sets the minimum amount of time (value in millis) an object may sit idle in the pool before it is eligible for eviction by the idle object evictor. | 300000 | long
 | *producerPoolMinIdle* (producer) | Sets the minimum number of instances allowed in the producer pool before the evictor thread (if active) spawns new objects. |  | int
 | *useRelativePath* (producer) | Sets whether to use a relative path in HTTP requests. | true | boolean
 | *allowSerializedHeaders* (advanced) | Only used for TCP when transferExchange is true. When set to true, serializable objects in headers and properties will be added to the exchange. Otherwise Camel will exclude any non-serializable objects and log it at WARN level. | false | boolean
diff --git a/components/camel-netty/src/main/docs/netty-component.adoc b/components/camel-netty/src/main/docs/netty-component.adoc
index 72e06ec..988bdc8 100644
--- a/components/camel-netty/src/main/docs/netty-component.adoc
+++ b/components/camel-netty/src/main/docs/netty-component.adoc
@@ -64,7 +64,7 @@ The Netty component supports 8 options, which are listed below.
 | *maximumPoolSize* (consumer) | Sets a maximum thread pool size for the netty consumer ordered thread pool. The default size is 2 x cpu core 1. Setting this value to eg 10 will then use 10 threads unless 2 x cpu core 1 is a higher value, which then will override and be used. For example if there are 8 cores, then the consumer thread pool will be 17. This thread pool is used to route messages received from Netty by Camel. We use a separate thread pool to ensure ordering of messages and a [...]
 | *configuration* (advanced) | To use the NettyConfiguration as configuration when creating endpoints. |  | NettyConfiguration
 | *executorService* (consumer) | To use the given EventExecutorGroup. |  | EventExecutorGroup
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -120,8 +120,8 @@ with the following path and query parameters:
 | *nettyServerBootstrapFactory* (consumer) | To use a custom NettyServerBootstrapFactory |  | NettyServerBootstrapFactory
 | *networkInterface* (consumer) | When using UDP then this option can be used to specify a network interface by its name, such as eth0 to join a multicast group. |  | String
 | *noReplyLogLevel* (consumer) | If sync is enabled this option dictates NettyConsumer which logging level to use when logging a there is no reply to send back. | WARN | LoggingLevel
-| *serverClosedChannel ExceptionCaughtLogLevel* (consumer) | If the server (NettyConsumer) catches an java.nio.channels.ClosedChannelException then its logged using this logging level. This is used to avoid logging the closed channel exceptions, as clients can disconnect abruptly and then cause a flood of closed exceptions in the Netty server. | DEBUG | LoggingLevel
-| *serverExceptionCaughtLog Level* (consumer) | If the server (NettyConsumer) catches an exception then its logged using this logging level. | WARN | LoggingLevel
+| *serverClosedChannelException CaughtLogLevel* (consumer) | If the server (NettyConsumer) catches an java.nio.channels.ClosedChannelException then its logged using this logging level. This is used to avoid logging the closed channel exceptions, as clients can disconnect abruptly and then cause a flood of closed exceptions in the Netty server. | DEBUG | LoggingLevel
+| *serverExceptionCaughtLogLevel* (consumer) | If the server (NettyConsumer) catches an exception then its logged using this logging level. | WARN | LoggingLevel
 | *serverInitializerFactory* (consumer) | To use a custom ServerInitializerFactory |  | ServerInitializerFactory
 | *usingExecutorService* (consumer) | Whether to use ordered thread pool, to ensure events are processed orderly on the same channel. | true | boolean
 | *connectTimeout* (producer) | Time to wait for a socket connection to be available. Value is in milliseconds. | 10000 | int
@@ -133,7 +133,7 @@ with the following path and query parameters:
 | *producerPoolEnabled* (producer) | Whether producer pool is enabled or not. Important: If you turn this off then a single shared connection is used for the producer, also if you are doing request/reply. That means there is a potential issue with interleaved responses if replies comes back out-of-order. Therefore you need to have a correlation id in both the request and reply messages so you can properly correlate the replies to the Camel callback that is responsible for continue proces [...]
 | *producerPoolMaxActive* (producer) | Sets the cap on the number of objects that can be allocated by the pool (checked out to clients, or idle awaiting checkout) at a given time. Use a negative value for no limit. | -1 | int
 | *producerPoolMaxIdle* (producer) | Sets the cap on the number of idle instances in the pool. | 100 | int
-| *producerPoolMinEvictable Idle* (producer) | Sets the minimum amount of time (value in millis) an object may sit idle in the pool before it is eligible for eviction by the idle object evictor. | 300000 | long
+| *producerPoolMinEvictableIdle* (producer) | Sets the minimum amount of time (value in millis) an object may sit idle in the pool before it is eligible for eviction by the idle object evictor. | 300000 | long
 | *producerPoolMinIdle* (producer) | Sets the minimum number of instances allowed in the producer pool before the evictor thread (if active) spawns new objects. |  | int
 | *udpConnectionlessSending* (producer) | This option supports connection less udp sending which is a real fire and forget. A connected udp send receive the PortUnreachableException if no one is listen on the receiving port. | false | boolean
 | *useByteBuf* (producer) | If the useByteBuf is true, netty producer will turn the message body into ByteBuf before sending it out. | false | boolean
diff --git a/components/camel-nsq/src/main/docs/nsq-component.adoc b/components/camel-nsq/src/main/docs/nsq-component.adoc
index b0060d1..161fb38 100644
--- a/components/camel-nsq/src/main/docs/nsq-component.adoc
+++ b/components/camel-nsq/src/main/docs/nsq-component.adoc
@@ -43,7 +43,7 @@ The NSQ component supports 5 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *servers* (common) | The hostnames of one or more nsqlookupd servers (consumer) or nsqd servers (producer). |  | String
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/components/camel-olingo2/camel-olingo2-component/src/main/docs/olingo2-component.adoc b/components/camel-olingo2/camel-olingo2-component/src/main/docs/olingo2-component.adoc
index d845723..da6dc73 100644
--- a/components/camel-olingo2/camel-olingo2-component/src/main/docs/olingo2-component.adoc
+++ b/components/camel-olingo2/camel-olingo2-component/src/main/docs/olingo2-component.adoc
@@ -56,7 +56,7 @@ The Olingo2 component supports 5 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *configuration* (common) | To use the shared configuration |  | Olingo2Configuration
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/components/camel-olingo4/camel-olingo4-component/src/main/docs/olingo4-component.adoc b/components/camel-olingo4/camel-olingo4-component/src/main/docs/olingo4-component.adoc
index 5ea8c28..e3b70b5 100644
--- a/components/camel-olingo4/camel-olingo4-component/src/main/docs/olingo4-component.adoc
+++ b/components/camel-olingo4/camel-olingo4-component/src/main/docs/olingo4-component.adoc
@@ -57,7 +57,7 @@ The Olingo4 component supports 5 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *configuration* (common) | To use the shared configuration |  | Olingo4Configuration
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/components/camel-pulsar/src/main/docs/pulsar-component.adoc b/components/camel-pulsar/src/main/docs/pulsar-component.adoc
index 9a0dbf8..7065bc7 100644
--- a/components/camel-pulsar/src/main/docs/pulsar-component.adoc
+++ b/components/camel-pulsar/src/main/docs/pulsar-component.adoc
@@ -44,8 +44,8 @@ The Pulsar component supports 7 options, which are listed below.
 | Name | Description | Default | Type
 | *autoConfiguration* (advanced) | The pulsar auto configuration |  | AutoConfiguration
 | *pulsarClient* (advanced) | The pulsar client |  | PulsarClient
-| *allowManual Acknowledgement* (consumer) | Whether to allow manual message acknowledgements. If this option is enabled, then messages are not immediately acknowledged after being consumed. Instead, an instance of PulsarMessageReceipt is stored as a header on the org.apache.camel.Exchange. Messages can then be acknowledged using PulsarMessageReceipt at any time before the ackTimeout occurs. | false | boolean
-| *pulsarMessageReceipt Factory* (consumer) | Provide a factory to create an alternate implementation of PulsarMessageReceipt. |  | PulsarMessageReceiptFactory
+| *allowManualAcknowledgement* (consumer) | Whether to allow manual message acknowledgements. If this option is enabled, then messages are not immediately acknowledged after being consumed. Instead, an instance of PulsarMessageReceipt is stored as a header on the org.apache.camel.Exchange. Messages can then be acknowledged using PulsarMessageReceipt at any time before the ackTimeout occurs. | false | boolean
+| *pulsarMessageReceiptFactory* (consumer) | Provide a factory to create an alternate implementation of PulsarMessageReceipt. |  | PulsarMessageReceiptFactory
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -98,7 +98,7 @@ with the following path and query parameters:
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
 | *batchingEnabled* (producer) | Control whether automatic batching of messages is enabled for the producer. Default is true. | true | boolean
 | *batchingMaxMessages* (producer) | Set the maximum number of messages permitted in a batch. Default 1,000. | 1000 | int
-| *batchingMaxPublishDelay Micros* (producer) | Set the time period within which the messages sent will be batched if batch messages are enabled. If set to a non zero value, messages will be queued until either: this time interval expires the max number of messages in a batch is reached Default is 1ms. | 1000 | long
+| *batchingMaxPublishDelayMicros* (producer) | Set the time period within which the messages sent will be batched if batch messages are enabled. If set to a non zero value, messages will be queued until either: this time interval expires the max number of messages in a batch is reached Default is 1ms. | 1000 | long
 | *blockIfQueueFull* (producer) | Set whether the send and asyncSend operations should block when the outgoing message queue is full. If set to false, send operations will immediately fail with ProducerQueueIsFullError when there is no space left in the pending queue. Default is false. | false | boolean
 | *compressionType* (producer) | Set the compression type for the producer. | NONE | CompressionType
 | *initialSequenceId* (producer) | Set the baseline for the sequence ids for messages published by the producer. First message will be using (initialSequenceId 1) as its sequence id and subsequent messages will be assigned incremental sequence ids, if not otherwise specified. | -1 | long
diff --git a/components/camel-quartz/src/main/docs/quartz-component.adoc b/components/camel-quartz/src/main/docs/quartz-component.adoc
index b4dab5a..151c9a7 100644
--- a/components/camel-quartz/src/main/docs/quartz-component.adoc
+++ b/components/camel-quartz/src/main/docs/quartz-component.adoc
@@ -57,13 +57,13 @@ The Quartz component supports 13 options, which are listed below.
 | Name | Description | Default | Type
 | *autoStartScheduler* (scheduler) | Whether or not the scheduler should be auto started. This options is default true | true | boolean
 | *startDelayedSeconds* (scheduler) | Seconds to wait before starting the quartz scheduler. |  | int
-| *prefixJobNameWith EndpointId* (consumer) | Whether to prefix the quartz job with the endpoint id. This option is default false. | false | boolean
+| *prefixJobNameWithEndpointId* (consumer) | Whether to prefix the quartz job with the endpoint id. This option is default false. | false | boolean
 | *enableJmx* (consumer) | Whether to enable Quartz JMX which allows to manage the Quartz scheduler from JMX. This options is default true | true | boolean
 | *propertiesRef* (consumer) | References to an existing Properties or Map to lookup in the registry to use for configuring quartz. |  | String
 | *properties* (consumer) | Properties to configure the Quartz scheduler. |  | Map
 | *propertiesFile* (consumer) | File name of the properties to load from the classpath |  | String
 | *prefixInstanceName* (consumer) | Whether to prefix the Quartz Scheduler instance name with the CamelContext name. This is enabled by default, to let each CamelContext use its own Quartz scheduler instance by default. You can set this option to false to reuse Quartz scheduler instances between multiple CamelContext's. | true | boolean
-| *interruptJobsOn Shutdown* (scheduler) | Whether to interrupt jobs on shutdown which forces the scheduler to shutdown quicker and attempt to interrupt any running jobs. If this is enabled then any running jobs can fail due to being interrupted. | false | boolean
+| *interruptJobsOnShutdown* (scheduler) | Whether to interrupt jobs on shutdown which forces the scheduler to shutdown quicker and attempt to interrupt any running jobs. If this is enabled then any running jobs can fail due to being interrupted. | false | boolean
 | *schedulerFactory* (advanced) | To use the custom SchedulerFactory which is used to create the Scheduler. |  | SchedulerFactory
 | *scheduler* (advanced) | To use the custom configured Quartz scheduler, instead of creating a new Scheduler. |  | Scheduler
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
@@ -112,7 +112,7 @@ with the following path and query parameters:
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *customCalendar* (advanced) | Specifies a custom calendar to avoid specific range of date |  | Calendar
 | *jobParameters* (advanced) | To configure additional options on the job. |  | Map
-| *prefixJobNameWithEndpoint Id* (advanced) | Whether the job name should be prefixed with endpoint id | false | boolean
+| *prefixJobNameWithEndpointId* (advanced) | Whether the job name should be prefixed with endpoint id | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *triggerParameters* (advanced) | To configure additional options on the trigger. |  | Map
 | *usingFixedCamelContextName* (advanced) | If it is true, JobDataMap uses the CamelContext name directly to reference the CamelContext, if it is false, JobDataMap uses use the CamelContext management name which could be changed during the deploy time. | false | boolean
diff --git a/components/camel-rabbitmq/src/main/docs/rabbitmq-component.adoc b/components/camel-rabbitmq/src/main/docs/rabbitmq-component.adoc
index c142332..b3af8f9 100644
--- a/components/camel-rabbitmq/src/main/docs/rabbitmq-component.adoc
+++ b/components/camel-rabbitmq/src/main/docs/rabbitmq-component.adoc
@@ -66,12 +66,12 @@ The RabbitMQ component supports 52 options, which are listed below.
 | *addresses* (common) | If this option is set, camel-rabbitmq will try to create connection based on the setting of option addresses. The addresses value is a string which looks like server1:12345, server2:12345 |  | String
 | *connectionFactory* (common) | To use a custom RabbitMQ connection factory. When this option is set, all connection options (connectionTimeout, requestedChannelMax...) set on URI are not used |  | ConnectionFactory
 | *threadPoolSize* (consumer) | The consumer uses a Thread Pool Executor with a fixed number of threads. This setting allows you to set that number of threads. | 10 | int
-| *autoDetectConnection Factory* (advanced) | Whether to auto-detect looking up RabbitMQ connection factory from the registry. When enabled and a single instance of the connection factory is found then it will be used. An explicit connection factory can be configured on the component or endpoint level which takes precedence. | true | boolean
+| *autoDetectConnectionFactory* (advanced) | Whether to auto-detect looking up RabbitMQ connection factory from the registry. When enabled and a single instance of the connection factory is found then it will be used. An explicit connection factory can be configured on the component or endpoint level which takes precedence. | true | boolean
 | *connectionTimeout* (advanced) | Connection timeout | 60000 | int
 | *requestedChannelMax* (advanced) | Connection requested channel max (max number of channels offered) | 2047 | int
 | *requestedFrameMax* (advanced) | Connection requested frame max (max size of frame offered) | 0 | int
 | *requestedHeartbeat* (advanced) | Connection requested heartbeat (heart-beat in seconds offered) | 60 | int
-| *automaticRecovery Enabled* (advanced) | Enables connection automatic recovery (uses connection implementation that performs automatic recovery when connection shutdown is not initiated by the application) |  | Boolean
+| *automaticRecoveryEnabled* (advanced) | Enables connection automatic recovery (uses connection implementation that performs automatic recovery when connection shutdown is not initiated by the application) |  | Boolean
 | *networkRecoveryInterval* (advanced) | Network recovery interval in milliseconds (interval used when recovering from network failure) | 5000 | Integer
 | *topologyRecoveryEnabled* (advanced) | Enables connection topology recovery (should topology recovery be performed) |  | Boolean
 | *prefetchEnabled* (consumer) | Enables the quality of service on the RabbitMQConsumer side. You need to specify the option of prefetchSize, prefetchCount, prefetchGlobal at the same time | false | boolean
@@ -81,10 +81,10 @@ The RabbitMQ component supports 52 options, which are listed below.
 | *channelPoolMaxSize* (producer) | Get maximum number of opened channel in pool | 10 | int
 | *channelPoolMaxWait* (producer) | Set the maximum number of milliseconds to wait for a channel from the pool | 1000 | long
 | *requestTimeout* (advanced) | Set timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds) | 20000 | long
-| *requestTimeoutChecker Interval* (advanced) | Set requestTimeoutCheckerInterval for inOut exchange | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Set requestTimeoutCheckerInterval for inOut exchange | 1000 | long
 | *transferException* (advanced) | When true and an inOut Exchange failed on the consumer side send the caused Exception back in the response | false | boolean
-| *publisher Acknowledgements* (producer) | When true, the message will be published with publisher acknowledgements turned on | false | boolean
-| *publisher AcknowledgementsTimeout* (producer) | The amount of time in milliseconds to wait for a basic.ack response from RabbitMQ server |  | long
+| *publisherAcknowledgements* (producer) | When true, the message will be published with publisher acknowledgements turned on | false | boolean
+| *publisherAcknowledgements Timeout* (producer) | The amount of time in milliseconds to wait for a basic.ack response from RabbitMQ server |  | long
 | *guaranteedDeliveries* (producer) | When true, an exception will be thrown when the message cannot be delivered (basic.return) and the message is marked as mandatory. PublisherAcknowledgement will also be activated in this case. See also publisher acknowledgements - When will messages be confirmed. | false | boolean
 | *mandatory* (producer) | This flag tells the server how to react if the message cannot be routed to a queue. If this flag is set, the server will return an unroutable message with a Return method. If this flag is zero, the server silently drops the message. If the header is present rabbitmq.MANDATORY it will override this option. | false | boolean
 | *immediate* (producer) | This flag tells the server how to react if the message cannot be routed to a queue consumer immediately. If this flag is set, the server will return an undeliverable message with a Return method. If this flag is zero, the server will queue the message, but with no guarantee that it will ever be consumed. If the header is present rabbitmq.IMMEDIATE it will override this option. | false | boolean
@@ -190,7 +190,7 @@ with the following path and query parameters:
 | *requestedFrameMax* (advanced) | Connection requested frame max (max size of frame offered) | 0 | int
 | *requestedHeartbeat* (advanced) | Connection requested heartbeat (heart-beat in seconds offered) | 60 | int
 | *requestTimeout* (advanced) | Set timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds) | 20000 | long
-| *requestTimeoutChecker Interval* (advanced) | Set requestTimeoutCheckerInterval for inOut exchange | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Set requestTimeoutCheckerInterval for inOut exchange | 1000 | long
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *topologyRecoveryEnabled* (advanced) | Enables connection topology recovery (should topology recovery be performed) |  | Boolean
 | *transferException* (advanced) | When true and an inOut Exchange failed on the consumer side send the caused Exception back in the response | false | boolean
diff --git a/components/camel-reactive-streams/src/main/docs/reactive-streams-component.adoc b/components/camel-reactive-streams/src/main/docs/reactive-streams-component.adoc
index fa93d83..297d6b9 100644
--- a/components/camel-reactive-streams/src/main/docs/reactive-streams-component.adoc
+++ b/components/camel-reactive-streams/src/main/docs/reactive-streams-component.adoc
@@ -56,7 +56,7 @@ The Reactive Streams component supports 6 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *internalEngine Configuration* (advanced) | Configures the internal engine for Reactive Streams. |  | ReactiveStreamsEngineConfiguration
+| *internalEngineConfiguration* (advanced) | Configures the internal engine for Reactive Streams. |  | ReactiveStreamsEngineConfiguration
 | *backpressureStrategy* (producer) | The backpressure strategy to use when pushing events to a slow subscriber. | BUFFER | ReactiveStreamsBackpressureStrategy
 | *serviceType* (advanced) | Set the type of the underlying reactive streams implementation to use. The implementation is looked up from the registry or using a ServiceLoader, the default implementation is DefaultCamelReactiveStreamsService |  | String
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
diff --git a/components/camel-rest-openapi/src/main/docs/rest-openapi-component.adoc b/components/camel-rest-openapi/src/main/docs/rest-openapi-component.adoc
index a2c8d75..15700dc 100644
--- a/components/camel-rest-openapi/src/main/docs/rest-openapi-component.adoc
+++ b/components/camel-rest-openapi/src/main/docs/rest-openapi-component.adoc
@@ -105,7 +105,7 @@ The REST OpenApi component supports 10 options, which are listed below.
 | *produces* (producer) | What payload type this component is producing. For example application/json according to the RFC7231. This equates to the value of Content-Type HTTP header. If set overrides any value present in the OpenApi specification. Can be overridden in endpoint configuration. |  | String
 | *specificationUri* (producer) | Path to the OpenApi specification file. The scheme, host base path are taken from this specification, but these can be overridden with properties on the component or endpoint level. If not given the component tries to load openapi.json resource. Note that the host defined on the component and endpoint of this Component should contain the scheme, hostname and optionally the port in the URI syntax (i.e. \https://api.example.com:8080). Can be overridden in  [...]
 | *sslContextParameters* (security) | Customize TLS parameters used by the component. If not set defaults to the TLS parameters set in the Camel context |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 |===
diff --git a/components/camel-rest-swagger/src/main/docs/rest-swagger-component.adoc b/components/camel-rest-swagger/src/main/docs/rest-swagger-component.adoc
index dd4cf04..b0e3c04 100644
--- a/components/camel-rest-swagger/src/main/docs/rest-swagger-component.adoc
+++ b/components/camel-rest-swagger/src/main/docs/rest-swagger-component.adoc
@@ -102,7 +102,7 @@ The REST Swagger component supports 10 options, which are listed below.
 | *produces* (producer) | What payload type this component is producing. For example application/json according to the RFC7231. This equates to the value of Content-Type HTTP header. If set overrides any value present in the Swagger specification. Can be overridden in endpoint configuration. |  | String
 | *specificationUri* (producer) | Path to the Swagger specification file. The scheme, host base path are taken from this specification, but these can be overridden with properties on the component or endpoint level. If not given the component tries to load swagger.json resource. Note that the host defined on the component and endpoint of this Component should contain the scheme, hostname and optionally the port in the URI syntax (i.e. \https://api.example.com:8080). Can be overridden in  [...]
 | *sslContextParameters* (security) | Customize TLS parameters used by the component. If not set defaults to the TLS parameters set in the Camel context |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 |===
diff --git a/components/camel-servicenow/camel-servicenow-component/src/main/docs/servicenow-component.adoc b/components/camel-servicenow/camel-servicenow-component/src/main/docs/servicenow-component.adoc
index d71df48..e270e29 100644
--- a/components/camel-servicenow/camel-servicenow-component/src/main/docs/servicenow-component.adoc
+++ b/components/camel-servicenow/camel-servicenow-component/src/main/docs/servicenow-component.adoc
@@ -54,7 +54,7 @@ The ServiceNow component supports 15 options, which are listed below.
 | *proxyPort* (advanced) | The proxy port number |  | Integer
 | *proxyUserName* (security) | Username for proxy authentication |  | String
 | *proxyPassword* (security) | Password for proxy authentication |  | String
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 |===
@@ -118,7 +118,7 @@ with the following path and query parameters:
 | *httpClientPolicy* (advanced) | To configure http-client |  | HTTPClientPolicy
 | *mapper* (advanced) | Sets Jackson's ObjectMapper to use for request/reply |  | ObjectMapper
 | *proxyAuthorizationPolicy* (advanced) | To configure proxy authentication |  | ProxyAuthorizationPolicy
-| *retrieveTargetRecordOn Import* (advanced) | Set this parameter to true to retrieve the target record when using import set api. The import set result is then replaced by the target record | false | Boolean
+| *retrieveTargetRecordOnImport* (advanced) | Set this parameter to true to retrieve the target record when using import set api. The import set result is then replaced by the target record | false | Boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *timeFormat* (advanced) | The time format used for Json serialization/deserialization | HH:mm:ss | String
 | *proxyHost* (proxy) | The proxy host name |  | String
diff --git a/components/camel-servlet/src/main/docs/servlet-component.adoc b/components/camel-servlet/src/main/docs/servlet-component.adoc
index d93ad84..32687cc 100644
--- a/components/camel-servlet/src/main/docs/servlet-component.adoc
+++ b/components/camel-servlet/src/main/docs/servlet-component.adoc
@@ -60,11 +60,11 @@ The Servlet component supports 10 options, which are listed below.
 | Name | Description | Default | Type
 | *servletName* (consumer) | Default name of servlet to use. The default name is CamelServlet. | CamelServlet | String
 | *httpRegistry* (consumer) | To use a custom org.apache.camel.component.servlet.HttpRegistry. |  | HttpRegistry
-| *attachmentMultipart Binding* (consumer) | Whether to automatic bind multipart/form-data as attachments on the Camel Exchange. The options attachmentMultipartBinding=true and disableStreamCache=false cannot work together. Remove disableStreamCache to use AttachmentMultipartBinding. This is turn off by default as this may require servlet specific configuration to enable this when using Servlet's. | false | boolean
+| *attachmentMultipartBinding* (consumer) | Whether to automatic bind multipart/form-data as attachments on the Camel Exchange. The options attachmentMultipartBinding=true and disableStreamCache=false cannot work together. Remove disableStreamCache to use AttachmentMultipartBinding. This is turn off by default as this may require servlet specific configuration to enable this when using Servlet's. | false | boolean
 | *fileNameExtWhitelist* (consumer) | Whitelist of accepted filename extensions for accepting uploaded files. Multiple extensions can be separated by comma, such as txt,xml. |  | String
 | *httpBinding* (advanced) | To use a custom HttpBinding to control the mapping between Camel message and HttpClient. |  | HttpBinding
 | *httpConfiguration* (advanced) | To use the shared HttpConfiguration as base configuration. |  | HttpConfiguration
-| *allowJavaSerialized Object* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
+| *allowJavaSerializedObject* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -117,7 +117,7 @@ with the following path and query parameters:
 | *traceEnabled* (consumer) | Specifies whether to enable HTTP TRACE for this Servlet consumer. By default TRACE is turned off. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *mapHttpMessageBody* (advanced) | If this option is true then IN exchange Body of the exchange will be mapped to HTTP body. Setting this to false will avoid the HTTP mapping. | true | boolean
-| *mapHttpMessageFormUrl EncodedBody* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
+| *mapHttpMessageFormUrlEncoded Body* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
 | *mapHttpMessageHeaders* (advanced) | If this option is true then IN exchange Headers of the exchange will be mapped to HTTP headers. Setting this to false will avoid the HTTP Headers mapping. | true | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 |===
diff --git a/components/camel-sjms/src/main/docs/sjms-batch-component.adoc b/components/camel-sjms/src/main/docs/sjms-batch-component.adoc
index 88df047..29315f6 100644
--- a/components/camel-sjms/src/main/docs/sjms-batch-component.adoc
+++ b/components/camel-sjms/src/main/docs/sjms-batch-component.adoc
@@ -187,7 +187,7 @@ with the following path and query parameters:
 | *messageCreatedStrategy* (advanced) | To use the given MessageCreatedStrategy which are invoked when Camel creates new instances of javax.jms.Message objects when Camel is sending a JMS message. |  | MessageCreatedStrategy
 | *recoveryInterval* (advanced) | Specifies the interval between recovery attempts, i.e. when a connection is being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds. | 5000 | int
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
-| *timeoutCheckerExecutor Service* (advanced) | If using the completionInterval option a background thread is created to trigger the completion interval. Set this option to provide a custom thread pool to be used rather than creating a new thread for every consumer. |  | ScheduledExecutorService
+| *timeoutCheckerExecutorService* (advanced) | If using the completionInterval option a background thread is created to trigger the completion interval. Set this option to provide a custom thread pool to be used rather than creating a new thread for every consumer. |  | ScheduledExecutorService
 |===
 // endpoint options: END
 // spring-boot-auto-configure options: START
diff --git a/components/camel-sjms/src/main/docs/sjms-component.adoc b/components/camel-sjms/src/main/docs/sjms-component.adoc
index 9f797e5..72405ae 100644
--- a/components/camel-sjms/src/main/docs/sjms-component.adoc
+++ b/components/camel-sjms/src/main/docs/sjms-component.adoc
@@ -96,8 +96,8 @@ The Simple JMS component supports 17 options, which are listed below.
 | *connectionResource* (advanced) | A ConnectionResource is an interface that allows for customization and container control of the ConnectionFactory. See Plugable Connection Resource Management for further details. |  | ConnectionResource
 | *connectionCount* (common) | The maximum number of connections available to endpoints started under this component | 1 | Integer
 | *jmsKeyFormatStrategy* (advanced) | Pluggable strategy for encoding and decoding JMS keys so they can be compliant with the JMS specification. Camel provides one implementation out of the box: default. The default strategy will safely marshal dots and hyphens (. and -). Can be used for JMS brokers which do not care whether JMS header keys contain illegal characters. You can provide your own implementation of the org.apache.camel.component.jms.JmsKeyFormatStrategy and refer to it using  [...]
-| *transactionCommit Strategy* (transaction) | To configure which kind of commit strategy to use. Camel provides two implementations out of the box, default and batch. |  | TransactionCommitStrategy
-| *destinationCreation Strategy* (advanced) | To use a custom DestinationCreationStrategy. |  | DestinationCreationStrategy
+| *transactionCommitStrategy* (transaction) | To configure which kind of commit strategy to use. Camel provides two implementations out of the box, default and batch. |  | TransactionCommitStrategy
+| *destinationCreationStrategy* (advanced) | To use a custom DestinationCreationStrategy. |  | DestinationCreationStrategy
 | *timedTaskManager* (advanced) | To use a custom TimedTaskManager |  | TimedTaskManager
 | *messageCreatedStrategy* (advanced) | To use the given MessageCreatedStrategy which are invoked when Camel creates new instances of javax.jms.Message objects when Camel is sending a JMS message. |  | MessageCreatedStrategy
 | *connectionTestOnBorrow* (advanced) | When using the default org.apache.camel.component.sjms.jms.ConnectionFactoryResource then should each javax.jms.Connection be tested (calling start) before returned from the pool. | true | boolean
diff --git a/components/camel-sjms2/src/main/docs/sjms2-component.adoc b/components/camel-sjms2/src/main/docs/sjms2-component.adoc
index 91bd451..168cf04 100644
--- a/components/camel-sjms2/src/main/docs/sjms2-component.adoc
+++ b/components/camel-sjms2/src/main/docs/sjms2-component.adoc
@@ -99,8 +99,8 @@ The Simple JMS2 component supports 17 options, which are listed below.
 | *connectionResource* (advanced) | A ConnectionResource is an interface that allows for customization and container control of the ConnectionFactory. See Plugable Connection Resource Management for further details. |  | ConnectionResource
 | *connectionCount* (common) | The maximum number of connections available to endpoints started under this component | 1 | Integer
 | *jmsKeyFormatStrategy* (advanced) | Pluggable strategy for encoding and decoding JMS keys so they can be compliant with the JMS specification. Camel provides one implementation out of the box: default. The default strategy will safely marshal dots and hyphens (. and -). Can be used for JMS brokers which do not care whether JMS header keys contain illegal characters. You can provide your own implementation of the org.apache.camel.component.jms.JmsKeyFormatStrategy and refer to it using  [...]
-| *transactionCommit Strategy* (transaction) | To configure which kind of commit strategy to use. Camel provides two implementations out of the box, default and batch. |  | TransactionCommitStrategy
-| *destinationCreation Strategy* (advanced) | To use a custom DestinationCreationStrategy. |  | DestinationCreationStrategy
+| *transactionCommitStrategy* (transaction) | To configure which kind of commit strategy to use. Camel provides two implementations out of the box, default and batch. |  | TransactionCommitStrategy
+| *destinationCreationStrategy* (advanced) | To use a custom DestinationCreationStrategy. |  | DestinationCreationStrategy
 | *timedTaskManager* (advanced) | To use a custom TimedTaskManager |  | TimedTaskManager
 | *messageCreatedStrategy* (advanced) | To use the given MessageCreatedStrategy which are invoked when Camel creates new instances of javax.jms.Message objects when Camel is sending a JMS message. |  | MessageCreatedStrategy
 | *connectionTestOnBorrow* (advanced) | When using the default org.apache.camel.component.sjms.jms.ConnectionFactoryResource then should each javax.jms.Connection be tested (calling start) before returned from the pool. | true | boolean
diff --git a/components/camel-solr/src/main/docs/solr-component.adoc b/components/camel-solr/src/main/docs/solr-component.adoc
index 3578bae..64a6443 100644
--- a/components/camel-solr/src/main/docs/solr-component.adoc
+++ b/components/camel-solr/src/main/docs/solr-component.adoc
@@ -78,7 +78,7 @@ with the following path and query parameters:
 | Name | Description | Default | Type
 | *allowCompression* (producer) | Server side must support gzip or deflate for this to have any effect |  | Boolean
 | *connectionTimeout* (producer) | connectionTimeout on the underlying HttpConnectionManager |  | Integer
-| *defaultMaxConnectionsPer Host* (producer) | maxConnectionsPerHost on the underlying HttpConnectionManager |  | Integer
+| *defaultMaxConnectionsPerHost* (producer) | maxConnectionsPerHost on the underlying HttpConnectionManager |  | Integer
 | *followRedirects* (producer) | indicates whether redirects are used to get to the Solr server |  | Boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *maxRetries* (producer) | Maximum number of retries to attempt in the event of transient errors |  | Integer
diff --git a/components/camel-soroush/src/main/docs/soroush-component.adoc b/components/camel-soroush/src/main/docs/soroush-component.adoc
index 2a468c2..bbcd64d 100644
--- a/components/camel-soroush/src/main/docs/soroush-component.adoc
+++ b/components/camel-soroush/src/main/docs/soroush-component.adoc
@@ -110,7 +110,7 @@ with the following path and query parameters:
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *backOffStrategy* (scheduling) | The strategy to backoff in case of connection failure. Currently 3 strategies are supported: 1. Exponential (default): It multiply retryWaitingTime by retryExponentialCoefficient after each connection failure. 2. Linear: It increase retryWaitingTime by retryLinearIncrement after each connection failure. 3. Fixed: Always use retryWaitingTime as the time between retries. | Exponential | String
 | *maxRetryWaitingTime* (scheduling) | Maximum amount of time (in millisecond) a thread wait before retrying failed request. | 3600000 | long
-| *reconnectIdleConnection Timeout* (scheduling) | The timeout in millisecond to reconnect the existing getMessage connection to ensure that the connection is always live and does not dead without notifying the bot. this value should not be changed. | 300000 | long
+| *reconnectIdleConnectionTimeout* (scheduling) | The timeout in millisecond to reconnect the existing getMessage connection to ensure that the connection is always live and does not dead without notifying the bot. this value should not be changed. | 300000 | long
 | *retryExponentialCoefficient* (scheduling) | Coefficient to compute back off time when using Exponential Back Off strategy | 2 | long
 | *retryLinearIncrement* (scheduling) | The amount of time (in millisecond) which adds to waiting time when using Linear back off strategy | 10000 | long
 | *retryWaitingTime* (scheduling) | Waiting time before retry failed request (Millisecond). If backOffStrategy is not Fixed this is the based value for computing back off waiting time. the first retry is always happen immediately after failure and retryWaitingTime do not apply to the first retry. | 1000 | long
diff --git a/components/camel-splunk/src/main/docs/splunk-component.adoc b/components/camel-splunk/src/main/docs/splunk-component.adoc
index 8d33108..d8042de 100644
--- a/components/camel-splunk/src/main/docs/splunk-component.adoc
+++ b/components/camel-splunk/src/main/docs/splunk-component.adoc
@@ -98,7 +98,7 @@ The Splunk component supports 4 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *splunkConfiguration Factory* (advanced) | To use the SplunkConfigurationFactory |  | SplunkConfigurationFactory
+| *splunkConfigurationFactory* (advanced) | To use the SplunkConfigurationFactory |  | SplunkConfigurationFactory
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/components/camel-spring-ws/src/main/docs/spring-ws-component.adoc b/components/camel-spring-ws/src/main/docs/spring-ws-component.adoc
index b888c97..adbf34a 100644
--- a/components/camel-spring-ws/src/main/docs/spring-ws-component.adoc
+++ b/components/camel-spring-ws/src/main/docs/spring-ws-component.adoc
@@ -95,7 +95,7 @@ The Spring WebService component supports 4 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/components/camel-stomp/src/main/docs/stomp-component.adoc b/components/camel-stomp/src/main/docs/stomp-component.adoc
index acc471a..9a52a71 100644
--- a/components/camel-stomp/src/main/docs/stomp-component.adoc
+++ b/components/camel-stomp/src/main/docs/stomp-component.adoc
@@ -54,7 +54,7 @@ The Stomp component supports 10 options, which are listed below.
 | *login* (security) | The username |  | String
 | *passcode* (security) | The password |  | String
 | *host* (common) | The virtual host |  | String
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
diff --git a/components/camel-undertow/src/main/docs/undertow-component.adoc b/components/camel-undertow/src/main/docs/undertow-component.adoc
index 4c848c6..31ffb03 100644
--- a/components/camel-undertow/src/main/docs/undertow-component.adoc
+++ b/components/camel-undertow/src/main/docs/undertow-component.adoc
@@ -56,7 +56,7 @@ The Undertow component supports 8 options, which are listed below.
 | Name | Description | Default | Type
 | *undertowHttpBinding* (advanced) | To use a custom HttpBinding to control the mapping between Camel message and HttpClient. |  | UndertowHttpBinding
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *hostOptions* (advanced) | To configure common options, such as thread pools |  | UndertowHostOptions
 | *muteException* (consumer) | If enabled and an Exchange failed processing on the consumer side the response's body won't contain the exception's stack trace. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
diff --git a/components/camel-weather/src/main/docs/weather-component.adoc b/components/camel-weather/src/main/docs/weather-component.adoc
index 212a386..13d2eb6 100644
--- a/components/camel-weather/src/main/docs/weather-component.adoc
+++ b/components/camel-weather/src/main/docs/weather-component.adoc
@@ -60,7 +60,7 @@ The Weather component supports 5 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *geolocationAccessKey* (common) | The geolocation service now needs an accessKey to be used |  | String
-| *geolocationRequestHost IP* (common) | The geolocation service now needs to specify the IP associated to the accessKey you're using |  | String
+| *geolocationRequestHostIP* (common) | The geolocation service now needs to specify the IP associated to the accessKey you're using |  | String
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/components/camel-websocket/src/main/docs/websocket-component.adoc b/components/camel-websocket/src/main/docs/websocket-component.adoc
index 26af3c6..3b75c85 100644
--- a/components/camel-websocket/src/main/docs/websocket-component.adoc
+++ b/components/camel-websocket/src/main/docs/websocket-component.adoc
@@ -50,7 +50,7 @@ The Jetty Websocket component supports 16 options, which are listed below.
 | *maxThreads* (advanced) | To set a value for maximum number of threads in server thread pool. MaxThreads/minThreads or threadPool fields are required due to switch to Jetty9. The default values for maxThreads is 1 2 noCores. |  | Integer
 | *threadPool* (advanced) | To use a custom thread pool for the server. MaxThreads/minThreads or threadPool fields are required due to switch to Jetty9. |  | ThreadPool
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *socketFactory* (common) | To configure a map which contains custom WebSocketFactory for sub protocols. The key in the map is the sub protocol. The default key is reserved for the default implementation. |  | Map
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
diff --git a/components/camel-xj/src/main/docs/xj-component.adoc b/components/camel-xj/src/main/docs/xj-component.adoc
index 44dc958..62a8c20 100644
--- a/components/camel-xj/src/main/docs/xj-component.adoc
+++ b/components/camel-xj/src/main/docs/xj-component.adoc
@@ -55,7 +55,7 @@ The XJ component supports 10 options, which are listed below.
 | Name | Description | Default | Type
 | *saxonExtensionFunctions* (advanced) | Allows you to use a custom net.sf.saxon.lib.ExtensionFunctionDefinition. You would need to add camel-saxon to the classpath. The function is looked up in the registry, where you can comma to separate multiple values to lookup. |  | String
 | *saxonConfiguration* (advanced) | To use a custom Saxon configuration |  | Configuration
-| *saxonConfiguration Properties* (advanced) | To set custom Saxon configuration properties |  | Map
+| *saxonConfigurationProperties* (advanced) | To set custom Saxon configuration properties |  | Map
 | *uriResolverFactory* (advanced) | To use a custom UriResolver which depends on a dynamic endpoint resource URI. Should not be used together with the option 'uriResolver'. |  | XsltUriResolverFactory
 | *uriResolver* (advanced) | To use a custom UriResolver. Should not be used together with the option 'uriResolverFactory'. |  | URIResolver
 | *contentCache* (producer) | Cache for the resource content (the stylesheet file) when it is loaded. If set to false Camel will reload the stylesheet file on each message processing. This is good for development. A cached stylesheet can be forced to reload at runtime via JMX using the clearCachedStylesheet operation. | true | boolean
diff --git a/components/camel-xmlsecurity/src/main/docs/xmlsecurity-component.adoc b/components/camel-xmlsecurity/src/main/docs/xmlsecurity-component.adoc
index c8294a6..7494810 100644
--- a/components/camel-xmlsecurity/src/main/docs/xmlsecurity-component.adoc
+++ b/components/camel-xmlsecurity/src/main/docs/xmlsecurity-component.adoc
@@ -300,7 +300,7 @@ with the following path and query parameters:
 | *parentXpath* (sign) | Sets the XPath to find the parent node in the enveloped case. Either you specify the parent node via this method or the local name and namespace of the parent with the methods setParentLocalName(String) and setParentNamespace(String). Default value is null. The value must be null for enveloping and detached XML signature. If the parameters parentXpath and parentLocalName are specified in the same configuration then an exception is thrown. |  | XPathFilterParameterSpec
 | *plainText* (sign) | Indicator whether the message body contains plain text. The default value is false, indicating that the message body contains XML. The value can be overwritten by the header XmlSignatureConstants#HEADER_MESSAGE_IS_PLAIN_TEXT. | false | Boolean
 | *plainTextEncoding* (sign) | Encoding of the plain text. Only relevant if the message body is plain text (see parameter plainText. Default value is UTF-8. | UTF-8 | String
-| *prefixForXmlSignature Namespace* (sign) | Namespace prefix for the XML signature namespace \http://www.w3.org/2000/09/xmldsig#. Default value is ds. If null or an empty value is set then no prefix is used for the XML signature namespace. See best practice \http://www.w3.org/TR/xmldsig-bestpractices/#signing-xml- without-namespaces | ds | String
+| *prefixForXmlSignatureNamespace* (sign) | Namespace prefix for the XML signature namespace \http://www.w3.org/2000/09/xmldsig#. Default value is ds. If null or an empty value is set then no prefix is used for the XML signature namespace. See best practice \http://www.w3.org/TR/xmldsig-bestpractices/#signing-xml- without-namespaces | ds | String
 | *properties* (sign) | For adding additional References and Objects to the XML signature which contain additional properties, you can provide a bean which implements the XmlSignatureProperties interface. |  | XmlSignatureProperties
 | *signatureAlgorithm* (sign) | Signature algorithm. Default value is \http://www.w3.org/2000/09/xmldsig#rsa-sha1. | http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 | String
 | *signatureId* (sign) | Sets the signature Id. If this parameter is not set (null value) then a unique ID is generated for the signature ID (default). If this parameter is set to (empty string) then no Id attribute is created in the signature element. |  | String
diff --git a/components/camel-xslt-saxon/src/main/docs/xslt-saxon-component.adoc b/components/camel-xslt-saxon/src/main/docs/xslt-saxon-component.adoc
index 8905c46..0f73db0 100644
--- a/components/camel-xslt-saxon/src/main/docs/xslt-saxon-component.adoc
+++ b/components/camel-xslt-saxon/src/main/docs/xslt-saxon-component.adoc
@@ -48,7 +48,7 @@ The XSLT Saxon component supports 10 options, which are listed below.
 | Name | Description | Default | Type
 | *saxonExtensionFunctions* (advanced) | Allows you to use a custom net.sf.saxon.lib.ExtensionFunctionDefinition. You would need to add camel-saxon to the classpath. The function is looked up in the registry, where you can comma to separate multiple values to lookup. |  | String
 | *saxonConfiguration* (advanced) | To use a custom Saxon configuration |  | Configuration
-| *saxonConfiguration Properties* (advanced) | To set custom Saxon configuration properties |  | Map
+| *saxonConfigurationProperties* (advanced) | To set custom Saxon configuration properties |  | Map
 | *uriResolverFactory* (advanced) | To use a custom UriResolver which depends on a dynamic endpoint resource URI. Should not be used together with the option 'uriResolver'. |  | XsltUriResolverFactory
 | *uriResolver* (advanced) | To use a custom UriResolver. Should not be used together with the option 'uriResolverFactory'. |  | URIResolver
 | *contentCache* (producer) | Cache for the resource content (the stylesheet file) when it is loaded. If set to false Camel will reload the stylesheet file on each message processing. This is good for development. A cached stylesheet can be forced to reload at runtime via JMX using the clearCachedStylesheet operation. | true | boolean
diff --git a/components/camel-zookeeper-master/src/main/docs/zookeeper-master-component.adoc b/components/camel-zookeeper-master/src/main/docs/zookeeper-master-component.adoc
index d88bbe6..71a6c36 100644
--- a/components/camel-zookeeper-master/src/main/docs/zookeeper-master-component.adoc
+++ b/components/camel-zookeeper-master/src/main/docs/zookeeper-master-component.adoc
@@ -48,7 +48,7 @@ The ZooKeeper Master component supports 8 options, which are listed below.
 | *containerIdFactory* (consumer) | To use a custom ContainerIdFactory for creating container ids. |  | ContainerIdFactory
 | *zkRoot* (consumer) | The root path to use in zookeeper where information is stored which nodes are master/slave etc. Will by default use: /camel/zookeepermaster/clusters/master | /camel/zookeepermaster/clusters/master | String
 | *curator* (advanced) | To use a custom configured CuratorFramework as connection to zookeeper ensemble. |  | CuratorFramework
-| *maximumConnection Timeout* (consumer) | Timeout in millis to use when connecting to the zookeeper ensemble | 10000 | int
+| *maximumConnectionTimeout* (consumer) | Timeout in millis to use when connecting to the zookeeper ensemble | 10000 | int
 | *zooKeeperUrl* (consumer) | The url for the zookeeper ensemble | localhost:2181 | String
 | *zooKeeperPassword* (security) | The password to use when connecting to the zookeeper ensemble |  | String
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
index 7954196..a8fff09 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
@@ -2648,13 +2648,7 @@ public interface EndpointBuilderFactory {
      * Since: 2.23
      * Maven coordinates: org.apache.camel:camel-ipfs
      *
-     * Syntax: <code>ipfs:ipfsHost:ipfsPort/ipfsCmd</code>
-     *
-     * Path parameter: ipfsHost (required)
-     * The ipfs host
-     *
-     * Path parameter: ipfsPort (required)
-     * The ipfs port
+     * Syntax: <code>ipfs:ipfsCmd</code>
      *
      * Path parameter: ipfsCmd (required)
      * The ipfs command
@@ -2971,9 +2965,10 @@ public interface EndpointBuilderFactory {
      *
      * Syntax: <code>websocket-jsr356:websocketPathOrUri</code>
      *
-     * Path parameter: websocketPathOrUri
-     * If a path (/foo) it will deploy locally the endpoint, if an uri it will
-     * connect to the corresponding server
+     * Path parameter: uri
+     * If a schemeless URI path is provided, a ServerEndpoint is deployed under
+     * that path. Else if the URI is prefixed with the 'ws://' scheme, then a
+     * connection is established to the corresponding server
      */
     default org.apache.camel.builder.endpoint.dsl.JSR356WebSocketEndpointBuilderFactory.JSR356WebSocketEndpointBuilder websocketJsr356(String path) {
         return org.apache.camel.builder.endpoint.dsl.JSR356WebSocketEndpointBuilderFactory.websocketJsr356(path);
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilders.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
index 2645359..a90950a 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
@@ -2632,13 +2632,7 @@ public interface EndpointBuilders {
      * Since: 2.23
      * Maven coordinates: org.apache.camel:camel-ipfs
      *
-     * Syntax: <code>ipfs:ipfsHost:ipfsPort/ipfsCmd</code>
-     *
-     * Path parameter: ipfsHost (required)
-     * The ipfs host
-     *
-     * Path parameter: ipfsPort (required)
-     * The ipfs port
+     * Syntax: <code>ipfs:ipfsCmd</code>
      *
      * Path parameter: ipfsCmd (required)
      * The ipfs command
@@ -2955,9 +2949,10 @@ public interface EndpointBuilders {
      *
      * Syntax: <code>websocket-jsr356:websocketPathOrUri</code>
      *
-     * Path parameter: websocketPathOrUri
-     * If a path (/foo) it will deploy locally the endpoint, if an uri it will
-     * connect to the corresponding server
+     * Path parameter: uri
+     * If a schemeless URI path is provided, a ServerEndpoint is deployed under
+     * that path. Else if the URI is prefixed with the 'ws://' scheme, then a
+     * connection is established to the corresponding server
      */
     static org.apache.camel.builder.endpoint.dsl.JSR356WebSocketEndpointBuilderFactory.JSR356WebSocketEndpointBuilder websocketJsr356(String path) {
         return org.apache.camel.builder.endpoint.dsl.JSR356WebSocketEndpointBuilderFactory.websocketJsr356(path);
diff --git a/docs/components/modules/ROOT/pages/activemq-component.adoc b/docs/components/modules/ROOT/pages/activemq-component.adoc
index 5d0ee31..2ec56f8 100644
--- a/docs/components/modules/ROOT/pages/activemq-component.adoc
+++ b/docs/components/modules/ROOT/pages/activemq-component.adoc
@@ -61,13 +61,13 @@ The ActiveMQ component supports 88 options, which are listed below.
 | *usePooledConnection* (common) | Enables or disables whether a PooledConnectionFactory will be used so that when messages are sent to ActiveMQ from outside of a message consuming thread, pooling will be used rather than the default with the Spring JmsTemplate which will create a new connection, session, producer for each message then close them all down again. The default value is true. | false | boolean
 | *useSingleConnection* (common) | Enables or disables whether a Spring SingleConnectionFactory will be used so that when messages are sent to ActiveMQ from outside of a message consuming thread, pooling will be used rather than the default with the Spring JmsTemplate which will create a new connection, session, producer for each message then close them all down again. The default value is false and a pooled connection is used by default. | false | boolean
 | *configuration* (common) | Configuration of ActiveMQ |  | JmsConfiguration
-| *allowAutoWired ConnectionFactory* (advanced) | Whether to auto-discover ConnectionFactory from the registry, if no connection factory has been configured. If only one instance of ConnectionFactory is found then it will be used. This is enabled by default. | false | boolean
-| *allowAutoWired DestinationResolver* (advanced) | Whether to auto-discover DestinationResolver from the registry, if no destination resolver has been configured. If only one instance of DestinationResolver is found then it will be used. This is enabled by default. | false | boolean
-| *acceptMessagesWhile Stopping* (consumer) | Specifies whether the consumer accept messages while it is stopping. You may consider enabling this option, if you start and stop JMS routes at runtime, while there are still messages enqueued on the queue. If this option is false, and you stop the JMS route, then messages may be rejected, and the JMS broker would have to attempt redeliveries, which yet again may be rejected, and eventually the message may be moved at a dead letter queue on t [...]
-| *allowReplyManagerQuick Stop* (consumer) | Whether the DefaultMessageListenerContainer used in the reply managers for request-reply messaging allow the DefaultMessageListenerContainer.runningAllowed flag to quick stop in case JmsConfiguration#isAcceptMessagesWhileStopping is enabled, and org.apache.camel.CamelContext is currently being stopped. This quick stop ability is enabled by default in the regular JMS consumers but to enable for reply managers you must enable this flag. | false  [...]
+| *allowAutoWiredConnection Factory* (advanced) | Whether to auto-discover ConnectionFactory from the registry, if no connection factory has been configured. If only one instance of ConnectionFactory is found then it will be used. This is enabled by default. | false | boolean
+| *allowAutoWiredDestination Resolver* (advanced) | Whether to auto-discover DestinationResolver from the registry, if no destination resolver has been configured. If only one instance of DestinationResolver is found then it will be used. This is enabled by default. | false | boolean
+| *acceptMessagesWhileStopping* (consumer) | Specifies whether the consumer accept messages while it is stopping. You may consider enabling this option, if you start and stop JMS routes at runtime, while there are still messages enqueued on the queue. If this option is false, and you stop the JMS route, then messages may be rejected, and the JMS broker would have to attempt redeliveries, which yet again may be rejected, and eventually the message may be moved at a dead letter queue on th [...]
+| *allowReplyManagerQuickStop* (consumer) | Whether the DefaultMessageListenerContainer used in the reply managers for request-reply messaging allow the DefaultMessageListenerContainer.runningAllowed flag to quick stop in case JmsConfiguration#isAcceptMessagesWhileStopping is enabled, and org.apache.camel.CamelContext is currently being stopped. This quick stop ability is enabled by default in the regular JMS consumers but to enable for reply managers you must enable this flag. | false | [...]
 | *acknowledgementMode* (consumer) | The JMS acknowledgement mode defined as an Integer. Allows you to set vendor-specific extensions to the acknowledgment mode. For the regular modes, it is preferable to use the acknowledgementModeName instead. |  | int
 | *eagerPoisonBody* (consumer) | If eagerLoadingOfProperties is enabled and the JMS message payload (JMS body or JMS properties) (cannot be read/mapped), then set this text as the message body instead so the message can be processed (the cause of the poison are already stored as exception on the Exchange). This can be turned off by setting eagerPoisonBody=false. See also the option eagerLoadingOfProperties. | Poison JMS message due to ${exception.message} | String
-| *eagerLoadingOf Properties* (consumer) | Enables eager loading of JMS properties as soon as a message is loaded which generally is inefficient as the JMS properties may not be required but sometimes can catch early any issues with the underlying JMS provider and the use of JMS properties. See also the option eagerLoadingOfBody. | false | boolean
+| *eagerLoadingOfProperties* (consumer) | Enables eager loading of JMS properties as soon as a message is loaded which generally is inefficient as the JMS properties may not be required but sometimes can catch early any issues with the underlying JMS provider and the use of JMS properties. See also the option eagerLoadingOfBody. | false | boolean
 | *acknowledgementModeName* (consumer) | The JMS acknowledgement name, which is one of: SESSION_TRANSACTED, CLIENT_ACKNOWLEDGE, AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE | AUTO_ACKNOWLEDGE | String
 | *autoStartup* (consumer) | Specifies whether the consumer container should auto-startup. | true | boolean
 | *cacheLevel* (consumer) | Sets the cache level by ID for the underlying JMS resources. See cacheLevelName option for more details. |  | int
@@ -75,7 +75,7 @@ The ActiveMQ component supports 88 options, which are listed below.
 | *replyToCacheLevelName* (producer) | Sets the cache level by name for the reply consumer when doing request/reply over JMS. This option only applies when using fixed reply queues (not temporary). Camel will by default use: CACHE_CONSUMER for exclusive or shared w/ replyToSelectorName. And CACHE_SESSION for shared without replyToSelectorName. Some JMS brokers such as IBM WebSphere may require to set the replyToCacheLevelName=CACHE_NONE to work. Note: If using temporary queues then CACHE [...]
 | *clientId* (common) | Sets the JMS client ID to use. Note that this value, if specified, must be unique and can only be used by a single JMS connection instance. It is typically only required for durable topic subscriptions. If using Apache ActiveMQ you may prefer to use Virtual Topics instead. |  | String
 | *concurrentConsumers* (consumer) | Specifies the default number of concurrent consumers when consuming from JMS (not for request/reply over JMS). See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. When doing request/reply over JMS then the option replyToConcurrentConsumers is used to control number of concurrent consumers on the reply message listener. | 1 | int
-| *replyToConcurrent Consumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
+| *replyToConcurrentConsumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
 | *connectionFactory* (common) | The connection factory to be use. A connection factory must be configured either on the component or endpoint. |  | ConnectionFactory
 | *username* (security) | Username to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *password* (security) | Password to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
@@ -84,22 +84,22 @@ The ActiveMQ component supports 88 options, which are listed below.
 | *durableSubscriptionName* (common) | The durable subscriber name for specifying durable topic subscriptions. The clientId option must be configured as well. |  | String
 | *exceptionListener* (advanced) | Specifies the JMS Exception Listener that is to be notified of any underlying JMS exceptions. |  | ExceptionListener
 | *errorHandler* (advanced) | Specifies a org.springframework.util.ErrorHandler to be invoked in case of any uncaught exceptions thrown while processing a Message. By default these exceptions will be logged at the WARN level, if no errorHandler has been configured. You can configure logging level and whether stack traces should be logged using errorHandlerLoggingLevel and errorHandlerLogStackTrace options. This makes it much easier to configure, than having to code a custom errorHandler. [...]
-| *errorHandlerLogging Level* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
-| *errorHandlerLogStack Trace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
+| *errorHandlerLoggingLevel* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
+| *errorHandlerLogStackTrace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
 | *explicitQosEnabled* (producer) | Set if the deliveryMode, priority or timeToLive qualities of service should be used when sending messages. This option is based on Spring's JmsTemplate. The deliveryMode, priority and timeToLive options are applied to the current endpoint. This contrasts with the preserveMessageQos option, which operates at message granularity, reading QoS properties exclusively from the Camel In message headers. | false | boolean
 | *exposeListenerSession* (consumer) | Specifies whether the listener session should be exposed when consuming messages. | false | boolean
 | *idleTaskExecutionLimit* (advanced) | Specifies the limit for idle executions of a receive task, not having received any message within its execution. If this limit is reached, the task will shut down and leave receiving to other executing tasks (in the case of dynamic scheduling; see the maxConcurrentConsumers setting). There is additional doc available from Spring. | 1 | int
 | *idleConsumerLimit* (advanced) | Specify the limit for the number of consumers that are allowed to be idle at any given time. | 1 | int
 | *maxConcurrentConsumers* (consumer) | Specifies the maximum number of concurrent consumers when consuming from JMS (not for request/reply over JMS). See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. When doing request/reply over JMS then the option replyToMaxConcurrentConsumers is used to control number of concurrent consumers on the reply message listener. |  | int
-| *replyToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
-| *replyOnTimeoutToMax ConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
+| *replyToMaxConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
+| *replyOnTimeoutToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
 | *maxMessagesPerTask* (advanced) | The number of messages per task. -1 is unlimited. If you use a range for concurrent consumers (eg min max), then this option can be used to set a value to eg 100 to control how fast the consumers will shrink when less work is required. | -1 | int
 | *messageConverter* (advanced) | To use a custom Spring org.springframework.jms.support.converter.MessageConverter so you can be in control how to map to/from a javax.jms.Message. |  | MessageConverter
 | *mapJmsMessage* (advanced) | Specifies whether Camel should auto map the received JMS message to a suited payload type, such as javax.jms.TextMessage to a String etc. See section about how mapping works below for more details. | true | boolean
 | *messageIdEnabled* (advanced) | When sending, specifies whether message IDs should be added. This is just an hint to the JMS Broker. If the JMS provider accepts this hint, these messages must have the message ID set to null; if the provider ignores the hint, the message ID must be set to its normal unique value. | true | boolean
 | *messageTimestampEnabled* (advanced) | Specifies whether timestamps should be enabled by default on sending messages. This is just an hint to the JMS broker. If the JMS provider accepts this hint, these messages must have the timestamp set to zero; if the provider ignores the hint the timestamp must be set to its normal value. | true | boolean
 | *alwaysCopyMessage* (producer) | If true, Camel will always make a JMS message copy of the message when it is passed to the producer for sending. Copying the message is needed in some situations, such as when a replyToDestinationSelectorName is set (incidentally, Camel will set the alwaysCopyMessage option to true, if a replyToDestinationSelectorName is set). | false | boolean
-| *useMessageIDAs CorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
+| *useMessageIDAsCorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
 | *priority* (producer) | Values greater than 1 specify the message priority when sending (where 0 is the lowest priority and 9 is the highest). The explicitQosEnabled option must also be enabled in order for this option to have any effect. | 4 | int
 | *pubSubNoLocal* (advanced) | Specifies whether to inhibit the delivery of messages published by its own connection. | false | boolean
 | *receiveTimeout* (advanced) | The timeout for receiving messages (in milliseconds). | 1000 | long
@@ -107,16 +107,16 @@ The ActiveMQ component supports 88 options, which are listed below.
 | *taskExecutor* (consumer) | Allows you to specify a custom task executor for consuming messages. |  | TaskExecutor
 | *timeToLive* (producer) | When sending messages, specifies the time-to-live of the message (in milliseconds). | -1 | long
 | *transacted* (transaction) | Specifies whether to use transacted mode | false | boolean
-| *lazyCreateTransaction Manager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
+| *lazyCreateTransactionManager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
 | *transactionManager* (transaction) | The Spring transaction manager to use. |  | PlatformTransactionManager
 | *transactionName* (transaction) | The name of the transaction to use. |  | String
 | *transactionTimeout* (transaction) | The timeout value of the transaction (in seconds), if using transacted mode. | -1 | int
-| *testConnectionOn Startup* (common) | Specifies whether to test the connection on startup. This ensures that when Camel starts that all the JMS consumers have a valid connection to the JMS broker. If a connection cannot be granted then Camel throws an exception on startup. This ensures that Camel is not started with failed connections. The JMS producers is tested as well. | false | boolean
+| *testConnectionOnStartup* (common) | Specifies whether to test the connection on startup. This ensures that when Camel starts that all the JMS consumers have a valid connection to the JMS broker. If a connection cannot be granted then Camel throws an exception on startup. This ensures that Camel is not started with failed connections. The JMS producers is tested as well. | false | boolean
 | *asyncStartListener* (advanced) | Whether to startup the JmsConsumer message listener asynchronously, when starting a route. For example if a JmsConsumer cannot get a connection to a remote JMS broker, then it may block while retrying and/or failover. This will cause Camel to block while starting routes. By setting this option to true, you will let routes startup, while the JmsConsumer connects to the JMS broker using a dedicated thread in asynchronous mode. If this option is used, the [...]
 | *asyncStopListener* (advanced) | Whether to stop the JmsConsumer message listener asynchronously, when stopping a route. | false | boolean
-| *forceSendOriginal Message* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
+| *forceSendOriginalMessage* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
 | *requestTimeout* (producer) | The timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds). The default is 20 seconds. You can include the header CamelJmsRequestTimeout to override this endpoint configured timeout value, and thus have per message individual timeout values. See also the requestTimeoutCheckerInterval option. | 20000 | long
-| *requestTimeoutChecker Interval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
 | *transferExchange* (advanced) | You can transfer the exchange over the wire instead of just the body and headers. The following fields are transferred: In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. You must enable this option on both the producer and consumer side, so Camel knows the payloads is an E [...]
 | *transferException* (advanced) | If enabled and you are using Request Reply messaging (InOut) and an Exchange failed on the consumer side, then the caused Exception will be send back in response as a javax.jms.ObjectMessage. If the client is Camel, the returned Exception is rethrown. This allows you to use Camel JMS as a bridge in your routing - for example, using persistent queues to enable robust routing. Notice that if you also have transferExchange enabled, this option takes preced [...]
 | *jmsOperations* (advanced) | Allows you to use your own implementation of the org.springframework.jms.core.JmsOperations interface. Camel uses JmsTemplate as default. Can be used for testing purpose, but not used much as stated in the spring API docs. |  | JmsOperations
@@ -125,21 +125,21 @@ The ActiveMQ component supports 88 options, which are listed below.
 | *preserveMessageQos* (producer) | Set to true, if you want to send message using the QoS settings specified on the message, instead of the QoS settings on the JMS endpoint. The following three headers are considered JMSPriority, JMSDeliveryMode, and JMSExpiration. You can provide all or only some of them. If not provided, Camel will fall back to use the values from the endpoint instead. So, when using this option, the headers override the values from the endpoint. The explicitQosEnable [...]
 | *asyncConsumer* (consumer) | Whether the JmsConsumer processes the Exchange asynchronously. If enabled then the JmsConsumer may pickup the next message from the JMS queue, while the previous message is being processed asynchronously (by the Asynchronous Routing Engine). This means that messages may be processed not 100% strictly in order. If disabled (as default) then the Exchange is fully processed before the JmsConsumer will pickup the next message from the JMS queue. Note if transac [...]
 | *allowNullBody* (producer) | Whether to allow sending messages with no body. If this option is false and the message body is null, then an JMSException is thrown. | true | boolean
-| *includeSentJMS MessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
-| *includeAllJMSX Properties* (advanced) | Whether to include all JMSXxxx properties when mapping from JMS to Camel Message. Setting this to true will include properties such as JMSXAppID, and JMSXUserID etc. Note: If you are using a custom headerFilterStrategy then this option does not apply. | false | boolean
-| *defaultTaskExecutor Type* (consumer) | Specifies what default TaskExecutor type to use in the DefaultMessageListenerContainer, for both consumer endpoints and the ReplyTo consumer of producer endpoints. Possible values: SimpleAsync (uses Spring's SimpleAsyncTaskExecutor) or ThreadPool (uses Spring's ThreadPoolTaskExecutor with optimal values - cached threadpool-like). If not set, it defaults to the previous behaviour, which uses a cached thread pool for consumer endpoints and SimpleAs [...]
+| *includeSentJMSMessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
+| *includeAllJMSXProperties* (advanced) | Whether to include all JMSXxxx properties when mapping from JMS to Camel Message. Setting this to true will include properties such as JMSXAppID, and JMSXUserID etc. Note: If you are using a custom headerFilterStrategy then this option does not apply. | false | boolean
+| *defaultTaskExecutorType* (consumer) | Specifies what default TaskExecutor type to use in the DefaultMessageListenerContainer, for both consumer endpoints and the ReplyTo consumer of producer endpoints. Possible values: SimpleAsync (uses Spring's SimpleAsyncTaskExecutor) or ThreadPool (uses Spring's ThreadPoolTaskExecutor with optimal values - cached threadpool-like). If not set, it defaults to the previous behaviour, which uses a cached thread pool for consumer endpoints and SimpleAsy [...]
 | *jmsKeyFormatStrategy* (advanced) | Pluggable strategy for encoding and decoding JMS keys so they can be compliant with the JMS specification. Camel provides two implementations out of the box: default and passthrough. The default strategy will safely marshal dots and hyphens (. and -). The passthrough strategy leaves the key as is. Can be used for JMS brokers which do not care whether JMS header keys contain illegal characters. You can provide your own implementation of the org.apache [...]
 | *allowAdditionalHeaders* (producer) | This option is used to allow additional headers which may have values that are invalid according to JMS specification. For example some message systems such as WMQ do this with header names using prefix JMS_IBM_MQMD_ containing values with byte array or other invalid types. You can specify multiple header names separated by comma, and use as suffix for wildcard matching. |  | String
 | *queueBrowseStrategy* (advanced) | To use a custom QueueBrowseStrategy when browsing queues |  | QueueBrowseStrategy
 | *messageCreatedStrategy* (advanced) | To use the given MessageCreatedStrategy which are invoked when Camel creates new instances of javax.jms.Message objects when Camel is sending a JMS message. |  | MessageCreatedStrategy
-| *waitForProvision CorrelationToBeUpdated Counter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
-| *waitForProvision CorrelationToBeUpdated ThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
+| *waitForProvisionCorrelationTo BeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
+| *waitForProvisionCorrelationTo BeUpdatedThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
 | *correlationProperty* (producer) | Use this JMS property to correlate messages in InOut exchange pattern (request-reply) instead of JMSCorrelationID property. This allows you to exchange messages with systems that do not correlate messages using JMSCorrelationID JMS property. If used JMSCorrelationID will not be used or set by Camel. The value of here named property will be generated if not supplied in the header of the message under the same name. |  | String
 | *subscriptionDurable* (consumer) | Set whether to make the subscription durable. The durable subscription name to be used can be specified through the subscriptionName property. Default is false. Set this to true to register a durable subscription, typically in combination with a subscriptionName value (unless your message listener class name is good enough as subscription name). Only makes sense when listening to a topic (pub-sub domain), therefore this method switches the pubSubDomai [...]
 | *subscriptionShared* (consumer) | Set whether to make the subscription shared. The shared subscription name to be used can be specified through the subscriptionName property. Default is false. Set this to true to register a shared subscription, typically in combination with a subscriptionName value (unless your message listener class name is good enough as subscription name). Note that shared subscriptions may also be durable, so this flag can (and often will) be combined with subscrip [...]
 | *subscriptionName* (consumer) | Set the name of a subscription to create. To be applied in case of a topic (pub-sub domain) with a shared or durable subscription. The subscription name needs to be unique within this client's JMS client id. Default is the class name of the specified message listener. Note: Only 1 concurrent consumer (which is the default of this message listener container) is allowed for each subscription, except for a shared subscription (which requires JMS 2.0). |  | String
-| *streamMessageType Enabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until n [...]
-| *formatDateHeadersTo Iso8601* (producer) | Sets whether date headers should be formatted according to the ISO 8601 standard. | false | boolean
+| *streamMessageTypeEnabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until no [...]
+| *formatDateHeadersToIso8601* (producer) | Sets whether date headers should be formatted according to the ISO 8601 standard. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -204,7 +204,7 @@ with the following path and query parameters:
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
 | *exposeListenerSession* (consumer) | Specifies whether the listener session should be exposed when consuming messages. | false | boolean
-| *replyToSameDestination Allowed* (consumer) | Whether a JMS consumer is allowed to send a reply message to the same destination that the consumer is using to consume from. This prevents an endless loop by consuming and sending back the same message to itself. | false | boolean
+| *replyToSameDestinationAllowed* (consumer) | Whether a JMS consumer is allowed to send a reply message to the same destination that the consumer is using to consume from. This prevents an endless loop by consuming and sending back the same message to itself. | false | boolean
 | *taskExecutor* (consumer) | Allows you to specify a custom task executor for consuming messages. |  | TaskExecutor
 | *deliveryDelay* (producer) | Sets delivery delay to use for send calls for JMS. This option requires JMS 2.0 compliant broker. | -1 | long
 | *deliveryMode* (producer) | Specifies the delivery mode to be used. Possibles values are those defined by javax.jms.DeliveryMode. NON_PERSISTENT = 1 and PERSISTENT = 2. |  | Integer
@@ -215,8 +215,8 @@ with the following path and query parameters:
 | *preserveMessageQos* (producer) | Set to true, if you want to send message using the QoS settings specified on the message, instead of the QoS settings on the JMS endpoint. The following three headers are considered JMSPriority, JMSDeliveryMode, and JMSExpiration. You can provide all or only some of them. If not provided, Camel will fall back to use the values from the endpoint instead. So, when using this option, the headers override the values from the endpoint. The explicitQosEnable [...]
 | *priority* (producer) | Values greater than 1 specify the message priority when sending (where 0 is the lowest priority and 9 is the highest). The explicitQosEnabled option must also be enabled in order for this option to have any effect. | 4 | int
 | *replyToConcurrentConsumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
-| *replyToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
-| *replyToOnTimeoutMax ConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
+| *replyToMaxConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
+| *replyToOnTimeoutMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
 | *replyToOverride* (producer) | Provides an explicit ReplyTo destination in the JMS message, which overrides the setting of replyTo. It is useful if you want to forward the message to a remote Queue and receive the reply message from the ReplyTo destination. |  | String
 | *replyToType* (producer) | Allows for explicitly specifying which kind of strategy to use for replyTo queues when doing request/reply over JMS. Possible values are: Temporary, Shared, or Exclusive. By default Camel will use temporary queues. However if replyTo has been configured, then Shared is used by default. This option allows you to use exclusive queues instead of shared ones. See Camel JMS documentation for more details, and especially the notes about the implications if running  [...]
 | *requestTimeout* (producer) | The timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds). The default is 20 seconds. You can include the header CamelJmsRequestTimeout to override this endpoint configured timeout value, and thus have per message individual timeout values. See also the requestTimeoutCheckerInterval option. | 20000 | long
@@ -229,7 +229,7 @@ with the following path and query parameters:
 | *forceSendOriginalMessage* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
 | *includeSentJMSMessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
 | *replyToCacheLevelName* (producer) | Sets the cache level by name for the reply consumer when doing request/reply over JMS. This option only applies when using fixed reply queues (not temporary). Camel will by default use: CACHE_CONSUMER for exclusive or shared w/ replyToSelectorName. And CACHE_SESSION for shared without replyToSelectorName. Some JMS brokers such as IBM WebSphere may require to set the replyToCacheLevelName=CACHE_NONE to work. Note: If using temporary queues then CACHE [...]
-| *replyToDestinationSelector Name* (producer) | Sets the JMS Selector using the fixed name to be used so you can filter out your own replies from the others when using a shared queue (that is, if you are not using a temporary reply queue). |  | String
+| *replyToDestinationSelectorName* (producer) | Sets the JMS Selector using the fixed name to be used so you can filter out your own replies from the others when using a shared queue (that is, if you are not using a temporary reply queue). |  | String
 | *streamMessageTypeEnabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until no [...]
 | *allowSerializedHeaders* (advanced) | Controls whether or not to include serialized headers. Applies only when isTransferExchange() is true. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. | false | boolean
 | *asyncStartListener* (advanced) | Whether to startup the JmsConsumer message listener asynchronously, when starting a route. For example if a JmsConsumer cannot get a connection to a remote JMS broker, then it may block while retrying and/or failover. This will cause Camel to block while starting routes. By setting this option to true, you will let routes startup, while the JmsConsumer connects to the JMS broker using a dedicated thread in asynchronous mode. If this option is used, the [...]
@@ -253,19 +253,19 @@ with the following path and query parameters:
 | *pubSubNoLocal* (advanced) | Specifies whether to inhibit the delivery of messages published by its own connection. | false | boolean
 | *receiveTimeout* (advanced) | The timeout for receiving messages (in milliseconds). | 1000 | long
 | *recoveryInterval* (advanced) | Specifies the interval between recovery attempts, i.e. when a connection is being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds. | 5000 | long
-| *requestTimeoutChecker Interval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *transferException* (advanced) | If enabled and you are using Request Reply messaging (InOut) and an Exchange failed on the consumer side, then the caused Exception will be send back in response as a javax.jms.ObjectMessage. If the client is Camel, the returned Exception is rethrown. This allows you to use Camel JMS as a bridge in your routing - for example, using persistent queues to enable robust routing. Notice that if you also have transferExchange enabled, this option takes preced [...]
 | *transferExchange* (advanced) | You can transfer the exchange over the wire instead of just the body and headers. The following fields are transferred: In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. You must enable this option on both the producer and consumer side, so Camel knows the payloads is an E [...]
-| *useMessageIDAsCorrelation ID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
-| *waitForProvisionCorrelation ToBeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
-| *waitForProvisionCorrelation ToBeUpdatedThreadSleeping Time* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
+| *useMessageIDAsCorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
+| *waitForProvisionCorrelationTo BeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
+| *waitForProvisionCorrelationTo BeUpdatedThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
 | *errorHandlerLoggingLevel* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
 | *errorHandlerLogStackTrace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
 | *password* (security) | Password to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *username* (security) | Username to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *transacted* (transaction) | Specifies whether to use transacted mode | false | boolean
-| *lazyCreateTransaction Manager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
+| *lazyCreateTransactionManager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
 | *transactionManager* (transaction) | The Spring transaction manager to use. |  | PlatformTransactionManager
 | *transactionName* (transaction) | The name of the transaction to use. |  | String
 | *transactionTimeout* (transaction) | The timeout value of the transaction (in seconds), if using transacted mode. | -1 | int
diff --git a/docs/components/modules/ROOT/pages/ahc-component.adoc b/docs/components/modules/ROOT/pages/ahc-component.adoc
index b0eb84f..7fb6ac1 100644
--- a/docs/components/modules/ROOT/pages/ahc-component.adoc
+++ b/docs/components/modules/ROOT/pages/ahc-component.adoc
@@ -158,8 +158,8 @@ The AHC component supports 9 options, which are listed below.
 | *binding* (advanced) | To use a custom AhcBinding which allows to control how to bind between AHC and Camel. |  | AhcBinding
 | *clientConfig* (advanced) | To configure the AsyncHttpClient to use a custom com.ning.http.client.AsyncHttpClientConfig instance. |  | AsyncHttpClientConfig
 | *sslContextParameters* (security) | Reference to a org.apache.camel.support.jsse.SSLContextParameters in the Registry. Note that configuring this option will override any SSL/TLS configuration options provided through the clientConfig option at the endpoint or component level. |  | SSLContextParameters
-| *allowJavaSerialized Object* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *allowJavaSerializedObject* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
diff --git a/docs/components/modules/ROOT/pages/ahc-ws-component.adoc b/docs/components/modules/ROOT/pages/ahc-ws-component.adoc
index 3b22c16..71f5f5c 100644
--- a/docs/components/modules/ROOT/pages/ahc-ws-component.adoc
+++ b/docs/components/modules/ROOT/pages/ahc-ws-component.adoc
@@ -59,8 +59,8 @@ The AHC Websocket component supports 9 options, which are listed below.
 | *binding* (advanced) | To use a custom AhcBinding which allows to control how to bind between AHC and Camel. |  | AhcBinding
 | *clientConfig* (advanced) | To configure the AsyncHttpClient to use a custom com.ning.http.client.AsyncHttpClientConfig instance. |  | AsyncHttpClientConfig
 | *sslContextParameters* (security) | Reference to a org.apache.camel.support.jsse.SSLContextParameters in the Registry. Note that configuring this option will override any SSL/TLS configuration options provided through the clientConfig option at the endpoint or component level. |  | SSLContextParameters
-| *allowJavaSerialized Object* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *allowJavaSerializedObject* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
diff --git a/docs/components/modules/ROOT/pages/amqp-component.adoc b/docs/components/modules/ROOT/pages/amqp-component.adoc
index bfbbd9e..ea0b277 100644
--- a/docs/components/modules/ROOT/pages/amqp-component.adoc
+++ b/docs/components/modules/ROOT/pages/amqp-component.adoc
@@ -49,14 +49,14 @@ The AMQP component supports 85 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *includeAmqpAnnotations* (common) | Whether to include AMQP annotations when mapping from AMQP to Camel Message. Setting this to true will map AMQP message annotations to message headers. Due to limitations in Apache Qpid JMS API, currently delivery annotations are ignored. | false | boolean
-| *allowAutoWired ConnectionFactory* (advanced) | Whether to auto-discover ConnectionFactory from the registry, if no connection factory has been configured. If only one instance of ConnectionFactory is found then it will be used. This is enabled by default. | false | boolean
-| *allowAutoWired DestinationResolver* (advanced) | Whether to auto-discover DestinationResolver from the registry, if no destination resolver has been configured. If only one instance of DestinationResolver is found then it will be used. This is enabled by default. | false | boolean
+| *allowAutoWiredConnection Factory* (advanced) | Whether to auto-discover ConnectionFactory from the registry, if no connection factory has been configured. If only one instance of ConnectionFactory is found then it will be used. This is enabled by default. | false | boolean
+| *allowAutoWiredDestination Resolver* (advanced) | Whether to auto-discover DestinationResolver from the registry, if no destination resolver has been configured. If only one instance of DestinationResolver is found then it will be used. This is enabled by default. | false | boolean
 | *configuration* (advanced) | To use a shared JMS configuration |  | JmsConfiguration
-| *acceptMessagesWhile Stopping* (consumer) | Specifies whether the consumer accept messages while it is stopping. You may consider enabling this option, if you start and stop JMS routes at runtime, while there are still messages enqueued on the queue. If this option is false, and you stop the JMS route, then messages may be rejected, and the JMS broker would have to attempt redeliveries, which yet again may be rejected, and eventually the message may be moved at a dead letter queue on t [...]
-| *allowReplyManagerQuick Stop* (consumer) | Whether the DefaultMessageListenerContainer used in the reply managers for request-reply messaging allow the DefaultMessageListenerContainer.runningAllowed flag to quick stop in case JmsConfiguration#isAcceptMessagesWhileStopping is enabled, and org.apache.camel.CamelContext is currently being stopped. This quick stop ability is enabled by default in the regular JMS consumers but to enable for reply managers you must enable this flag. | false  [...]
+| *acceptMessagesWhileStopping* (consumer) | Specifies whether the consumer accept messages while it is stopping. You may consider enabling this option, if you start and stop JMS routes at runtime, while there are still messages enqueued on the queue. If this option is false, and you stop the JMS route, then messages may be rejected, and the JMS broker would have to attempt redeliveries, which yet again may be rejected, and eventually the message may be moved at a dead letter queue on th [...]
+| *allowReplyManagerQuickStop* (consumer) | Whether the DefaultMessageListenerContainer used in the reply managers for request-reply messaging allow the DefaultMessageListenerContainer.runningAllowed flag to quick stop in case JmsConfiguration#isAcceptMessagesWhileStopping is enabled, and org.apache.camel.CamelContext is currently being stopped. This quick stop ability is enabled by default in the regular JMS consumers but to enable for reply managers you must enable this flag. | false | [...]
 | *acknowledgementMode* (consumer) | The JMS acknowledgement mode defined as an Integer. Allows you to set vendor-specific extensions to the acknowledgment mode. For the regular modes, it is preferable to use the acknowledgementModeName instead. |  | int
 | *eagerPoisonBody* (consumer) | If eagerLoadingOfProperties is enabled and the JMS message payload (JMS body or JMS properties) (cannot be read/mapped), then set this text as the message body instead so the message can be processed (the cause of the poison are already stored as exception on the Exchange). This can be turned off by setting eagerPoisonBody=false. See also the option eagerLoadingOfProperties. | Poison JMS message due to ${exception.message} | String
-| *eagerLoadingOf Properties* (consumer) | Enables eager loading of JMS properties as soon as a message is loaded which generally is inefficient as the JMS properties may not be required but sometimes can catch early any issues with the underlying JMS provider and the use of JMS properties. See also the option eagerLoadingOfBody. | false | boolean
+| *eagerLoadingOfProperties* (consumer) | Enables eager loading of JMS properties as soon as a message is loaded which generally is inefficient as the JMS properties may not be required but sometimes can catch early any issues with the underlying JMS provider and the use of JMS properties. See also the option eagerLoadingOfBody. | false | boolean
 | *acknowledgementModeName* (consumer) | The JMS acknowledgement name, which is one of: SESSION_TRANSACTED, CLIENT_ACKNOWLEDGE, AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE | AUTO_ACKNOWLEDGE | String
 | *autoStartup* (consumer) | Specifies whether the consumer container should auto-startup. | true | boolean
 | *cacheLevel* (consumer) | Sets the cache level by ID for the underlying JMS resources. See cacheLevelName option for more details. |  | int
@@ -64,7 +64,7 @@ The AMQP component supports 85 options, which are listed below.
 | *replyToCacheLevelName* (producer) | Sets the cache level by name for the reply consumer when doing request/reply over JMS. This option only applies when using fixed reply queues (not temporary). Camel will by default use: CACHE_CONSUMER for exclusive or shared w/ replyToSelectorName. And CACHE_SESSION for shared without replyToSelectorName. Some JMS brokers such as IBM WebSphere may require to set the replyToCacheLevelName=CACHE_NONE to work. Note: If using temporary queues then CACHE [...]
 | *clientId* (common) | Sets the JMS client ID to use. Note that this value, if specified, must be unique and can only be used by a single JMS connection instance. It is typically only required for durable topic subscriptions. If using Apache ActiveMQ you may prefer to use Virtual Topics instead. |  | String
 | *concurrentConsumers* (consumer) | Specifies the default number of concurrent consumers when consuming from JMS (not for request/reply over JMS). See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. When doing request/reply over JMS then the option replyToConcurrentConsumers is used to control number of concurrent consumers on the reply message listener. | 1 | int
-| *replyToConcurrent Consumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
+| *replyToConcurrentConsumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
 | *connectionFactory* (common) | The connection factory to be use. A connection factory must be configured either on the component or endpoint. |  | ConnectionFactory
 | *username* (security) | Username to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *password* (security) | Password to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
@@ -73,22 +73,22 @@ The AMQP component supports 85 options, which are listed below.
 | *durableSubscriptionName* (common) | The durable subscriber name for specifying durable topic subscriptions. The clientId option must be configured as well. |  | String
 | *exceptionListener* (advanced) | Specifies the JMS Exception Listener that is to be notified of any underlying JMS exceptions. |  | ExceptionListener
 | *errorHandler* (advanced) | Specifies a org.springframework.util.ErrorHandler to be invoked in case of any uncaught exceptions thrown while processing a Message. By default these exceptions will be logged at the WARN level, if no errorHandler has been configured. You can configure logging level and whether stack traces should be logged using errorHandlerLoggingLevel and errorHandlerLogStackTrace options. This makes it much easier to configure, than having to code a custom errorHandler. [...]
-| *errorHandlerLogging Level* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
-| *errorHandlerLogStack Trace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
+| *errorHandlerLoggingLevel* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
+| *errorHandlerLogStackTrace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
 | *explicitQosEnabled* (producer) | Set if the deliveryMode, priority or timeToLive qualities of service should be used when sending messages. This option is based on Spring's JmsTemplate. The deliveryMode, priority and timeToLive options are applied to the current endpoint. This contrasts with the preserveMessageQos option, which operates at message granularity, reading QoS properties exclusively from the Camel In message headers. | false | boolean
 | *exposeListenerSession* (consumer) | Specifies whether the listener session should be exposed when consuming messages. | false | boolean
 | *idleTaskExecutionLimit* (advanced) | Specifies the limit for idle executions of a receive task, not having received any message within its execution. If this limit is reached, the task will shut down and leave receiving to other executing tasks (in the case of dynamic scheduling; see the maxConcurrentConsumers setting). There is additional doc available from Spring. | 1 | int
 | *idleConsumerLimit* (advanced) | Specify the limit for the number of consumers that are allowed to be idle at any given time. | 1 | int
 | *maxConcurrentConsumers* (consumer) | Specifies the maximum number of concurrent consumers when consuming from JMS (not for request/reply over JMS). See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. When doing request/reply over JMS then the option replyToMaxConcurrentConsumers is used to control number of concurrent consumers on the reply message listener. |  | int
-| *replyToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
-| *replyOnTimeoutToMax ConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
+| *replyToMaxConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
+| *replyOnTimeoutToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
 | *maxMessagesPerTask* (advanced) | The number of messages per task. -1 is unlimited. If you use a range for concurrent consumers (eg min max), then this option can be used to set a value to eg 100 to control how fast the consumers will shrink when less work is required. | -1 | int
 | *messageConverter* (advanced) | To use a custom Spring org.springframework.jms.support.converter.MessageConverter so you can be in control how to map to/from a javax.jms.Message. |  | MessageConverter
 | *mapJmsMessage* (advanced) | Specifies whether Camel should auto map the received JMS message to a suited payload type, such as javax.jms.TextMessage to a String etc. See section about how mapping works below for more details. | true | boolean
 | *messageIdEnabled* (advanced) | When sending, specifies whether message IDs should be added. This is just an hint to the JMS Broker. If the JMS provider accepts this hint, these messages must have the message ID set to null; if the provider ignores the hint, the message ID must be set to its normal unique value. | true | boolean
 | *messageTimestampEnabled* (advanced) | Specifies whether timestamps should be enabled by default on sending messages. This is just an hint to the JMS broker. If the JMS provider accepts this hint, these messages must have the timestamp set to zero; if the provider ignores the hint the timestamp must be set to its normal value. | true | boolean
 | *alwaysCopyMessage* (producer) | If true, Camel will always make a JMS message copy of the message when it is passed to the producer for sending. Copying the message is needed in some situations, such as when a replyToDestinationSelectorName is set (incidentally, Camel will set the alwaysCopyMessage option to true, if a replyToDestinationSelectorName is set). | false | boolean
-| *useMessageIDAs CorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
+| *useMessageIDAsCorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
 | *priority* (producer) | Values greater than 1 specify the message priority when sending (where 0 is the lowest priority and 9 is the highest). The explicitQosEnabled option must also be enabled in order for this option to have any effect. | 4 | int
 | *pubSubNoLocal* (advanced) | Specifies whether to inhibit the delivery of messages published by its own connection. | false | boolean
 | *receiveTimeout* (advanced) | The timeout for receiving messages (in milliseconds). | 1000 | long
@@ -96,16 +96,16 @@ The AMQP component supports 85 options, which are listed below.
 | *taskExecutor* (consumer) | Allows you to specify a custom task executor for consuming messages. |  | TaskExecutor
 | *timeToLive* (producer) | When sending messages, specifies the time-to-live of the message (in milliseconds). | -1 | long
 | *transacted* (transaction) | Specifies whether to use transacted mode | false | boolean
-| *lazyCreateTransaction Manager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
+| *lazyCreateTransactionManager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
 | *transactionManager* (transaction) | The Spring transaction manager to use. |  | PlatformTransactionManager
 | *transactionName* (transaction) | The name of the transaction to use. |  | String
 | *transactionTimeout* (transaction) | The timeout value of the transaction (in seconds), if using transacted mode. | -1 | int
-| *testConnectionOn Startup* (common) | Specifies whether to test the connection on startup. This ensures that when Camel starts that all the JMS consumers have a valid connection to the JMS broker. If a connection cannot be granted then Camel throws an exception on startup. This ensures that Camel is not started with failed connections. The JMS producers is tested as well. | false | boolean
+| *testConnectionOnStartup* (common) | Specifies whether to test the connection on startup. This ensures that when Camel starts that all the JMS consumers have a valid connection to the JMS broker. If a connection cannot be granted then Camel throws an exception on startup. This ensures that Camel is not started with failed connections. The JMS producers is tested as well. | false | boolean
 | *asyncStartListener* (advanced) | Whether to startup the JmsConsumer message listener asynchronously, when starting a route. For example if a JmsConsumer cannot get a connection to a remote JMS broker, then it may block while retrying and/or failover. This will cause Camel to block while starting routes. By setting this option to true, you will let routes startup, while the JmsConsumer connects to the JMS broker using a dedicated thread in asynchronous mode. If this option is used, the [...]
 | *asyncStopListener* (advanced) | Whether to stop the JmsConsumer message listener asynchronously, when stopping a route. | false | boolean
-| *forceSendOriginal Message* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
+| *forceSendOriginalMessage* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
 | *requestTimeout* (producer) | The timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds). The default is 20 seconds. You can include the header CamelJmsRequestTimeout to override this endpoint configured timeout value, and thus have per message individual timeout values. See also the requestTimeoutCheckerInterval option. | 20000 | long
-| *requestTimeoutChecker Interval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
 | *transferExchange* (advanced) | You can transfer the exchange over the wire instead of just the body and headers. The following fields are transferred: In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. You must enable this option on both the producer and consumer side, so Camel knows the payloads is an E [...]
 | *transferException* (advanced) | If enabled and you are using Request Reply messaging (InOut) and an Exchange failed on the consumer side, then the caused Exception will be send back in response as a javax.jms.ObjectMessage. If the client is Camel, the returned Exception is rethrown. This allows you to use Camel JMS as a bridge in your routing - for example, using persistent queues to enable robust routing. Notice that if you also have transferExchange enabled, this option takes preced [...]
 | *jmsOperations* (advanced) | Allows you to use your own implementation of the org.springframework.jms.core.JmsOperations interface. Camel uses JmsTemplate as default. Can be used for testing purpose, but not used much as stated in the spring API docs. |  | JmsOperations
@@ -114,21 +114,21 @@ The AMQP component supports 85 options, which are listed below.
 | *preserveMessageQos* (producer) | Set to true, if you want to send message using the QoS settings specified on the message, instead of the QoS settings on the JMS endpoint. The following three headers are considered JMSPriority, JMSDeliveryMode, and JMSExpiration. You can provide all or only some of them. If not provided, Camel will fall back to use the values from the endpoint instead. So, when using this option, the headers override the values from the endpoint. The explicitQosEnable [...]
 | *asyncConsumer* (consumer) | Whether the JmsConsumer processes the Exchange asynchronously. If enabled then the JmsConsumer may pickup the next message from the JMS queue, while the previous message is being processed asynchronously (by the Asynchronous Routing Engine). This means that messages may be processed not 100% strictly in order. If disabled (as default) then the Exchange is fully processed before the JmsConsumer will pickup the next message from the JMS queue. Note if transac [...]
 | *allowNullBody* (producer) | Whether to allow sending messages with no body. If this option is false and the message body is null, then an JMSException is thrown. | true | boolean
-| *includeSentJMS MessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
-| *includeAllJMSX Properties* (advanced) | Whether to include all JMSXxxx properties when mapping from JMS to Camel Message. Setting this to true will include properties such as JMSXAppID, and JMSXUserID etc. Note: If you are using a custom headerFilterStrategy then this option does not apply. | false | boolean
-| *defaultTaskExecutor Type* (consumer) | Specifies what default TaskExecutor type to use in the DefaultMessageListenerContainer, for both consumer endpoints and the ReplyTo consumer of producer endpoints. Possible values: SimpleAsync (uses Spring's SimpleAsyncTaskExecutor) or ThreadPool (uses Spring's ThreadPoolTaskExecutor with optimal values - cached threadpool-like). If not set, it defaults to the previous behaviour, which uses a cached thread pool for consumer endpoints and SimpleAs [...]
+| *includeSentJMSMessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
+| *includeAllJMSXProperties* (advanced) | Whether to include all JMSXxxx properties when mapping from JMS to Camel Message. Setting this to true will include properties such as JMSXAppID, and JMSXUserID etc. Note: If you are using a custom headerFilterStrategy then this option does not apply. | false | boolean
+| *defaultTaskExecutorType* (consumer) | Specifies what default TaskExecutor type to use in the DefaultMessageListenerContainer, for both consumer endpoints and the ReplyTo consumer of producer endpoints. Possible values: SimpleAsync (uses Spring's SimpleAsyncTaskExecutor) or ThreadPool (uses Spring's ThreadPoolTaskExecutor with optimal values - cached threadpool-like). If not set, it defaults to the previous behaviour, which uses a cached thread pool for consumer endpoints and SimpleAsy [...]
 | *jmsKeyFormatStrategy* (advanced) | Pluggable strategy for encoding and decoding JMS keys so they can be compliant with the JMS specification. Camel provides two implementations out of the box: default and passthrough. The default strategy will safely marshal dots and hyphens (. and -). The passthrough strategy leaves the key as is. Can be used for JMS brokers which do not care whether JMS header keys contain illegal characters. You can provide your own implementation of the org.apache [...]
 | *allowAdditionalHeaders* (producer) | This option is used to allow additional headers which may have values that are invalid according to JMS specification. For example some message systems such as WMQ do this with header names using prefix JMS_IBM_MQMD_ containing values with byte array or other invalid types. You can specify multiple header names separated by comma, and use as suffix for wildcard matching. |  | String
 | *queueBrowseStrategy* (advanced) | To use a custom QueueBrowseStrategy when browsing queues |  | QueueBrowseStrategy
 | *messageCreatedStrategy* (advanced) | To use the given MessageCreatedStrategy which are invoked when Camel creates new instances of javax.jms.Message objects when Camel is sending a JMS message. |  | MessageCreatedStrategy
-| *waitForProvision CorrelationToBeUpdated Counter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
-| *waitForProvision CorrelationToBeUpdated ThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
+| *waitForProvisionCorrelationTo BeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
+| *waitForProvisionCorrelationTo BeUpdatedThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
 | *correlationProperty* (producer) | Use this JMS property to correlate messages in InOut exchange pattern (request-reply) instead of JMSCorrelationID property. This allows you to exchange messages with systems that do not correlate messages using JMSCorrelationID JMS property. If used JMSCorrelationID will not be used or set by Camel. The value of here named property will be generated if not supplied in the header of the message under the same name. |  | String
 | *subscriptionDurable* (consumer) | Set whether to make the subscription durable. The durable subscription name to be used can be specified through the subscriptionName property. Default is false. Set this to true to register a durable subscription, typically in combination with a subscriptionName value (unless your message listener class name is good enough as subscription name). Only makes sense when listening to a topic (pub-sub domain), therefore this method switches the pubSubDomai [...]
 | *subscriptionShared* (consumer) | Set whether to make the subscription shared. The shared subscription name to be used can be specified through the subscriptionName property. Default is false. Set this to true to register a shared subscription, typically in combination with a subscriptionName value (unless your message listener class name is good enough as subscription name). Note that shared subscriptions may also be durable, so this flag can (and often will) be combined with subscrip [...]
 | *subscriptionName* (consumer) | Set the name of a subscription to create. To be applied in case of a topic (pub-sub domain) with a shared or durable subscription. The subscription name needs to be unique within this client's JMS client id. Default is the class name of the specified message listener. Note: Only 1 concurrent consumer (which is the default of this message listener container) is allowed for each subscription, except for a shared subscription (which requires JMS 2.0). |  | String
-| *streamMessageType Enabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until n [...]
-| *formatDateHeadersTo Iso8601* (producer) | Sets whether date headers should be formatted according to the ISO 8601 standard. | false | boolean
+| *streamMessageTypeEnabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until no [...]
+| *formatDateHeadersToIso8601* (producer) | Sets whether date headers should be formatted according to the ISO 8601 standard. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -196,7 +196,7 @@ with the following path and query parameters:
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
 | *exposeListenerSession* (consumer) | Specifies whether the listener session should be exposed when consuming messages. | false | boolean
-| *replyToSameDestination Allowed* (consumer) | Whether a JMS consumer is allowed to send a reply message to the same destination that the consumer is using to consume from. This prevents an endless loop by consuming and sending back the same message to itself. | false | boolean
+| *replyToSameDestinationAllowed* (consumer) | Whether a JMS consumer is allowed to send a reply message to the same destination that the consumer is using to consume from. This prevents an endless loop by consuming and sending back the same message to itself. | false | boolean
 | *taskExecutor* (consumer) | Allows you to specify a custom task executor for consuming messages. |  | TaskExecutor
 | *deliveryDelay* (producer) | Sets delivery delay to use for send calls for JMS. This option requires JMS 2.0 compliant broker. | -1 | long
 | *deliveryMode* (producer) | Specifies the delivery mode to be used. Possibles values are those defined by javax.jms.DeliveryMode. NON_PERSISTENT = 1 and PERSISTENT = 2. |  | Integer
@@ -207,8 +207,8 @@ with the following path and query parameters:
 | *preserveMessageQos* (producer) | Set to true, if you want to send message using the QoS settings specified on the message, instead of the QoS settings on the JMS endpoint. The following three headers are considered JMSPriority, JMSDeliveryMode, and JMSExpiration. You can provide all or only some of them. If not provided, Camel will fall back to use the values from the endpoint instead. So, when using this option, the headers override the values from the endpoint. The explicitQosEnable [...]
 | *priority* (producer) | Values greater than 1 specify the message priority when sending (where 0 is the lowest priority and 9 is the highest). The explicitQosEnabled option must also be enabled in order for this option to have any effect. | 4 | int
 | *replyToConcurrentConsumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
-| *replyToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
-| *replyToOnTimeoutMax ConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
+| *replyToMaxConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
+| *replyToOnTimeoutMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
 | *replyToOverride* (producer) | Provides an explicit ReplyTo destination in the JMS message, which overrides the setting of replyTo. It is useful if you want to forward the message to a remote Queue and receive the reply message from the ReplyTo destination. |  | String
 | *replyToType* (producer) | Allows for explicitly specifying which kind of strategy to use for replyTo queues when doing request/reply over JMS. Possible values are: Temporary, Shared, or Exclusive. By default Camel will use temporary queues. However if replyTo has been configured, then Shared is used by default. This option allows you to use exclusive queues instead of shared ones. See Camel JMS documentation for more details, and especially the notes about the implications if running  [...]
 | *requestTimeout* (producer) | The timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds). The default is 20 seconds. You can include the header CamelJmsRequestTimeout to override this endpoint configured timeout value, and thus have per message individual timeout values. See also the requestTimeoutCheckerInterval option. | 20000 | long
@@ -221,7 +221,7 @@ with the following path and query parameters:
 | *forceSendOriginalMessage* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
 | *includeSentJMSMessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
 | *replyToCacheLevelName* (producer) | Sets the cache level by name for the reply consumer when doing request/reply over JMS. This option only applies when using fixed reply queues (not temporary). Camel will by default use: CACHE_CONSUMER for exclusive or shared w/ replyToSelectorName. And CACHE_SESSION for shared without replyToSelectorName. Some JMS brokers such as IBM WebSphere may require to set the replyToCacheLevelName=CACHE_NONE to work. Note: If using temporary queues then CACHE [...]
-| *replyToDestinationSelector Name* (producer) | Sets the JMS Selector using the fixed name to be used so you can filter out your own replies from the others when using a shared queue (that is, if you are not using a temporary reply queue). |  | String
+| *replyToDestinationSelectorName* (producer) | Sets the JMS Selector using the fixed name to be used so you can filter out your own replies from the others when using a shared queue (that is, if you are not using a temporary reply queue). |  | String
 | *streamMessageTypeEnabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until no [...]
 | *allowSerializedHeaders* (advanced) | Controls whether or not to include serialized headers. Applies only when isTransferExchange() is true. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. | false | boolean
 | *asyncStartListener* (advanced) | Whether to startup the JmsConsumer message listener asynchronously, when starting a route. For example if a JmsConsumer cannot get a connection to a remote JMS broker, then it may block while retrying and/or failover. This will cause Camel to block while starting routes. By setting this option to true, you will let routes startup, while the JmsConsumer connects to the JMS broker using a dedicated thread in asynchronous mode. If this option is used, the [...]
@@ -245,19 +245,19 @@ with the following path and query parameters:
 | *pubSubNoLocal* (advanced) | Specifies whether to inhibit the delivery of messages published by its own connection. | false | boolean
 | *receiveTimeout* (advanced) | The timeout for receiving messages (in milliseconds). | 1000 | long
 | *recoveryInterval* (advanced) | Specifies the interval between recovery attempts, i.e. when a connection is being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds. | 5000 | long
-| *requestTimeoutChecker Interval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *transferException* (advanced) | If enabled and you are using Request Reply messaging (InOut) and an Exchange failed on the consumer side, then the caused Exception will be send back in response as a javax.jms.ObjectMessage. If the client is Camel, the returned Exception is rethrown. This allows you to use Camel JMS as a bridge in your routing - for example, using persistent queues to enable robust routing. Notice that if you also have transferExchange enabled, this option takes preced [...]
 | *transferExchange* (advanced) | You can transfer the exchange over the wire instead of just the body and headers. The following fields are transferred: In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. You must enable this option on both the producer and consumer side, so Camel knows the payloads is an E [...]
-| *useMessageIDAsCorrelation ID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
-| *waitForProvisionCorrelation ToBeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
-| *waitForProvisionCorrelation ToBeUpdatedThreadSleeping Time* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
+| *useMessageIDAsCorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
+| *waitForProvisionCorrelationTo BeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
+| *waitForProvisionCorrelationTo BeUpdatedThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
 | *errorHandlerLoggingLevel* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
 | *errorHandlerLogStackTrace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
 | *password* (security) | Password to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *username* (security) | Username to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *transacted* (transaction) | Specifies whether to use transacted mode | false | boolean
-| *lazyCreateTransaction Manager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
+| *lazyCreateTransactionManager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
 | *transactionManager* (transaction) | The Spring transaction manager to use. |  | PlatformTransactionManager
 | *transactionName* (transaction) | The name of the transaction to use. |  | String
 | *transactionTimeout* (transaction) | The timeout value of the transaction (in seconds), if using transacted mode. | -1 | int
diff --git a/docs/components/modules/ROOT/pages/atmosphere-websocket-component.adoc b/docs/components/modules/ROOT/pages/atmosphere-websocket-component.adoc
index 4e0197f..9eccf68 100644
--- a/docs/components/modules/ROOT/pages/atmosphere-websocket-component.adoc
+++ b/docs/components/modules/ROOT/pages/atmosphere-websocket-component.adoc
@@ -49,11 +49,11 @@ The Atmosphere Websocket component supports 10 options, which are listed below.
 | Name | Description | Default | Type
 | *servletName* (consumer) | Default name of servlet to use. The default name is CamelServlet. | CamelServlet | String
 | *httpRegistry* (consumer) | To use a custom org.apache.camel.component.servlet.HttpRegistry. |  | HttpRegistry
-| *attachmentMultipart Binding* (consumer) | Whether to automatic bind multipart/form-data as attachments on the Camel Exchange. The options attachmentMultipartBinding=true and disableStreamCache=false cannot work together. Remove disableStreamCache to use AttachmentMultipartBinding. This is turn off by default as this may require servlet specific configuration to enable this when using Servlet's. | false | boolean
+| *attachmentMultipartBinding* (consumer) | Whether to automatic bind multipart/form-data as attachments on the Camel Exchange. The options attachmentMultipartBinding=true and disableStreamCache=false cannot work together. Remove disableStreamCache to use AttachmentMultipartBinding. This is turn off by default as this may require servlet specific configuration to enable this when using Servlet's. | false | boolean
 | *fileNameExtWhitelist* (consumer) | Whitelist of accepted filename extensions for accepting uploaded files. Multiple extensions can be separated by comma, such as txt,xml. |  | String
 | *httpBinding* (advanced) | To use a custom HttpBinding to control the mapping between Camel message and HttpClient. |  | HttpBinding
 | *httpConfiguration* (advanced) | To use the shared HttpConfiguration as base configuration. |  | HttpConfiguration
-| *allowJavaSerialized Object* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
+| *allowJavaSerializedObject* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -111,7 +111,7 @@ with the following path and query parameters:
 | *traceEnabled* (consumer) | Specifies whether to enable HTTP TRACE for this Servlet consumer. By default TRACE is turned off. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *mapHttpMessageBody* (advanced) | If this option is true then IN exchange Body of the exchange will be mapped to HTTP body. Setting this to false will avoid the HTTP mapping. | true | boolean
-| *mapHttpMessageFormUrl EncodedBody* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
+| *mapHttpMessageFormUrlEncoded Body* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
 | *mapHttpMessageHeaders* (advanced) | If this option is true then IN exchange Headers of the exchange will be mapped to HTTP headers. Setting this to false will avoid the HTTP Headers mapping. | true | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 |===
diff --git a/docs/components/modules/ROOT/pages/aws-ddbstream-component.adoc b/docs/components/modules/ROOT/pages/aws-ddbstream-component.adoc
index 3c83803..8e46e78 100644
--- a/docs/components/modules/ROOT/pages/aws-ddbstream-component.adoc
+++ b/docs/components/modules/ROOT/pages/aws-ddbstream-component.adoc
@@ -78,7 +78,7 @@ with the following path and query parameters:
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *amazonDynamoDbStreams Client* (consumer) | Amazon DynamoDB client to use for all requests for this endpoint |  | AmazonDynamoDBStreams
+| *amazonDynamoDbStreamsClient* (consumer) | Amazon DynamoDB client to use for all requests for this endpoint |  | AmazonDynamoDBStreams
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
 | *iteratorType* (consumer) | Defines where in the DynaboDB stream to start getting records. Note that using TRIM_HORIZON can cause a significant delay before the stream has caught up to real-time. if {AT,AFTER}_SEQUENCE_NUMBER are used, then a sequenceNumberProvider MUST be supplied. | LATEST | ShardIteratorType
 | *maxResultsPerRequest* (consumer) | Maximum number of records that will be fetched in each poll |  | int
diff --git a/docs/components/modules/ROOT/pages/aws-s3-component.adoc b/docs/components/modules/ROOT/pages/aws-s3-component.adoc
index 3652586..90596b2 100644
--- a/docs/components/modules/ROOT/pages/aws-s3-component.adoc
+++ b/docs/components/modules/ROOT/pages/aws-s3-component.adoc
@@ -132,7 +132,7 @@ with the following path and query parameters:
 | *accelerateModeEnabled* ( advanced) | Define if Accelerate Mode enabled is true or false | false | boolean
 | *chunkedEncodingDisabled* ( advanced) | Define if disabled Chunked Encoding is true or false | false | boolean
 | *dualstackEnabled* ( advanced) | Define if Dualstack enabled is true or false | false | boolean
-| *forceGlobalBucketAccess Enabled* ( advanced) | Define if Force Global Bucket Access enabled is true or false | false | boolean
+| *forceGlobalBucketAccessEnabled* ( advanced) | Define if Force Global Bucket Access enabled is true or false | false | boolean
 | *payloadSigningEnabled* ( advanced) | Define if Payload Signing enabled is true or false | false | boolean
 | *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. |  | int
 | *backoffIdleThreshold* (scheduler) | The number of subsequent idle polls that should happen before the backoffMultipler should kick-in. |  | int
diff --git a/docs/components/modules/ROOT/pages/aws-sqs-component.adoc b/docs/components/modules/ROOT/pages/aws-sqs-component.adoc
index 4739d67..1cebaff 100644
--- a/docs/components/modules/ROOT/pages/aws-sqs-component.adoc
+++ b/docs/components/modules/ROOT/pages/aws-sqs-component.adoc
@@ -96,7 +96,7 @@ with the following path and query parameters:
 | *deleteAfterRead* (consumer) | Delete message from SQS after it has been read | true | boolean
 | *deleteIfFiltered* (consumer) | Whether or not to send the DeleteMessage to the SQS queue if an exchange fails to get through a filter. If 'false' and exchange does not make it through a Camel filter upstream in the route, then don't send DeleteMessage. | true | boolean
 | *extendMessageVisibility* (consumer) | If enabled then a scheduled background task will keep extending the message visibility on SQS. This is needed if it takes a long time to process the message. If set to true defaultVisibilityTimeout must be set. See details at Amazon docs. | false | boolean
-| *kmsDataKeyReusePeriod Seconds* (consumer) | The length of time, in seconds, for which Amazon SQS can reuse a data key to encrypt or decrypt messages before calling AWS KMS again. An integer representing seconds, between 60 seconds (1 minute) and 86,400 seconds (24 hours). Default: 300 (5 minutes). |  | Integer
+| *kmsDataKeyReusePeriodSeconds* (consumer) | The length of time, in seconds, for which Amazon SQS can reuse a data key to encrypt or decrypt messages before calling AWS KMS again. An integer representing seconds, between 60 seconds (1 minute) and 86,400 seconds (24 hours). Default: 300 (5 minutes). |  | Integer
 | *kmsMasterKeyId* (consumer) | The ID of an AWS-managed customer master key (CMK) for Amazon SQS or a custom CMK. |  | String
 | *maxMessagesPerPoll* (consumer) | Gets the maximum number of messages as a limit to poll at each polling. Is default unlimited, but use 0 or negative number to disable it as unlimited. |  | int
 | *messageAttributeNames* (consumer) | A list of message attribute names to receive when consuming. Multiple names can be separated by comma. |  | String
@@ -109,7 +109,7 @@ with the following path and query parameters:
 | *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
 | *delaySeconds* (producer) | Delay sending messages for a number of seconds. |  | Integer
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
-| *messageDeduplicationId Strategy* (producer) | Only for FIFO queues. Strategy for setting the messageDeduplicationId on the message. Can be one of the following options: useExchangeId, useContentBasedDeduplication. For the useContentBasedDeduplication option, no messageDeduplicationId will be set on the message. | useExchangeId | MessageDeduplicationIdStrategy
+| *messageDeduplicationIdStrategy* (producer) | Only for FIFO queues. Strategy for setting the messageDeduplicationId on the message. Can be one of the following options: useExchangeId, useContentBasedDeduplication. For the useContentBasedDeduplication option, no messageDeduplicationId will be set on the message. | useExchangeId | MessageDeduplicationIdStrategy
 | *messageGroupIdStrategy* (producer) | Only for FIFO queues. Strategy for setting the messageGroupId on the message. Can be one of the following options: useConstant, useExchangeId, usePropertyValue. For the usePropertyValue option, the value of property CamelAwsMessageGroupId will be used. |  | MessageGroupIdStrategy
 | *operation* (producer) | The operation to do in case the user don't want to send only a message |  | SqsOperations
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
@@ -135,7 +135,7 @@ with the following path and query parameters:
 | *maximumMessageSize* (queue) | The maximumMessageSize (in bytes) an SQS message can contain for this queue. |  | Integer
 | *messageRetentionPeriod* (queue) | The messageRetentionPeriod (in seconds) a message will be retained by SQS for this queue. |  | Integer
 | *policy* (queue) | The policy for this queue |  | String
-| *receiveMessageWaitTime Seconds* (queue) | If you do not specify WaitTimeSeconds in the request, the queue attribute ReceiveMessageWaitTimeSeconds is used to determine how long to wait. |  | Integer
+| *receiveMessageWaitTimeSeconds* (queue) | If you do not specify WaitTimeSeconds in the request, the queue attribute ReceiveMessageWaitTimeSeconds is used to determine how long to wait. |  | Integer
 | *redrivePolicy* (queue) | Specify the policy that send message to DeadLetter queue. See detail at Amazon docs. |  | String
 | *accessKey* (security) | Amazon AWS Access Key |  | String
 | *secretKey* (security) | Amazon AWS Secret Key |  | String
diff --git a/docs/components/modules/ROOT/pages/aws-swf-component.adoc b/docs/components/modules/ROOT/pages/aws-swf-component.adoc
index a94fe96..8874d10 100644
--- a/docs/components/modules/ROOT/pages/aws-swf-component.adoc
+++ b/docs/components/modules/ROOT/pages/aws-swf-component.adoc
@@ -87,17 +87,17 @@ with the following path and query parameters:
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
-| *clientConfiguration Parameters* (advanced) | To configure the ClientConfiguration using the key/values from the Map. |  | Map
-| *startWorkflowOptions Parameters* (advanced) | To configure the StartWorkflowOptions using the key/values from the Map. |  | Map
+| *clientConfigurationParameters* (advanced) | To configure the ClientConfiguration using the key/values from the Map. |  | Map
+| *startWorkflowOptionsParameters* (advanced) | To configure the StartWorkflowOptions using the key/values from the Map. |  | Map
 | *sWClientParameters* (advanced) | To configure the AmazonSimpleWorkflowClient using the key/values from the Map. |  | Map
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *activityList* (activity) | The list name to consume activities from. |  | String
 | *activitySchedulingOptions* (activity) | Activity scheduling options |  | ActivitySchedulingOptions
 | *activityThreadPoolSize* (activity) | Maximum number of threads in work pool for activity. | 100 | int
-| *activityTypeExecution Options* (activity) | Activity execution options |  | ActivityTypeExecutionOptions
+| *activityTypeExecutionOptions* (activity) | Activity execution options |  | ActivityTypeExecutionOptions
 | *activityTypeRegistration Options* (activity) | Activity registration options |  | ActivityTypeRegistrationOptions
 | *childPolicy* (workflow) | The policy to use on child workflows when terminating a workflow. |  | String
-| *executionStartToClose Timeout* (workflow) | Set the execution start to close timeout. | 3600 | String
+| *executionStartToCloseTimeout* (workflow) | Set the execution start to close timeout. | 3600 | String
 | *operation* (workflow) | Workflow operation | START | String
 | *signalName* (workflow) | The name of the signal to send to the workflow. |  | String
 | *stateResultType* (workflow) | The type of the result when a workflow state is queried. |  | String
diff --git a/docs/components/modules/ROOT/pages/bean-validator-component.adoc b/docs/components/modules/ROOT/pages/bean-validator-component.adoc
index a5b51f0..7672a3f 100644
--- a/docs/components/modules/ROOT/pages/bean-validator-component.adoc
+++ b/docs/components/modules/ROOT/pages/bean-validator-component.adoc
@@ -58,10 +58,10 @@ The Bean Validator component supports 7 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *ignoreXmlConfiguration* (producer) | Whether to ignore data from the META-INF/validation.xml file. | false | boolean
-| *validationProvider Resolver* (advanced) | To use a a custom ValidationProviderResolver |  | ValidationProviderResolver
+| *validationProviderResolver* (advanced) | To use a a custom ValidationProviderResolver |  | ValidationProviderResolver
 | *messageInterpolator* (advanced) | To use a custom MessageInterpolator |  | MessageInterpolator
 | *traversableResolver* (advanced) | To use a custom TraversableResolver |  | TraversableResolver
-| *constraintValidator Factory* (advanced) | To use a custom ConstraintValidatorFactory |  | ConstraintValidatorFactory
+| *constraintValidatorFactory* (advanced) | To use a custom ConstraintValidatorFactory |  | ConstraintValidatorFactory
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 |===
diff --git a/docs/components/modules/ROOT/pages/beanstalk-component.adoc b/docs/components/modules/ROOT/pages/beanstalk-component.adoc
index 1ce65f7..6e53481 100644
--- a/docs/components/modules/ROOT/pages/beanstalk-component.adoc
+++ b/docs/components/modules/ROOT/pages/beanstalk-component.adoc
@@ -69,7 +69,7 @@ The Beanstalk component supports 4 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *connectionSettings Factory* (common) | Custom ConnectionSettingsFactory. Specify which ConnectionSettingsFactory to use to make connections to Beanstalkd. Especially useful for unit testing without beanstalkd daemon (you can mock ConnectionSettings) |  | ConnectionSettingsFactory
+| *connectionSettingsFactory* (common) | Custom ConnectionSettingsFactory. Specify which ConnectionSettingsFactory to use to make connections to Beanstalkd. Especially useful for unit testing without beanstalkd daemon (you can mock ConnectionSettings) |  | ConnectionSettingsFactory
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/cometd-component.adoc b/docs/components/modules/ROOT/pages/cometd-component.adoc
index 0a6bd19..6ea1690 100644
--- a/docs/components/modules/ROOT/pages/cometd-component.adoc
+++ b/docs/components/modules/ROOT/pages/cometd-component.adoc
@@ -67,7 +67,7 @@ The CometD component supports 10 options, which are listed below.
 | *securityPolicy* (security) | To use a custom configured SecurityPolicy to control authorization |  | SecurityPolicy
 | *extensions* (common) | To use a list of custom BayeuxServer.Extension that allows modifying incoming and outgoing requests. |  | List
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/consul-component.adoc b/docs/components/modules/ROOT/pages/consul-component.adoc
index 4d76edb..98ac11b 100644
--- a/docs/components/modules/ROOT/pages/consul-component.adoc
+++ b/docs/components/modules/ROOT/pages/consul-component.adoc
@@ -51,7 +51,7 @@ The Consul component supports 11 options, which are listed below.
 | *url* (common) | The Consul agent URL |  | String
 | *datacenter* (common) | The data center |  | String
 | *sslContextParameters* (common) | SSL configuration using an org.apache.camel.support.jsse.SSLContextParameters instance. |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *aclToken* (common) | Sets the ACL token to be used with Consul |  | String
 | *userName* (common) | Sets the username to be used for basic authentication |  | String
 | *password* (common) | Sets the password to be used for basic authentication |  | String
diff --git a/docs/components/modules/ROOT/pages/crypto-cms-component.adoc b/docs/components/modules/ROOT/pages/crypto-cms-component.adoc
index 58e9047..acf9d3c 100644
--- a/docs/components/modules/ROOT/pages/crypto-cms-component.adoc
+++ b/docs/components/modules/ROOT/pages/crypto-cms-component.adoc
@@ -90,15 +90,15 @@ with the following path and query parameters:
 | *password* (decrypt) | Sets the password of the private keys. It is assumed that all private keys in the keystore have the same password. If not set then it is assumed that the password of the private keys is given by the keystore password given in the KeyStoreParameters. |  | char[]
 | *fromBase64* (decrypt_verify) | If true then the CMS message is base 64 encoded and must be decoded during the processing. Default value is false. | false | boolean
 | *contentEncryptionAlgorithm* (encrypt) | Encryption algorithm, for example DESede/CBC/PKCS5Padding. Further possible values: DESede/CBC/PKCS5Padding, AES/CBC/PKCS5Padding, Camellia/CBC/PKCS5Padding, CAST5/CBC/PKCS5Padding. |  | String
-| *originatorInformation Provider* (encrypt) | Provider for the originator info. See \https://tools.ietf.org/html/rfc5652#section-6.1. The default value is null. |  | OriginatorInformationProvider
+| *originatorInformationProvider* (encrypt) | Provider for the originator info. See \https://tools.ietf.org/html/rfc5652#section-6.1. The default value is null. |  | OriginatorInformationProvider
 | *recipient* (encrypt) | Recipient Info: reference to a bean which implements the interface org.apache.camel.component.crypto.cms.api.TransRecipientInfo |  | List
 | *secretKeyLength* (encrypt) | Key length for the secret symmetric key used for the content encryption. Only used if the specified content-encryption algorithm allows keys of different sizes. If contentEncryptionAlgorithm=AES/CBC/PKCS5Padding or Camellia/CBC/PKCS5Padding then 128; if contentEncryptionAlgorithm=DESede/CBC/PKCS5Padding then 192, 128; if strong encryption is enabled then for AES/CBC/PKCS5Padding and Camellia/CBC/PKCS5Padding also the key lengths 192 and 256 are possible. |  | int
-| *unprotectedAttributes GeneratorProvider* (encrypt) | Provider of the generator for the unprotected attributes. The default value is null which means no unprotected attribute is added to the Enveloped Data object. See \https://tools.ietf.org/html/rfc5652#section-6.1. |  | AttributesGeneratorProvider
+| *unprotectedAttributesGenerator Provider* (encrypt) | Provider of the generator for the unprotected attributes. The default value is null which means no unprotected attribute is added to the Enveloped Data object. See \https://tools.ietf.org/html/rfc5652#section-6.1. |  | AttributesGeneratorProvider
 | *toBase64* (encrypt_sign) | Indicates whether the Signed Data or Enveloped Data instance shall be base 64 encoded. Default value is false. | false | Boolean
 | *includeContent* (sign) | Indicates whether the signed content should be included into the Signed Data instance. If false then a detached Signed Data instance is created in the header CamelCryptoCmsSignedData. | true | Boolean
 | *signer* (sign) | Signer information: reference to bean(s) which implements org.apache.camel.component.crypto.cms.api.SignerInfo. Multiple values can be separated by comma |  | String
 | *signedDataHeaderBase64* (verify) | Indicates whether the value in the header CamelCryptoCmsSignedData is base64 encoded. Default value is false. Only relevant for detached signatures. In the detached signature case, the header contains the Signed Data object. | false | boolean
-| *verifySignaturesOfAll Signers* (verify) | If true then the signatures of all signers contained in the Signed Data object are verified. If false then only one signature whose signer info matches with one of the specified certificates is verified. Default value is true. | true | boolean
+| *verifySignaturesOfAllSigners* (verify) | If true then the signatures of all signers contained in the Signed Data object are verified. If false then only one signature whose signer info matches with one of the specified certificates is verified. Default value is true. | true | boolean
 |===
 // endpoint options: END
 // spring-boot-auto-configure options: START
diff --git a/docs/components/modules/ROOT/pages/cxf-component.adoc b/docs/components/modules/ROOT/pages/cxf-component.adoc
index 02a7785..3f0129c 100644
--- a/docs/components/modules/ROOT/pages/cxf-component.adoc
+++ b/docs/components/modules/ROOT/pages/cxf-component.adoc
@@ -97,7 +97,7 @@ The CXF component supports 6 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *allowStreaming* (advanced) | This option controls whether the CXF component, when running in PAYLOAD mode, will DOM parse the incoming messages into DOM Elements or keep the payload as a javax.xml.transform.Source object that would allow streaming in some cases. |  | Boolean
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -158,7 +158,7 @@ with the following path and query parameters:
 | *mergeProtocolHeaders* (advanced) | Whether to merge protocol headers. If enabled then propagating headers between Camel and CXF becomes more consistent and similar. For more details see CAMEL-6393. | false | boolean
 | *mtomEnabled* (advanced) | To enable MTOM (attachments). This requires to use POJO or PAYLOAD data format mode. | false | boolean
 | *properties* (advanced) | To set additional CXF options using the key/value pairs from the Map. For example to turn on stacktraces in SOAP faults, properties.faultStackTraceEnabled=true |  | Map
-| *skipPayloadMessagePart Check* (advanced) | Sets whether SOAP message validation should be disabled. | false | boolean
+| *skipPayloadMessagePartCheck* (advanced) | Sets whether SOAP message validation should be disabled. | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *loggingFeatureEnabled* (logging) | This option enables CXF Logging Feature which writes inbound and outbound SOAP messages to log. | false | boolean
 | *loggingSizeLimit* (logging) | To limit the total size of number of bytes the logger will output when logging feature has been enabled and -1 for no limit. | 49152 | int
diff --git a/docs/components/modules/ROOT/pages/cxfrs-component.adoc b/docs/components/modules/ROOT/pages/cxfrs-component.adoc
index 8ed7bde..b9476f5 100644
--- a/docs/components/modules/ROOT/pages/cxfrs-component.adoc
+++ b/docs/components/modules/ROOT/pages/cxfrs-component.adoc
@@ -60,7 +60,7 @@ The CXF-RS component supports 5 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -117,7 +117,7 @@ with the following path and query parameters:
 | *sslContextParameters* (producer) | The Camel SSL setting reference. Use the # notation to reference the SSL Context. |  | SSLContextParameters
 | *throwExceptionOnFailure* (producer) | This option tells the CxfRsProducer to inspect return codes and will generate an Exception if the return code is larger than 207. | true | boolean
 | *httpClientAPI* (producer) | If it is true, the CxfRsProducer will use the HttpClientAPI to invoke the service. If it is false, the CxfRsProducer will use the ProxyClientAPI to invoke the service | true | boolean
-| *ignoreDeleteMethodMessage Body* (producer) | This option is used to tell CxfRsProducer to ignore the message body of the DELETE method when using HTTP API. | false | boolean
+| *ignoreDeleteMethodMessageBody* (producer) | This option is used to tell CxfRsProducer to ignore the message body of the DELETE method when using HTTP API. | false | boolean
 | *maxClientCacheSize* (producer) | This option allows you to configure the maximum size of the cache. The implementation caches CXF clients or ClientFactoryBean in CxfProvider and CxfRsProvider. | 10 | int
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *binding* (advanced) | To use a custom CxfBinding to control the binding between Camel Message and CXF Message. |  | CxfRsBinding
diff --git a/docs/components/modules/ROOT/pages/debezium-mongodb-component.adoc b/docs/components/modules/ROOT/pages/debezium-mongodb-component.adoc
index 638d904..3026004 100644
--- a/docs/components/modules/ROOT/pages/debezium-mongodb-component.adoc
+++ b/docs/components/modules/ROOT/pages/debezium-mongodb-component.adoc
@@ -91,7 +91,7 @@ with the following path and query parameters:
 | *offsetStorage* (consumer) | The name of the Java class that is responsible for persistence of connector offsets. | org.apache.kafka.connect.storage.FileOffsetBackingStore | String
 | *offsetStorageFileName* (consumer) | Path to file where offsets are to be stored. Required when offset.storage is set to the FileOffsetBackingStore |  | String
 | *offsetStoragePartitions* (consumer) | The number of partitions used when creating the offset storage topic. Required when offset.storage is set to the 'KafkaOffsetBackingStore'. |  | int
-| *offsetStorageReplication Factor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
+| *offsetStorageReplicationFactor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
 | *offsetStorageTopic* (consumer) | The name of the Kafka topic where offsets are to be stored. Required when offset.storage is set to the KafkaOffsetBackingStore. |  | String
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
@@ -99,7 +99,7 @@ with the following path and query parameters:
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *collectionBlacklist* (mongodb) | Description is not available here, please check Debezium website for corresponding key 'collection.blacklist' description. |  | String
 | *collectionWhitelist* (mongodb) | The collections for which changes are to be captured |  | String
-| *connectBackoffInitialDelay Ms* (mongodb) | The initial delay when trying to reconnect to a primary after a connection cannot be made or when no primary is available. Defaults to 1 second (1000 ms). | 1000 | long
+| *connectBackoffInitialDelayMs* (mongodb) | The initial delay when trying to reconnect to a primary after a connection cannot be made or when no primary is available. Defaults to 1 second (1000 ms). | 1000 | long
 | *connectBackoffMaxDelayMs* (mongodb) | The maximum delay when trying to reconnect to a primary after a connection cannot be made or when no primary is available. Defaults to 120 second (120,000 ms). | 120000 | long
 | *connectMaxAttempts* (mongodb) | Maximum number of failed connection attempts to a replica set primary before an exception occurs and task is aborted. Defaults to 16, which with the defaults for 'connect.backoff.initial.delay.ms' and 'connect.backoff.max.delay.ms' results in just over 20 minutes of attempts before failing. | 16 | int
 | *databaseBlacklist* (mongodb) | The databases for which changes are to be excluded |  | String
diff --git a/docs/components/modules/ROOT/pages/debezium-mysql-component.adoc b/docs/components/modules/ROOT/pages/debezium-mysql-component.adoc
index e35ff66..faddeda 100644
--- a/docs/components/modules/ROOT/pages/debezium-mysql-component.adoc
+++ b/docs/components/modules/ROOT/pages/debezium-mysql-component.adoc
@@ -98,7 +98,7 @@ with the following path and query parameters:
 | *offsetStorage* (consumer) | The name of the Java class that is responsible for persistence of connector offsets. | org.apache.kafka.connect.storage.FileOffsetBackingStore | String
 | *offsetStorageFileName* (consumer) | Path to file where offsets are to be stored. Required when offset.storage is set to the FileOffsetBackingStore |  | String
 | *offsetStoragePartitions* (consumer) | The number of partitions used when creating the offset storage topic. Required when offset.storage is set to the 'KafkaOffsetBackingStore'. |  | int
-| *offsetStorageReplication Factor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
+| *offsetStorageReplicationFactor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
 | *offsetStorageTopic* (consumer) | The name of the Kafka topic where offsets are to be stored. Required when offset.storage is set to the KafkaOffsetBackingStore. |  | String
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
@@ -113,11 +113,11 @@ with the following path and query parameters:
 | *databaseBlacklist* (mysql) | Description is not available here, please check Debezium website for corresponding key 'database.blacklist' description. |  | String
 | *databaseHistory* (mysql) | The name of the DatabaseHistory class that should be used to store and recover database schema changes. The configuration properties for the history are prefixed with the 'database.history.' string. | io.debezium.relational.history.FileDatabaseHistory | String
 | *databaseHistoryFileFilename* (mysql) | The path to the file that will be used to record the database history |  | String
-| *databaseHistoryKafka BootstrapServers* (mysql) | A list of host/port pairs that the connector will use for establishing the initial connection to the Kafka cluster for retrieving database schema history previously stored by the connector. This should point to the same Kafka cluster used by the Kafka Connect process. |  | String
-| *databaseHistoryKafka RecoveryAttempts* (mysql) | The number of attempts in a row that no data are returned from Kafka before recover completes. The maximum amount of time to wait after receiving no data is (recovery.attempts) x (recovery.poll.interval.ms). | 100 | int
-| *databaseHistoryKafka RecoveryPollIntervalMs* (mysql) | The number of milliseconds to wait while polling for persisted data during recovery. | 100 | int
+| *databaseHistoryKafkaBootstrap Servers* (mysql) | A list of host/port pairs that the connector will use for establishing the initial connection to the Kafka cluster for retrieving database schema history previously stored by the connector. This should point to the same Kafka cluster used by the Kafka Connect process. |  | String
+| *databaseHistoryKafkaRecovery Attempts* (mysql) | The number of attempts in a row that no data are returned from Kafka before recover completes. The maximum amount of time to wait after receiving no data is (recovery.attempts) x (recovery.poll.interval.ms). | 100 | int
+| *databaseHistoryKafkaRecovery PollIntervalMs* (mysql) | The number of milliseconds to wait while polling for persisted data during recovery. | 100 | int
 | *databaseHistoryKafkaTopic* (mysql) | The name of the topic for the database schema history |  | String
-| *databaseHistorySkip UnparseableDdl* (mysql) | Controls the action Debezium will take when it meets a DDL statement in binlog, that it cannot parse.By default the connector will stop operating but by changing the setting it can ignore the statements which it cannot parse. If skipping is enabled then Debezium can miss metadata changes. | false | boolean
+| *databaseHistorySkipUnparseable Ddl* (mysql) | Controls the action Debezium will take when it meets a DDL statement in binlog, that it cannot parse.By default the connector will stop operating but by changing the setting it can ignore the statements which it cannot parse. If skipping is enabled then Debezium can miss metadata changes. | false | boolean
 | *databaseHistoryStoreOnly MonitoredTablesDdl* (mysql) | Controls what DDL will Debezium store in database history.By default (false) Debezium will store all incoming DDL statements. If set to truethen only DDL that manipulates a monitored table will be stored. | false | boolean
 | *databaseHostname* (mysql) | Resolvable hostname or IP address of the MySQL database server. |  | String
 | *databaseInitialStatements* (mysql) | A semicolon separated list of SQL statements to be executed when a JDBC connection (not binlog reading connection) to the database is established. Note that the connector may establish JDBC connections at its own discretion, so this should typically be used for configuration of session parameters only,but not for executing DML statements. Use doubled semicolon (';;') to use a semicolon as a character and not as a delimiter. |  | String
@@ -131,7 +131,7 @@ with the following path and query parameters:
 | *databaseSslKeystorePassword* (mysql) | Password to access the private key from the keystore file specified by 'ssl.keystore' configuration property or the 'javax.net.ssl.keyStore' system or JVM property. This password is used to unlock the keystore file (store password), and to decrypt the private key stored in the keystore (key password). |  | String
 | *databaseSslMode* (mysql) | Whether to use an encrypted connection to MySQL. Options include'disabled' (the default) to use an unencrypted connection; 'preferred' to establish a secure (encrypted) connection if the server supports secure connections, but fall back to an unencrypted connection otherwise; 'required' to use a secure (encrypted) connection, and fail if one cannot be established; 'verify_ca' like 'required' but additionally verify the server TLS certificate against the conf [...]
 | *databaseSslTruststore* (mysql) | Location of the Java truststore file containing the collection of CA certificates trusted by this application process (trust store). |  | String
-| *databaseSslTruststore Password* (mysql) | Password to unlock the keystore file (store password) specified by 'ssl.trustore' configuration property or the 'javax.net.ssl.trustStore' system or JVM property. |  | String
+| *databaseSslTruststorePassword* (mysql) | Password to unlock the keystore file (store password) specified by 'ssl.trustore' configuration property or the 'javax.net.ssl.trustStore' system or JVM property. |  | String
 | *databaseUser* (mysql) | Name of the MySQL database user to be used when connecting to the database. |  | String
 | *databaseWhitelist* (mysql) | The databases for which changes are to be captured |  | String
 | *decimalHandlingMode* (mysql) | Specify how DECIMAL and NUMERIC columns should be represented in change events, including:'precise' (the default) uses java.math.BigDecimal to represent values, which are encoded in the change events using a binary representation and Kafka Connect's 'org.apache.kafka.connect.data.Decimal' type; 'string' uses string to represent values; 'double' represents values using Java's 'double', which may not offer the precision but will be far easier to use in con [...]
@@ -145,7 +145,7 @@ with the following path and query parameters:
 | *heartbeatTopicsPrefix* (mysql) | The prefix that is used to name heartbeat topics.Defaults to __debezium-heartbeat. | __debezium-heartbeat | String
 | *includeQuery* (mysql) | Whether the connector should include the original SQL query that generated the change event. Note: This option requires MySQL be configured with the binlog_rows_query_log_events option set to ON. Query will not be present for events generated from snapshot. WARNING: Enabling this option may expose tables or fields explicitly blacklisted or masked by including the original SQL statement in the change event. For this reason the default value is 'false'. | false | [...]
 | *includeSchemaChanges* (mysql) | Whether the connector should publish changes in the database schema to a Kafka topic with the same name as the database server ID. Each schema change will be recorded using a key that contains the database name and whose value includes the DDL statement(s).The default is 'true'. This is independent of how the connector internally records database history. | true | boolean
-| *inconsistentSchemaHandling Mode* (mysql) | Specify how binlog events that belong to a table missing from internal schema representation (i.e. internal representation is not consistent with database) should be handled, including:'fail' (the default) an exception indicating the problematic event and its binlog position is raised, causing the connector to be stopped; 'warn' the problematic event and its binlog position will be logged and the event will be skipped;'ignore' the problematic [...]
+| *inconsistentSchemaHandlingMode* (mysql) | Specify how binlog events that belong to a table missing from internal schema representation (i.e. internal representation is not consistent with database) should be handled, including:'fail' (the default) an exception indicating the problematic event and its binlog position is raised, causing the connector to be stopped; 'warn' the problematic event and its binlog position will be logged and the event will be skipped;'ignore' the problematic  [...]
 | *maxBatchSize* (mysql) | Maximum size of each batch of source records. Defaults to 2048. | 2048 | int
 | *maxQueueSize* (mysql) | Maximum size of the queue for change events read from the database log but not yet recorded or forwarded. Defaults to 8192, and should always be larger than the maximum batch size. | 8192 | int
 | *messageKeyColumns* (mysql) | A semicolon-separated list of expressions that match fully-qualified tables and column(s) to be used as message key. Each expression must match the pattern ':',where the table names could be defined as (DB_NAME.TABLE_NAME) or (SCHEMA_NAME.TABLE_NAME), depending on the specific connector,and the key columns are a comma-separated list of columns representing the custom key. For any table without an explicit key configuration the table's primary key column(s) [...]
diff --git a/docs/components/modules/ROOT/pages/debezium-postgres-component.adoc b/docs/components/modules/ROOT/pages/debezium-postgres-component.adoc
index b6a34b1..6dacfa1 100644
--- a/docs/components/modules/ROOT/pages/debezium-postgres-component.adoc
+++ b/docs/components/modules/ROOT/pages/debezium-postgres-component.adoc
@@ -89,7 +89,7 @@ with the following path and query parameters:
 | *offsetStorage* (consumer) | The name of the Java class that is responsible for persistence of connector offsets. | org.apache.kafka.connect.storage.FileOffsetBackingStore | String
 | *offsetStorageFileName* (consumer) | Path to file where offsets are to be stored. Required when offset.storage is set to the FileOffsetBackingStore |  | String
 | *offsetStoragePartitions* (consumer) | The number of partitions used when creating the offset storage topic. Required when offset.storage is set to the 'KafkaOffsetBackingStore'. |  | int
-| *offsetStorageReplication Factor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
+| *offsetStorageReplicationFactor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
 | *offsetStorageTopic* (consumer) | The name of the Kafka topic where offsets are to be stored. Required when offset.storage is set to the KafkaOffsetBackingStore. |  | String
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
diff --git a/docs/components/modules/ROOT/pages/debezium-sqlserver-component.adoc b/docs/components/modules/ROOT/pages/debezium-sqlserver-component.adoc
index 823673a..433f97e 100644
--- a/docs/components/modules/ROOT/pages/debezium-sqlserver-component.adoc
+++ b/docs/components/modules/ROOT/pages/debezium-sqlserver-component.adoc
@@ -88,7 +88,7 @@ with the following path and query parameters:
 | *offsetStorage* (consumer) | The name of the Java class that is responsible for persistence of connector offsets. | org.apache.kafka.connect.storage.FileOffsetBackingStore | String
 | *offsetStorageFileName* (consumer) | Path to file where offsets are to be stored. Required when offset.storage is set to the FileOffsetBackingStore |  | String
 | *offsetStoragePartitions* (consumer) | The number of partitions used when creating the offset storage topic. Required when offset.storage is set to the 'KafkaOffsetBackingStore'. |  | int
-| *offsetStorageReplication Factor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
+| *offsetStorageReplicationFactor* (consumer) | Replication factor used when creating the offset storage topic. Required when offset.storage is set to the KafkaOffsetBackingStore |  | int
 | *offsetStorageTopic* (consumer) | The name of the Kafka topic where offsets are to be stored. Required when offset.storage is set to the KafkaOffsetBackingStore. |  | String
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
@@ -98,9 +98,9 @@ with the following path and query parameters:
 | *databaseDbname* (sqlserver) | The name of the database the connector should be monitoring. When working with a multi-tenant set-up, must be set to the CDB name. |  | String
 | *databaseHistory* (sqlserver) | The name of the DatabaseHistory class that should be used to store and recover database schema changes. The configuration properties for the history are prefixed with the 'database.history.' string. | io.debezium.relational.history.FileDatabaseHistory | String
 | *databaseHistoryFileFilename* (sqlserver) | The path to the file that will be used to record the database history |  | String
-| *databaseHistoryKafka BootstrapServers* (sqlserver) | A list of host/port pairs that the connector will use for establishing the initial connection to the Kafka cluster for retrieving database schema history previously stored by the connector. This should point to the same Kafka cluster used by the Kafka Connect process. |  | String
-| *databaseHistoryKafka RecoveryAttempts* (sqlserver) | The number of attempts in a row that no data are returned from Kafka before recover completes. The maximum amount of time to wait after receiving no data is (recovery.attempts) x (recovery.poll.interval.ms). | 100 | int
-| *databaseHistoryKafka RecoveryPollIntervalMs* (sqlserver) | The number of milliseconds to wait while polling for persisted data during recovery. | 100 | int
+| *databaseHistoryKafkaBootstrap Servers* (sqlserver) | A list of host/port pairs that the connector will use for establishing the initial connection to the Kafka cluster for retrieving database schema history previously stored by the connector. This should point to the same Kafka cluster used by the Kafka Connect process. |  | String
+| *databaseHistoryKafkaRecovery Attempts* (sqlserver) | The number of attempts in a row that no data are returned from Kafka before recover completes. The maximum amount of time to wait after receiving no data is (recovery.attempts) x (recovery.poll.interval.ms). | 100 | int
+| *databaseHistoryKafkaRecovery PollIntervalMs* (sqlserver) | The number of milliseconds to wait while polling for persisted data during recovery. | 100 | int
 | *databaseHistoryKafkaTopic* (sqlserver) | The name of the topic for the database schema history |  | String
 | *databaseHostname* (sqlserver) | Resolvable hostname or IP address of the SQL Server database server. |  | String
 | *databasePassword* (sqlserver) | *Required* Password of the SQL Server database user to be used when connecting to the database. |  | String
diff --git a/docs/components/modules/ROOT/pages/disruptor-component.adoc b/docs/components/modules/ROOT/pages/disruptor-component.adoc
index 1e91b15..9d2f851 100644
--- a/docs/components/modules/ROOT/pages/disruptor-component.adoc
+++ b/docs/components/modules/ROOT/pages/disruptor-component.adoc
@@ -107,8 +107,8 @@ The Disruptor component supports 10 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *defaultConcurrent Consumers* (consumer) | To configure the default number of concurrent consumers | 1 | int
-| *defaultMultiple Consumers* (consumer) | To configure the default value for multiple consumers | false | boolean
+| *defaultConcurrentConsumers* (consumer) | To configure the default number of concurrent consumers | 1 | int
+| *defaultMultipleConsumers* (consumer) | To configure the default value for multiple consumers | false | boolean
 | *defaultProducerType* (producer) | To configure the default value for DisruptorProducerType The default value is Multi. | Multi | DisruptorProducerType
 | *defaultWaitStrategy* (consumer) | To configure the default value for DisruptorWaitStrategy The default value is Blocking. | Blocking | DisruptorWaitStrategy
 | *defaultBlockWhenFull* (producer) | To configure the default value for block when full The default value is true. | true | boolean
diff --git a/docs/components/modules/ROOT/pages/ehcache-component.adoc b/docs/components/modules/ROOT/pages/ehcache-component.adoc
index ffe94b7..e304b2b 100644
--- a/docs/components/modules/ROOT/pages/ehcache-component.adoc
+++ b/docs/components/modules/ROOT/pages/ehcache-component.adoc
@@ -52,7 +52,7 @@ The Ehcache component supports 9 options, which are listed below.
 | Name | Description | Default | Type
 | *configuration* (advanced) | Sets the global component configuration |  | EhcacheConfiguration
 | *cacheManager* (common) | The cache manager |  | CacheManager
-| *cacheManager Configuration* (common) | The cache manager configuration |  | Configuration
+| *cacheManagerConfiguration* (common) | The cache manager configuration |  | Configuration
 | *cacheConfiguration* (common) | The default cache configuration to be used to create caches. |  | CacheConfiguration
 | *cachesConfigurations* (common) | A map of caches configurations to be used to create caches. |  | Map
 | *cacheConfigurationUri* (common) | URI pointing to the Ehcache XML configuration file's location |  | String
diff --git a/docs/components/modules/ROOT/pages/elytron-component.adoc b/docs/components/modules/ROOT/pages/elytron-component.adoc
index 4c97074..5cbe671 100644
--- a/docs/components/modules/ROOT/pages/elytron-component.adoc
+++ b/docs/components/modules/ROOT/pages/elytron-component.adoc
@@ -62,7 +62,7 @@ The Elytron component supports 11 options, which are listed below.
 | *elytronProvider* (advanced) | Elytron security provider, has to support mechanism from parameter mechanismName. | instance of WildFlyElytronHttpBearerProvider | WildFlyElytronBaseProvider
 | *undertowHttpBinding* (advanced) | To use a custom HttpBinding to control the mapping between Camel message and HttpClient. |  | UndertowHttpBinding
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *hostOptions* (advanced) | To configure common options, such as thread pools |  | UndertowHostOptions
 | *muteException* (consumer) | If enabled and an Exchange failed processing on the consumer side the response's body won't contain the exception's stack trace. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
diff --git a/docs/components/modules/ROOT/pages/etcd-component.adoc b/docs/components/modules/ROOT/pages/etcd-component.adoc
index 2014c1b..7f1ed14 100644
--- a/docs/components/modules/ROOT/pages/etcd-component.adoc
+++ b/docs/components/modules/ROOT/pages/etcd-component.adoc
@@ -35,7 +35,7 @@ The Etcd component supports 9 options, which are listed below.
 | *userName* (common) | The user name to use for basic authentication. |  | String
 | *password* (common) | The password to use for basic authentication. |  | String
 | *configuration* (advanced) | Sets the common configuration shared among endpoints |  | EtcdConfiguration
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/file-component.adoc b/docs/components/modules/ROOT/pages/file-component.adoc
index 0156d64..2f36ca1 100644
--- a/docs/components/modules/ROOT/pages/file-component.adoc
+++ b/docs/components/modules/ROOT/pages/file-component.adoc
@@ -114,7 +114,7 @@ with the following path and query parameters:
 | *extendedAttributes* (consumer) | To define which file attributes of interest. Like posix:permissions,posix:owner,basic:lastAccessTime, it supports basic wildcard like posix:, basic:lastAccessTime |  | String
 | *inProgressRepository* (consumer) | A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files being consumed. By default a memory based repository is used. |  | IdempotentRepository
 | *localWorkDirectory* (consumer) | When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume a very big remote file and thus can conserve memory. |  | String
-| *onCompletionException Handler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
+| *onCompletionExceptionHandler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
 | *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
 | *probeContentType* (consumer) | Whether to enable probing of the content type. If enable then the consumer uses Files#probeContentType(java.nio.file.Path) to determine the content-type of the file, and store that as a header with key Exchange#FILE_CONTENT_TYPE on the Message. | false | boolean
 | *processStrategy* (consumer) | A pluggable org.apache.camel.component.file.GenericFileProcessStrategy allowing you to implement your own readLock option or similar. Can also be used when special conditions must be met before a file can be consumed, such as a special ready file exists. If this option is set then the readLock option does not apply. |  | GenericFileProcessStrategy
@@ -177,10 +177,10 @@ with the following path and query parameters:
  
 Notice: The various read locks is not all suited to work in clustered mode, where concurrent consumers on different nodes is competing for the same files on a shared file system. The markerFile using a close to atomic operation to create the empty marker file, but its not guaranteed to work in a cluster. The fileLock may work better but then the file system need to support distributed file locks, and so on. Using the idempotent read lock can support clustering if the idempotent repositor [...]
 | *readLockCheckInterval* (lock) | Interval in millis for the read-lock, if supported by the read lock. This interval is used for sleeping between attempts to acquire the read lock. For example when using the changed read lock, you can set a higher interval period to cater for slow writes. The default of 1 sec. may be too fast if the producer is very slow writing the file. Notice: For FTP the default readLockCheckInterval is 5000. The readLockTimeout value must be higher than readLockChe [...]
-| *readLockDeleteOrphanLock Files* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
-| *readLockIdempotentRelease Async* (lock) | Whether the delayed release task should be synchronous or asynchronous. See more details at the readLockIdempotentReleaseDelay option. | false | boolean
-| *readLockIdempotentRelease AsyncPoolSize* (lock) | The number of threads in the scheduled thread pool when using asynchronous release tasks. Using a default of 1 core threads should be sufficient in almost all use-cases, only set this to a higher value if either updating the idempotent repository is slow, or there are a lot of files to process. This option is not in-use if you use a shared thread pool by configuring the readLockIdempotentReleaseExecutorService option. See more details  [...]
-| *readLockIdempotentRelease Delay* (lock) | Whether to delay the release task for a period of millis. This can be used to delay the release tasks to expand the window when a file is regarded as read-locked, in an active/active cluster scenario with a shared idempotent repository, to ensure other nodes cannot potentially scan and acquire the same file, due to race-conditions. By expanding the time-window of the release tasks helps prevents these situations. Note delaying is only needed i [...]
+| *readLockDeleteOrphanLockFiles* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
+| *readLockIdempotentReleaseAsync* (lock) | Whether the delayed release task should be synchronous or asynchronous. See more details at the readLockIdempotentReleaseDelay option. | false | boolean
+| *readLockIdempotentReleaseAsync PoolSize* (lock) | The number of threads in the scheduled thread pool when using asynchronous release tasks. Using a default of 1 core threads should be sufficient in almost all use-cases, only set this to a higher value if either updating the idempotent repository is slow, or there are a lot of files to process. This option is not in-use if you use a shared thread pool by configuring the readLockIdempotentReleaseExecutorService option. See more details  [...]
+| *readLockIdempotentReleaseDelay* (lock) | Whether to delay the release task for a period of millis. This can be used to delay the release tasks to expand the window when a file is regarded as read-locked, in an active/active cluster scenario with a shared idempotent repository, to ensure other nodes cannot potentially scan and acquire the same file, due to race-conditions. By expanding the time-window of the release tasks helps prevents these situations. Note delaying is only needed if [...]
 | *readLockIdempotentRelease ExecutorService* (lock) | To use a custom and shared thread pool for asynchronous release tasks. See more details at the readLockIdempotentReleaseDelay option. |  | ScheduledExecutorService
 | *readLockLoggingLevel* (lock) | Logging level used when a read lock could not be acquired. By default a DEBUG is logged. You can change this level, for example to OFF to not have any logging. This option is only applicable for readLock of types: changed, fileLock, idempotent, idempotent-changed, idempotent-rename, rename. | DEBUG | LoggingLevel
 | *readLockMarkerFile* (lock) | Whether to use marker file with the changed, rename, or exclusive read lock types. By default a marker file is used as well to guard against other processes picking up the same files. This behavior can be turned off by setting this option to false. For example if you do not want to write marker files to the file systems by the Camel application. | true | boolean
diff --git a/docs/components/modules/ROOT/pages/ftp-component.adoc b/docs/components/modules/ROOT/pages/ftp-component.adoc
index ec1bd77..7f3defe 100644
--- a/docs/components/modules/ROOT/pages/ftp-component.adoc
+++ b/docs/components/modules/ROOT/pages/ftp-component.adoc
@@ -121,7 +121,7 @@ with the following path and query parameters:
 | *fileName* (common) | Use Expression such as File Language to dynamically set the filename. For consumers, it's used as a filename filter. For producers, it's used to evaluate the filename to write. If an expression is set, it take precedence over the CamelFileName header. (Note: The header itself can also be an Expression). The expression options support both String and Expression types. If the expression is a String type, it is always evaluated using the File Language. If the express [...]
 | *passiveMode* (common) | Sets passive mode connections. Default is active mode connections. | false | boolean
 | *separator* (common) | Sets the path separator to be used. UNIX = Uses unix style path separator Windows = Uses windows style path separator Auto = (is default) Use existing path separator in file name | UNIX | PathSeparator
-| *transferLoggingInterval Seconds* (common) | Configures the interval in seconds to use when logging the progress of upload and download operations that are in-flight. This is used for logging progress when operations takes longer time. | 5 | int
+| *transferLoggingIntervalSeconds* (common) | Configures the interval in seconds to use when logging the progress of upload and download operations that are in-flight. This is used for logging progress when operations takes longer time. | 5 | int
 | *transferLoggingLevel* (common) | Configure the logging level to use when logging the progress of upload and download operations. | DEBUG | LoggingLevel
 | *transferLoggingVerbose* (common) | Configures whether the perform verbose (fine grained) logging of the progress of upload and download operations. | false | boolean
 | *fastExistsCheck* (common) | If set this option to be true, camel-\ftp will use the list file directly to check if the file exists. Since some FTP server may not support to list the file directly, if the option is false, camel-\ftp will use the old way to list the directory and check if the file exists. This option also influences readLock=changed to control whether it performs a fast check to update file information or not. This can be used to speed up the process if the FTP server ha [...]
@@ -138,11 +138,11 @@ with the following path and query parameters:
 | *download* (consumer) | Whether the FTP consumer should download the file. If this option is set to false, then the message body will be null, but the consumer will still trigger a Camel Exchange that has details about the file such as file name, file size, etc. It's just that the file will not be downloaded. | false | boolean
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
-| *handleDirectoryParser AbsoluteResult* (consumer) | Allows you to set how the consumer will handle subfolders and files in the path if the directory parser results in with absolute paths The reason for this is that some FTP servers may return file names with absolute paths, and if so then the FTP component needs to handle this by converting the returned path into a relative path. | false | boolean
-| *ignoreFileNotFoundOr PermissionError* (consumer) | Whether to ignore when (trying to list files in directories or when downloading a file), which does not exist or due to permission error. By default when a directory or file does not exists or insufficient permission, then an exception is thrown. Setting this option to true allows to ignore that instead. | false | boolean
+| *handleDirectoryParserAbsolute Result* (consumer) | Allows you to set how the consumer will handle subfolders and files in the path if the directory parser results in with absolute paths The reason for this is that some FTP servers may return file names with absolute paths, and if so then the FTP component needs to handle this by converting the returned path into a relative path. | false | boolean
+| *ignoreFileNotFoundOrPermission Error* (consumer) | Whether to ignore when (trying to list files in directories or when downloading a file), which does not exist or due to permission error. By default when a directory or file does not exists or insufficient permission, then an exception is thrown. Setting this option to true allows to ignore that instead. | false | boolean
 | *inProgressRepository* (consumer) | A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files being consumed. By default a memory based repository is used. |  | IdempotentRepository
 | *localWorkDirectory* (consumer) | When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume a very big remote file and thus can conserve memory. |  | String
-| *onCompletionException Handler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
+| *onCompletionExceptionHandler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
 | *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
 | *processStrategy* (consumer) | A pluggable org.apache.camel.component.file.GenericFileProcessStrategy allowing you to implement your own readLock option or similar. Can also be used when special conditions must be met before a file can be consumed, such as a special ready file exists. If this option is set then the readLock option does not apply. |  | GenericFileProcessStrategy
 | *useList* (consumer) | Whether to allow using LIST command when downloading a file. Default is true. In some use cases you may want to download a specific file and are not allowed to use the LIST command, and therefore you can set this option to false. Notice when using this option, then the specific file to download does not include meta-data information such as file size, timestamp, permissions etc, because those information is only possible to retrieve when LIST command is in use. | [...]
@@ -175,7 +175,7 @@ with the following path and query parameters:
 | *soTimeout* (advanced) | Sets the so timeout FTP and FTPS Only for Camel 2.4. SFTP for Camel 2.14.3/2.15.3/2.16 onwards. Is the SocketOptions.SO_TIMEOUT value in millis. Recommended option is to set this to 300000 so as not have a hanged connection. On SFTP this option is set as timeout on the JSCH Session instance. | 300000 | int
 | *stepwise* (advanced) | Sets whether we should stepwise change directories while traversing file structures when downloading files, or as well when uploading a file to a directory. You can disable this if you for example are in a situation where you cannot change directory on the FTP server due security reasons. | true | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
-| *throwExceptionOnConnect Failed* (advanced) | Should an exception be thrown if connection failed (exhausted) By default exception is not thrown and a WARN is logged. You can use this to enable exception being thrown and handle the thrown exception from the org.apache.camel.spi.PollingConsumerPollStrategy rollback method. | false | boolean
+| *throwExceptionOnConnectFailed* (advanced) | Should an exception be thrown if connection failed (exhausted) By default exception is not thrown and a WARN is logged. You can use this to enable exception being thrown and handle the thrown exception from the org.apache.camel.spi.PollingConsumerPollStrategy rollback method. | false | boolean
 | *timeout* (advanced) | Sets the data timeout for waiting for reply Used only by FTPClient | 30000 | int
 | *antExclude* (filter) | Ant style filter exclusion. If both antInclude and antExclude are used, antExclude takes precedence over antInclude. Multiple exclusions may be specified in comma-delimited format. |  | String
 | *antFilterCaseSensitive* (filter) | Sets case sensitive flag on ant filter | true | boolean
@@ -196,7 +196,7 @@ with the following path and query parameters:
 | *exclusiveReadLockStrategy* (lock) | Pluggable read-lock as a org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy implementation. |  | GenericFileExclusiveReadLockStrategy
 | *readLock* (lock) | Used by consumer, to only poll the files if it has exclusive read-lock on the file (i.e. the file is not in-progress or being written). Camel will wait until the file lock is granted. This option provides the build in strategies: - none - No read lock is in use - markerFile - Camel creates a marker file (fileName.camelLock) and then holds a lock on it. This option is not available for the FTP component - changed - Changed is using file length/modification timestamp  [...]
 | *readLockCheckInterval* (lock) | Interval in millis for the read-lock, if supported by the read lock. This interval is used for sleeping between attempts to acquire the read lock. For example when using the changed read lock, you can set a higher interval period to cater for slow writes. The default of 1 sec. may be too fast if the producer is very slow writing the file. Notice: For FTP the default readLockCheckInterval is 5000. The readLockTimeout value must be higher than readLockChe [...]
-| *readLockDeleteOrphanLock Files* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
+| *readLockDeleteOrphanLockFiles* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
 | *readLockLoggingLevel* (lock) | Logging level used when a read lock could not be acquired. By default a DEBUG is logged. You can change this level, for example to OFF to not have any logging. This option is only applicable for readLock of types: changed, fileLock, idempotent, idempotent-changed, idempotent-rename, rename. | DEBUG | LoggingLevel
 | *readLockMarkerFile* (lock) | Whether to use marker file with the changed, rename, or exclusive read lock types. By default a marker file is used as well to guard against other processes picking up the same files. This behavior can be turned off by setting this option to false. For example if you do not want to write marker files to the file systems by the Camel application. | true | boolean
 | *readLockMinAge* (lock) | This option is applied only for readLock=changed. It allows to specify a minimum age the file must be before attempting to acquire the read lock. For example use readLockMinAge=300s to require the file is at last 5 minutes old. This can speedup the changed read lock as it will only attempt to acquire files which are at least that given age. | 0 | long
diff --git a/docs/components/modules/ROOT/pages/ftps-component.adoc b/docs/components/modules/ROOT/pages/ftps-component.adoc
index 4a2c8f1..832fecb 100644
--- a/docs/components/modules/ROOT/pages/ftps-component.adoc
+++ b/docs/components/modules/ROOT/pages/ftps-component.adoc
@@ -38,7 +38,7 @@ The FTPS component supports 4 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -80,7 +80,7 @@ with the following path and query parameters:
 | *fileName* (common) | Use Expression such as File Language to dynamically set the filename. For consumers, it's used as a filename filter. For producers, it's used to evaluate the filename to write. If an expression is set, it take precedence over the CamelFileName header. (Note: The header itself can also be an Expression). The expression options support both String and Expression types. If the expression is a String type, it is always evaluated using the File Language. If the express [...]
 | *passiveMode* (common) | Sets passive mode connections. Default is active mode connections. | false | boolean
 | *separator* (common) | Sets the path separator to be used. UNIX = Uses unix style path separator Windows = Uses windows style path separator Auto = (is default) Use existing path separator in file name | UNIX | PathSeparator
-| *transferLoggingInterval Seconds* (common) | Configures the interval in seconds to use when logging the progress of upload and download operations that are in-flight. This is used for logging progress when operations takes longer time. | 5 | int
+| *transferLoggingIntervalSeconds* (common) | Configures the interval in seconds to use when logging the progress of upload and download operations that are in-flight. This is used for logging progress when operations takes longer time. | 5 | int
 | *transferLoggingLevel* (common) | Configure the logging level to use when logging the progress of upload and download operations. | DEBUG | LoggingLevel
 | *transferLoggingVerbose* (common) | Configures whether the perform verbose (fine grained) logging of the progress of upload and download operations. | false | boolean
 | *fastExistsCheck* (common) | If set this option to be true, camel-\ftp will use the list file directly to check if the file exists. Since some FTP server may not support to list the file directly, if the option is false, camel-\ftp will use the old way to list the directory and check if the file exists. This option also influences readLock=changed to control whether it performs a fast check to update file information or not. This can be used to speed up the process if the FTP server ha [...]
@@ -97,11 +97,11 @@ with the following path and query parameters:
 | *download* (consumer) | Whether the FTP consumer should download the file. If this option is set to false, then the message body will be null, but the consumer will still trigger a Camel Exchange that has details about the file such as file name, file size, etc. It's just that the file will not be downloaded. | false | boolean
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
-| *handleDirectoryParser AbsoluteResult* (consumer) | Allows you to set how the consumer will handle subfolders and files in the path if the directory parser results in with absolute paths The reason for this is that some FTP servers may return file names with absolute paths, and if so then the FTP component needs to handle this by converting the returned path into a relative path. | false | boolean
-| *ignoreFileNotFoundOr PermissionError* (consumer) | Whether to ignore when (trying to list files in directories or when downloading a file), which does not exist or due to permission error. By default when a directory or file does not exists or insufficient permission, then an exception is thrown. Setting this option to true allows to ignore that instead. | false | boolean
+| *handleDirectoryParserAbsolute Result* (consumer) | Allows you to set how the consumer will handle subfolders and files in the path if the directory parser results in with absolute paths The reason for this is that some FTP servers may return file names with absolute paths, and if so then the FTP component needs to handle this by converting the returned path into a relative path. | false | boolean
+| *ignoreFileNotFoundOrPermission Error* (consumer) | Whether to ignore when (trying to list files in directories or when downloading a file), which does not exist or due to permission error. By default when a directory or file does not exists or insufficient permission, then an exception is thrown. Setting this option to true allows to ignore that instead. | false | boolean
 | *inProgressRepository* (consumer) | A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files being consumed. By default a memory based repository is used. |  | IdempotentRepository
 | *localWorkDirectory* (consumer) | When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume a very big remote file and thus can conserve memory. |  | String
-| *onCompletionException Handler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
+| *onCompletionExceptionHandler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
 | *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
 | *processStrategy* (consumer) | A pluggable org.apache.camel.component.file.GenericFileProcessStrategy allowing you to implement your own readLock option or similar. Can also be used when special conditions must be met before a file can be consumed, such as a special ready file exists. If this option is set then the readLock option does not apply. |  | GenericFileProcessStrategy
 | *useList* (consumer) | Whether to allow using LIST command when downloading a file. Default is true. In some use cases you may want to download a specific file and are not allowed to use the LIST command, and therefore you can set this option to false. Notice when using this option, then the specific file to download does not include meta-data information such as file size, timestamp, permissions etc, because those information is only possible to retrieve when LIST command is in use. | [...]
@@ -134,7 +134,7 @@ with the following path and query parameters:
 | *soTimeout* (advanced) | Sets the so timeout FTP and FTPS Only for Camel 2.4. SFTP for Camel 2.14.3/2.15.3/2.16 onwards. Is the SocketOptions.SO_TIMEOUT value in millis. Recommended option is to set this to 300000 so as not have a hanged connection. On SFTP this option is set as timeout on the JSCH Session instance. | 300000 | int
 | *stepwise* (advanced) | Sets whether we should stepwise change directories while traversing file structures when downloading files, or as well when uploading a file to a directory. You can disable this if you for example are in a situation where you cannot change directory on the FTP server due security reasons. | true | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
-| *throwExceptionOnConnect Failed* (advanced) | Should an exception be thrown if connection failed (exhausted) By default exception is not thrown and a WARN is logged. You can use this to enable exception being thrown and handle the thrown exception from the org.apache.camel.spi.PollingConsumerPollStrategy rollback method. | false | boolean
+| *throwExceptionOnConnectFailed* (advanced) | Should an exception be thrown if connection failed (exhausted) By default exception is not thrown and a WARN is logged. You can use this to enable exception being thrown and handle the thrown exception from the org.apache.camel.spi.PollingConsumerPollStrategy rollback method. | false | boolean
 | *timeout* (advanced) | Sets the data timeout for waiting for reply Used only by FTPClient | 30000 | int
 | *antExclude* (filter) | Ant style filter exclusion. If both antInclude and antExclude are used, antExclude takes precedence over antInclude. Multiple exclusions may be specified in comma-delimited format. |  | String
 | *antFilterCaseSensitive* (filter) | Sets case sensitive flag on ant filter | true | boolean
@@ -155,7 +155,7 @@ with the following path and query parameters:
 | *exclusiveReadLockStrategy* (lock) | Pluggable read-lock as a org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy implementation. |  | GenericFileExclusiveReadLockStrategy
 | *readLock* (lock) | Used by consumer, to only poll the files if it has exclusive read-lock on the file (i.e. the file is not in-progress or being written). Camel will wait until the file lock is granted. This option provides the build in strategies: - none - No read lock is in use - markerFile - Camel creates a marker file (fileName.camelLock) and then holds a lock on it. This option is not available for the FTP component - changed - Changed is using file length/modification timestamp  [...]
 | *readLockCheckInterval* (lock) | Interval in millis for the read-lock, if supported by the read lock. This interval is used for sleeping between attempts to acquire the read lock. For example when using the changed read lock, you can set a higher interval period to cater for slow writes. The default of 1 sec. may be too fast if the producer is very slow writing the file. Notice: For FTP the default readLockCheckInterval is 5000. The readLockTimeout value must be higher than readLockChe [...]
-| *readLockDeleteOrphanLock Files* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
+| *readLockDeleteOrphanLockFiles* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
 | *readLockLoggingLevel* (lock) | Logging level used when a read lock could not be acquired. By default a DEBUG is logged. You can change this level, for example to OFF to not have any logging. This option is only applicable for readLock of types: changed, fileLock, idempotent, idempotent-changed, idempotent-rename, rename. | DEBUG | LoggingLevel
 | *readLockMarkerFile* (lock) | Whether to use marker file with the changed, rename, or exclusive read lock types. By default a marker file is used as well to guard against other processes picking up the same files. This behavior can be turned off by setting this option to false. For example if you do not want to write marker files to the file systems by the Camel application. | true | boolean
 | *readLockMinAge* (lock) | This option is applied only for readLock=changed. It allows to specify a minimum age the file must be before attempting to acquire the read lock. For example use readLockMinAge=300s to require the file is at last 5 minutes old. This can speedup the changed read lock as it will only attempt to acquire files which are at least that given age. | 0 | long
@@ -184,8 +184,8 @@ with the following path and query parameters:
 | *disableSecureDataChannel Defaults* (security) | Use this option to disable default options when using secure data channel. This allows you to be in full control what the execPbsz and execProt setting should be used. Default is false | false | boolean
 | *execPbsz* (security) | When using secure data channel you can set the exec protection buffer size |  | Long
 | *execProt* (security) | The exec protection level PROT command. C - Clear S - Safe(SSL protocol only) E - Confidential(SSL protocol only) P - Private |  | String
-| *ftpClientKeyStore Parameters* (security) | Set the key store parameters |  | Map
-| *ftpClientTrustStore Parameters* (security) | Set the trust store parameters |  | Map
+| *ftpClientKeyStoreParameters* (security) | Set the key store parameters |  | Map
+| *ftpClientTrustStoreParameters* (security) | Set the trust store parameters |  | Map
 | *implicit* (security) | Set the security mode (Implicit/Explicit). true - Implicit Mode / False - Explicit Mode | false | boolean
 | *password* (security) | Password to use for login |  | String
 | *securityProtocol* (security) | Set the underlying security protocol. | TLSv1.2 | String
diff --git a/docs/components/modules/ROOT/pages/http-component.adoc b/docs/components/modules/ROOT/pages/http-component.adoc
index 17b1a7a..9517414 100644
--- a/docs/components/modules/ROOT/pages/http-component.adoc
+++ b/docs/components/modules/ROOT/pages/http-component.adoc
@@ -61,18 +61,18 @@ The HTTP component supports 19 options, which are listed below.
 | *clientConnectionManager* (advanced) | To use a custom and shared HttpClientConnectionManager to manage connections. If this has been configured then this is always used for all endpoints created by this component. |  | HttpClientConnectionManager
 | *httpContext* (advanced) | To use a custom org.apache.http.protocol.HttpContext when executing requests. |  | HttpContext
 | *sslContextParameters* (security) | To configure security using SSLContextParameters. Important: Only one instance of org.apache.camel.support.jsse.SSLContextParameters is supported per HttpComponent. If you need to use 2 or more different instances, you need to define a new HttpComponent per instance you need. |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *x509HostnameVerifier* (security) | To use a custom X509HostnameVerifier such as DefaultHostnameVerifier or NoopHostnameVerifier. |  | HostnameVerifier
 | *maxTotalConnections* (advanced) | The maximum number of connections. | 200 | int
 | *connectionsPerRoute* (advanced) | The maximum number of connections per route. | 20 | int
 | *connectionTimeToLive* (advanced) | The time for connection to live, the time unit is millisecond, the default value is always keep alive. |  | long
 | *cookieStore* (producer) | To use a custom org.apache.http.client.CookieStore. By default the org.apache.http.impl.client.BasicCookieStore is used which is an in-memory only cookie store. Notice if bridgeEndpoint=true then the cookie store is forced to be a noop cookie store as cookie shouldn't be stored as we are just bridging (eg acting as a proxy). |  | CookieStore
-| *connectionRequest Timeout* (timeout) | The timeout in milliseconds used when requesting a connection from the connection manager. A timeout value of zero is interpreted as an infinite timeout. A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). Default: -1 | -1 | int
+| *connectionRequestTimeout* (timeout) | The timeout in milliseconds used when requesting a connection from the connection manager. A timeout value of zero is interpreted as an infinite timeout. A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). Default: -1 | -1 | int
 | *connectTimeout* (timeout) | Determines the timeout in milliseconds until a connection is established. A timeout value of zero is interpreted as an infinite timeout. A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). Default: -1 | -1 | int
 | *socketTimeout* (timeout) | Defines the socket timeout (SO_TIMEOUT) in milliseconds, which is the timeout for waiting for data or, put differently, a maximum period inactivity between two consecutive data packets). A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). Default: -1 | -1 | int
 | *httpBinding* (advanced) | To use a custom HttpBinding to control the mapping between Camel message and HttpClient. |  | HttpBinding
 | *httpConfiguration* (advanced) | To use the shared HttpConfiguration as base configuration. |  | HttpConfiguration
-| *allowJavaSerialized Object* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
+| *allowJavaSerializedObject* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -142,7 +142,7 @@ with the following path and query parameters:
 | *httpClientOptions* (advanced) | To configure the HttpClient using the key/values from the Map. |  | Map
 | *httpContext* (advanced) | To use a custom HttpContext instance |  | HttpContext
 | *mapHttpMessageBody* (advanced) | If this option is true then IN exchange Body of the exchange will be mapped to HTTP body. Setting this to false will avoid the HTTP mapping. | true | boolean
-| *mapHttpMessageFormUrl EncodedBody* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
+| *mapHttpMessageFormUrlEncoded Body* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
 | *mapHttpMessageHeaders* (advanced) | If this option is true then IN exchange Headers of the exchange will be mapped to HTTP headers. Setting this to false will avoid the HTTP Headers mapping. | true | boolean
 | *maxTotalConnections* (advanced) | The maximum number of connections. | 200 | int
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
diff --git a/docs/components/modules/ROOT/pages/iec60870-client-component.adoc b/docs/components/modules/ROOT/pages/iec60870-client-component.adoc
index 4626819..6f66fc2 100644
--- a/docs/components/modules/ROOT/pages/iec60870-client-component.adoc
+++ b/docs/components/modules/ROOT/pages/iec60870-client-component.adoc
@@ -32,7 +32,7 @@ The IEC 60870 Client component supports 4 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *defaultConnection Options* (common) | Default connection options |  | ClientOptions
+| *defaultConnectionOptions* (common) | Default connection options |  | ClientOptions
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -95,7 +95,7 @@ with the following path and query parameters:
 | *acknowledgeWindow* (connection) | Parameter W - Acknowledgment window. | 10 | short
 | *adsuAddressType* (connection) | The common ASDU address size. May be either SIZE_1 or SIZE_2. |  | ASDUAddressType
 | *causeOfTransmissionType* (connection) | The cause of transmission type. May be either SIZE_1 or SIZE_2. |  | CauseOfTransmissionType
-| *informationObjectAddress Type* (connection) | The information address size. May be either SIZE_1, SIZE_2 or SIZE_3. |  | InformationObjectAddressType
+| *informationObjectAddressType* (connection) | The information address size. May be either SIZE_1, SIZE_2 or SIZE_3. |  | InformationObjectAddressType
 | *maxUnacknowledged* (connection) | Parameter K - Maximum number of un-acknowledged messages. | 15 | short
 | *timeout1* (connection) | Timeout T1 in milliseconds. | 15000 | int
 | *timeout2* (connection) | Timeout T2 in milliseconds. | 10000 | int
diff --git a/docs/components/modules/ROOT/pages/iec60870-server-component.adoc b/docs/components/modules/ROOT/pages/iec60870-server-component.adoc
index b876a0c..76c0380 100644
--- a/docs/components/modules/ROOT/pages/iec60870-server-component.adoc
+++ b/docs/components/modules/ROOT/pages/iec60870-server-component.adoc
@@ -33,7 +33,7 @@ The IEC 60870 Server component supports 4 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *defaultConnection Options* (common) | Default connection options |  | ServerOptions
+| *defaultConnectionOptions* (common) | Default connection options |  | ServerOptions
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -99,7 +99,7 @@ with the following path and query parameters:
 | *acknowledgeWindow* (connection) | Parameter W - Acknowledgment window. | 10 | short
 | *adsuAddressType* (connection) | The common ASDU address size. May be either SIZE_1 or SIZE_2. |  | ASDUAddressType
 | *causeOfTransmissionType* (connection) | The cause of transmission type. May be either SIZE_1 or SIZE_2. |  | CauseOfTransmissionType
-| *informationObjectAddress Type* (connection) | The information address size. May be either SIZE_1, SIZE_2 or SIZE_3. |  | InformationObjectAddressType
+| *informationObjectAddressType* (connection) | The information address size. May be either SIZE_1, SIZE_2 or SIZE_3. |  | InformationObjectAddressType
 | *maxUnacknowledged* (connection) | Parameter K - Maximum number of un-acknowledged messages. | 15 | short
 | *timeout1* (connection) | Timeout T1 in milliseconds. | 15000 | int
 | *timeout2* (connection) | Timeout T2 in milliseconds. | 10000 | int
diff --git a/docs/components/modules/ROOT/pages/ignite-cache-component.adoc b/docs/components/modules/ROOT/pages/ignite-cache-component.adoc
index 676e15b..fab6cc0 100644
--- a/docs/components/modules/ROOT/pages/ignite-cache-component.adoc
+++ b/docs/components/modules/ROOT/pages/ignite-cache-component.adoc
@@ -60,7 +60,7 @@ with the following path and query parameters:
 |===
 | Name | Description | Default | Type
 | *propagateIncomingBodyIfNo ReturnValue* (common) | Sets whether to propagate the incoming body if the return type of the underlying Ignite operation is void. | true | boolean
-| *treatCollectionsAsCache Objects* (common) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
+| *treatCollectionsAsCacheObjects* (common) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
 | *autoUnsubscribe* (consumer) | Whether auto unsubscribe is enabled in the Continuous Query Consumer. | true | boolean
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
 | *fireExistingQueryResults* (consumer) | Whether to process existing results that match the query. Used on initialization of the Continuous Query Consumer. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/ignite-compute-component.adoc b/docs/components/modules/ROOT/pages/ignite-compute-component.adoc
index 89b4fe7..955c8a6 100644
--- a/docs/components/modules/ROOT/pages/ignite-compute-component.adoc
+++ b/docs/components/modules/ROOT/pages/ignite-compute-component.adoc
@@ -66,7 +66,7 @@ with the following path and query parameters:
 | *propagateIncomingBodyIfNo ReturnValue* (producer) | Sets whether to propagate the incoming body if the return type of the underlying Ignite operation is void. | true | boolean
 | *taskName* (producer) | The task name, only applicable if using the IgniteComputeExecutionType#EXECUTE execution type. |  | String
 | *timeoutMillis* (producer) | The timeout interval for triggered jobs, in milliseconds, which will be set via IgniteCompute#withTimeout(long). |  | Long
-| *treatCollectionsAsCache Objects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
+| *treatCollectionsAsCacheObjects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 |===
diff --git a/docs/components/modules/ROOT/pages/ignite-events-component.adoc b/docs/components/modules/ROOT/pages/ignite-events-component.adoc
index a14bd12..aeff2ddc 100644
--- a/docs/components/modules/ROOT/pages/ignite-events-component.adoc
+++ b/docs/components/modules/ROOT/pages/ignite-events-component.adoc
@@ -60,7 +60,7 @@ with the following path and query parameters:
 | *clusterGroupExpression* (consumer) | The cluster group expression. |  | ClusterGroupExpression
 | *events* (consumer) | The event types to subscribe to as a comma-separated string of event constants as defined in EventType. For example: EVT_CACHE_ENTRY_CREATED,EVT_CACHE_OBJECT_REMOVED,EVT_IGFS_DIR_CREATED. | EVTS_ALL | String
 | *propagateIncomingBodyIfNo ReturnValue* (consumer) | Sets whether to propagate the incoming body if the return type of the underlying Ignite operation is void. | true | boolean
-| *treatCollectionsAsCache Objects* (consumer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
+| *treatCollectionsAsCacheObjects* (consumer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
diff --git a/docs/components/modules/ROOT/pages/ignite-idgen-component.adoc b/docs/components/modules/ROOT/pages/ignite-idgen-component.adoc
index a2e92be..d1dd2b7 100644
--- a/docs/components/modules/ROOT/pages/ignite-idgen-component.adoc
+++ b/docs/components/modules/ROOT/pages/ignite-idgen-component.adoc
@@ -60,7 +60,7 @@ with the following path and query parameters:
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *operation* (producer) | The operation to invoke on the Ignite ID Generator. Superseded by the IgniteConstants.IGNITE_IDGEN_OPERATION header in the IN message. Possible values: ADD_AND_GET, GET, GET_AND_ADD, GET_AND_INCREMENT, INCREMENT_AND_GET. |  | IgniteIdGenOperation
 | *propagateIncomingBodyIfNo ReturnValue* (producer) | Sets whether to propagate the incoming body if the return type of the underlying Ignite operation is void. | true | boolean
-| *treatCollectionsAsCache Objects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
+| *treatCollectionsAsCacheObjects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 |===
diff --git a/docs/components/modules/ROOT/pages/ignite-messaging-component.adoc b/docs/components/modules/ROOT/pages/ignite-messaging-component.adoc
index e608c27..bc39be9 100644
--- a/docs/components/modules/ROOT/pages/ignite-messaging-component.adoc
+++ b/docs/components/modules/ROOT/pages/ignite-messaging-component.adoc
@@ -57,7 +57,7 @@ with the following path and query parameters:
 |===
 | Name | Description | Default | Type
 | *propagateIncomingBodyIfNo ReturnValue* (common) | Sets whether to propagate the incoming body if the return type of the underlying Ignite operation is void. | true | boolean
-| *treatCollectionsAsCache Objects* (common) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
+| *treatCollectionsAsCacheObjects* (common) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
diff --git a/docs/components/modules/ROOT/pages/ignite-queue-component.adoc b/docs/components/modules/ROOT/pages/ignite-queue-component.adoc
index 61aa7f6..2d73a2d 100644
--- a/docs/components/modules/ROOT/pages/ignite-queue-component.adoc
+++ b/docs/components/modules/ROOT/pages/ignite-queue-component.adoc
@@ -61,7 +61,7 @@ with the following path and query parameters:
 | *operation* (producer) | The operation to invoke on the Ignite Queue. Superseded by the IgniteConstants.IGNITE_QUEUE_OPERATION header in the IN message. Possible values: CONTAINS, ADD, SIZE, REMOVE, ITERATOR, CLEAR, RETAIN_ALL, ARRAY, DRAIN, ELEMENT, PEEK, OFFER, POLL, TAKE, PUT. |  | IgniteQueueOperation
 | *propagateIncomingBodyIfNo ReturnValue* (producer) | Sets whether to propagate the incoming body if the return type of the underlying Ignite operation is void. | true | boolean
 | *timeoutMillis* (producer) | The queue timeout in milliseconds. Default: no timeout. |  | Long
-| *treatCollectionsAsCache Objects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
+| *treatCollectionsAsCacheObjects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 |===
diff --git a/docs/components/modules/ROOT/pages/ignite-set-component.adoc b/docs/components/modules/ROOT/pages/ignite-set-component.adoc
index 354080a..f4cacf0 100644
--- a/docs/components/modules/ROOT/pages/ignite-set-component.adoc
+++ b/docs/components/modules/ROOT/pages/ignite-set-component.adoc
@@ -59,7 +59,7 @@ with the following path and query parameters:
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *operation* (producer) | The operation to invoke on the Ignite Set. Superseded by the IgniteConstants.IGNITE_SETS_OPERATION header in the IN message. Possible values: CONTAINS, ADD, SIZE, REMOVE, ITERATOR, CLEAR, RETAIN_ALL, ARRAY.The set operation to perform. |  | IgniteSetOperation
 | *propagateIncomingBodyIfNo ReturnValue* (producer) | Sets whether to propagate the incoming body if the return type of the underlying Ignite operation is void. | true | boolean
-| *treatCollectionsAsCache Objects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
+| *treatCollectionsAsCacheObjects* (producer) | Sets whether to treat Collections as cache objects or as Collections of items to insert/update/compute, etc. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 |===
diff --git a/docs/components/modules/ROOT/pages/index.adoc b/docs/components/modules/ROOT/pages/index.adoc
index a82b47d..f07cf4f 100644
--- a/docs/components/modules/ROOT/pages/index.adoc
+++ b/docs/components/modules/ROOT/pages/index.adoc
@@ -6,7 +6,7 @@ The following Apache Camel artifacts are provided:
 == Components
 
 // components: START
-Number of Components: 308 in 246 JAR artifacts (1 deprecated)
+Number of Components: 308 in 245 JAR artifacts (1 deprecated)
 
 [width="100%",cols="4,1,5",options="header"]
 |===
@@ -22,7 +22,7 @@ Number of Components: 308 in 246 JAR artifacts (1 deprecated)
 
 | xref:apns-component.adoc[APNS] (camel-apns) | 2.8 | For sending notifications to Apple iOS devices.
 
-| xref:as2-component.adoc[AS2] (camel-as2) | 2.22 | Component used for transferring data secure and reliable over the internet using the AS2 protocol.
+| xref:as2-component.adoc[AS2] (@@@ARTIFACTID@@@) | 2.22 | Component used for transferring data secure and reliable over the internet using the AS2 protocol.
 
 | xref:asterisk-component.adoc[Asterisk] (camel-asterisk) | 2.18 | The asterisk component is used to interact with Asterisk PBX Server.
 
@@ -500,7 +500,7 @@ Number of Components: 308 in 246 JAR artifacts (1 deprecated)
 
 | xref:saga-component.adoc[Saga] (camel-saga) | 2.21 | The saga component provides access to advanced options for managing the flow in the Saga EIP.
 
-| xref:salesforce-component.adoc[Salesforce] (camel-salesforce) | 2.12 | The salesforce component is used for integrating Camel with the massive Salesforce API.
+| xref:salesforce-component.adoc[Salesforce] (@@@ARTIFACTID@@@) | 2.12 | The salesforce component is used for integrating Camel with the massive Salesforce API.
 
 | xref:sap-netweaver-component.adoc[SAP NetWeaver] (camel-sap-netweaver) | 2.12 | The sap-netweaver component integrates with the SAP NetWeaver Gateway using HTTP transports.
 
diff --git a/docs/components/modules/ROOT/pages/ipfs-component.adoc b/docs/components/modules/ROOT/pages/ipfs-component.adoc
index eb7b570..1299eed 100644
--- a/docs/components/modules/ROOT/pages/ipfs-component.adoc
+++ b/docs/components/modules/ROOT/pages/ipfs-component.adoc
@@ -33,13 +33,15 @@ ipfs://cmd?options
 == Options
 
 // component options: START
-The IPFS component supports 2 options, which are listed below.
+The IPFS component supports 4 options, which are listed below.
 
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
+| *ipfsHost* (producer) | The ipfs host | 127.0.0.1 | String
+| *ipfsPort* (producer) | The ipfs port | 5001 | int
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 |===
@@ -49,19 +51,17 @@ The IPFS component supports 2 options, which are listed below.
 The IPFS endpoint is configured using URI syntax:
 
 ----
-ipfs:ipfsHost:ipfsPort/ipfsCmd
+ipfs:ipfsCmd
 ----
 
 with the following path and query parameters:
 
-=== Path Parameters (3 parameters):
+=== Path Parameters (1 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *ipfsHost* | *Required* The ipfs host |  | String
-| *ipfsPort* | *Required* The ipfs port |  | int
 | *ipfsCmd* | *Required* The ipfs command |  | String
 |===
 
diff --git a/docs/components/modules/ROOT/pages/irc-component.adoc b/docs/components/modules/ROOT/pages/irc-component.adoc
index b8a952f..67fc715 100644
--- a/docs/components/modules/ROOT/pages/irc-component.adoc
+++ b/docs/components/modules/ROOT/pages/irc-component.adoc
@@ -36,7 +36,7 @@ The IRC component supports 4 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/jcache-component.adoc b/docs/components/modules/ROOT/pages/jcache-component.adoc
index fb9eb77..b1a882a 100644
--- a/docs/components/modules/ROOT/pages/jcache-component.adoc
+++ b/docs/components/modules/ROOT/pages/jcache-component.adoc
@@ -123,8 +123,8 @@ The JCache component supports 8 options, which are listed below.
 | Name | Description | Default | Type
 | *cachingProvider* (common) | The fully qualified class name of the javax.cache.spi.CachingProvider |  | String
 | *cacheConfiguration* (common) | A Configuration for the Cache |  | Configuration
-| *cacheConfiguration Properties* (common) | Properties to configure jcache |  | Map
-| *cacheConfiguration PropertiesRef* (common) | References to an existing Properties or Map to lookup in the registry to use for configuring jcache. |  | String
+| *cacheConfigurationProperties* (common) | Properties to configure jcache |  | Map
+| *cacheConfigurationProperties Ref* (common) | References to an existing Properties or Map to lookup in the registry to use for configuring jcache. |  | String
 | *configurationUri* (common) | An implementation specific URI for the CacheManager |  | String
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
diff --git a/docs/components/modules/ROOT/pages/jdbc-component.adoc b/docs/components/modules/ROOT/pages/jdbc-component.adoc
index a006fc7..477ffe5 100644
--- a/docs/components/modules/ROOT/pages/jdbc-component.adoc
+++ b/docs/components/modules/ROOT/pages/jdbc-component.adoc
@@ -98,7 +98,7 @@ with the following path and query parameters:
 | *transacted* (producer) | Whether transactions are in use. | false | boolean
 | *useGetBytesForBlob* (producer) | To read BLOB columns as bytes instead of string data. This may be needed for certain databases such as Oracle where you must read BLOB columns as bytes. | false | boolean
 | *useHeadersAsParameters* (producer) | Set this option to true to use the prepareStatementStrategy with named parameters. This allows to define queries with named placeholders, and use headers with the dynamic values for the query placeholders. | false | boolean
-| *useJDBC4ColumnNameAnd LabelSemantics* (producer) | Sets whether to use JDBC 4 or JDBC 3.0 or older semantic when retrieving column name. JDBC 4.0 uses columnLabel to get the column name where as JDBC 3.0 uses both columnName or columnLabel. Unfortunately JDBC drivers behave differently so you can use this option to work out issues around your JDBC driver if you get problem using this component This option is default true. | true | boolean
+| *useJDBC4ColumnNameAndLabel Semantics* (producer) | Sets whether to use JDBC 4 or JDBC 3.0 or older semantic when retrieving column name. JDBC 4.0 uses columnLabel to get the column name where as JDBC 3.0 uses both columnName or columnLabel. Unfortunately JDBC drivers behave differently so you can use this option to work out issues around your JDBC driver if you get problem using this component This option is default true. | true | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *beanRowMapper* (advanced) | To use a custom org.apache.camel.component.jdbc.BeanRowMapper when using outputClass. The default implementation will lower case the row names and skip underscores, and dashes. For example CUST_ID is mapped as custId. |  | BeanRowMapper
 | *prepareStatementStrategy* (advanced) | Allows the plugin to use a custom org.apache.camel.component.jdbc.JdbcPrepareStatementStrategy to control preparation of the query and prepared statement. |  | JdbcPrepareStatementStrategy
diff --git a/docs/components/modules/ROOT/pages/jetty-component.adoc b/docs/components/modules/ROOT/pages/jetty-component.adoc
index 8846f95..942e462 100644
--- a/docs/components/modules/ROOT/pages/jetty-component.adoc
+++ b/docs/components/modules/ROOT/pages/jetty-component.adoc
@@ -75,21 +75,21 @@ The Jetty component supports 32 options, which are listed below.
 | *httpBinding* (advanced) | Not to be used - use JettyHttpBinding instead. |  | HttpBinding
 | *httpConfiguration* (advanced) | Jetty component does not use HttpConfiguration. |  | HttpConfiguration
 | *mbContainer* (advanced) | To use a existing configured org.eclipse.jetty.jmx.MBeanContainer if JMX is enabled that Jetty uses for registering mbeans. |  | MBeanContainer
-| *sslSocketConnector Properties* (security) | A map which contains general SSL connector properties. |  | Map
-| *socketConnector Properties* (security) | A map which contains general HTTP connector properties. Uses the same principle as sslSocketConnectorProperties. |  | Map
+| *sslSocketConnectorProperties* (security) | A map which contains general SSL connector properties. |  | Map
+| *socketConnectorProperties* (security) | A map which contains general HTTP connector properties. Uses the same principle as sslSocketConnectorProperties. |  | Map
 | *continuationTimeout* (consumer) | Allows to set a timeout in millis when using Jetty as consumer (server). By default Jetty uses 30000. You can use a value of = 0 to never expire. If a timeout occurs then the request will be expired and Jetty will return back a http error 503 to the client. This option is only in use when using Jetty with the Asynchronous Routing Engine. | 30000 | Long
 | *useContinuation* (consumer) | Whether or not to use Jetty continuations for the Jetty Server. | true | boolean
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters | false | boolean
 | *responseBufferSize* (consumer) | Allows to configure a custom value of the response buffer size on the Jetty connectors. |  | Integer
 | *requestBufferSize* (consumer) | Allows to configure a custom value of the request buffer size on the Jetty connectors. |  | Integer
 | *requestHeaderSize* (consumer) | Allows to configure a custom value of the request header size on the Jetty connectors. |  | Integer
 | *responseHeaderSize* (consumer) | Allows to configure a custom value of the response header size on the Jetty connectors. |  | Integer
 | *proxyHost* (proxy) | To use a http proxy to configure the hostname. |  | String
 | *proxyPort* (proxy) | To use a http proxy to configure the port number. |  | Integer
-| *useXForwardedFor Header* (consumer) | To use the X-Forwarded-For header in HttpServletRequest.getRemoteAddr. | false | boolean
+| *useXForwardedForHeader* (consumer) | To use the X-Forwarded-For header in HttpServletRequest.getRemoteAddr. | false | boolean
 | *sendServerVersion* (consumer) | If the option is true, jetty will send the server header with the jetty version information to the client which sends the request. NOTE please make sure there is no any other camel-jetty endpoint is share the same port, otherwise this option may not work as expected. | true | boolean
-| *allowJavaSerialized Object* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
+| *allowJavaSerializedObject* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -159,7 +159,7 @@ with the following path and query parameters:
 | *traceEnabled* (consumer) | Specifies whether to enable HTTP TRACE for this Servlet consumer. By default TRACE is turned off. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *mapHttpMessageBody* (advanced) | If this option is true then IN exchange Body of the exchange will be mapped to HTTP body. Setting this to false will avoid the HTTP mapping. | true | boolean
-| *mapHttpMessageFormUrl EncodedBody* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
+| *mapHttpMessageFormUrlEncoded Body* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
 | *mapHttpMessageHeaders* (advanced) | If this option is true then IN exchange Headers of the exchange will be mapped to HTTP headers. Setting this to false will avoid the HTTP Headers mapping. | true | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
diff --git a/docs/components/modules/ROOT/pages/jms-component.adoc b/docs/components/modules/ROOT/pages/jms-component.adoc
index 4c4e23d..3033a24 100644
--- a/docs/components/modules/ROOT/pages/jms-component.adoc
+++ b/docs/components/modules/ROOT/pages/jms-component.adoc
@@ -190,14 +190,14 @@ The JMS component supports 84 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *allowAutoWired ConnectionFactory* (advanced) | Whether to auto-discover ConnectionFactory from the registry, if no connection factory has been configured. If only one instance of ConnectionFactory is found then it will be used. This is enabled by default. | false | boolean
-| *allowAutoWired DestinationResolver* (advanced) | Whether to auto-discover DestinationResolver from the registry, if no destination resolver has been configured. If only one instance of DestinationResolver is found then it will be used. This is enabled by default. | false | boolean
+| *allowAutoWiredConnection Factory* (advanced) | Whether to auto-discover ConnectionFactory from the registry, if no connection factory has been configured. If only one instance of ConnectionFactory is found then it will be used. This is enabled by default. | false | boolean
+| *allowAutoWiredDestination Resolver* (advanced) | Whether to auto-discover DestinationResolver from the registry, if no destination resolver has been configured. If only one instance of DestinationResolver is found then it will be used. This is enabled by default. | false | boolean
 | *configuration* (advanced) | To use a shared JMS configuration |  | JmsConfiguration
-| *acceptMessagesWhile Stopping* (consumer) | Specifies whether the consumer accept messages while it is stopping. You may consider enabling this option, if you start and stop JMS routes at runtime, while there are still messages enqueued on the queue. If this option is false, and you stop the JMS route, then messages may be rejected, and the JMS broker would have to attempt redeliveries, which yet again may be rejected, and eventually the message may be moved at a dead letter queue on t [...]
-| *allowReplyManagerQuick Stop* (consumer) | Whether the DefaultMessageListenerContainer used in the reply managers for request-reply messaging allow the DefaultMessageListenerContainer.runningAllowed flag to quick stop in case JmsConfiguration#isAcceptMessagesWhileStopping is enabled, and org.apache.camel.CamelContext is currently being stopped. This quick stop ability is enabled by default in the regular JMS consumers but to enable for reply managers you must enable this flag. | false  [...]
+| *acceptMessagesWhileStopping* (consumer) | Specifies whether the consumer accept messages while it is stopping. You may consider enabling this option, if you start and stop JMS routes at runtime, while there are still messages enqueued on the queue. If this option is false, and you stop the JMS route, then messages may be rejected, and the JMS broker would have to attempt redeliveries, which yet again may be rejected, and eventually the message may be moved at a dead letter queue on th [...]
+| *allowReplyManagerQuickStop* (consumer) | Whether the DefaultMessageListenerContainer used in the reply managers for request-reply messaging allow the DefaultMessageListenerContainer.runningAllowed flag to quick stop in case JmsConfiguration#isAcceptMessagesWhileStopping is enabled, and org.apache.camel.CamelContext is currently being stopped. This quick stop ability is enabled by default in the regular JMS consumers but to enable for reply managers you must enable this flag. | false | [...]
 | *acknowledgementMode* (consumer) | The JMS acknowledgement mode defined as an Integer. Allows you to set vendor-specific extensions to the acknowledgment mode. For the regular modes, it is preferable to use the acknowledgementModeName instead. |  | int
 | *eagerPoisonBody* (consumer) | If eagerLoadingOfProperties is enabled and the JMS message payload (JMS body or JMS properties) (cannot be read/mapped), then set this text as the message body instead so the message can be processed (the cause of the poison are already stored as exception on the Exchange). This can be turned off by setting eagerPoisonBody=false. See also the option eagerLoadingOfProperties. | Poison JMS message due to ${exception.message} | String
-| *eagerLoadingOf Properties* (consumer) | Enables eager loading of JMS properties as soon as a message is loaded which generally is inefficient as the JMS properties may not be required but sometimes can catch early any issues with the underlying JMS provider and the use of JMS properties. See also the option eagerLoadingOfBody. | false | boolean
+| *eagerLoadingOfProperties* (consumer) | Enables eager loading of JMS properties as soon as a message is loaded which generally is inefficient as the JMS properties may not be required but sometimes can catch early any issues with the underlying JMS provider and the use of JMS properties. See also the option eagerLoadingOfBody. | false | boolean
 | *acknowledgementModeName* (consumer) | The JMS acknowledgement name, which is one of: SESSION_TRANSACTED, CLIENT_ACKNOWLEDGE, AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE | AUTO_ACKNOWLEDGE | String
 | *autoStartup* (consumer) | Specifies whether the consumer container should auto-startup. | true | boolean
 | *cacheLevel* (consumer) | Sets the cache level by ID for the underlying JMS resources. See cacheLevelName option for more details. |  | int
@@ -205,7 +205,7 @@ The JMS component supports 84 options, which are listed below.
 | *replyToCacheLevelName* (producer) | Sets the cache level by name for the reply consumer when doing request/reply over JMS. This option only applies when using fixed reply queues (not temporary). Camel will by default use: CACHE_CONSUMER for exclusive or shared w/ replyToSelectorName. And CACHE_SESSION for shared without replyToSelectorName. Some JMS brokers such as IBM WebSphere may require to set the replyToCacheLevelName=CACHE_NONE to work. Note: If using temporary queues then CACHE [...]
 | *clientId* (common) | Sets the JMS client ID to use. Note that this value, if specified, must be unique and can only be used by a single JMS connection instance. It is typically only required for durable topic subscriptions. If using Apache ActiveMQ you may prefer to use Virtual Topics instead. |  | String
 | *concurrentConsumers* (consumer) | Specifies the default number of concurrent consumers when consuming from JMS (not for request/reply over JMS). See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. When doing request/reply over JMS then the option replyToConcurrentConsumers is used to control number of concurrent consumers on the reply message listener. | 1 | int
-| *replyToConcurrent Consumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
+| *replyToConcurrentConsumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
 | *connectionFactory* (common) | The connection factory to be use. A connection factory must be configured either on the component or endpoint. |  | ConnectionFactory
 | *username* (security) | Username to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *password* (security) | Password to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
@@ -214,22 +214,22 @@ The JMS component supports 84 options, which are listed below.
 | *durableSubscriptionName* (common) | The durable subscriber name for specifying durable topic subscriptions. The clientId option must be configured as well. |  | String
 | *exceptionListener* (advanced) | Specifies the JMS Exception Listener that is to be notified of any underlying JMS exceptions. |  | ExceptionListener
 | *errorHandler* (advanced) | Specifies a org.springframework.util.ErrorHandler to be invoked in case of any uncaught exceptions thrown while processing a Message. By default these exceptions will be logged at the WARN level, if no errorHandler has been configured. You can configure logging level and whether stack traces should be logged using errorHandlerLoggingLevel and errorHandlerLogStackTrace options. This makes it much easier to configure, than having to code a custom errorHandler. [...]
-| *errorHandlerLogging Level* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
-| *errorHandlerLogStack Trace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
+| *errorHandlerLoggingLevel* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
+| *errorHandlerLogStackTrace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
 | *explicitQosEnabled* (producer) | Set if the deliveryMode, priority or timeToLive qualities of service should be used when sending messages. This option is based on Spring's JmsTemplate. The deliveryMode, priority and timeToLive options are applied to the current endpoint. This contrasts with the preserveMessageQos option, which operates at message granularity, reading QoS properties exclusively from the Camel In message headers. | false | boolean
 | *exposeListenerSession* (consumer) | Specifies whether the listener session should be exposed when consuming messages. | false | boolean
 | *idleTaskExecutionLimit* (advanced) | Specifies the limit for idle executions of a receive task, not having received any message within its execution. If this limit is reached, the task will shut down and leave receiving to other executing tasks (in the case of dynamic scheduling; see the maxConcurrentConsumers setting). There is additional doc available from Spring. | 1 | int
 | *idleConsumerLimit* (advanced) | Specify the limit for the number of consumers that are allowed to be idle at any given time. | 1 | int
 | *maxConcurrentConsumers* (consumer) | Specifies the maximum number of concurrent consumers when consuming from JMS (not for request/reply over JMS). See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. When doing request/reply over JMS then the option replyToMaxConcurrentConsumers is used to control number of concurrent consumers on the reply message listener. |  | int
-| *replyToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
-| *replyOnTimeoutToMax ConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
+| *replyToMaxConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
+| *replyOnTimeoutToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
 | *maxMessagesPerTask* (advanced) | The number of messages per task. -1 is unlimited. If you use a range for concurrent consumers (eg min max), then this option can be used to set a value to eg 100 to control how fast the consumers will shrink when less work is required. | -1 | int
 | *messageConverter* (advanced) | To use a custom Spring org.springframework.jms.support.converter.MessageConverter so you can be in control how to map to/from a javax.jms.Message. |  | MessageConverter
 | *mapJmsMessage* (advanced) | Specifies whether Camel should auto map the received JMS message to a suited payload type, such as javax.jms.TextMessage to a String etc. See section about how mapping works below for more details. | true | boolean
 | *messageIdEnabled* (advanced) | When sending, specifies whether message IDs should be added. This is just an hint to the JMS Broker. If the JMS provider accepts this hint, these messages must have the message ID set to null; if the provider ignores the hint, the message ID must be set to its normal unique value. | true | boolean
 | *messageTimestampEnabled* (advanced) | Specifies whether timestamps should be enabled by default on sending messages. This is just an hint to the JMS broker. If the JMS provider accepts this hint, these messages must have the timestamp set to zero; if the provider ignores the hint the timestamp must be set to its normal value. | true | boolean
 | *alwaysCopyMessage* (producer) | If true, Camel will always make a JMS message copy of the message when it is passed to the producer for sending. Copying the message is needed in some situations, such as when a replyToDestinationSelectorName is set (incidentally, Camel will set the alwaysCopyMessage option to true, if a replyToDestinationSelectorName is set). | false | boolean
-| *useMessageIDAs CorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
+| *useMessageIDAsCorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
 | *priority* (producer) | Values greater than 1 specify the message priority when sending (where 0 is the lowest priority and 9 is the highest). The explicitQosEnabled option must also be enabled in order for this option to have any effect. | 4 | int
 | *pubSubNoLocal* (advanced) | Specifies whether to inhibit the delivery of messages published by its own connection. | false | boolean
 | *receiveTimeout* (advanced) | The timeout for receiving messages (in milliseconds). | 1000 | long
@@ -237,16 +237,16 @@ The JMS component supports 84 options, which are listed below.
 | *taskExecutor* (consumer) | Allows you to specify a custom task executor for consuming messages. |  | TaskExecutor
 | *timeToLive* (producer) | When sending messages, specifies the time-to-live of the message (in milliseconds). | -1 | long
 | *transacted* (transaction) | Specifies whether to use transacted mode | false | boolean
-| *lazyCreateTransaction Manager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
+| *lazyCreateTransactionManager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
 | *transactionManager* (transaction) | The Spring transaction manager to use. |  | PlatformTransactionManager
 | *transactionName* (transaction) | The name of the transaction to use. |  | String
 | *transactionTimeout* (transaction) | The timeout value of the transaction (in seconds), if using transacted mode. | -1 | int
-| *testConnectionOn Startup* (common) | Specifies whether to test the connection on startup. This ensures that when Camel starts that all the JMS consumers have a valid connection to the JMS broker. If a connection cannot be granted then Camel throws an exception on startup. This ensures that Camel is not started with failed connections. The JMS producers is tested as well. | false | boolean
+| *testConnectionOnStartup* (common) | Specifies whether to test the connection on startup. This ensures that when Camel starts that all the JMS consumers have a valid connection to the JMS broker. If a connection cannot be granted then Camel throws an exception on startup. This ensures that Camel is not started with failed connections. The JMS producers is tested as well. | false | boolean
 | *asyncStartListener* (advanced) | Whether to startup the JmsConsumer message listener asynchronously, when starting a route. For example if a JmsConsumer cannot get a connection to a remote JMS broker, then it may block while retrying and/or failover. This will cause Camel to block while starting routes. By setting this option to true, you will let routes startup, while the JmsConsumer connects to the JMS broker using a dedicated thread in asynchronous mode. If this option is used, the [...]
 | *asyncStopListener* (advanced) | Whether to stop the JmsConsumer message listener asynchronously, when stopping a route. | false | boolean
-| *forceSendOriginal Message* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
+| *forceSendOriginalMessage* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
 | *requestTimeout* (producer) | The timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds). The default is 20 seconds. You can include the header CamelJmsRequestTimeout to override this endpoint configured timeout value, and thus have per message individual timeout values. See also the requestTimeoutCheckerInterval option. | 20000 | long
-| *requestTimeoutChecker Interval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
 | *transferExchange* (advanced) | You can transfer the exchange over the wire instead of just the body and headers. The following fields are transferred: In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. You must enable this option on both the producer and consumer side, so Camel knows the payloads is an E [...]
 | *transferException* (advanced) | If enabled and you are using Request Reply messaging (InOut) and an Exchange failed on the consumer side, then the caused Exception will be send back in response as a javax.jms.ObjectMessage. If the client is Camel, the returned Exception is rethrown. This allows you to use Camel JMS as a bridge in your routing - for example, using persistent queues to enable robust routing. Notice that if you also have transferExchange enabled, this option takes preced [...]
 | *jmsOperations* (advanced) | Allows you to use your own implementation of the org.springframework.jms.core.JmsOperations interface. Camel uses JmsTemplate as default. Can be used for testing purpose, but not used much as stated in the spring API docs. |  | JmsOperations
@@ -255,21 +255,21 @@ The JMS component supports 84 options, which are listed below.
 | *preserveMessageQos* (producer) | Set to true, if you want to send message using the QoS settings specified on the message, instead of the QoS settings on the JMS endpoint. The following three headers are considered JMSPriority, JMSDeliveryMode, and JMSExpiration. You can provide all or only some of them. If not provided, Camel will fall back to use the values from the endpoint instead. So, when using this option, the headers override the values from the endpoint. The explicitQosEnable [...]
 | *asyncConsumer* (consumer) | Whether the JmsConsumer processes the Exchange asynchronously. If enabled then the JmsConsumer may pickup the next message from the JMS queue, while the previous message is being processed asynchronously (by the Asynchronous Routing Engine). This means that messages may be processed not 100% strictly in order. If disabled (as default) then the Exchange is fully processed before the JmsConsumer will pickup the next message from the JMS queue. Note if transac [...]
 | *allowNullBody* (producer) | Whether to allow sending messages with no body. If this option is false and the message body is null, then an JMSException is thrown. | true | boolean
-| *includeSentJMS MessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
-| *includeAllJMSX Properties* (advanced) | Whether to include all JMSXxxx properties when mapping from JMS to Camel Message. Setting this to true will include properties such as JMSXAppID, and JMSXUserID etc. Note: If you are using a custom headerFilterStrategy then this option does not apply. | false | boolean
-| *defaultTaskExecutor Type* (consumer) | Specifies what default TaskExecutor type to use in the DefaultMessageListenerContainer, for both consumer endpoints and the ReplyTo consumer of producer endpoints. Possible values: SimpleAsync (uses Spring's SimpleAsyncTaskExecutor) or ThreadPool (uses Spring's ThreadPoolTaskExecutor with optimal values - cached threadpool-like). If not set, it defaults to the previous behaviour, which uses a cached thread pool for consumer endpoints and SimpleAs [...]
+| *includeSentJMSMessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
+| *includeAllJMSXProperties* (advanced) | Whether to include all JMSXxxx properties when mapping from JMS to Camel Message. Setting this to true will include properties such as JMSXAppID, and JMSXUserID etc. Note: If you are using a custom headerFilterStrategy then this option does not apply. | false | boolean
+| *defaultTaskExecutorType* (consumer) | Specifies what default TaskExecutor type to use in the DefaultMessageListenerContainer, for both consumer endpoints and the ReplyTo consumer of producer endpoints. Possible values: SimpleAsync (uses Spring's SimpleAsyncTaskExecutor) or ThreadPool (uses Spring's ThreadPoolTaskExecutor with optimal values - cached threadpool-like). If not set, it defaults to the previous behaviour, which uses a cached thread pool for consumer endpoints and SimpleAsy [...]
 | *jmsKeyFormatStrategy* (advanced) | Pluggable strategy for encoding and decoding JMS keys so they can be compliant with the JMS specification. Camel provides two implementations out of the box: default and passthrough. The default strategy will safely marshal dots and hyphens (. and -). The passthrough strategy leaves the key as is. Can be used for JMS brokers which do not care whether JMS header keys contain illegal characters. You can provide your own implementation of the org.apache [...]
 | *allowAdditionalHeaders* (producer) | This option is used to allow additional headers which may have values that are invalid according to JMS specification. For example some message systems such as WMQ do this with header names using prefix JMS_IBM_MQMD_ containing values with byte array or other invalid types. You can specify multiple header names separated by comma, and use as suffix for wildcard matching. |  | String
 | *queueBrowseStrategy* (advanced) | To use a custom QueueBrowseStrategy when browsing queues |  | QueueBrowseStrategy
 | *messageCreatedStrategy* (advanced) | To use the given MessageCreatedStrategy which are invoked when Camel creates new instances of javax.jms.Message objects when Camel is sending a JMS message. |  | MessageCreatedStrategy
-| *waitForProvision CorrelationToBeUpdated Counter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
-| *waitForProvision CorrelationToBeUpdated ThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
+| *waitForProvisionCorrelationTo BeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
+| *waitForProvisionCorrelationTo BeUpdatedThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
 | *correlationProperty* (producer) | Use this JMS property to correlate messages in InOut exchange pattern (request-reply) instead of JMSCorrelationID property. This allows you to exchange messages with systems that do not correlate messages using JMSCorrelationID JMS property. If used JMSCorrelationID will not be used or set by Camel. The value of here named property will be generated if not supplied in the header of the message under the same name. |  | String
 | *subscriptionDurable* (consumer) | Set whether to make the subscription durable. The durable subscription name to be used can be specified through the subscriptionName property. Default is false. Set this to true to register a durable subscription, typically in combination with a subscriptionName value (unless your message listener class name is good enough as subscription name). Only makes sense when listening to a topic (pub-sub domain), therefore this method switches the pubSubDomai [...]
 | *subscriptionShared* (consumer) | Set whether to make the subscription shared. The shared subscription name to be used can be specified through the subscriptionName property. Default is false. Set this to true to register a shared subscription, typically in combination with a subscriptionName value (unless your message listener class name is good enough as subscription name). Note that shared subscriptions may also be durable, so this flag can (and often will) be combined with subscrip [...]
 | *subscriptionName* (consumer) | Set the name of a subscription to create. To be applied in case of a topic (pub-sub domain) with a shared or durable subscription. The subscription name needs to be unique within this client's JMS client id. Default is the class name of the specified message listener. Note: Only 1 concurrent consumer (which is the default of this message listener container) is allowed for each subscription, except for a shared subscription (which requires JMS 2.0). |  | String
-| *streamMessageType Enabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until n [...]
-| *formatDateHeadersTo Iso8601* (producer) | Sets whether date headers should be formatted according to the ISO 8601 standard. | false | boolean
+| *streamMessageTypeEnabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until no [...]
+| *formatDateHeadersToIso8601* (producer) | Sets whether date headers should be formatted according to the ISO 8601 standard. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -348,7 +348,7 @@ with the following path and query parameters:
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
 | *exposeListenerSession* (consumer) | Specifies whether the listener session should be exposed when consuming messages. | false | boolean
-| *replyToSameDestination Allowed* (consumer) | Whether a JMS consumer is allowed to send a reply message to the same destination that the consumer is using to consume from. This prevents an endless loop by consuming and sending back the same message to itself. | false | boolean
+| *replyToSameDestinationAllowed* (consumer) | Whether a JMS consumer is allowed to send a reply message to the same destination that the consumer is using to consume from. This prevents an endless loop by consuming and sending back the same message to itself. | false | boolean
 | *taskExecutor* (consumer) | Allows you to specify a custom task executor for consuming messages. |  | TaskExecutor
 | *deliveryDelay* (producer) | Sets delivery delay to use for send calls for JMS. This option requires JMS 2.0 compliant broker. | -1 | long
 | *deliveryMode* (producer) | Specifies the delivery mode to be used. Possibles values are those defined by javax.jms.DeliveryMode. NON_PERSISTENT = 1 and PERSISTENT = 2. |  | Integer
@@ -359,8 +359,8 @@ with the following path and query parameters:
 | *preserveMessageQos* (producer) | Set to true, if you want to send message using the QoS settings specified on the message, instead of the QoS settings on the JMS endpoint. The following three headers are considered JMSPriority, JMSDeliveryMode, and JMSExpiration. You can provide all or only some of them. If not provided, Camel will fall back to use the values from the endpoint instead. So, when using this option, the headers override the values from the endpoint. The explicitQosEnable [...]
 | *priority* (producer) | Values greater than 1 specify the message priority when sending (where 0 is the lowest priority and 9 is the highest). The explicitQosEnabled option must also be enabled in order for this option to have any effect. | 4 | int
 | *replyToConcurrentConsumers* (producer) | Specifies the default number of concurrent consumers when doing request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. | 1 | int
-| *replyToMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
-| *replyToOnTimeoutMax ConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
+| *replyToMaxConcurrentConsumers* (producer) | Specifies the maximum number of concurrent consumers when using request/reply over JMS. See also the maxMessagesPerTask option to control dynamic scaling up/down of threads. |  | int
+| *replyToOnTimeoutMaxConcurrent Consumers* (producer) | Specifies the maximum number of concurrent consumers for continue routing when timeout occurred when using request/reply over JMS. | 1 | int
 | *replyToOverride* (producer) | Provides an explicit ReplyTo destination in the JMS message, which overrides the setting of replyTo. It is useful if you want to forward the message to a remote Queue and receive the reply message from the ReplyTo destination. |  | String
 | *replyToType* (producer) | Allows for explicitly specifying which kind of strategy to use for replyTo queues when doing request/reply over JMS. Possible values are: Temporary, Shared, or Exclusive. By default Camel will use temporary queues. However if replyTo has been configured, then Shared is used by default. This option allows you to use exclusive queues instead of shared ones. See Camel JMS documentation for more details, and especially the notes about the implications if running  [...]
 | *requestTimeout* (producer) | The timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds). The default is 20 seconds. You can include the header CamelJmsRequestTimeout to override this endpoint configured timeout value, and thus have per message individual timeout values. See also the requestTimeoutCheckerInterval option. | 20000 | long
@@ -373,7 +373,7 @@ with the following path and query parameters:
 | *forceSendOriginalMessage* (producer) | When using mapJmsMessage=false Camel will create a new JMS message to send to a new JMS destination if you touch the headers (get or set) during the route. Set this option to true to force Camel to send the original JMS message that was received. | false | boolean
 | *includeSentJMSMessageID* (producer) | Only applicable when sending to JMS destination using InOnly (eg fire and forget). Enabling this option will enrich the Camel Exchange with the actual JMSMessageID that was used by the JMS client when the message was sent to the JMS destination. | false | boolean
 | *replyToCacheLevelName* (producer) | Sets the cache level by name for the reply consumer when doing request/reply over JMS. This option only applies when using fixed reply queues (not temporary). Camel will by default use: CACHE_CONSUMER for exclusive or shared w/ replyToSelectorName. And CACHE_SESSION for shared without replyToSelectorName. Some JMS brokers such as IBM WebSphere may require to set the replyToCacheLevelName=CACHE_NONE to work. Note: If using temporary queues then CACHE [...]
-| *replyToDestinationSelector Name* (producer) | Sets the JMS Selector using the fixed name to be used so you can filter out your own replies from the others when using a shared queue (that is, if you are not using a temporary reply queue). |  | String
+| *replyToDestinationSelectorName* (producer) | Sets the JMS Selector using the fixed name to be used so you can filter out your own replies from the others when using a shared queue (that is, if you are not using a temporary reply queue). |  | String
 | *streamMessageTypeEnabled* (producer) | Sets whether StreamMessage type is enabled or not. Message payloads of streaming kind such as files, InputStream, etc will either by sent as BytesMessage or StreamMessage. This option controls which kind will be used. By default BytesMessage is used which enforces the entire message payload to be read into memory. By enabling this option the message payload is read into memory in chunks and each chunk is then written to the StreamMessage until no [...]
 | *allowSerializedHeaders* (advanced) | Controls whether or not to include serialized headers. Applies only when isTransferExchange() is true. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. | false | boolean
 | *asyncStartListener* (advanced) | Whether to startup the JmsConsumer message listener asynchronously, when starting a route. For example if a JmsConsumer cannot get a connection to a remote JMS broker, then it may block while retrying and/or failover. This will cause Camel to block while starting routes. By setting this option to true, you will let routes startup, while the JmsConsumer connects to the JMS broker using a dedicated thread in asynchronous mode. If this option is used, the [...]
@@ -397,19 +397,19 @@ with the following path and query parameters:
 | *pubSubNoLocal* (advanced) | Specifies whether to inhibit the delivery of messages published by its own connection. | false | boolean
 | *receiveTimeout* (advanced) | The timeout for receiving messages (in milliseconds). | 1000 | long
 | *recoveryInterval* (advanced) | Specifies the interval between recovery attempts, i.e. when a connection is being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds. | 5000 | long
-| *requestTimeoutChecker Interval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Configures how often Camel should check for timed out Exchanges when doing request/reply over JMS. By default Camel checks once per second. But if you must react faster when a timeout occurs, then you can lower this interval, to check more frequently. The timeout is determined by the option requestTimeout. | 1000 | long
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *transferException* (advanced) | If enabled and you are using Request Reply messaging (InOut) and an Exchange failed on the consumer side, then the caused Exception will be send back in response as a javax.jms.ObjectMessage. If the client is Camel, the returned Exception is rethrown. This allows you to use Camel JMS as a bridge in your routing - for example, using persistent queues to enable robust routing. Notice that if you also have transferExchange enabled, this option takes preced [...]
 | *transferExchange* (advanced) | You can transfer the exchange over the wire instead of just the body and headers. The following fields are transferred: In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange properties, exchange exception. This requires that the objects are serializable. Camel will exclude any non-serializable objects and log it at WARN level. You must enable this option on both the producer and consumer side, so Camel knows the payloads is an E [...]
-| *useMessageIDAsCorrelation ID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
-| *waitForProvisionCorrelation ToBeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
-| *waitForProvisionCorrelation ToBeUpdatedThreadSleeping Time* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
+| *useMessageIDAsCorrelationID* (advanced) | Specifies whether JMSMessageID should always be used as JMSCorrelationID for InOut messages. | false | boolean
+| *waitForProvisionCorrelationTo BeUpdatedCounter* (advanced) | Number of times to wait for provisional correlation id to be updated to the actual correlation id when doing request/reply over JMS and when the option useMessageIDAsCorrelationID is enabled. | 50 | int
+| *waitForProvisionCorrelationTo BeUpdatedThreadSleepingTime* (advanced) | Interval in millis to sleep each time while waiting for provisional correlation id to be updated. | 100 | long
 | *errorHandlerLoggingLevel* (logging) | Allows to configure the default errorHandler logging level for logging uncaught exceptions. | WARN | LoggingLevel
 | *errorHandlerLogStackTrace* (logging) | Allows to control whether stacktraces should be logged or not, by the default errorHandler. | true | boolean
 | *password* (security) | Password to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *username* (security) | Username to use with the ConnectionFactory. You can also configure username/password directly on the ConnectionFactory. |  | String
 | *transacted* (transaction) | Specifies whether to use transacted mode | false | boolean
-| *lazyCreateTransaction Manager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
+| *lazyCreateTransactionManager* (transaction) | If true, Camel will create a JmsTransactionManager, if there is no transactionManager injected when option transacted=true. | true | boolean
 | *transactionManager* (transaction) | The Spring transaction manager to use. |  | PlatformTransactionManager
 | *transactionName* (transaction) | The name of the transaction to use. |  | String
 | *transactionTimeout* (transaction) | The timeout value of the transaction (in seconds), if using transacted mode. | -1 | int
diff --git a/docs/components/modules/ROOT/pages/jmx-component.adoc b/docs/components/modules/ROOT/pages/jmx-component.adoc
index 50a08e8..9e8f575 100644
--- a/docs/components/modules/ROOT/pages/jmx-component.adoc
+++ b/docs/components/modules/ROOT/pages/jmx-component.adoc
@@ -71,7 +71,7 @@ with the following path and query parameters:
 | *notificationFilter* (advanced) | Reference to a bean that implements the NotificationFilter. |  | NotificationFilter
 | *objectProperties* (advanced) | Properties for the object name. These values will be used if the objectName param is not set |  | Map
 | *reconnectDelay* (advanced) | The number of seconds to wait before attempting to retry establishment of the initial connection or attempt to reconnect a lost connection | 10 | int
-| *reconnectOnConnection Failure* (advanced) | If true the consumer will attempt to reconnect to the JMX server when any connection failure occurs. The consumer will attempt to re-establish the JMX connection every 'x' seconds until the connection is made-- where 'x' is the configured reconnectionDelay | false | boolean
+| *reconnectOnConnectionFailure* (advanced) | If true the consumer will attempt to reconnect to the JMX server when any connection failure occurs. The consumer will attempt to re-establish the JMX connection every 'x' seconds until the connection is made-- where 'x' is the configured reconnectionDelay | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *testConnectionOnStartup* (advanced) | If true the consumer will throw an exception if unable to establish the JMX connection upon startup. If false, the consumer will attempt to establish the JMX connection every 'x' seconds until the connection is made -- where 'x' is the configured reconnectionDelay | true | boolean
 | *notifyDiffer* (string) | If true, will fire a notification when the string attribute differs from the string to compare (string monitor or consumer). By default the consumer will notify match if observed attribute and string to compare has been configured. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/kafka-component.adoc b/docs/components/modules/ROOT/pages/kafka-component.adoc
index 8bbd169..d1620a8 100644
--- a/docs/components/modules/ROOT/pages/kafka-component.adoc
+++ b/docs/components/modules/ROOT/pages/kafka-component.adoc
@@ -48,10 +48,10 @@ The Kafka component supports 10 options, which are listed below.
 | *configuration* (common) | Allows to pre-configure the Kafka component with common options that the endpoints will reuse. |  | KafkaConfiguration
 | *brokers* (common) | URL of the Kafka brokers to use. The format is host1:port1,host2:port2, and the list can be a subset of brokers or a VIP pointing to a subset of brokers. This option is known as bootstrap.servers in the Kafka documentation. |  | String
 | *workerPool* (advanced) | To use a shared custom worker pool for continue routing Exchange after kafka server has acknowledge the message that was sent to it from KafkaProducer using asynchronous non-blocking processing. If using this option then you must handle the lifecycle of the thread pool to shut the pool down when no longer needed. |  | ExecutorService
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *breakOnFirstError* (consumer) | This options controls what happens when a consumer is processing an exchange and it fails. If the option is false then the consumer continues to the next message and processes it. If the option is true then the consumer breaks out, and will seek back to offset of the message that caused a failure, and then re-attempt to process this message. However this can lead to endless processing of the same message if its bound to fail every time, eg a poison mess [...]
 | *allowManualCommit* (consumer) | Whether to allow doing manual commits via KafkaManualCommit. If this option is enabled then an instance of KafkaManualCommit is stored on the Exchange message header, which allows end users to access this API and perform manual offset commits via the Kafka consumer. | false | boolean
-| *kafkaManualCommit Factory* (consumer) | Factory to use for creating KafkaManualCommit instances. This allows to plugin a custom factory to create custom KafkaManualCommit instances in case special logic is needed when doing manual commits that deviates from the default implementation that comes out of the box. |  | KafkaManualCommitFactory
+| *kafkaManualCommitFactory* (consumer) | Factory to use for creating KafkaManualCommit instances. This allows to plugin a custom factory to create custom KafkaManualCommit instances in case special logic is needed when doing manual commits that deviates from the default implementation that comes out of the box. |  | KafkaManualCommitFactory
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -156,9 +156,9 @@ with the following path and query parameters:
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *interceptorClasses* (monitoring) | Sets interceptors for producer or consumers. Producer interceptors have to be classes implementing org.apache.kafka.clients.producer.ProducerInterceptor Consumer interceptors have to be classes implementing org.apache.kafka.clients.consumer.ConsumerInterceptor Note that if you use Producer interceptor on a consumer it will throw a class cast exception in runtime |  | String
-| *kerberosBeforeReloginMin Time* (security) | Login thread sleep time between refresh attempts. | 60000 | Integer
+| *kerberosBeforeReloginMinTime* (security) | Login thread sleep time between refresh attempts. | 60000 | Integer
 | *kerberosInitCmd* (security) | Kerberos kinit command path. Default is /usr/bin/kinit | /usr/bin/kinit | String
-| *kerberosPrincipalToLocal Rules* (security) | A list of rules for mapping from principal names to short names (typically operating system usernames). The rules are evaluated in order and the first rule that matches a principal name is used to map it to a short name. Any later rules in the list are ignored. By default, principal names of the form \{username\}/\{hostname\}\{REALM\} are mapped to \{username\}. For more details on the format please see the security authorization and acls d [...]
+| *kerberosPrincipalToLocalRules* (security) | A list of rules for mapping from principal names to short names (typically operating system usernames). The rules are evaluated in order and the first rule that matches a principal name is used to map it to a short name. Any later rules in the list are ignored. By default, principal names of the form \{username\}/\{hostname\}\{REALM\} are mapped to \{username\}. For more details on the format please see the security authorization and acls do [...]
 | *kerberosRenewJitter* (security) | Percentage of random jitter added to the renewal time. | 0.05 | Double
 | *kerberosRenewWindowFactor* (security) | Login thread will sleep until the specified window factor of time from last refresh to ticket's expiry has been reached, at which time it will try to renew the ticket. | 0.8 | Double
 | *saslJaasConfig* (security) | Expose the kafka sasl.jaas.config parameter Example: org.apache.kafka.common.security.plain.PlainLoginModule required username=USERNAME password=PASSWORD; |  | String
diff --git a/docs/components/modules/ROOT/pages/lumberjack-component.adoc b/docs/components/modules/ROOT/pages/lumberjack-component.adoc
index 20a53ca..2006580 100644
--- a/docs/components/modules/ROOT/pages/lumberjack-component.adoc
+++ b/docs/components/modules/ROOT/pages/lumberjack-component.adoc
@@ -51,7 +51,7 @@ The Lumberjack component supports 4 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *sslContextParameters* (security) | Sets the default SSL configuration to use for all the endpoints. You can also configure it directly at the endpoint level. |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
 |===
diff --git a/docs/components/modules/ROOT/pages/mail-component.adoc b/docs/components/modules/ROOT/pages/mail-component.adoc
index b092852..6a26e72 100644
--- a/docs/components/modules/ROOT/pages/mail-component.adoc
+++ b/docs/components/modules/ROOT/pages/mail-component.adoc
@@ -103,7 +103,7 @@ The Mail component supports 7 options, which are listed below.
 | Name | Description | Default | Type
 | *configuration* (advanced) | Sets the Mail configuration |  | MailConfiguration
 | *contentTypeResolver* (advanced) | Resolver to determine Content-Type for file attachments. |  | ContentTypeResolver
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -170,7 +170,7 @@ with the following path and query parameters:
 | *subject* (producer) | The Subject of the message being sent. Note: Setting the subject in the header takes precedence over this option. |  | String
 | *to* (producer) | Sets the To email address. Separate multiple email addresses with comma. |  | String
 | *javaMailSender* (producer) | To use a custom org.apache.camel.component.mail.JavaMailSender for sending emails. |  | JavaMailSender
-| *additionalJavaMail Properties* (advanced) | Sets additional java mail properties, that will append/override any default properties that is set based on all the other options. This is useful if you need to add some special options but want to keep the others as is. |  | Properties
+| *additionalJavaMailProperties* (advanced) | Sets additional java mail properties, that will append/override any default properties that is set based on all the other options. This is useful if you need to add some special options but want to keep the others as is. |  | Properties
 | *alternativeBodyHeader* (advanced) | Specifies the key to an IN message header that contains an alternative email body. For example, if you send emails in text/html format and want to provide an alternative mail body for non-HTML email clients, set the alternative mail body with this key as a header. | CamelMailAlternativeBody | String
 | *attachmentsContentTransfer EncodingResolver* (advanced) | To use a custom AttachmentsContentTransferEncodingResolver to resolve what content-type-encoding to use for attachments. |  | AttachmentsContentTransferEncodingResolver
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
@@ -186,7 +186,7 @@ with the following path and query parameters:
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *useInlineAttachments* (advanced) | Whether to use disposition inline or attachment. | false | boolean
 | *idempotentRepository* (filter) | A pluggable repository org.apache.camel.spi.IdempotentRepository which allows to cluster consuming from the same mailbox, and let the repository coordinate whether a mail message is valid for the consumer to process. By default no repository is in use. |  | IdempotentRepository
-| *idempotentRepositoryRemove OnCommit* (filter) | When using idempotent repository, then when the mail message has been successfully processed and is committed, should the message id be removed from the idempotent repository (default) or be kept in the repository. By default its assumed the message id is unique and has no value to be kept in the repository, because the mail message will be marked as seen/moved or deleted to prevent it from being consumed again. And therefore having the  [...]
+| *idempotentRepositoryRemoveOn Commit* (filter) | When using idempotent repository, then when the mail message has been successfully processed and is committed, should the message id be removed from the idempotent repository (default) or be kept in the repository. By default its assumed the message id is unique and has no value to be kept in the repository, because the mail message will be marked as seen/moved or deleted to prevent it from being consumed again. And therefore having the  [...]
 | *searchTerm* (filter) | Refers to a javax.mail.search.SearchTerm which allows to filter mails based on search criteria such as subject, body, from, sent after a certain date etc. |  | SearchTerm
 | *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. |  | int
 | *backoffIdleThreshold* (scheduler) | The number of subsequent idle polls that should happen before the backoffMultipler should kick-in. |  | int
diff --git a/docs/components/modules/ROOT/pages/milo-server-component.adoc b/docs/components/modules/ROOT/pages/milo-server-component.adoc
index f150150..fdb1a2f 100644
--- a/docs/components/modules/ROOT/pages/milo-server-component.adoc
+++ b/docs/components/modules/ROOT/pages/milo-server-component.adoc
@@ -43,20 +43,20 @@ The OPC UA Server component supports 22 options, which are listed below.
 | *applicationUri* (common) | The application URI |  | String
 | *productUri* (common) | The product URI |  | String
 | *bindPort* (common) | The TCP port the server binds to |  | int
-| *strictEndpointUrls Enabled* (common) | Set whether strict endpoint URLs are enforced | false | boolean
+| *strictEndpointUrlsEnabled* (common) | Set whether strict endpoint URLs are enforced | false | boolean
 | *serverName* (common) | Server name |  | String
 | *hostname* (common) | Server hostname |  | String
 | *securityPolicies* (common) | Security policies |  | Set
 | *securityPoliciesById* (common) | Security policies by URI or name |  | Collection
-| *userAuthentication Credentials* (common) | Set user password combinations in the form of user1:pwd1,user2:pwd2 Usernames and passwords will be URL decoded |  | String
-| *enableAnonymous Authentication* (common) | Enable anonymous authentication, disabled by default | false | boolean
-| *usernameSecurityPolicy Uri* (common) | Set the UserTokenPolicy used when |  | SecurityPolicy
+| *userAuthenticationCredentials* (common) | Set user password combinations in the form of user1:pwd1,user2:pwd2 Usernames and passwords will be URL decoded |  | String
+| *enableAnonymousAuthentication* (common) | Enable anonymous authentication, disabled by default | false | boolean
+| *usernameSecurityPolicyUri* (common) | Set the UserTokenPolicy used when |  | SecurityPolicy
 | *bindAddresses* (common) | Set the addresses of the local addresses the server should bind to |  | String
 | *buildInfo* (common) | Server build info |  | BuildInfo
 | *serverCertificate* (common) | Server certificate |  | Result
 | *certificateManager* (common) | Server certificate manager |  | CertificateManager
 | *certificateValidator* (common) | Validator for client certificates |  | Supplier
-| *defaultCertificate Validator* (common) | Validator for client certificates using default file based approach |  | File
+| *defaultCertificateValidator* (common) | Validator for client certificates using default file based approach |  | File
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/mina-component.adoc b/docs/components/modules/ROOT/pages/mina-component.adoc
index c8111b3..18d776f 100644
--- a/docs/components/modules/ROOT/pages/mina-component.adoc
+++ b/docs/components/modules/ROOT/pages/mina-component.adoc
@@ -80,7 +80,7 @@ The Mina component supports 5 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *configuration* (advanced) | To use the shared mina configuration. |  | MinaConfiguration
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/nats-component.adoc b/docs/components/modules/ROOT/pages/nats-component.adoc
index 746faaa..84c3303 100644
--- a/docs/components/modules/ROOT/pages/nats-component.adoc
+++ b/docs/components/modules/ROOT/pages/nats-component.adoc
@@ -44,7 +44,7 @@ The Nats component supports 5 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *servers* (common) | URLs to one or more NAT servers. Use comma to separate URLs when specifying multiple servers. |  | String
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/netty-component.adoc b/docs/components/modules/ROOT/pages/netty-component.adoc
index 770b598..9a0302d 100644
--- a/docs/components/modules/ROOT/pages/netty-component.adoc
+++ b/docs/components/modules/ROOT/pages/netty-component.adoc
@@ -65,7 +65,7 @@ The Netty component supports 8 options, which are listed below.
 | *maximumPoolSize* (consumer) | Sets a maximum thread pool size for the netty consumer ordered thread pool. The default size is 2 x cpu core 1. Setting this value to eg 10 will then use 10 threads unless 2 x cpu core 1 is a higher value, which then will override and be used. For example if there are 8 cores, then the consumer thread pool will be 17. This thread pool is used to route messages received from Netty by Camel. We use a separate thread pool to ensure ordering of messages and a [...]
 | *configuration* (advanced) | To use the NettyConfiguration as configuration when creating endpoints. |  | NettyConfiguration
 | *executorService* (consumer) | To use the given EventExecutorGroup. |  | EventExecutorGroup
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
@@ -121,8 +121,8 @@ with the following path and query parameters:
 | *nettyServerBootstrapFactory* (consumer) | To use a custom NettyServerBootstrapFactory |  | NettyServerBootstrapFactory
 | *networkInterface* (consumer) | When using UDP then this option can be used to specify a network interface by its name, such as eth0 to join a multicast group. |  | String
 | *noReplyLogLevel* (consumer) | If sync is enabled this option dictates NettyConsumer which logging level to use when logging a there is no reply to send back. | WARN | LoggingLevel
-| *serverClosedChannel ExceptionCaughtLogLevel* (consumer) | If the server (NettyConsumer) catches an java.nio.channels.ClosedChannelException then its logged using this logging level. This is used to avoid logging the closed channel exceptions, as clients can disconnect abruptly and then cause a flood of closed exceptions in the Netty server. | DEBUG | LoggingLevel
-| *serverExceptionCaughtLog Level* (consumer) | If the server (NettyConsumer) catches an exception then its logged using this logging level. | WARN | LoggingLevel
+| *serverClosedChannelException CaughtLogLevel* (consumer) | If the server (NettyConsumer) catches an java.nio.channels.ClosedChannelException then its logged using this logging level. This is used to avoid logging the closed channel exceptions, as clients can disconnect abruptly and then cause a flood of closed exceptions in the Netty server. | DEBUG | LoggingLevel
+| *serverExceptionCaughtLogLevel* (consumer) | If the server (NettyConsumer) catches an exception then its logged using this logging level. | WARN | LoggingLevel
 | *serverInitializerFactory* (consumer) | To use a custom ServerInitializerFactory |  | ServerInitializerFactory
 | *usingExecutorService* (consumer) | Whether to use ordered thread pool, to ensure events are processed orderly on the same channel. | true | boolean
 | *connectTimeout* (producer) | Time to wait for a socket connection to be available. Value is in milliseconds. | 10000 | int
@@ -134,7 +134,7 @@ with the following path and query parameters:
 | *producerPoolEnabled* (producer) | Whether producer pool is enabled or not. Important: If you turn this off then a single shared connection is used for the producer, also if you are doing request/reply. That means there is a potential issue with interleaved responses if replies comes back out-of-order. Therefore you need to have a correlation id in both the request and reply messages so you can properly correlate the replies to the Camel callback that is responsible for continue proces [...]
 | *producerPoolMaxActive* (producer) | Sets the cap on the number of objects that can be allocated by the pool (checked out to clients, or idle awaiting checkout) at a given time. Use a negative value for no limit. | -1 | int
 | *producerPoolMaxIdle* (producer) | Sets the cap on the number of idle instances in the pool. | 100 | int
-| *producerPoolMinEvictable Idle* (producer) | Sets the minimum amount of time (value in millis) an object may sit idle in the pool before it is eligible for eviction by the idle object evictor. | 300000 | long
+| *producerPoolMinEvictableIdle* (producer) | Sets the minimum amount of time (value in millis) an object may sit idle in the pool before it is eligible for eviction by the idle object evictor. | 300000 | long
 | *producerPoolMinIdle* (producer) | Sets the minimum number of instances allowed in the producer pool before the evictor thread (if active) spawns new objects. |  | int
 | *udpConnectionlessSending* (producer) | This option supports connection less udp sending which is a real fire and forget. A connected udp send receive the PortUnreachableException if no one is listen on the receiving port. | false | boolean
 | *useByteBuf* (producer) | If the useByteBuf is true, netty producer will turn the message body into ByteBuf before sending it out. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/netty-http-component.adoc b/docs/components/modules/ROOT/pages/netty-http-component.adoc
index 6531bdc..bcf250d 100644
--- a/docs/components/modules/ROOT/pages/netty-http-component.adoc
+++ b/docs/components/modules/ROOT/pages/netty-http-component.adoc
@@ -104,7 +104,7 @@ The Netty HTTP component supports 11 options, which are listed below.
 | *configuration* (common) | To use the NettyConfiguration as configuration when creating endpoints. |  | NettyHttpConfiguration
 | *headerFilterStrategy* (advanced) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter headers. |  | HeaderFilterStrategy
 | *securityConfiguration* (security) | Refers to a org.apache.camel.component.netty.http.NettyHttpSecurityConfiguration for configuring secure web resources. |  | NettyHttpSecurityConfiguration
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *maximumPoolSize* (consumer) | Sets a maximum thread pool size for the netty consumer ordered thread pool. The default size is 2 x cpu core 1. Setting this value to eg 10 will then use 10 threads unless 2 x cpu core 1 is a higher value, which then will override and be used. For example if there are 8 cores, then the consumer thread pool will be 17. This thread pool is used to route messages received from Netty by Camel. We use a separate thread pool to ensure ordering of messages and a [...]
 | *executorService* (consumer) | To use the given EventExecutorGroup. |  | EventExecutorGroup
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
@@ -174,8 +174,8 @@ with the following path and query parameters:
 | *nettyServerBootstrapFactory* (consumer) | To use a custom NettyServerBootstrapFactory |  | NettyServerBootstrapFactory
 | *nettySharedHttpServer* (consumer) | To use a shared Netty HTTP server. See Netty HTTP Server Example for more details. |  | NettySharedHttpServer
 | *noReplyLogLevel* (consumer) | If sync is enabled this option dictates NettyConsumer which logging level to use when logging a there is no reply to send back. | WARN | LoggingLevel
-| *serverClosedChannel ExceptionCaughtLogLevel* (consumer) | If the server (NettyConsumer) catches an java.nio.channels.ClosedChannelException then its logged using this logging level. This is used to avoid logging the closed channel exceptions, as clients can disconnect abruptly and then cause a flood of closed exceptions in the Netty server. | DEBUG | LoggingLevel
-| *serverExceptionCaughtLog Level* (consumer) | If the server (NettyConsumer) catches an exception then its logged using this logging level. | WARN | LoggingLevel
+| *serverClosedChannelException CaughtLogLevel* (consumer) | If the server (NettyConsumer) catches an java.nio.channels.ClosedChannelException then its logged using this logging level. This is used to avoid logging the closed channel exceptions, as clients can disconnect abruptly and then cause a flood of closed exceptions in the Netty server. | DEBUG | LoggingLevel
+| *serverExceptionCaughtLogLevel* (consumer) | If the server (NettyConsumer) catches an exception then its logged using this logging level. | WARN | LoggingLevel
 | *serverInitializerFactory* (consumer) | To use a custom ServerInitializerFactory |  | ServerInitializerFactory
 | *traceEnabled* (consumer) | Specifies whether to enable HTTP TRACE for this Netty HTTP consumer. By default TRACE is turned off. | false | boolean
 | *urlDecodeHeaders* (consumer) | If this option is enabled, then during binding from Netty to Camel Message then the header values will be URL decoded (eg %20 will be a space character. Notice this option is used by the default org.apache.camel.component.netty.http.NettyHttpBinding and therefore if you implement a custom org.apache.camel.component.netty.http.NettyHttpBinding then you would need to decode the headers accordingly to this option. | false | boolean
@@ -190,7 +190,7 @@ with the following path and query parameters:
 | *producerPoolEnabled* (producer) | Whether producer pool is enabled or not. Important: If you turn this off then a single shared connection is used for the producer, also if you are doing request/reply. That means there is a potential issue with interleaved responses if replies comes back out-of-order. Therefore you need to have a correlation id in both the request and reply messages so you can properly correlate the replies to the Camel callback that is responsible for continue proces [...]
 | *producerPoolMaxActive* (producer) | Sets the cap on the number of objects that can be allocated by the pool (checked out to clients, or idle awaiting checkout) at a given time. Use a negative value for no limit. | -1 | int
 | *producerPoolMaxIdle* (producer) | Sets the cap on the number of idle instances in the pool. | 100 | int
-| *producerPoolMinEvictable Idle* (producer) | Sets the minimum amount of time (value in millis) an object may sit idle in the pool before it is eligible for eviction by the idle object evictor. | 300000 | long
+| *producerPoolMinEvictableIdle* (producer) | Sets the minimum amount of time (value in millis) an object may sit idle in the pool before it is eligible for eviction by the idle object evictor. | 300000 | long
 | *producerPoolMinIdle* (producer) | Sets the minimum number of instances allowed in the producer pool before the evictor thread (if active) spawns new objects. |  | int
 | *useRelativePath* (producer) | Sets whether to use a relative path in HTTP requests. | true | boolean
 | *allowSerializedHeaders* (advanced) | Only used for TCP when transferExchange is true. When set to true, serializable objects in headers and properties will be added to the exchange. Otherwise Camel will exclude any non-serializable objects and log it at WARN level. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/nsq-component.adoc b/docs/components/modules/ROOT/pages/nsq-component.adoc
index 6073e38..3ca42d0 100644
--- a/docs/components/modules/ROOT/pages/nsq-component.adoc
+++ b/docs/components/modules/ROOT/pages/nsq-component.adoc
@@ -44,7 +44,7 @@ The NSQ component supports 5 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *servers* (common) | The hostnames of one or more nsqlookupd servers (consumer) or nsqd servers (producer). |  | String
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/olingo2-component.adoc b/docs/components/modules/ROOT/pages/olingo2-component.adoc
index e975de4..921e82f 100644
--- a/docs/components/modules/ROOT/pages/olingo2-component.adoc
+++ b/docs/components/modules/ROOT/pages/olingo2-component.adoc
@@ -57,7 +57,7 @@ The Olingo2 component supports 5 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *configuration* (common) | To use the shared configuration |  | Olingo2Configuration
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/olingo4-component.adoc b/docs/components/modules/ROOT/pages/olingo4-component.adoc
index 38e04d1..9eefca5 100644
--- a/docs/components/modules/ROOT/pages/olingo4-component.adoc
+++ b/docs/components/modules/ROOT/pages/olingo4-component.adoc
@@ -58,7 +58,7 @@ The Olingo4 component supports 5 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *configuration* (common) | To use the shared configuration |  | Olingo4Configuration
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/pulsar-component.adoc b/docs/components/modules/ROOT/pages/pulsar-component.adoc
index 72c0053..238c9a5 100644
--- a/docs/components/modules/ROOT/pages/pulsar-component.adoc
+++ b/docs/components/modules/ROOT/pages/pulsar-component.adoc
@@ -45,8 +45,8 @@ The Pulsar component supports 7 options, which are listed below.
 | Name | Description | Default | Type
 | *autoConfiguration* (advanced) | The pulsar auto configuration |  | AutoConfiguration
 | *pulsarClient* (advanced) | The pulsar client |  | PulsarClient
-| *allowManual Acknowledgement* (consumer) | Whether to allow manual message acknowledgements. If this option is enabled, then messages are not immediately acknowledged after being consumed. Instead, an instance of PulsarMessageReceipt is stored as a header on the org.apache.camel.Exchange. Messages can then be acknowledged using PulsarMessageReceipt at any time before the ackTimeout occurs. | false | boolean
-| *pulsarMessageReceipt Factory* (consumer) | Provide a factory to create an alternate implementation of PulsarMessageReceipt. |  | PulsarMessageReceiptFactory
+| *allowManualAcknowledgement* (consumer) | Whether to allow manual message acknowledgements. If this option is enabled, then messages are not immediately acknowledged after being consumed. Instead, an instance of PulsarMessageReceipt is stored as a header on the org.apache.camel.Exchange. Messages can then be acknowledged using PulsarMessageReceipt at any time before the ackTimeout occurs. | false | boolean
+| *pulsarMessageReceiptFactory* (consumer) | Provide a factory to create an alternate implementation of PulsarMessageReceipt. |  | PulsarMessageReceiptFactory
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -99,7 +99,7 @@ with the following path and query parameters:
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
 | *batchingEnabled* (producer) | Control whether automatic batching of messages is enabled for the producer. Default is true. | true | boolean
 | *batchingMaxMessages* (producer) | Set the maximum number of messages permitted in a batch. Default 1,000. | 1000 | int
-| *batchingMaxPublishDelay Micros* (producer) | Set the time period within which the messages sent will be batched if batch messages are enabled. If set to a non zero value, messages will be queued until either: this time interval expires the max number of messages in a batch is reached Default is 1ms. | 1000 | long
+| *batchingMaxPublishDelayMicros* (producer) | Set the time period within which the messages sent will be batched if batch messages are enabled. If set to a non zero value, messages will be queued until either: this time interval expires the max number of messages in a batch is reached Default is 1ms. | 1000 | long
 | *blockIfQueueFull* (producer) | Set whether the send and asyncSend operations should block when the outgoing message queue is full. If set to false, send operations will immediately fail with ProducerQueueIsFullError when there is no space left in the pending queue. Default is false. | false | boolean
 | *compressionType* (producer) | Set the compression type for the producer. | NONE | CompressionType
 | *initialSequenceId* (producer) | Set the baseline for the sequence ids for messages published by the producer. First message will be using (initialSequenceId 1) as its sequence id and subsequent messages will be assigned incremental sequence ids, if not otherwise specified. | -1 | long
diff --git a/docs/components/modules/ROOT/pages/quartz-component.adoc b/docs/components/modules/ROOT/pages/quartz-component.adoc
index 39dfd8d..8248e29 100644
--- a/docs/components/modules/ROOT/pages/quartz-component.adoc
+++ b/docs/components/modules/ROOT/pages/quartz-component.adoc
@@ -58,13 +58,13 @@ The Quartz component supports 13 options, which are listed below.
 | Name | Description | Default | Type
 | *autoStartScheduler* (scheduler) | Whether or not the scheduler should be auto started. This options is default true | true | boolean
 | *startDelayedSeconds* (scheduler) | Seconds to wait before starting the quartz scheduler. |  | int
-| *prefixJobNameWith EndpointId* (consumer) | Whether to prefix the quartz job with the endpoint id. This option is default false. | false | boolean
+| *prefixJobNameWithEndpointId* (consumer) | Whether to prefix the quartz job with the endpoint id. This option is default false. | false | boolean
 | *enableJmx* (consumer) | Whether to enable Quartz JMX which allows to manage the Quartz scheduler from JMX. This options is default true | true | boolean
 | *propertiesRef* (consumer) | References to an existing Properties or Map to lookup in the registry to use for configuring quartz. |  | String
 | *properties* (consumer) | Properties to configure the Quartz scheduler. |  | Map
 | *propertiesFile* (consumer) | File name of the properties to load from the classpath |  | String
 | *prefixInstanceName* (consumer) | Whether to prefix the Quartz Scheduler instance name with the CamelContext name. This is enabled by default, to let each CamelContext use its own Quartz scheduler instance by default. You can set this option to false to reuse Quartz scheduler instances between multiple CamelContext's. | true | boolean
-| *interruptJobsOn Shutdown* (scheduler) | Whether to interrupt jobs on shutdown which forces the scheduler to shutdown quicker and attempt to interrupt any running jobs. If this is enabled then any running jobs can fail due to being interrupted. | false | boolean
+| *interruptJobsOnShutdown* (scheduler) | Whether to interrupt jobs on shutdown which forces the scheduler to shutdown quicker and attempt to interrupt any running jobs. If this is enabled then any running jobs can fail due to being interrupted. | false | boolean
 | *schedulerFactory* (advanced) | To use the custom SchedulerFactory which is used to create the Scheduler. |  | SchedulerFactory
 | *scheduler* (advanced) | To use the custom configured Quartz scheduler, instead of creating a new Scheduler. |  | Scheduler
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
@@ -113,7 +113,7 @@ with the following path and query parameters:
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *customCalendar* (advanced) | Specifies a custom calendar to avoid specific range of date |  | Calendar
 | *jobParameters* (advanced) | To configure additional options on the job. |  | Map
-| *prefixJobNameWithEndpoint Id* (advanced) | Whether the job name should be prefixed with endpoint id | false | boolean
+| *prefixJobNameWithEndpointId* (advanced) | Whether the job name should be prefixed with endpoint id | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *triggerParameters* (advanced) | To configure additional options on the trigger. |  | Map
 | *usingFixedCamelContextName* (advanced) | If it is true, JobDataMap uses the CamelContext name directly to reference the CamelContext, if it is false, JobDataMap uses use the CamelContext management name which could be changed during the deploy time. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/rabbitmq-component.adoc b/docs/components/modules/ROOT/pages/rabbitmq-component.adoc
index 5127d22..98effd4 100644
--- a/docs/components/modules/ROOT/pages/rabbitmq-component.adoc
+++ b/docs/components/modules/ROOT/pages/rabbitmq-component.adoc
@@ -67,12 +67,12 @@ The RabbitMQ component supports 52 options, which are listed below.
 | *addresses* (common) | If this option is set, camel-rabbitmq will try to create connection based on the setting of option addresses. The addresses value is a string which looks like server1:12345, server2:12345 |  | String
 | *connectionFactory* (common) | To use a custom RabbitMQ connection factory. When this option is set, all connection options (connectionTimeout, requestedChannelMax...) set on URI are not used |  | ConnectionFactory
 | *threadPoolSize* (consumer) | The consumer uses a Thread Pool Executor with a fixed number of threads. This setting allows you to set that number of threads. | 10 | int
-| *autoDetectConnection Factory* (advanced) | Whether to auto-detect looking up RabbitMQ connection factory from the registry. When enabled and a single instance of the connection factory is found then it will be used. An explicit connection factory can be configured on the component or endpoint level which takes precedence. | true | boolean
+| *autoDetectConnectionFactory* (advanced) | Whether to auto-detect looking up RabbitMQ connection factory from the registry. When enabled and a single instance of the connection factory is found then it will be used. An explicit connection factory can be configured on the component or endpoint level which takes precedence. | true | boolean
 | *connectionTimeout* (advanced) | Connection timeout | 60000 | int
 | *requestedChannelMax* (advanced) | Connection requested channel max (max number of channels offered) | 2047 | int
 | *requestedFrameMax* (advanced) | Connection requested frame max (max size of frame offered) | 0 | int
 | *requestedHeartbeat* (advanced) | Connection requested heartbeat (heart-beat in seconds offered) | 60 | int
-| *automaticRecovery Enabled* (advanced) | Enables connection automatic recovery (uses connection implementation that performs automatic recovery when connection shutdown is not initiated by the application) |  | Boolean
+| *automaticRecoveryEnabled* (advanced) | Enables connection automatic recovery (uses connection implementation that performs automatic recovery when connection shutdown is not initiated by the application) |  | Boolean
 | *networkRecoveryInterval* (advanced) | Network recovery interval in milliseconds (interval used when recovering from network failure) | 5000 | Integer
 | *topologyRecoveryEnabled* (advanced) | Enables connection topology recovery (should topology recovery be performed) |  | Boolean
 | *prefetchEnabled* (consumer) | Enables the quality of service on the RabbitMQConsumer side. You need to specify the option of prefetchSize, prefetchCount, prefetchGlobal at the same time | false | boolean
@@ -82,10 +82,10 @@ The RabbitMQ component supports 52 options, which are listed below.
 | *channelPoolMaxSize* (producer) | Get maximum number of opened channel in pool | 10 | int
 | *channelPoolMaxWait* (producer) | Set the maximum number of milliseconds to wait for a channel from the pool | 1000 | long
 | *requestTimeout* (advanced) | Set timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds) | 20000 | long
-| *requestTimeoutChecker Interval* (advanced) | Set requestTimeoutCheckerInterval for inOut exchange | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Set requestTimeoutCheckerInterval for inOut exchange | 1000 | long
 | *transferException* (advanced) | When true and an inOut Exchange failed on the consumer side send the caused Exception back in the response | false | boolean
-| *publisher Acknowledgements* (producer) | When true, the message will be published with publisher acknowledgements turned on | false | boolean
-| *publisher AcknowledgementsTimeout* (producer) | The amount of time in milliseconds to wait for a basic.ack response from RabbitMQ server |  | long
+| *publisherAcknowledgements* (producer) | When true, the message will be published with publisher acknowledgements turned on | false | boolean
+| *publisherAcknowledgements Timeout* (producer) | The amount of time in milliseconds to wait for a basic.ack response from RabbitMQ server |  | long
 | *guaranteedDeliveries* (producer) | When true, an exception will be thrown when the message cannot be delivered (basic.return) and the message is marked as mandatory. PublisherAcknowledgement will also be activated in this case. See also publisher acknowledgements - When will messages be confirmed. | false | boolean
 | *mandatory* (producer) | This flag tells the server how to react if the message cannot be routed to a queue. If this flag is set, the server will return an unroutable message with a Return method. If this flag is zero, the server silently drops the message. If the header is present rabbitmq.MANDATORY it will override this option. | false | boolean
 | *immediate* (producer) | This flag tells the server how to react if the message cannot be routed to a queue consumer immediately. If this flag is set, the server will return an undeliverable message with a Return method. If this flag is zero, the server will queue the message, but with no guarantee that it will ever be consumed. If the header is present rabbitmq.IMMEDIATE it will override this option. | false | boolean
@@ -191,7 +191,7 @@ with the following path and query parameters:
 | *requestedFrameMax* (advanced) | Connection requested frame max (max size of frame offered) | 0 | int
 | *requestedHeartbeat* (advanced) | Connection requested heartbeat (heart-beat in seconds offered) | 60 | int
 | *requestTimeout* (advanced) | Set timeout for waiting for a reply when using the InOut Exchange Pattern (in milliseconds) | 20000 | long
-| *requestTimeoutChecker Interval* (advanced) | Set requestTimeoutCheckerInterval for inOut exchange | 1000 | long
+| *requestTimeoutCheckerInterval* (advanced) | Set requestTimeoutCheckerInterval for inOut exchange | 1000 | long
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *topologyRecoveryEnabled* (advanced) | Enables connection topology recovery (should topology recovery be performed) |  | Boolean
 | *transferException* (advanced) | When true and an inOut Exchange failed on the consumer side send the caused Exception back in the response | false | boolean
diff --git a/docs/components/modules/ROOT/pages/reactive-streams-component.adoc b/docs/components/modules/ROOT/pages/reactive-streams-component.adoc
index d11d086..11a3788 100644
--- a/docs/components/modules/ROOT/pages/reactive-streams-component.adoc
+++ b/docs/components/modules/ROOT/pages/reactive-streams-component.adoc
@@ -57,7 +57,7 @@ The Reactive Streams component supports 6 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *internalEngine Configuration* (advanced) | Configures the internal engine for Reactive Streams. |  | ReactiveStreamsEngineConfiguration
+| *internalEngineConfiguration* (advanced) | Configures the internal engine for Reactive Streams. |  | ReactiveStreamsEngineConfiguration
 | *backpressureStrategy* (producer) | The backpressure strategy to use when pushing events to a slow subscriber. | BUFFER | ReactiveStreamsBackpressureStrategy
 | *serviceType* (advanced) | Set the type of the underlying reactive streams implementation to use. The implementation is looked up from the registry or using a ServiceLoader, the default implementation is DefaultCamelReactiveStreamsService |  | String
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
diff --git a/docs/components/modules/ROOT/pages/rest-openapi-component.adoc b/docs/components/modules/ROOT/pages/rest-openapi-component.adoc
index 61b9a7f..b31bd48 100644
--- a/docs/components/modules/ROOT/pages/rest-openapi-component.adoc
+++ b/docs/components/modules/ROOT/pages/rest-openapi-component.adoc
@@ -106,7 +106,7 @@ The REST OpenApi component supports 10 options, which are listed below.
 | *produces* (producer) | What payload type this component is producing. For example application/json according to the RFC7231. This equates to the value of Content-Type HTTP header. If set overrides any value present in the OpenApi specification. Can be overridden in endpoint configuration. |  | String
 | *specificationUri* (producer) | Path to the OpenApi specification file. The scheme, host base path are taken from this specification, but these can be overridden with properties on the component or endpoint level. If not given the component tries to load openapi.json resource. Note that the host defined on the component and endpoint of this Component should contain the scheme, hostname and optionally the port in the URI syntax (i.e. \https://api.example.com:8080). Can be overridden in  [...]
 | *sslContextParameters* (security) | Customize TLS parameters used by the component. If not set defaults to the TLS parameters set in the Camel context |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 |===
diff --git a/docs/components/modules/ROOT/pages/rest-swagger-component.adoc b/docs/components/modules/ROOT/pages/rest-swagger-component.adoc
index 3e12b1c..4d736d5 100644
--- a/docs/components/modules/ROOT/pages/rest-swagger-component.adoc
+++ b/docs/components/modules/ROOT/pages/rest-swagger-component.adoc
@@ -103,7 +103,7 @@ The REST Swagger component supports 10 options, which are listed below.
 | *produces* (producer) | What payload type this component is producing. For example application/json according to the RFC7231. This equates to the value of Content-Type HTTP header. If set overrides any value present in the Swagger specification. Can be overridden in endpoint configuration. |  | String
 | *specificationUri* (producer) | Path to the Swagger specification file. The scheme, host base path are taken from this specification, but these can be overridden with properties on the component or endpoint level. If not given the component tries to load swagger.json resource. Note that the host defined on the component and endpoint of this Component should contain the scheme, hostname and optionally the port in the URI syntax (i.e. \https://api.example.com:8080). Can be overridden in  [...]
 | *sslContextParameters* (security) | Customize TLS parameters used by the component. If not set defaults to the TLS parameters set in the Camel context |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 |===
diff --git a/docs/components/modules/ROOT/pages/servicenow-component.adoc b/docs/components/modules/ROOT/pages/servicenow-component.adoc
index a411be0..757f100 100644
--- a/docs/components/modules/ROOT/pages/servicenow-component.adoc
+++ b/docs/components/modules/ROOT/pages/servicenow-component.adoc
@@ -55,7 +55,7 @@ The ServiceNow component supports 15 options, which are listed below.
 | *proxyPort* (advanced) | The proxy port number |  | Integer
 | *proxyUserName* (security) | Username for proxy authentication |  | String
 | *proxyPassword* (security) | Password for proxy authentication |  | String
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 |===
@@ -119,7 +119,7 @@ with the following path and query parameters:
 | *httpClientPolicy* (advanced) | To configure http-client |  | HTTPClientPolicy
 | *mapper* (advanced) | Sets Jackson's ObjectMapper to use for request/reply |  | ObjectMapper
 | *proxyAuthorizationPolicy* (advanced) | To configure proxy authentication |  | ProxyAuthorizationPolicy
-| *retrieveTargetRecordOn Import* (advanced) | Set this parameter to true to retrieve the target record when using import set api. The import set result is then replaced by the target record | false | Boolean
+| *retrieveTargetRecordOnImport* (advanced) | Set this parameter to true to retrieve the target record when using import set api. The import set result is then replaced by the target record | false | Boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *timeFormat* (advanced) | The time format used for Json serialization/deserialization | HH:mm:ss | String
 | *proxyHost* (proxy) | The proxy host name |  | String
diff --git a/docs/components/modules/ROOT/pages/servlet-component.adoc b/docs/components/modules/ROOT/pages/servlet-component.adoc
index 509c92e..827d759 100644
--- a/docs/components/modules/ROOT/pages/servlet-component.adoc
+++ b/docs/components/modules/ROOT/pages/servlet-component.adoc
@@ -61,11 +61,11 @@ The Servlet component supports 10 options, which are listed below.
 | Name | Description | Default | Type
 | *servletName* (consumer) | Default name of servlet to use. The default name is CamelServlet. | CamelServlet | String
 | *httpRegistry* (consumer) | To use a custom org.apache.camel.component.servlet.HttpRegistry. |  | HttpRegistry
-| *attachmentMultipart Binding* (consumer) | Whether to automatic bind multipart/form-data as attachments on the Camel Exchange. The options attachmentMultipartBinding=true and disableStreamCache=false cannot work together. Remove disableStreamCache to use AttachmentMultipartBinding. This is turn off by default as this may require servlet specific configuration to enable this when using Servlet's. | false | boolean
+| *attachmentMultipartBinding* (consumer) | Whether to automatic bind multipart/form-data as attachments on the Camel Exchange. The options attachmentMultipartBinding=true and disableStreamCache=false cannot work together. Remove disableStreamCache to use AttachmentMultipartBinding. This is turn off by default as this may require servlet specific configuration to enable this when using Servlet's. | false | boolean
 | *fileNameExtWhitelist* (consumer) | Whitelist of accepted filename extensions for accepting uploaded files. Multiple extensions can be separated by comma, such as txt,xml. |  | String
 | *httpBinding* (advanced) | To use a custom HttpBinding to control the mapping between Camel message and HttpClient. |  | HttpBinding
 | *httpConfiguration* (advanced) | To use the shared HttpConfiguration as base configuration. |  | HttpConfiguration
-| *allowJavaSerialized Object* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
+| *allowJavaSerializedObject* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
@@ -118,7 +118,7 @@ with the following path and query parameters:
 | *traceEnabled* (consumer) | Specifies whether to enable HTTP TRACE for this Servlet consumer. By default TRACE is turned off. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *mapHttpMessageBody* (advanced) | If this option is true then IN exchange Body of the exchange will be mapped to HTTP body. Setting this to false will avoid the HTTP mapping. | true | boolean
-| *mapHttpMessageFormUrl EncodedBody* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
+| *mapHttpMessageFormUrlEncoded Body* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
 | *mapHttpMessageHeaders* (advanced) | If this option is true then IN exchange Headers of the exchange will be mapped to HTTP headers. Setting this to false will avoid the HTTP Headers mapping. | true | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 |===
diff --git a/docs/components/modules/ROOT/pages/sftp-component.adoc b/docs/components/modules/ROOT/pages/sftp-component.adoc
index c1ec635..c89e5e5 100644
--- a/docs/components/modules/ROOT/pages/sftp-component.adoc
+++ b/docs/components/modules/ROOT/pages/sftp-component.adoc
@@ -91,10 +91,10 @@ with the following path and query parameters:
 | *download* (consumer) | Whether the FTP consumer should download the file. If this option is set to false, then the message body will be null, but the consumer will still trigger a Camel Exchange that has details about the file such as file name, file size, etc. It's just that the file will not be downloaded. | false | boolean
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
-| *ignoreFileNotFoundOr PermissionError* (consumer) | Whether to ignore when (trying to list files in directories or when downloading a file), which does not exist or due to permission error. By default when a directory or file does not exists or insufficient permission, then an exception is thrown. Setting this option to true allows to ignore that instead. | false | boolean
+| *ignoreFileNotFoundOrPermission Error* (consumer) | Whether to ignore when (trying to list files in directories or when downloading a file), which does not exist or due to permission error. By default when a directory or file does not exists or insufficient permission, then an exception is thrown. Setting this option to true allows to ignore that instead. | false | boolean
 | *inProgressRepository* (consumer) | A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files being consumed. By default a memory based repository is used. |  | IdempotentRepository
 | *localWorkDirectory* (consumer) | When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume a very big remote file and thus can conserve memory. |  | String
-| *onCompletionException Handler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
+| *onCompletionExceptionHandler* (consumer) | To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where the consumer does either a commit or rollback. The default implementation will log any exception at WARN level and ignore. |  | ExceptionHandler
 | *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
 | *processStrategy* (consumer) | A pluggable org.apache.camel.component.file.GenericFileProcessStrategy allowing you to implement your own readLock option or similar. Can also be used when special conditions must be met before a file can be consumed, such as a special ready file exists. If this option is set then the readLock option does not apply. |  | GenericFileProcessStrategy
 | *useList* (consumer) | Whether to allow using LIST command when downloading a file. Default is true. In some use cases you may want to download a specific file and are not allowed to use the LIST command, and therefore you can set this option to false. Notice when using this option, then the specific file to download does not include meta-data information such as file size, timestamp, permissions etc, because those information is only possible to retrieve when LIST command is in use. | [...]
@@ -126,7 +126,7 @@ with the following path and query parameters:
 | *soTimeout* (advanced) | Sets the so timeout FTP and FTPS Only for Camel 2.4. SFTP for Camel 2.14.3/2.15.3/2.16 onwards. Is the SocketOptions.SO_TIMEOUT value in millis. Recommended option is to set this to 300000 so as not have a hanged connection. On SFTP this option is set as timeout on the JSCH Session instance. | 300000 | int
 | *stepwise* (advanced) | Sets whether we should stepwise change directories while traversing file structures when downloading files, or as well when uploading a file to a directory. You can disable this if you for example are in a situation where you cannot change directory on the FTP server due security reasons. | true | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
-| *throwExceptionOnConnect Failed* (advanced) | Should an exception be thrown if connection failed (exhausted) By default exception is not thrown and a WARN is logged. You can use this to enable exception being thrown and handle the thrown exception from the org.apache.camel.spi.PollingConsumerPollStrategy rollback method. | false | boolean
+| *throwExceptionOnConnectFailed* (advanced) | Should an exception be thrown if connection failed (exhausted) By default exception is not thrown and a WARN is logged. You can use this to enable exception being thrown and handle the thrown exception from the org.apache.camel.spi.PollingConsumerPollStrategy rollback method. | false | boolean
 | *timeout* (advanced) | Sets the data timeout for waiting for reply Used only by FTPClient | 30000 | int
 | *antExclude* (filter) | Ant style filter exclusion. If both antInclude and antExclude are used, antExclude takes precedence over antInclude. Multiple exclusions may be specified in comma-delimited format. |  | String
 | *antFilterCaseSensitive* (filter) | Sets case sensitive flag on ant filter | true | boolean
@@ -147,10 +147,10 @@ with the following path and query parameters:
 | *exclusiveReadLockStrategy* (lock) | Pluggable read-lock as a org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy implementation. |  | GenericFileExclusiveReadLockStrategy
 | *readLock* (lock) | Used by consumer, to only poll the files if it has exclusive read-lock on the file (i.e. the file is not in-progress or being written). Camel will wait until the file lock is granted. This option provides the build in strategies: - none - No read lock is in use - markerFile - Camel creates a marker file (fileName.camelLock) and then holds a lock on it. This option is not available for the FTP component - changed - Changed is using file length/modification timestamp  [...]
 | *readLockCheckInterval* (lock) | Interval in millis for the read-lock, if supported by the read lock. This interval is used for sleeping between attempts to acquire the read lock. For example when using the changed read lock, you can set a higher interval period to cater for slow writes. The default of 1 sec. may be too fast if the producer is very slow writing the file. Notice: For FTP the default readLockCheckInterval is 5000. The readLockTimeout value must be higher than readLockChe [...]
-| *readLockDeleteOrphanLock Files* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
-| *readLockIdempotentRelease Async* (lock) | Whether the delayed release task should be synchronous or asynchronous. See more details at the readLockIdempotentReleaseDelay option. | false | boolean
-| *readLockIdempotentRelease AsyncPoolSize* (lock) | The number of threads in the scheduled thread pool when using asynchronous release tasks. Using a default of 1 core threads should be sufficient in almost all use-cases, only set this to a higher value if either updating the idempotent repository is slow, or there are a lot of files to process. This option is not in-use if you use a shared thread pool by configuring the readLockIdempotentReleaseExecutorService option. See more details  [...]
-| *readLockIdempotentRelease Delay* (lock) | Whether to delay the release task for a period of millis. This can be used to delay the release tasks to expand the window when a file is regarded as read-locked, in an active/active cluster scenario with a shared idempotent repository, to ensure other nodes cannot potentially scan and acquire the same file, due to race-conditions. By expanding the time-window of the release tasks helps prevents these situations. Note delaying is only needed i [...]
+| *readLockDeleteOrphanLockFiles* (lock) | Whether or not read lock with marker files should upon startup delete any orphan read lock files, which may have been left on the file system, if Camel was not properly shutdown (such as a JVM crash). If turning this option to false then any orphaned lock file will cause Camel to not attempt to pickup that file, this could also be due another node is concurrently reading files from the same shared directory. | true | boolean
+| *readLockIdempotentReleaseAsync* (lock) | Whether the delayed release task should be synchronous or asynchronous. See more details at the readLockIdempotentReleaseDelay option. | false | boolean
+| *readLockIdempotentReleaseAsync PoolSize* (lock) | The number of threads in the scheduled thread pool when using asynchronous release tasks. Using a default of 1 core threads should be sufficient in almost all use-cases, only set this to a higher value if either updating the idempotent repository is slow, or there are a lot of files to process. This option is not in-use if you use a shared thread pool by configuring the readLockIdempotentReleaseExecutorService option. See more details  [...]
+| *readLockIdempotentReleaseDelay* (lock) | Whether to delay the release task for a period of millis. This can be used to delay the release tasks to expand the window when a file is regarded as read-locked, in an active/active cluster scenario with a shared idempotent repository, to ensure other nodes cannot potentially scan and acquire the same file, due to race-conditions. By expanding the time-window of the release tasks helps prevents these situations. Note delaying is only needed if [...]
 | *readLockIdempotentRelease ExecutorService* (lock) | To use a custom and shared thread pool for asynchronous release tasks. See more details at the readLockIdempotentReleaseDelay option. |  | ScheduledExecutorService
 | *readLockLoggingLevel* (lock) | Logging level used when a read lock could not be acquired. By default a DEBUG is logged. You can change this level, for example to OFF to not have any logging. This option is only applicable for readLock of types: changed, fileLock, idempotent, idempotent-changed, idempotent-rename, rename. | DEBUG | LoggingLevel
 | *readLockMarkerFile* (lock) | Whether to use marker file with the changed, rename, or exclusive read lock types. By default a marker file is used as well to guard against other processes picking up the same files. This behavior can be turned off by setting this option to false. For example if you do not want to write marker files to the file systems by the Camel application. | true | boolean
diff --git a/docs/components/modules/ROOT/pages/sjms-batch-component.adoc b/docs/components/modules/ROOT/pages/sjms-batch-component.adoc
index b922d70..9ad2413 100644
--- a/docs/components/modules/ROOT/pages/sjms-batch-component.adoc
+++ b/docs/components/modules/ROOT/pages/sjms-batch-component.adoc
@@ -188,7 +188,7 @@ with the following path and query parameters:
 | *messageCreatedStrategy* (advanced) | To use the given MessageCreatedStrategy which are invoked when Camel creates new instances of javax.jms.Message objects when Camel is sending a JMS message. |  | MessageCreatedStrategy
 | *recoveryInterval* (advanced) | Specifies the interval between recovery attempts, i.e. when a connection is being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds. | 5000 | int
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
-| *timeoutCheckerExecutor Service* (advanced) | If using the completionInterval option a background thread is created to trigger the completion interval. Set this option to provide a custom thread pool to be used rather than creating a new thread for every consumer. |  | ScheduledExecutorService
+| *timeoutCheckerExecutorService* (advanced) | If using the completionInterval option a background thread is created to trigger the completion interval. Set this option to provide a custom thread pool to be used rather than creating a new thread for every consumer. |  | ScheduledExecutorService
 |===
 // endpoint options: END
 // spring-boot-auto-configure options: START
diff --git a/docs/components/modules/ROOT/pages/sjms-component.adoc b/docs/components/modules/ROOT/pages/sjms-component.adoc
index 9272354..231241e 100644
--- a/docs/components/modules/ROOT/pages/sjms-component.adoc
+++ b/docs/components/modules/ROOT/pages/sjms-component.adoc
@@ -97,8 +97,8 @@ The Simple JMS component supports 17 options, which are listed below.
 | *connectionResource* (advanced) | A ConnectionResource is an interface that allows for customization and container control of the ConnectionFactory. See Plugable Connection Resource Management for further details. |  | ConnectionResource
 | *connectionCount* (common) | The maximum number of connections available to endpoints started under this component | 1 | Integer
 | *jmsKeyFormatStrategy* (advanced) | Pluggable strategy for encoding and decoding JMS keys so they can be compliant with the JMS specification. Camel provides one implementation out of the box: default. The default strategy will safely marshal dots and hyphens (. and -). Can be used for JMS brokers which do not care whether JMS header keys contain illegal characters. You can provide your own implementation of the org.apache.camel.component.jms.JmsKeyFormatStrategy and refer to it using  [...]
-| *transactionCommit Strategy* (transaction) | To configure which kind of commit strategy to use. Camel provides two implementations out of the box, default and batch. |  | TransactionCommitStrategy
-| *destinationCreation Strategy* (advanced) | To use a custom DestinationCreationStrategy. |  | DestinationCreationStrategy
+| *transactionCommitStrategy* (transaction) | To configure which kind of commit strategy to use. Camel provides two implementations out of the box, default and batch. |  | TransactionCommitStrategy
+| *destinationCreationStrategy* (advanced) | To use a custom DestinationCreationStrategy. |  | DestinationCreationStrategy
 | *timedTaskManager* (advanced) | To use a custom TimedTaskManager |  | TimedTaskManager
 | *messageCreatedStrategy* (advanced) | To use the given MessageCreatedStrategy which are invoked when Camel creates new instances of javax.jms.Message objects when Camel is sending a JMS message. |  | MessageCreatedStrategy
 | *connectionTestOnBorrow* (advanced) | When using the default org.apache.camel.component.sjms.jms.ConnectionFactoryResource then should each javax.jms.Connection be tested (calling start) before returned from the pool. | true | boolean
diff --git a/docs/components/modules/ROOT/pages/sjms2-component.adoc b/docs/components/modules/ROOT/pages/sjms2-component.adoc
index d846ae7..2736fab 100644
--- a/docs/components/modules/ROOT/pages/sjms2-component.adoc
+++ b/docs/components/modules/ROOT/pages/sjms2-component.adoc
@@ -100,8 +100,8 @@ The Simple JMS2 component supports 17 options, which are listed below.
 | *connectionResource* (advanced) | A ConnectionResource is an interface that allows for customization and container control of the ConnectionFactory. See Plugable Connection Resource Management for further details. |  | ConnectionResource
 | *connectionCount* (common) | The maximum number of connections available to endpoints started under this component | 1 | Integer
 | *jmsKeyFormatStrategy* (advanced) | Pluggable strategy for encoding and decoding JMS keys so they can be compliant with the JMS specification. Camel provides one implementation out of the box: default. The default strategy will safely marshal dots and hyphens (. and -). Can be used for JMS brokers which do not care whether JMS header keys contain illegal characters. You can provide your own implementation of the org.apache.camel.component.jms.JmsKeyFormatStrategy and refer to it using  [...]
-| *transactionCommit Strategy* (transaction) | To configure which kind of commit strategy to use. Camel provides two implementations out of the box, default and batch. |  | TransactionCommitStrategy
-| *destinationCreation Strategy* (advanced) | To use a custom DestinationCreationStrategy. |  | DestinationCreationStrategy
+| *transactionCommitStrategy* (transaction) | To configure which kind of commit strategy to use. Camel provides two implementations out of the box, default and batch. |  | TransactionCommitStrategy
+| *destinationCreationStrategy* (advanced) | To use a custom DestinationCreationStrategy. |  | DestinationCreationStrategy
 | *timedTaskManager* (advanced) | To use a custom TimedTaskManager |  | TimedTaskManager
 | *messageCreatedStrategy* (advanced) | To use the given MessageCreatedStrategy which are invoked when Camel creates new instances of javax.jms.Message objects when Camel is sending a JMS message. |  | MessageCreatedStrategy
 | *connectionTestOnBorrow* (advanced) | When using the default org.apache.camel.component.sjms.jms.ConnectionFactoryResource then should each javax.jms.Connection be tested (calling start) before returned from the pool. | true | boolean
diff --git a/docs/components/modules/ROOT/pages/solr-component.adoc b/docs/components/modules/ROOT/pages/solr-component.adoc
index 29a7116..cdabd70 100644
--- a/docs/components/modules/ROOT/pages/solr-component.adoc
+++ b/docs/components/modules/ROOT/pages/solr-component.adoc
@@ -79,7 +79,7 @@ with the following path and query parameters:
 | Name | Description | Default | Type
 | *allowCompression* (producer) | Server side must support gzip or deflate for this to have any effect |  | Boolean
 | *connectionTimeout* (producer) | connectionTimeout on the underlying HttpConnectionManager |  | Integer
-| *defaultMaxConnectionsPer Host* (producer) | maxConnectionsPerHost on the underlying HttpConnectionManager |  | Integer
+| *defaultMaxConnectionsPerHost* (producer) | maxConnectionsPerHost on the underlying HttpConnectionManager |  | Integer
 | *followRedirects* (producer) | indicates whether redirects are used to get to the Solr server |  | Boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *maxRetries* (producer) | Maximum number of retries to attempt in the event of transient errors |  | Integer
diff --git a/docs/components/modules/ROOT/pages/soroush-component.adoc b/docs/components/modules/ROOT/pages/soroush-component.adoc
index d9a9c9e..a147378 100644
--- a/docs/components/modules/ROOT/pages/soroush-component.adoc
+++ b/docs/components/modules/ROOT/pages/soroush-component.adoc
@@ -111,7 +111,7 @@ with the following path and query parameters:
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 | *backOffStrategy* (scheduling) | The strategy to backoff in case of connection failure. Currently 3 strategies are supported: 1. Exponential (default): It multiply retryWaitingTime by retryExponentialCoefficient after each connection failure. 2. Linear: It increase retryWaitingTime by retryLinearIncrement after each connection failure. 3. Fixed: Always use retryWaitingTime as the time between retries. | Exponential | String
 | *maxRetryWaitingTime* (scheduling) | Maximum amount of time (in millisecond) a thread wait before retrying failed request. | 3600000 | long
-| *reconnectIdleConnection Timeout* (scheduling) | The timeout in millisecond to reconnect the existing getMessage connection to ensure that the connection is always live and does not dead without notifying the bot. this value should not be changed. | 300000 | long
+| *reconnectIdleConnectionTimeout* (scheduling) | The timeout in millisecond to reconnect the existing getMessage connection to ensure that the connection is always live and does not dead without notifying the bot. this value should not be changed. | 300000 | long
 | *retryExponentialCoefficient* (scheduling) | Coefficient to compute back off time when using Exponential Back Off strategy | 2 | long
 | *retryLinearIncrement* (scheduling) | The amount of time (in millisecond) which adds to waiting time when using Linear back off strategy | 10000 | long
 | *retryWaitingTime* (scheduling) | Waiting time before retry failed request (Millisecond). If backOffStrategy is not Fixed this is the based value for computing back off waiting time. the first retry is always happen immediately after failure and retryWaitingTime do not apply to the first retry. | 1000 | long
diff --git a/docs/components/modules/ROOT/pages/splunk-component.adoc b/docs/components/modules/ROOT/pages/splunk-component.adoc
index b5d4c1d..d929c6a 100644
--- a/docs/components/modules/ROOT/pages/splunk-component.adoc
+++ b/docs/components/modules/ROOT/pages/splunk-component.adoc
@@ -99,7 +99,7 @@ The Splunk component supports 4 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *splunkConfiguration Factory* (advanced) | To use the SplunkConfigurationFactory |  | SplunkConfigurationFactory
+| *splunkConfigurationFactory* (advanced) | To use the SplunkConfigurationFactory |  | SplunkConfigurationFactory
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/spring-ws-component.adoc b/docs/components/modules/ROOT/pages/spring-ws-component.adoc
index 4b9e7ba..cd03925 100644
--- a/docs/components/modules/ROOT/pages/spring-ws-component.adoc
+++ b/docs/components/modules/ROOT/pages/spring-ws-component.adoc
@@ -96,7 +96,7 @@ The Spring WebService component supports 4 options, which are listed below.
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/stomp-component.adoc b/docs/components/modules/ROOT/pages/stomp-component.adoc
index 6b44bfa..fa1ef29 100644
--- a/docs/components/modules/ROOT/pages/stomp-component.adoc
+++ b/docs/components/modules/ROOT/pages/stomp-component.adoc
@@ -55,7 +55,7 @@ The Stomp component supports 10 options, which are listed below.
 | *login* (security) | The username |  | String
 | *passcode* (security) | The password |  | String
 | *host* (common) | The virtual host |  | String
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
diff --git a/docs/components/modules/ROOT/pages/undertow-component.adoc b/docs/components/modules/ROOT/pages/undertow-component.adoc
index 2786c24..dd657f8 100644
--- a/docs/components/modules/ROOT/pages/undertow-component.adoc
+++ b/docs/components/modules/ROOT/pages/undertow-component.adoc
@@ -57,7 +57,7 @@ The Undertow component supports 8 options, which are listed below.
 | Name | Description | Default | Type
 | *undertowHttpBinding* (advanced) | To use a custom HttpBinding to control the mapping between Camel message and HttpClient. |  | UndertowHttpBinding
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *hostOptions* (advanced) | To configure common options, such as thread pools |  | UndertowHostOptions
 | *muteException* (consumer) | If enabled and an Exchange failed processing on the consumer side the response's body won't contain the exception's stack trace. | false | boolean
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
diff --git a/docs/components/modules/ROOT/pages/weather-component.adoc b/docs/components/modules/ROOT/pages/weather-component.adoc
index 8e0b7ad..c2f9244 100644
--- a/docs/components/modules/ROOT/pages/weather-component.adoc
+++ b/docs/components/modules/ROOT/pages/weather-component.adoc
@@ -61,7 +61,7 @@ The Weather component supports 5 options, which are listed below.
 |===
 | Name | Description | Default | Type
 | *geolocationAccessKey* (common) | The geolocation service now needs an accessKey to be used |  | String
-| *geolocationRequestHost IP* (common) | The geolocation service now needs to specify the IP associated to the accessKey you're using |  | String
+| *geolocationRequestHostIP* (common) | The geolocation service now needs to specify the IP associated to the accessKey you're using |  | String
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/websocket-component.adoc b/docs/components/modules/ROOT/pages/websocket-component.adoc
index d8fcde0..b34a4a4 100644
--- a/docs/components/modules/ROOT/pages/websocket-component.adoc
+++ b/docs/components/modules/ROOT/pages/websocket-component.adoc
@@ -51,7 +51,7 @@ The Jetty Websocket component supports 16 options, which are listed below.
 | *maxThreads* (advanced) | To set a value for maximum number of threads in server thread pool. MaxThreads/minThreads or threadPool fields are required due to switch to Jetty9. The default values for maxThreads is 1 2 noCores. |  | Integer
 | *threadPool* (advanced) | To use a custom thread pool for the server. MaxThreads/minThreads or threadPool fields are required due to switch to Jetty9. |  | ThreadPool
 | *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
-| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
 | *socketFactory* (common) | To configure a map which contains custom WebSocketFactory for sub protocols. The key in the map is the sub protocol. The default key is reserved for the default implementation. |  | Map
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
diff --git a/docs/components/modules/ROOT/pages/xj-component.adoc b/docs/components/modules/ROOT/pages/xj-component.adoc
index c53e3a6..22d9fdf 100644
--- a/docs/components/modules/ROOT/pages/xj-component.adoc
+++ b/docs/components/modules/ROOT/pages/xj-component.adoc
@@ -56,7 +56,7 @@ The XJ component supports 10 options, which are listed below.
 | Name | Description | Default | Type
 | *saxonExtensionFunctions* (advanced) | Allows you to use a custom net.sf.saxon.lib.ExtensionFunctionDefinition. You would need to add camel-saxon to the classpath. The function is looked up in the registry, where you can comma to separate multiple values to lookup. |  | String
 | *saxonConfiguration* (advanced) | To use a custom Saxon configuration |  | Configuration
-| *saxonConfiguration Properties* (advanced) | To set custom Saxon configuration properties |  | Map
+| *saxonConfigurationProperties* (advanced) | To set custom Saxon configuration properties |  | Map
 | *uriResolverFactory* (advanced) | To use a custom UriResolver which depends on a dynamic endpoint resource URI. Should not be used together with the option 'uriResolver'. |  | XsltUriResolverFactory
 | *uriResolver* (advanced) | To use a custom UriResolver. Should not be used together with the option 'uriResolverFactory'. |  | URIResolver
 | *contentCache* (producer) | Cache for the resource content (the stylesheet file) when it is loaded. If set to false Camel will reload the stylesheet file on each message processing. This is good for development. A cached stylesheet can be forced to reload at runtime via JMX using the clearCachedStylesheet operation. | true | boolean
diff --git a/docs/components/modules/ROOT/pages/xmlsecurity-component.adoc b/docs/components/modules/ROOT/pages/xmlsecurity-component.adoc
index 610167d..47b531f 100644
--- a/docs/components/modules/ROOT/pages/xmlsecurity-component.adoc
+++ b/docs/components/modules/ROOT/pages/xmlsecurity-component.adoc
@@ -301,7 +301,7 @@ with the following path and query parameters:
 | *parentXpath* (sign) | Sets the XPath to find the parent node in the enveloped case. Either you specify the parent node via this method or the local name and namespace of the parent with the methods setParentLocalName(String) and setParentNamespace(String). Default value is null. The value must be null for enveloping and detached XML signature. If the parameters parentXpath and parentLocalName are specified in the same configuration then an exception is thrown. |  | XPathFilterParameterSpec
 | *plainText* (sign) | Indicator whether the message body contains plain text. The default value is false, indicating that the message body contains XML. The value can be overwritten by the header XmlSignatureConstants#HEADER_MESSAGE_IS_PLAIN_TEXT. | false | Boolean
 | *plainTextEncoding* (sign) | Encoding of the plain text. Only relevant if the message body is plain text (see parameter plainText. Default value is UTF-8. | UTF-8 | String
-| *prefixForXmlSignature Namespace* (sign) | Namespace prefix for the XML signature namespace \http://www.w3.org/2000/09/xmldsig#. Default value is ds. If null or an empty value is set then no prefix is used for the XML signature namespace. See best practice \http://www.w3.org/TR/xmldsig-bestpractices/#signing-xml- without-namespaces | ds | String
+| *prefixForXmlSignatureNamespace* (sign) | Namespace prefix for the XML signature namespace \http://www.w3.org/2000/09/xmldsig#. Default value is ds. If null or an empty value is set then no prefix is used for the XML signature namespace. See best practice \http://www.w3.org/TR/xmldsig-bestpractices/#signing-xml- without-namespaces | ds | String
 | *properties* (sign) | For adding additional References and Objects to the XML signature which contain additional properties, you can provide a bean which implements the XmlSignatureProperties interface. |  | XmlSignatureProperties
 | *signatureAlgorithm* (sign) | Signature algorithm. Default value is \http://www.w3.org/2000/09/xmldsig#rsa-sha1. | http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 | String
 | *signatureId* (sign) | Sets the signature Id. If this parameter is not set (null value) then a unique ID is generated for the signature ID (default). If this parameter is set to (empty string) then no Id attribute is created in the signature element. |  | String
diff --git a/docs/components/modules/ROOT/pages/xslt-saxon-component.adoc b/docs/components/modules/ROOT/pages/xslt-saxon-component.adoc
index 3eea5eb..b04a1c2 100644
--- a/docs/components/modules/ROOT/pages/xslt-saxon-component.adoc
+++ b/docs/components/modules/ROOT/pages/xslt-saxon-component.adoc
@@ -49,7 +49,7 @@ The XSLT Saxon component supports 10 options, which are listed below.
 | Name | Description | Default | Type
 | *saxonExtensionFunctions* (advanced) | Allows you to use a custom net.sf.saxon.lib.ExtensionFunctionDefinition. You would need to add camel-saxon to the classpath. The function is looked up in the registry, where you can comma to separate multiple values to lookup. |  | String
 | *saxonConfiguration* (advanced) | To use a custom Saxon configuration |  | Configuration
-| *saxonConfiguration Properties* (advanced) | To set custom Saxon configuration properties |  | Map
+| *saxonConfigurationProperties* (advanced) | To set custom Saxon configuration properties |  | Map
 | *uriResolverFactory* (advanced) | To use a custom UriResolver which depends on a dynamic endpoint resource URI. Should not be used together with the option 'uriResolver'. |  | XsltUriResolverFactory
 | *uriResolver* (advanced) | To use a custom UriResolver. Should not be used together with the option 'uriResolverFactory'. |  | URIResolver
 | *contentCache* (producer) | Cache for the resource content (the stylesheet file) when it is loaded. If set to false Camel will reload the stylesheet file on each message processing. This is good for development. A cached stylesheet can be forced to reload at runtime via JMX using the clearCachedStylesheet operation. | true | boolean
diff --git a/docs/components/modules/ROOT/pages/zookeeper-master-component.adoc b/docs/components/modules/ROOT/pages/zookeeper-master-component.adoc
index eae1ffa..86ee41d 100644
--- a/docs/components/modules/ROOT/pages/zookeeper-master-component.adoc
+++ b/docs/components/modules/ROOT/pages/zookeeper-master-component.adoc
@@ -49,7 +49,7 @@ The ZooKeeper Master component supports 8 options, which are listed below.
 | *containerIdFactory* (consumer) | To use a custom ContainerIdFactory for creating container ids. |  | ContainerIdFactory
 | *zkRoot* (consumer) | The root path to use in zookeeper where information is stored which nodes are master/slave etc. Will by default use: /camel/zookeepermaster/clusters/master | /camel/zookeepermaster/clusters/master | String
 | *curator* (advanced) | To use a custom configured CuratorFramework as connection to zookeeper ensemble. |  | CuratorFramework
-| *maximumConnection Timeout* (consumer) | Timeout in millis to use when connecting to the zookeeper ensemble | 10000 | int
+| *maximumConnectionTimeout* (consumer) | Timeout in millis to use when connecting to the zookeeper ensemble | 10000 | int
 | *zooKeeperUrl* (consumer) | The url for the zookeeper ensemble | localhost:2181 | String
 | *zooKeeperPassword* (security) | The password to use when connecting to the zookeeper ensemble |  | String
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean


[camel] 03/07: Move srcgen to camel-tooling-util

Posted by gn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 01e676338fea7f0664188e148a05a52d94e91c6b
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Mon Jan 13 08:31:12 2020 +0100

    Move srcgen to camel-tooling-util
---
 .../maven/config/ConnectorConfigGenerator.java     |   8 +-
 .../camel/tooling/util}/srcgen/Annotation.java     |   2 +-
 .../apache/camel/tooling/util}/srcgen/Field.java   |   2 +-
 .../camel/tooling/util}/srcgen/GenericType.java    |   6 +-
 .../camel/tooling/util}/srcgen/JavaClass.java      | 153 +++++++++++++--------
 .../apache/camel/tooling/util}/srcgen/Javadoc.java |   2 +-
 .../apache/camel/tooling/util}/srcgen/Method.java  |  24 +++-
 .../apache/camel/tooling/util}/srcgen/Param.java   |   2 +-
 .../camel/tooling/util}/srcgen/Property.java       |   2 +-
 .../camel/maven/packaging/EndpointDslMojo.java     |   8 +-
 10 files changed, 134 insertions(+), 75 deletions(-)

diff --git a/components/camel-debezium-common/camel-debezium-maven-plugin/src/main/java/org/apache/camel/maven/config/ConnectorConfigGenerator.java b/components/camel-debezium-common/camel-debezium-maven-plugin/src/main/java/org/apache/camel/maven/config/ConnectorConfigGenerator.java
index 4893914..67cff02 100644
--- a/components/camel-debezium-common/camel-debezium-maven-plugin/src/main/java/org/apache/camel/maven/config/ConnectorConfigGenerator.java
+++ b/components/camel-debezium-common/camel-debezium-maven-plugin/src/main/java/org/apache/camel/maven/config/ConnectorConfigGenerator.java
@@ -27,9 +27,9 @@ import io.debezium.config.Configuration;
 import io.debezium.config.Field;
 import io.debezium.relational.history.FileDatabaseHistory;
 import org.apache.camel.component.debezium.configuration.ConfigurationValidation;
-import org.apache.camel.maven.packaging.srcgen.Annotation;
-import org.apache.camel.maven.packaging.srcgen.JavaClass;
-import org.apache.camel.maven.packaging.srcgen.Method;
+import org.apache.camel.tooling.util.srcgen.Annotation;
+import org.apache.camel.tooling.util.srcgen.JavaClass;
+import org.apache.camel.tooling.util.srcgen.Method;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriParams;
@@ -173,7 +173,7 @@ public final class ConnectorConfigGenerator {
         // connector fields
         dbzConfigFields.forEach((fieldName, fieldConfig) -> {
             if (!isFieldInternalOrDeprecated(fieldConfig)) {
-                final org.apache.camel.maven.packaging.srcgen.Field field = javaClass.addField()
+                final org.apache.camel.tooling.util.srcgen.Field field = javaClass.addField()
                         .setName(fieldConfig.getFieldName())
                         .setType(fieldConfig.getRawType())
                         .setPrivate();
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Annotation.java b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Annotation.java
similarity index 98%
rename from tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Annotation.java
rename to tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Annotation.java
index 992a122..34c1ef8 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Annotation.java
+++ b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Annotation.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.maven.packaging.srcgen;
+package org.apache.camel.tooling.util.srcgen;
 
 import java.util.LinkedHashMap;
 import java.util.stream.Collectors;
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Field.java b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Field.java
similarity index 98%
rename from tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Field.java
rename to tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Field.java
index 1fd3cac..edfc731 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Field.java
+++ b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Field.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.maven.packaging.srcgen;
+package org.apache.camel.tooling.util.srcgen;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/GenericType.java b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/GenericType.java
similarity index 99%
rename from tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/GenericType.java
rename to tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/GenericType.java
index abc325a..1f1b064 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/GenericType.java
+++ b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/GenericType.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.maven.packaging.srcgen;
+package org.apache.camel.tooling.util.srcgen;
 
 import java.lang.reflect.Array;
 import java.lang.reflect.GenericArrayType;
@@ -29,10 +29,10 @@ import java.util.Map;
 @SuppressWarnings("rawtypes")
 public class GenericType {
 
-    private static final GenericType ALL = new GenericType(Object.class);
-
     private static final GenericType[] EMPTY = new GenericType[0];
 
+    private static final GenericType ALL = new GenericType(Object.class);
+
     private static final Map<String, Class> PRIMITIVE_CLASSES = new HashMap<>();
 
     public enum BoundType {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/JavaClass.java b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/JavaClass.java
similarity index 81%
rename from tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/JavaClass.java
rename to tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/JavaClass.java
index 4c44e8e..d0e47c1 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/JavaClass.java
+++ b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/JavaClass.java
@@ -14,10 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.maven.packaging.srcgen;
+package org.apache.camel.tooling.util.srcgen;
 
 import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -25,7 +26,6 @@ import java.util.Set;
 import java.util.TreeSet;
 import java.util.stream.Collectors;
 
-import org.jboss.forge.roaster.model.util.Strings;
 
 public class JavaClass {
 
@@ -49,6 +49,7 @@ public class JavaClass {
     boolean isAbstract;
     boolean isClass = true;
     boolean isEnum;
+    int maxImportPerPackage = 10;
 
     public JavaClass() {
     }
@@ -69,6 +70,10 @@ public class JavaClass {
         }
     }
 
+    public void setMaxImportPerPackage(int maxImportPerPackage) {
+        this.maxImportPerPackage = maxImportPerPackage;
+    }
+
     public JavaClass setStatic(boolean aStatic) {
         isStatic = aStatic;
         return this;
@@ -243,6 +248,20 @@ public class JavaClass {
         imports.removeIf(f -> f.startsWith("java.lang.") || f.startsWith(packageName + "."));
         imports.removeIf(GenericType::isPrimitive);
 
+        Map<String, List<String>> importsByPackages = new LinkedHashMap<>();
+        for (String imp : imports) {
+            String key = imp.substring(0, imp.lastIndexOf('.'));
+            importsByPackages.computeIfAbsent(key, k -> new ArrayList<>()).add(imp);
+        }
+        imports.clear();
+        for (Map.Entry<String, List<String>> e : importsByPackages.entrySet()) {
+            if (e.getValue().size() < maxImportPerPackage) {
+                imports.addAll(e.getValue());
+            } else {
+                imports.add(e.getKey() + ".*");
+            }
+        }
+
         sb.append("package ").append(packageName).append(";\n");
         sb.append("\n");
         if (!imports.isEmpty()) {
@@ -267,7 +286,7 @@ public class JavaClass {
                 .append("enum ").append(name).append(" {\n")
                 .append(indent)
                 .append("    ")
-                .append(Strings.join(values, ",\n" + indent + "    "))
+                .append(String.join(",\n" + indent + "    ", values))
                 .append(";\n")
                 .append(indent)
                 .append("}");
@@ -289,7 +308,7 @@ public class JavaClass {
         }
         if (!implementNames.isEmpty()) {
             sb2.append(isClass ? " implements " : " extends ")
-                    .append(Strings.join(implementNames, ", "));
+                    .append(String.join(", ", implementNames));
         }
         sb2.append(" {");
         if (sb2.length() < 80) {
@@ -311,7 +330,7 @@ public class JavaClass {
             if (!implementNames.isEmpty()) {
                 sb.append("\n");
                 sb.append(indent).append(isClass ? "        implements\n" : "        extends\n");
-                sb.append(indent).append("            ").append(Strings.join(implementNames, ", "));
+                sb.append(indent).append("            ").append(String.join(", ", implementNames));
             }
             sb.append(" {\n");
         }
@@ -415,73 +434,91 @@ public class JavaClass {
         }
         printAnnotations(sb, indent, method.annotations);
 
-        StringBuilder sb2 = new StringBuilder();
-        sb2.append(indent);
-        if (method.isPublic) {
-            sb2.append("public ");
-        } else if (method.isProtected) {
-            sb2.append("protected ");
-        }
-        if (method.isDefault) {
-            sb2.append("default ");
-        }
-        if (method.isStatic) {
-            sb2.append("static ");
-        }
-        if (!method.isConstructor) {
-            sb2.append(method.returnType != null ? shortName(method.returnType) : "void");
-            sb2.append(" ");
-        }
-        sb2.append(method.name);
-        sb2.append("(");
-        sb2.append(method.parameters.stream().map(p -> shortName(p.type) + " " + p.name)
-                .collect(Collectors.joining(", ")));
-        sb2.append(") ");
-        if (!method.exceptions.isEmpty()) {
-            sb2.append("throws ");
-            sb2.append(method.exceptions.stream().map(this::shortName).collect(Collectors.joining(", ", "", " ")));
-        }
-        sb2.append("{");
-        if (sb2.length() < 84) {
-            sb.append(sb2);
+        if (method.signature != null) {
+            sb.append(method.signature);
+            if (!method.isAbstract) {
+                sb.append(" {");
+            }
         } else {
-            sb.append(indent);
+            StringBuilder sb2 = new StringBuilder();
+            sb2.append(indent);
             if (method.isPublic) {
-                sb.append("public ");
+                sb2.append("public ");
             } else if (method.isProtected) {
-                sb.append("protected ");
+                sb2.append("protected ");
+            } else if (method.isPrivate) {
+                sb2.append("private ");
             }
             if (method.isDefault) {
-                sb.append("default ");
+                sb2.append("default ");
             }
             if (method.isStatic) {
-                sb.append("static ");
+                sb2.append("static ");
             }
-            sb.append(shortName(method.returnType));
-            sb.append(" ");
-            sb.append(method.name);
-            if (method.parameters.size() > 0) {
-                sb.append("(\n");
-                sb.append(method.parameters.stream().map(p -> indent + "        " + shortName(p.type) + " " + p.name)
-                        .collect(Collectors.joining(",\n")));
-                sb.append(")");
-            } else {
-                sb.append("()");
+            if (!method.isConstructor) {
+                sb2.append(method.returnType != null ? shortName(method.returnType) : "void");
+                sb2.append(" ");
             }
+            sb2.append(method.name);
+            sb2.append("(");
+            sb2.append(method.parameters.stream().map(p -> shortName(p.type) + " " + p.name)
+                    .collect(Collectors.joining(", ")));
+            sb2.append(") ");
             if (!method.exceptions.isEmpty()) {
-                sb.append("\n            throws");
-                sb.append(method.exceptions.stream().map(this::shortName).collect(Collectors.joining(", ", " ", "")));
+                sb2.append("throws ");
+                sb2.append(method.exceptions.stream().map(this::shortName).collect(Collectors.joining(", ", "", " ")));
+            }
+            if (!method.isAbstract) {
+                sb2.append("{");
+            }
+            if (sb2.length() < 84) {
+                sb.append(sb2);
+            } else {
+                sb.append(indent);
+                if (method.isPublic) {
+                    sb.append("public ");
+                } else if (method.isProtected) {
+                    sb.append("protected ");
+                } else if (method.isPrivate) {
+                    sb.append("private ");
+                }
+                if (method.isDefault) {
+                    sb.append("default ");
+                }
+                if (!method.isConstructor) {
+                    sb.append(method.returnType != null ? shortName(method.returnType) : "void");
+                    sb.append(" ");
+                }
+                sb.append(method.name);
+                if (method.parameters.size() > 0) {
+                    sb.append("(\n");
+                    sb.append(method.parameters.stream().map(p -> indent + "        " + shortName(p.type) + " " + p.name)
+                            .collect(Collectors.joining(",\n")));
+                    sb.append(")");
+                } else {
+                    sb.append("()");
+                }
+                if (!method.exceptions.isEmpty()) {
+                    sb.append("\n            throws");
+                    sb.append(method.exceptions.stream().map(this::shortName).collect(Collectors.joining(", ", " ", "")));
+                }
+                if (!method.isAbstract) {
+                    sb.append(" {");
+                }
             }
-            sb.append(" {");
         }
-        sb.append("\n");
-        for (String l : method.body.split("\n")) {
-            sb.append(indent);
-            sb.append("    ");
-            sb.append(l);
+        if (!method.isAbstract) {
             sb.append("\n");
+            for (String l : method.body.split("\n")) {
+                sb.append(indent);
+                sb.append("    ");
+                sb.append(l);
+                sb.append("\n");
+            }
+            sb.append(indent).append("}\n");
+        } else {
+            sb.append(";\n");
         }
-        sb.append(indent).append("}\n");
     }
 
     private void printField(StringBuilder sb, String indent, Field field) {
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Javadoc.java b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Javadoc.java
similarity index 95%
rename from tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Javadoc.java
rename to tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Javadoc.java
index 97b1132..a1ca7c6 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Javadoc.java
+++ b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Javadoc.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.maven.packaging.srcgen;
+package org.apache.camel.tooling.util.srcgen;
 
 public class Javadoc {
 
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Method.java b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Method.java
similarity index 87%
rename from tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Method.java
rename to tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Method.java
index 66f388f..8277350 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Method.java
+++ b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Method.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.maven.packaging.srcgen;
+package org.apache.camel.tooling.util.srcgen;
 
 import java.lang.reflect.Type;
 import java.util.ArrayList;
@@ -27,23 +27,40 @@ public class Method {
     boolean isDefault;
     boolean isPublic;
     boolean isProtected;
+    boolean isPrivate;
     boolean isStatic;
     boolean isConstructor;
+    boolean isAbstract;
+    String signature;
     String body;
     List<Param> parameters = new ArrayList<>();
     List<GenericType> exceptions = new ArrayList<>();
     List<Annotation> annotations = new ArrayList<>();
     Javadoc javadoc = new Javadoc();
 
+    public Method setSignature(String signature) {
+        this.signature = signature;
+        return this;
+    }
+
     public Method setPublic() {
         isPublic = true;
         isProtected = false;
+        isPrivate = false;
         return this;
     }
 
     public Method setProtected() {
         isPublic = false;
         isProtected = true;
+        isPrivate = false;
+        return this;
+    }
+
+    public Method setPrivate() {
+        isPublic = false;
+        isProtected = false;
+        isPrivate = true;
         return this;
     }
 
@@ -57,6 +74,11 @@ public class Method {
         return this;
     }
 
+    public Method setAbstract() {
+        isAbstract = true;
+        return this;
+    }
+
     public String getName() {
         return name;
     }
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Param.java b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Param.java
similarity index 95%
rename from tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Param.java
rename to tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Param.java
index 3e79b22..9f6ae5b 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Param.java
+++ b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Param.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.maven.packaging.srcgen;
+package org.apache.camel.tooling.util.srcgen;
 
 public class Param {
 
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Property.java b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Property.java
similarity index 98%
rename from tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Property.java
rename to tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Property.java
index 819e94f..5d29755 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/srcgen/Property.java
+++ b/tooling/camel-tooling-util/src/main/java/org/apache/camel/tooling/util/srcgen/Property.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.maven.packaging.srcgen;
+package org.apache.camel.tooling.util.srcgen;
 
 public class Property {
 
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java
index aa7ea71..0d54d1a 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/EndpointDslMojo.java
@@ -51,10 +51,10 @@ import org.apache.camel.maven.packaging.generics.GenericsUtil;
 import org.apache.camel.maven.packaging.model.ComponentModel;
 import org.apache.camel.maven.packaging.model.ComponentOptionModel;
 import org.apache.camel.maven.packaging.model.EndpointOptionModel;
-import org.apache.camel.maven.packaging.srcgen.GenericType;
-import org.apache.camel.maven.packaging.srcgen.GenericType.BoundType;
-import org.apache.camel.maven.packaging.srcgen.JavaClass;
-import org.apache.camel.maven.packaging.srcgen.Method;
+import org.apache.camel.tooling.util.srcgen.GenericType;
+import org.apache.camel.tooling.util.srcgen.GenericType.BoundType;
+import org.apache.camel.tooling.util.srcgen.JavaClass;
+import org.apache.camel.tooling.util.srcgen.Method;
 import org.apache.camel.tooling.util.JSonSchemaHelper;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;


[camel] 07/07: Regen endpoint dsl

Posted by gn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit fe981b23937f184cdba8f37ce68cc11430db70f7
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Wed Jan 15 17:06:26 2020 +0100

    Regen endpoint dsl
---
 .../builder/endpoint/EndpointBuilderFactory.java   | 147 +--------------------
 .../camel/builder/endpoint/EndpointBuilders.java   | 147 +--------------------
 ...zelcastReplicatedmapEndpointBuilderFactory.java |   2 +-
 ...ubernetesDeploymentsEndpointBuilderFactory.java |   2 +-
 ...sistentVolumesClaimsEndpointBuilderFactory.java |   2 +-
 ...tesPersistentVolumesEndpointBuilderFactory.java |   2 +-
 ...plicationControllersEndpointBuilderFactory.java |   2 +-
 ...rnetesResourcesQuotaEndpointBuilderFactory.java |   2 +-
 ...netesServiceAccountsEndpointBuilderFactory.java |   2 +-
 ...penshiftBuildConfigsEndpointBuilderFactory.java |   2 +-
 .../dsl/WordpressEndpointBuilderFactory.java       |   2 +-
 11 files changed, 11 insertions(+), 301 deletions(-)

diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
index a8fff09..a6fec89 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
@@ -2423,24 +2423,6 @@ public interface EndpointBuilderFactory {
     }
 
     /**
-     * Hazelcast Replicated Map (camel-hazelcast)
-     * The hazelcast-replicatedmap component is used to access Hazelcast
-     * replicated map.
-     *
-     * Category: cache,datagrid
-     * Since: 2.16
-     * Maven coordinates: org.apache.camel:camel-hazelcast
-     *
-     * Syntax: <code>hazelcast-replicatedmap:cacheName</code>
-     *
-     * Path parameter: cacheName (required)
-     * The name of the cache
-     */
-    default org.apache.camel.builder.endpoint.dsl.HazelcastReplicatedmapEndpointBuilderFactory.HazelcastReplicatedmapEndpointBuilder hazelcastReplicatedmap(String path) {
-        return org.apache.camel.builder.endpoint.dsl.HazelcastReplicatedmapEndpointBuilderFactory.hazelcastReplicatedmap(path);
-    }
-
-    /**
      * Hazelcast Ringbuffer (camel-hazelcast)
      * The hazelcast-ringbuffer component is used to access Hazelcast
      * distributed ringbuffer.
@@ -3340,24 +3322,6 @@ public interface EndpointBuilderFactory {
     }
 
     /**
-     * Kubernetes Deployments (camel-kubernetes)
-     * The Kubernetes Nodes component provides a producer to execute kubernetes
-     * node operations and a consumer to consume node events.
-     *
-     * Category: container,cloud,paas
-     * Since: 2.20
-     * Maven coordinates: org.apache.camel:camel-kubernetes
-     *
-     * Syntax: <code>kubernetes-deployments:masterUrl</code>
-     *
-     * Path parameter: masterUrl (required)
-     * Kubernetes Master url
-     */
-    default org.apache.camel.builder.endpoint.dsl.KubernetesDeploymentsEndpointBuilderFactory.KubernetesDeploymentsEndpointBuilder kubernetesDeployments(String path) {
-        return org.apache.camel.builder.endpoint.dsl.KubernetesDeploymentsEndpointBuilderFactory.kubernetesDeployments(path);
-    }
-
-    /**
      * Kubernetes HPA (camel-kubernetes)
      * The Kubernetes HPA component provides a producer to execute kubernetes
      * hpa operations and a consumer to consume HPA events.
@@ -3431,42 +3395,6 @@ public interface EndpointBuilderFactory {
     }
 
     /**
-     * Kubernetes Persistent Volume Claim (camel-kubernetes)
-     * The Kubernetes Persistent Volumes Claims component provides a producer to
-     * execute kubernetes persistent volume claim operations.
-     *
-     * Category: container,cloud,paas
-     * Since: 2.17
-     * Maven coordinates: org.apache.camel:camel-kubernetes
-     *
-     * Syntax: <code>kubernetes-persistent-volumes-claims:masterUrl</code>
-     *
-     * Path parameter: masterUrl (required)
-     * Kubernetes Master url
-     */
-    default org.apache.camel.builder.endpoint.dsl.KubernetesPersistentVolumesClaimsEndpointBuilderFactory.KubernetesPersistentVolumesClaimsEndpointBuilder kubernetesPersistentVolumesClaims(String path) {
-        return org.apache.camel.builder.endpoint.dsl.KubernetesPersistentVolumesClaimsEndpointBuilderFactory.kubernetesPersistentVolumesClaims(path);
-    }
-
-    /**
-     * Kubernetes Persistent Volume (camel-kubernetes)
-     * The Kubernetes Persistent Volumes component provides a producer to
-     * execute kubernetes persistent volume operations.
-     *
-     * Category: container,cloud,paas
-     * Since: 2.17
-     * Maven coordinates: org.apache.camel:camel-kubernetes
-     *
-     * Syntax: <code>kubernetes-persistent-volumes:masterUrl</code>
-     *
-     * Path parameter: masterUrl (required)
-     * Kubernetes Master url
-     */
-    default org.apache.camel.builder.endpoint.dsl.KubernetesPersistentVolumesEndpointBuilderFactory.KubernetesPersistentVolumesEndpointBuilder kubernetesPersistentVolumes(String path) {
-        return org.apache.camel.builder.endpoint.dsl.KubernetesPersistentVolumesEndpointBuilderFactory.kubernetesPersistentVolumes(path);
-    }
-
-    /**
      * Kubernetes Pods (camel-kubernetes)
      * The Kubernetes Pods component provides a producer to execute kubernetes
      * pod operations and a consumer to consume pod events.
@@ -3485,43 +3413,6 @@ public interface EndpointBuilderFactory {
     }
 
     /**
-     * Kubernetes Replication Controller (camel-kubernetes)
-     * The Kubernetes Replication Controllers component provides a producer to
-     * execute kubernetes replication controller operations and a consumer to
-     * consume replication controller events.
-     *
-     * Category: container,cloud,paas
-     * Since: 2.17
-     * Maven coordinates: org.apache.camel:camel-kubernetes
-     *
-     * Syntax: <code>kubernetes-replication-controllers:masterUrl</code>
-     *
-     * Path parameter: masterUrl (required)
-     * Kubernetes Master url
-     */
-    default org.apache.camel.builder.endpoint.dsl.KubernetesReplicationControllersEndpointBuilderFactory.KubernetesReplicationControllersEndpointBuilder kubernetesReplicationControllers(String path) {
-        return org.apache.camel.builder.endpoint.dsl.KubernetesReplicationControllersEndpointBuilderFactory.kubernetesReplicationControllers(path);
-    }
-
-    /**
-     * Kubernetes Resources Quota (camel-kubernetes)
-     * The Kubernetes Resources Quota component provides a producer to execute
-     * kubernetes resources quota operations.
-     *
-     * Category: container,cloud,paas
-     * Since: 2.17
-     * Maven coordinates: org.apache.camel:camel-kubernetes
-     *
-     * Syntax: <code>kubernetes-resources-quota:masterUrl</code>
-     *
-     * Path parameter: masterUrl (required)
-     * Kubernetes Master url
-     */
-    default org.apache.camel.builder.endpoint.dsl.KubernetesResourcesQuotaEndpointBuilderFactory.KubernetesResourcesQuotaEndpointBuilder kubernetesResourcesQuota(String path) {
-        return org.apache.camel.builder.endpoint.dsl.KubernetesResourcesQuotaEndpointBuilderFactory.kubernetesResourcesQuota(path);
-    }
-
-    /**
      * Kubernetes Secrets (camel-kubernetes)
      * The Kubernetes Secrets component provides a producer to execute
      * kubernetes secret operations.
@@ -3540,24 +3431,6 @@ public interface EndpointBuilderFactory {
     }
 
     /**
-     * Kubernetes Service Account (camel-kubernetes)
-     * The Kubernetes Service Accounts component provides a producer to execute
-     * service account operations.
-     *
-     * Category: container,cloud,paas
-     * Since: 2.17
-     * Maven coordinates: org.apache.camel:camel-kubernetes
-     *
-     * Syntax: <code>kubernetes-service-accounts:masterUrl</code>
-     *
-     * Path parameter: masterUrl (required)
-     * Kubernetes Master url
-     */
-    default org.apache.camel.builder.endpoint.dsl.KubernetesServiceAccountsEndpointBuilderFactory.KubernetesServiceAccountsEndpointBuilder kubernetesServiceAccounts(String path) {
-        return org.apache.camel.builder.endpoint.dsl.KubernetesServiceAccountsEndpointBuilderFactory.kubernetesServiceAccounts(path);
-    }
-
-    /**
      * Kubernetes Services (camel-kubernetes)
      * The Kubernetes Services component provides a producer to execute service
      * operations and a consumer to consume service events.
@@ -4445,24 +4318,6 @@ public interface EndpointBuilderFactory {
     }
 
     /**
-     * Openshift Build Config (camel-kubernetes)
-     * The Kubernetes Build Config component provides a producer to execute
-     * kubernetes build config operations.
-     *
-     * Category: container,cloud,paas
-     * Since: 2.17
-     * Maven coordinates: org.apache.camel:camel-kubernetes
-     *
-     * Syntax: <code>openshift-build-configs:masterUrl</code>
-     *
-     * Path parameter: masterUrl (required)
-     * Kubernetes Master url
-     */
-    default org.apache.camel.builder.endpoint.dsl.OpenshiftBuildConfigsEndpointBuilderFactory.OpenshiftBuildConfigsEndpointBuilder openshiftBuildConfigs(String path) {
-        return org.apache.camel.builder.endpoint.dsl.OpenshiftBuildConfigsEndpointBuilderFactory.openshiftBuildConfigs(path);
-    }
-
-    /**
      * Openshift Builds (camel-kubernetes)
      * The Openshift Builds component provides a producer to execute openshift
      * build operations.
@@ -6309,7 +6164,7 @@ public interface EndpointBuilderFactory {
      *
      * Path parameter: operation (required)
      * The endpoint operation.
-     * The value can be one of: post, , user
+     * The value can be one of: post, user
      *
      * Path parameter: operationDetail
      * The second part of an endpoint operation. Needed only when endpoint
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilders.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
index a90950a..0a51980 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
@@ -2407,24 +2407,6 @@ public interface EndpointBuilders {
     }
 
     /**
-     * Hazelcast Replicated Map (camel-hazelcast)
-     * The hazelcast-replicatedmap component is used to access Hazelcast
-     * replicated map.
-     *
-     * Category: cache,datagrid
-     * Since: 2.16
-     * Maven coordinates: org.apache.camel:camel-hazelcast
-     *
-     * Syntax: <code>hazelcast-replicatedmap:cacheName</code>
-     *
-     * Path parameter: cacheName (required)
-     * The name of the cache
-     */
-    static org.apache.camel.builder.endpoint.dsl.HazelcastReplicatedmapEndpointBuilderFactory.HazelcastReplicatedmapEndpointBuilder hazelcastReplicatedmap(String path) {
-        return org.apache.camel.builder.endpoint.dsl.HazelcastReplicatedmapEndpointBuilderFactory.hazelcastReplicatedmap(path);
-    }
-
-    /**
      * Hazelcast Ringbuffer (camel-hazelcast)
      * The hazelcast-ringbuffer component is used to access Hazelcast
      * distributed ringbuffer.
@@ -3324,24 +3306,6 @@ public interface EndpointBuilders {
     }
 
     /**
-     * Kubernetes Deployments (camel-kubernetes)
-     * The Kubernetes Nodes component provides a producer to execute kubernetes
-     * node operations and a consumer to consume node events.
-     *
-     * Category: container,cloud,paas
-     * Since: 2.20
-     * Maven coordinates: org.apache.camel:camel-kubernetes
-     *
-     * Syntax: <code>kubernetes-deployments:masterUrl</code>
-     *
-     * Path parameter: masterUrl (required)
-     * Kubernetes Master url
-     */
-    static org.apache.camel.builder.endpoint.dsl.KubernetesDeploymentsEndpointBuilderFactory.KubernetesDeploymentsEndpointBuilder kubernetesDeployments(String path) {
-        return org.apache.camel.builder.endpoint.dsl.KubernetesDeploymentsEndpointBuilderFactory.kubernetesDeployments(path);
-    }
-
-    /**
      * Kubernetes HPA (camel-kubernetes)
      * The Kubernetes HPA component provides a producer to execute kubernetes
      * hpa operations and a consumer to consume HPA events.
@@ -3415,42 +3379,6 @@ public interface EndpointBuilders {
     }
 
     /**
-     * Kubernetes Persistent Volume Claim (camel-kubernetes)
-     * The Kubernetes Persistent Volumes Claims component provides a producer to
-     * execute kubernetes persistent volume claim operations.
-     *
-     * Category: container,cloud,paas
-     * Since: 2.17
-     * Maven coordinates: org.apache.camel:camel-kubernetes
-     *
-     * Syntax: <code>kubernetes-persistent-volumes-claims:masterUrl</code>
-     *
-     * Path parameter: masterUrl (required)
-     * Kubernetes Master url
-     */
-    static org.apache.camel.builder.endpoint.dsl.KubernetesPersistentVolumesClaimsEndpointBuilderFactory.KubernetesPersistentVolumesClaimsEndpointBuilder kubernetesPersistentVolumesClaims(String path) {
-        return org.apache.camel.builder.endpoint.dsl.KubernetesPersistentVolumesClaimsEndpointBuilderFactory.kubernetesPersistentVolumesClaims(path);
-    }
-
-    /**
-     * Kubernetes Persistent Volume (camel-kubernetes)
-     * The Kubernetes Persistent Volumes component provides a producer to
-     * execute kubernetes persistent volume operations.
-     *
-     * Category: container,cloud,paas
-     * Since: 2.17
-     * Maven coordinates: org.apache.camel:camel-kubernetes
-     *
-     * Syntax: <code>kubernetes-persistent-volumes:masterUrl</code>
-     *
-     * Path parameter: masterUrl (required)
-     * Kubernetes Master url
-     */
-    static org.apache.camel.builder.endpoint.dsl.KubernetesPersistentVolumesEndpointBuilderFactory.KubernetesPersistentVolumesEndpointBuilder kubernetesPersistentVolumes(String path) {
-        return org.apache.camel.builder.endpoint.dsl.KubernetesPersistentVolumesEndpointBuilderFactory.kubernetesPersistentVolumes(path);
-    }
-
-    /**
      * Kubernetes Pods (camel-kubernetes)
      * The Kubernetes Pods component provides a producer to execute kubernetes
      * pod operations and a consumer to consume pod events.
@@ -3469,43 +3397,6 @@ public interface EndpointBuilders {
     }
 
     /**
-     * Kubernetes Replication Controller (camel-kubernetes)
-     * The Kubernetes Replication Controllers component provides a producer to
-     * execute kubernetes replication controller operations and a consumer to
-     * consume replication controller events.
-     *
-     * Category: container,cloud,paas
-     * Since: 2.17
-     * Maven coordinates: org.apache.camel:camel-kubernetes
-     *
-     * Syntax: <code>kubernetes-replication-controllers:masterUrl</code>
-     *
-     * Path parameter: masterUrl (required)
-     * Kubernetes Master url
-     */
-    static org.apache.camel.builder.endpoint.dsl.KubernetesReplicationControllersEndpointBuilderFactory.KubernetesReplicationControllersEndpointBuilder kubernetesReplicationControllers(String path) {
-        return org.apache.camel.builder.endpoint.dsl.KubernetesReplicationControllersEndpointBuilderFactory.kubernetesReplicationControllers(path);
-    }
-
-    /**
-     * Kubernetes Resources Quota (camel-kubernetes)
-     * The Kubernetes Resources Quota component provides a producer to execute
-     * kubernetes resources quota operations.
-     *
-     * Category: container,cloud,paas
-     * Since: 2.17
-     * Maven coordinates: org.apache.camel:camel-kubernetes
-     *
-     * Syntax: <code>kubernetes-resources-quota:masterUrl</code>
-     *
-     * Path parameter: masterUrl (required)
-     * Kubernetes Master url
-     */
-    static org.apache.camel.builder.endpoint.dsl.KubernetesResourcesQuotaEndpointBuilderFactory.KubernetesResourcesQuotaEndpointBuilder kubernetesResourcesQuota(String path) {
-        return org.apache.camel.builder.endpoint.dsl.KubernetesResourcesQuotaEndpointBuilderFactory.kubernetesResourcesQuota(path);
-    }
-
-    /**
      * Kubernetes Secrets (camel-kubernetes)
      * The Kubernetes Secrets component provides a producer to execute
      * kubernetes secret operations.
@@ -3524,24 +3415,6 @@ public interface EndpointBuilders {
     }
 
     /**
-     * Kubernetes Service Account (camel-kubernetes)
-     * The Kubernetes Service Accounts component provides a producer to execute
-     * service account operations.
-     *
-     * Category: container,cloud,paas
-     * Since: 2.17
-     * Maven coordinates: org.apache.camel:camel-kubernetes
-     *
-     * Syntax: <code>kubernetes-service-accounts:masterUrl</code>
-     *
-     * Path parameter: masterUrl (required)
-     * Kubernetes Master url
-     */
-    static org.apache.camel.builder.endpoint.dsl.KubernetesServiceAccountsEndpointBuilderFactory.KubernetesServiceAccountsEndpointBuilder kubernetesServiceAccounts(String path) {
-        return org.apache.camel.builder.endpoint.dsl.KubernetesServiceAccountsEndpointBuilderFactory.kubernetesServiceAccounts(path);
-    }
-
-    /**
      * Kubernetes Services (camel-kubernetes)
      * The Kubernetes Services component provides a producer to execute service
      * operations and a consumer to consume service events.
@@ -4429,24 +4302,6 @@ public interface EndpointBuilders {
     }
 
     /**
-     * Openshift Build Config (camel-kubernetes)
-     * The Kubernetes Build Config component provides a producer to execute
-     * kubernetes build config operations.
-     *
-     * Category: container,cloud,paas
-     * Since: 2.17
-     * Maven coordinates: org.apache.camel:camel-kubernetes
-     *
-     * Syntax: <code>openshift-build-configs:masterUrl</code>
-     *
-     * Path parameter: masterUrl (required)
-     * Kubernetes Master url
-     */
-    static org.apache.camel.builder.endpoint.dsl.OpenshiftBuildConfigsEndpointBuilderFactory.OpenshiftBuildConfigsEndpointBuilder openshiftBuildConfigs(String path) {
-        return org.apache.camel.builder.endpoint.dsl.OpenshiftBuildConfigsEndpointBuilderFactory.openshiftBuildConfigs(path);
-    }
-
-    /**
      * Openshift Builds (camel-kubernetes)
      * The Openshift Builds component provides a producer to execute openshift
      * build operations.
@@ -6293,7 +6148,7 @@ public interface EndpointBuilders {
      *
      * Path parameter: operation (required)
      * The endpoint operation.
-     * The value can be one of: post, , user
+     * The value can be one of: post, user
      *
      * Path parameter: operationDetail
      * The second part of an endpoint operation. Needed only when endpoint
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/HazelcastReplicatedmapEndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/HazelcastReplicatedmapEndpointBuilderFactory.java
index 6c8ad9a..93e8dcc 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/HazelcastReplicatedmapEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/HazelcastReplicatedmapEndpointBuilderFactory.java
@@ -681,7 +681,7 @@ public interface HazelcastReplicatedmapEndpointBuilderFactory {
      * Path parameter: cacheName (required)
      * The name of the cache
      */
-    static HazelcastReplicatedmapEndpointBuilder hazelcastReplicatedmap(
+    HazelcastReplicatedmapEndpointBuilder hazelcastReplicatedmap(
             String path) {
         class HazelcastReplicatedmapEndpointBuilderImpl extends AbstractEndpointBuilder implements HazelcastReplicatedmapEndpointBuilder, AdvancedHazelcastReplicatedmapEndpointBuilder {
             public HazelcastReplicatedmapEndpointBuilderImpl(String path) {
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesDeploymentsEndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesDeploymentsEndpointBuilderFactory.java
index 39b5a7e..a02ae79 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesDeploymentsEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesDeploymentsEndpointBuilderFactory.java
@@ -1278,7 +1278,7 @@ public interface KubernetesDeploymentsEndpointBuilderFactory {
      * Path parameter: masterUrl (required)
      * Kubernetes Master url
      */
-    static KubernetesDeploymentsEndpointBuilder kubernetesDeployments(
+    KubernetesDeploymentsEndpointBuilder kubernetesDeployments(
             String path) {
         class KubernetesDeploymentsEndpointBuilderImpl extends AbstractEndpointBuilder implements KubernetesDeploymentsEndpointBuilder, AdvancedKubernetesDeploymentsEndpointBuilder {
             public KubernetesDeploymentsEndpointBuilderImpl(String path) {
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesPersistentVolumesClaimsEndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesPersistentVolumesClaimsEndpointBuilderFactory.java
index 1e298a6..fd6364d 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesPersistentVolumesClaimsEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesPersistentVolumesClaimsEndpointBuilderFactory.java
@@ -437,7 +437,7 @@ public interface KubernetesPersistentVolumesClaimsEndpointBuilderFactory {
      * Path parameter: masterUrl (required)
      * Kubernetes Master url
      */
-    static KubernetesPersistentVolumesClaimsEndpointBuilder kubernetesPersistentVolumesClaims(
+    KubernetesPersistentVolumesClaimsEndpointBuilder kubernetesPersistentVolumesClaims(
             String path) {
         class KubernetesPersistentVolumesClaimsEndpointBuilderImpl extends AbstractEndpointBuilder implements KubernetesPersistentVolumesClaimsEndpointBuilder, AdvancedKubernetesPersistentVolumesClaimsEndpointBuilder {
             public KubernetesPersistentVolumesClaimsEndpointBuilderImpl(String path) {
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesPersistentVolumesEndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesPersistentVolumesEndpointBuilderFactory.java
index 133011c..74b0cb6 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesPersistentVolumesEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesPersistentVolumesEndpointBuilderFactory.java
@@ -436,7 +436,7 @@ public interface KubernetesPersistentVolumesEndpointBuilderFactory {
      * Path parameter: masterUrl (required)
      * Kubernetes Master url
      */
-    static KubernetesPersistentVolumesEndpointBuilder kubernetesPersistentVolumes(
+    KubernetesPersistentVolumesEndpointBuilder kubernetesPersistentVolumes(
             String path) {
         class KubernetesPersistentVolumesEndpointBuilderImpl extends AbstractEndpointBuilder implements KubernetesPersistentVolumesEndpointBuilder, AdvancedKubernetesPersistentVolumesEndpointBuilder {
             public KubernetesPersistentVolumesEndpointBuilderImpl(String path) {
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesReplicationControllersEndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesReplicationControllersEndpointBuilderFactory.java
index b8f2648..e166c3d 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesReplicationControllersEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesReplicationControllersEndpointBuilderFactory.java
@@ -1287,7 +1287,7 @@ public interface KubernetesReplicationControllersEndpointBuilderFactory {
      * Path parameter: masterUrl (required)
      * Kubernetes Master url
      */
-    static KubernetesReplicationControllersEndpointBuilder kubernetesReplicationControllers(
+    KubernetesReplicationControllersEndpointBuilder kubernetesReplicationControllers(
             String path) {
         class KubernetesReplicationControllersEndpointBuilderImpl extends AbstractEndpointBuilder implements KubernetesReplicationControllersEndpointBuilder, AdvancedKubernetesReplicationControllersEndpointBuilder {
             public KubernetesReplicationControllersEndpointBuilderImpl(String path) {
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesResourcesQuotaEndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesResourcesQuotaEndpointBuilderFactory.java
index a79ca40..e427a80 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesResourcesQuotaEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesResourcesQuotaEndpointBuilderFactory.java
@@ -433,7 +433,7 @@ public interface KubernetesResourcesQuotaEndpointBuilderFactory {
      * Path parameter: masterUrl (required)
      * Kubernetes Master url
      */
-    static KubernetesResourcesQuotaEndpointBuilder kubernetesResourcesQuota(
+    KubernetesResourcesQuotaEndpointBuilder kubernetesResourcesQuota(
             String path) {
         class KubernetesResourcesQuotaEndpointBuilderImpl extends AbstractEndpointBuilder implements KubernetesResourcesQuotaEndpointBuilder, AdvancedKubernetesResourcesQuotaEndpointBuilder {
             public KubernetesResourcesQuotaEndpointBuilderImpl(String path) {
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesServiceAccountsEndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesServiceAccountsEndpointBuilderFactory.java
index 0b1e1ad..e1186d6 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesServiceAccountsEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/KubernetesServiceAccountsEndpointBuilderFactory.java
@@ -436,7 +436,7 @@ public interface KubernetesServiceAccountsEndpointBuilderFactory {
      * Path parameter: masterUrl (required)
      * Kubernetes Master url
      */
-    static KubernetesServiceAccountsEndpointBuilder kubernetesServiceAccounts(
+    KubernetesServiceAccountsEndpointBuilder kubernetesServiceAccounts(
             String path) {
         class KubernetesServiceAccountsEndpointBuilderImpl extends AbstractEndpointBuilder implements KubernetesServiceAccountsEndpointBuilder, AdvancedKubernetesServiceAccountsEndpointBuilder {
             public KubernetesServiceAccountsEndpointBuilderImpl(String path) {
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/OpenshiftBuildConfigsEndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/OpenshiftBuildConfigsEndpointBuilderFactory.java
index b85bc0e..4afb617 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/OpenshiftBuildConfigsEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/OpenshiftBuildConfigsEndpointBuilderFactory.java
@@ -430,7 +430,7 @@ public interface OpenshiftBuildConfigsEndpointBuilderFactory {
      * Path parameter: masterUrl (required)
      * Kubernetes Master url
      */
-    static OpenshiftBuildConfigsEndpointBuilder openshiftBuildConfigs(
+    OpenshiftBuildConfigsEndpointBuilder openshiftBuildConfigs(
             String path) {
         class OpenshiftBuildConfigsEndpointBuilderImpl extends AbstractEndpointBuilder implements OpenshiftBuildConfigsEndpointBuilder, AdvancedOpenshiftBuildConfigsEndpointBuilder {
             public OpenshiftBuildConfigsEndpointBuilderImpl(String path) {
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/WordpressEndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/WordpressEndpointBuilderFactory.java
index f06ca36..ba64e1b 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/WordpressEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/WordpressEndpointBuilderFactory.java
@@ -854,7 +854,7 @@ public interface WordpressEndpointBuilderFactory {
      * 
      * Path parameter: operation (required)
      * The endpoint operation.
-     * The value can be one of: post, , user
+     * The value can be one of: post, user
      * 
      * Path parameter: operationDetail
      * The second part of an endpoint operation. Needed only when endpoint


[camel] 01/07: Remove spring-boot specific mojos

Posted by gn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a78c904d5f98bae95a4c1ff3badd693928372752
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Fri Dec 20 18:06:00 2019 +0100

    Remove spring-boot specific mojos
---
 .../packaging/PrepareCatalogSpringBootMojo.java    | 717 ---------------------
 .../camel/maven/packaging/SpringBootHelper.java    |  74 ---
 ...pdateSpringBootAutoConfigurationReadmeMojo.java | 400 ------------
 3 files changed, 1191 deletions(-)

diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogSpringBootMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogSpringBootMojo.java
deleted file mode 100644
index 6b0c33f..0000000
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCatalogSpringBootMojo.java
+++ /dev/null
@@ -1,717 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.maven.packaging;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.channels.FileChannel;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.regex.Pattern;
-
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectHelper;
-
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
-
-/**
- * Prepares the Spring Boot provider camel catalog to include component it supports
- */
-@Mojo(name = "prepare-catalog-springboot", threadSafe = true)
-public class PrepareCatalogSpringBootMojo extends AbstractMojo {
-
-    public static final int BUFFER_SIZE = 128 * 1024;
-
-    private static final Pattern ARTIFACT_PATTERN = Pattern.compile("\"artifactId\": \"camel-(.*)\"");
-
-    /**
-     * The maven project.
-     */
-    @Parameter(property = "project", required = true, readonly = true)
-    protected MavenProject project;
-
-    /**
-     * The output directory for components catalog
-     */
-    @Parameter(defaultValue = "${project.build.directory}/classes/org/apache/camel/catalog/springboot/components")
-    protected File componentsOutDir;
-
-    /**
-     * The output directory for dataformats catalog
-     */
-    @Parameter(defaultValue = "${project.build.directory}/classes/org/apache/camel/catalog/springboot/dataformats")
-    protected File dataFormatsOutDir;
-
-    /**
-     * The output directory for languages catalog
-     */
-    @Parameter(defaultValue = "${project.build.directory}/classes/org/apache/camel/catalog/springboot/languages")
-    protected File languagesOutDir;
-
-    /**
-     * The output directory for others catalog
-     *
-     */
-    @Parameter(defaultValue = "${project.build.directory}/classes/org/apache/camel/catalog/springboot/others")
-    protected File othersOutDir;
-
-    /**
-     * The directory where all spring-boot starters are
-     *
-     */
-    @Parameter(defaultValue = "${project.build.directory}/../../../platforms/spring-boot/components-starter")
-    protected File componentsStarterDir;
-
-    /**
-     * The components directory where all the Apache Camel components are
-     *
-     */
-    @Parameter(defaultValue = "${project.build.directory}/../../../components")
-    protected File componentsDir;
-
-    /**
-     * The camel-core directory
-     */
-    @Parameter(defaultValue = "${project.build.directory}/../../../core/camel-core-engine")
-    protected File coreDir;
-
-    /**
-     * The camel-base directory
-     */
-    @Parameter(defaultValue = "${project.build.directory}/../../../core/camel-base")
-    protected File baseDir;
-
-    /**
-     * Maven ProjectHelper.
-     */
-    @Component
-    private MavenProjectHelper projectHelper;
-
-    /**
-     * Execute goal.
-     *
-     * @throws MojoExecutionException execution of the main class or one of the
-     *                                                        threads it generated failed.
-     * @throws MojoFailureException   something bad happened...
-     */
-    @Override
-    public void execute() throws MojoExecutionException, MojoFailureException {
-        Set<String> starters = findSpringBootStarters();
-        executeComponents(starters);
-        executeDataFormats(starters);
-        executeLanguages(starters);
-        executeOthers(starters);
-    }
-
-    protected void executeComponents(Set<String> starters) throws MojoExecutionException, MojoFailureException {
-        getLog().info("Copying all Camel component json descriptors");
-
-        // lets use sorted set/maps
-        Set<File> jsonFiles = new TreeSet<>();
-        Set<File> componentFiles = new TreeSet<>();
-
-        // find all json files in components and camel-core
-        if (componentsDir != null && componentsDir.isDirectory()) {
-            File[] components = componentsDir.listFiles();
-            if (components != null) {
-                for (File dir : components) {
-                    if (dir.isDirectory() && !"target".equals(dir.getName())) {
-                        File target = new File(dir, "target/classes");
-
-                        // the directory must be in the list of known features
-                        if (!starters.contains(dir.getName())) {
-                            continue;
-                        }
-
-                        // special for some which is in a sub dir
-                        if ("camel-as2".equals(dir.getName())) {
-                            target = new File(dir, "camel-as2-component/target/classes");
-                        } else if ("camel-box".equals(dir.getName())) {
-                            target = new File(dir, "camel-box-component/target/classes");
-                        } else if ("camel-salesforce".equals(dir.getName())) {
-                            target = new File(dir, "camel-salesforce-component/target/classes");
-                        } else if ("camel-servicenow".equals(dir.getName())) {
-                            target = new File(dir, "camel-servicenow-component/target/classes");
-                        } else {
-                            // this module must be active with a source folder
-                            File src = new File(dir, "src");
-                            boolean active = src.isDirectory() && src.exists();
-                            if (!active) {
-                                continue;
-                            }
-                        }
-
-
-                        findComponentFilesRecursive(target, jsonFiles, componentFiles, new CamelComponentsFileFilter());
-                    }
-                }
-            }
-        }
-        if (coreDir != null && coreDir.isDirectory()) {
-            File target = new File(coreDir, "target/classes");
-            findComponentFilesRecursive(target, jsonFiles, componentFiles, new CamelComponentsFileFilter());
-        }
-
-        getLog().info("Found " + componentFiles.size() + " component.properties files");
-        getLog().info("Found " + jsonFiles.size() + " component json files");
-
-        // make sure to create out dir
-        componentsOutDir.mkdirs();
-
-        for (File file : jsonFiles) {
-            // for spring-boot we need to amend the json file to use -starter as the artifact-id
-            try {
-                String text = loadText(new FileInputStream(file));
-
-                text = ARTIFACT_PATTERN.matcher(text).replaceFirst("\"artifactId\": \"camel-$1-starter\"");
-
-                // write new json file
-                File to = new File(componentsOutDir, file.getName());
-                FileOutputStream fos = new FileOutputStream(to, false);
-
-                fos.write(text.getBytes());
-
-                fos.close();
-
-            } catch (IOException e) {
-                throw new MojoFailureException("Cannot write json file " + file, e);
-            }
-        }
-
-        File all = new File(componentsOutDir, "../components.properties");
-        try {
-            FileOutputStream fos = new FileOutputStream(all, false);
-
-            String[] names = componentsOutDir.list();
-            List<String> components = new ArrayList<>();
-            // sort the names
-            for (String name : names) {
-                if (name.endsWith(".json")) {
-                    // strip out .json from the name
-                    String componentName = name.substring(0, name.length() - 5);
-                    components.add(componentName);
-                }
-            }
-
-            Collections.sort(components);
-            for (String name : components) {
-                fos.write(name.getBytes());
-                fos.write("\n".getBytes());
-            }
-
-            fos.close();
-
-        } catch (IOException e) {
-            throw new MojoFailureException("Error writing to file " + all);
-        }
-    }
-
-    protected void executeDataFormats(Set<String> starters) throws MojoExecutionException, MojoFailureException {
-        getLog().info("Copying all Camel dataformat json descriptors");
-
-        // lets use sorted set/maps
-        Set<File> jsonFiles = new TreeSet<>();
-        Set<File> dataFormatFiles = new TreeSet<>();
-
-        // find all data formats from the components directory
-        if (componentsDir != null && componentsDir.isDirectory()) {
-            File[] dataFormats = componentsDir.listFiles();
-            if (dataFormats != null) {
-                for (File dir : dataFormats) {
-                    if (dir.isDirectory() && !"target".equals(dir.getName())) {
-                        // the directory must be in the list of known starters
-                        if (!starters.contains(dir.getName())) {
-                            continue;
-                        }
-                        // this module must be active with a source folder
-                        File src = new File(dir, "src");
-                        boolean active = src.isDirectory() && src.exists();
-                        if (!active) {
-                            continue;
-                        }
-                        File target = new File(dir, "target/classes");
-                        findDataFormatFilesRecursive(target, jsonFiles, dataFormatFiles, new CamelDataFormatsFileFilter());
-                    }
-                }
-            }
-        }
-        if (coreDir != null && coreDir.isDirectory()) {
-            File target = new File(coreDir, "target/classes");
-            findDataFormatFilesRecursive(target, jsonFiles, dataFormatFiles, new CamelDataFormatsFileFilter());
-        }
-
-        getLog().info("Found " + dataFormatFiles.size() + " dataformat.properties files");
-        getLog().info("Found " + jsonFiles.size() + " dataformat json files");
-
-        // make sure to create out dir
-        dataFormatsOutDir.mkdirs();
-
-        for (File file : jsonFiles) {
-            // for spring-boot we need to amend the json file to use -starter as the artifact-id
-            try {
-                String text = loadText(new FileInputStream(file));
-
-                text = ARTIFACT_PATTERN.matcher(text).replaceFirst("\"artifactId\": \"camel-$1-starter\"");
-
-                // write new json file
-                File to = new File(dataFormatsOutDir, file.getName());
-                FileOutputStream fos = new FileOutputStream(to, false);
-
-                fos.write(text.getBytes());
-
-                fos.close();
-
-            } catch (IOException e) {
-                throw new MojoFailureException("Cannot write json file " + file, e);
-            }
-        }
-
-        File all = new File(dataFormatsOutDir, "../dataformats.properties");
-        try {
-            FileOutputStream fos = new FileOutputStream(all, false);
-
-            String[] names = dataFormatsOutDir.list();
-            List<String> dataFormats = new ArrayList<>();
-            // sort the names
-            for (String name : names) {
-                if (name.endsWith(".json")) {
-                    // strip out .json from the name
-                    String dataFormatName = name.substring(0, name.length() - 5);
-                    dataFormats.add(dataFormatName);
-                }
-            }
-
-            Collections.sort(dataFormats);
-            for (String name : dataFormats) {
-                fos.write(name.getBytes());
-                fos.write("\n".getBytes());
-            }
-
-            fos.close();
-
-        } catch (IOException e) {
-            throw new MojoFailureException("Error writing to file " + all);
-        }
-    }
-
-    protected void executeLanguages(Set<String> starters) throws MojoExecutionException, MojoFailureException {
-        getLog().info("Copying all Camel language json descriptors");
-
-        // lets use sorted set/maps
-        Set<File> jsonFiles = new TreeSet<>();
-        Set<File> languageFiles = new TreeSet<>();
-
-        // find all languages from the components directory
-        if (componentsDir != null && componentsDir.isDirectory()) {
-            File[] languages = componentsDir.listFiles();
-            if (languages != null) {
-                for (File dir : languages) {
-                    // the directory must be in the list of known starters
-                    if (!starters.contains(dir.getName())) {
-                        continue;
-                    }
-                    // this module must be active with a source folder
-                    File src = new File(dir, "src");
-                    boolean active = src.isDirectory() && src.exists();
-                    if (!active) {
-                        continue;
-                    }
-                    if (dir.isDirectory() && !"target".equals(dir.getName())) {
-                        File target = new File(dir, "target/classes");
-                        findLanguageFilesRecursive(target, jsonFiles, languageFiles, new CamelLanguagesFileFilter());
-                    }
-                }
-            }
-        }
-        if (baseDir != null && baseDir.isDirectory()) {
-            File target = new File(baseDir, "target/classes");
-            findLanguageFilesRecursive(target, jsonFiles, languageFiles, new CamelLanguagesFileFilter());
-            // also look in camel-jaxp
-            target = new File(coreDir, "../camel-jaxp/target/classes");
-            findLanguageFilesRecursive(target, jsonFiles, languageFiles, new CamelLanguagesFileFilter());
-        }
-
-        getLog().info("Found " + languageFiles.size() + " language.properties files");
-        getLog().info("Found " + jsonFiles.size() + " language json files");
-
-        // make sure to create out dir
-        languagesOutDir.mkdirs();
-
-        for (File file : jsonFiles) {
-            // for spring-boot we need to amend the json file to use -starter as the artifact-id
-            try {
-                String text = loadText(new FileInputStream(file));
-
-                text = ARTIFACT_PATTERN.matcher(text).replaceFirst("\"artifactId\": \"camel-$1-starter\"");
-
-                // write new json file
-                File to = new File(languagesOutDir, file.getName());
-                FileOutputStream fos = new FileOutputStream(to, false);
-
-                fos.write(text.getBytes());
-
-                fos.close();
-
-            } catch (IOException e) {
-                throw new MojoFailureException("Cannot write json file " + file, e);
-            }
-        }
-
-        File all = new File(languagesOutDir, "../languages.properties");
-        try {
-            FileOutputStream fos = new FileOutputStream(all, false);
-
-            String[] names = languagesOutDir.list();
-            List<String> languages = new ArrayList<>();
-            // sort the names
-            for (String name : names) {
-                if (name.endsWith(".json")) {
-                    // strip out .json from the name
-                    String languageName = name.substring(0, name.length() - 5);
-                    languages.add(languageName);
-                }
-            }
-
-            Collections.sort(languages);
-            for (String name : languages) {
-                fos.write(name.getBytes());
-                fos.write("\n".getBytes());
-            }
-
-            fos.close();
-
-        } catch (IOException e) {
-            throw new MojoFailureException("Error writing to file " + all);
-        }
-    }
-
-    protected void executeOthers(Set<String> starters) throws MojoExecutionException, MojoFailureException {
-        getLog().info("Copying all Camel other json descriptors");
-
-        // lets use sorted set/maps
-        Set<File> jsonFiles = new TreeSet<>();
-        Set<File> otherFiles = new TreeSet<>();
-
-        // find all other from the components directory
-        if (componentsDir != null && componentsDir.isDirectory()) {
-            File[] others = componentsDir.listFiles();
-            if (others != null) {
-                for (File dir : others) {
-                    // the directory must be in the list of known starters
-                    if (!starters.contains(dir.getName())) {
-                        continue;
-                    }
-
-                    // skip these special cases
-                    boolean special = "camel-core-osgi".equals(dir.getName())
-                        || "camel-core-xml".equals(dir.getName())
-                        || "camel-http-base".equals(dir.getName())
-                        || "camel-http-common".equals(dir.getName())
-                        || "camel-jetty-common".equals(dir.getName());
-                    boolean special2 = "camel-as2".equals(dir.getName())
-                        || "camel-box".equals(dir.getName())
-                        || "camel-olingo2".equals(dir.getName())
-                        || "camel-olingo4".equals(dir.getName())
-                        || "camel-servicenow".equals(dir.getName())
-                        || "camel-salesforce".equals(dir.getName());
-                    boolean special3 = "camel-debezium-common".equals(dir.getName());
-                    if (special || special2 || special3) {
-                        continue;
-                    }
-
-                    // this module must be active with a source folder
-                    File src = new File(dir, "src");
-                    boolean active = src.isDirectory() && src.exists();
-                    if (!active) {
-                        continue;
-                    }
-
-                    if (dir.isDirectory() && !"target".equals(dir.getName())) {
-                        File target = new File(dir, "target/classes");
-                        findOtherFilesRecursive(target, jsonFiles, otherFiles, new CamelOthersFileFilter());
-                    }
-                }
-            }
-        }
-
-        getLog().info("Found " + otherFiles.size() + " other.properties files");
-        getLog().info("Found " + jsonFiles.size() + " other json files");
-
-        // make sure to create out dir
-        othersOutDir.mkdirs();
-
-        for (File file : jsonFiles) {
-            // for spring-boot we need to amend the json file to use -starter as the artifact-id
-            try {
-                String text = loadText(new FileInputStream(file));
-
-                text = ARTIFACT_PATTERN.matcher(text).replaceFirst("\"artifactId\": \"camel-$1-starter\"");
-
-                // write new json file
-                File to = new File(othersOutDir, file.getName());
-                FileOutputStream fos = new FileOutputStream(to, false);
-
-                fos.write(text.getBytes());
-
-                fos.close();
-
-            } catch (IOException e) {
-                throw new MojoFailureException("Cannot write json file " + file, e);
-            }
-        }
-
-        File all = new File(othersOutDir, "../others.properties");
-        try {
-            FileOutputStream fos = new FileOutputStream(all, false);
-
-            String[] names = othersOutDir.list();
-            List<String> others = new ArrayList<>();
-            // sort the names
-            for (String name : names) {
-                if (name.endsWith(".json")) {
-                    // strip out .json from the name
-                    String otherName = name.substring(0, name.length() - 5);
-                    others.add(otherName);
-                }
-            }
-
-            Collections.sort(others);
-            for (String name : others) {
-                fos.write(name.getBytes());
-                fos.write("\n".getBytes());
-            }
-
-            fos.close();
-
-        } catch (IOException e) {
-            throw new MojoFailureException("Error writing to file " + all);
-        }
-    }
-
-    private void findComponentFilesRecursive(File dir, Set<File> found, Set<File> components, FileFilter filter) {
-        File[] files = dir.listFiles(filter);
-        if (files != null) {
-            for (File file : files) {
-                // skip files in root dirs as Camel does not store information there but others may do
-                boolean rootDir = "classes".equals(dir.getName()) || "META-INF".equals(dir.getName());
-                boolean jsonFile = !rootDir && file.isFile() && file.getName().endsWith(".json");
-                boolean componentFile = !rootDir && file.isFile() && file.getName().equals("component.properties");
-                if (jsonFile) {
-                    found.add(file);
-                } else if (componentFile) {
-                    components.add(file);
-                } else if (file.isDirectory()) {
-                    findComponentFilesRecursive(file, found, components, filter);
-                }
-            }
-        }
-    }
-
-    private void findDataFormatFilesRecursive(File dir, Set<File> found, Set<File> dataFormats, FileFilter filter) {
-        File[] files = dir.listFiles(filter);
-        if (files != null) {
-            for (File file : files) {
-                // skip files in root dirs as Camel does not store information there but others may do
-                boolean rootDir = "classes".equals(dir.getName()) || "META-INF".equals(dir.getName());
-                boolean jsonFile = !rootDir && file.isFile() && file.getName().endsWith(".json");
-                boolean dataFormatFile = !rootDir && file.isFile() && file.getName().equals("dataformat.properties");
-                if (jsonFile) {
-                    found.add(file);
-                } else if (dataFormatFile) {
-                    dataFormats.add(file);
-                } else if (file.isDirectory()) {
-                    findDataFormatFilesRecursive(file, found, dataFormats, filter);
-                }
-            }
-        }
-    }
-
-    private void findLanguageFilesRecursive(File dir, Set<File> found, Set<File> languages, FileFilter filter) {
-        File[] files = dir.listFiles(filter);
-        if (files != null) {
-            for (File file : files) {
-                // skip files in root dirs as Camel does not store information there but others may do
-                boolean rootDir = "classes".equals(dir.getName()) || "META-INF".equals(dir.getName());
-                boolean jsonFile = !rootDir && file.isFile() && file.getName().endsWith(".json");
-                boolean languageFile = !rootDir && file.isFile() && file.getName().equals("language.properties");
-                if (jsonFile) {
-                    found.add(file);
-                } else if (languageFile) {
-                    languages.add(file);
-                } else if (file.isDirectory()) {
-                    findLanguageFilesRecursive(file, found, languages, filter);
-                }
-            }
-        }
-    }
-
-    private void findOtherFilesRecursive(File dir, Set<File> found, Set<File> others, FileFilter filter) {
-        File[] files = dir.listFiles(filter);
-        if (files != null) {
-            for (File file : files) {
-                // skip files in root dirs as Camel does not store information there but others may do
-                boolean rootDir = "classes".equals(dir.getName()) || "META-INF".equals(dir.getName());
-                boolean jsonFile = rootDir && file.isFile() && file.getName().endsWith(".json");
-                boolean otherFile = !rootDir && file.isFile() && file.getName().equals("other.properties");
-                if (jsonFile) {
-                    found.add(file);
-                } else if (otherFile) {
-                    others.add(file);
-                } else if (file.isDirectory()) {
-                    findOtherFilesRecursive(file, found, others, filter);
-                }
-            }
-        }
-    }
-
-    private class CamelComponentsFileFilter implements FileFilter {
-
-        @Override
-        public boolean accept(File pathname) {
-            if (pathname.isDirectory() && pathname.getName().equals("model")) {
-                // do not check the camel-core model packages as there is no components there
-                return false;
-            }
-            if (pathname.isFile() && pathname.getName().endsWith(".json")) {
-                // must be a components json file
-                try {
-                    String json = loadText(new FileInputStream(pathname));
-                    return json != null && json.contains("\"kind\": \"component\"");
-                } catch (IOException e) {
-                    // ignore
-                }
-            }
-            return pathname.isDirectory() || (pathname.isFile() && pathname.getName().equals("component.properties"));
-        }
-    }
-
-    private class CamelDataFormatsFileFilter implements FileFilter {
-
-        @Override
-        public boolean accept(File pathname) {
-            if (pathname.isDirectory() && pathname.getName().equals("model")) {
-                // do not check the camel-core model packages as there is no components there
-                return false;
-            }
-            if (pathname.isFile() && pathname.getName().endsWith(".json")) {
-                // must be a dataformat json file
-                try {
-                    String json = loadText(new FileInputStream(pathname));
-                    return json != null && json.contains("\"kind\": \"dataformat\"");
-                } catch (IOException e) {
-                    // ignore
-                }
-            }
-            return pathname.isDirectory() || (pathname.isFile() && pathname.getName().equals("dataformat.properties"));
-        }
-    }
-
-    private class CamelLanguagesFileFilter implements FileFilter {
-
-        @Override
-        public boolean accept(File pathname) {
-            if (pathname.isDirectory() && pathname.getName().equals("model")) {
-                // do not check the camel-core model packages as there is no components there
-                return false;
-            }
-            if (pathname.isFile() && pathname.getName().endsWith(".json")) {
-                // must be a language json file
-                try {
-                    String json = loadText(new FileInputStream(pathname));
-                    return json != null && json.contains("\"kind\": \"language\"");
-                } catch (IOException e) {
-                    // ignore
-                }
-            }
-            return pathname.isDirectory() || (pathname.isFile() && pathname.getName().equals("language.properties"));
-        }
-    }
-
-    private class CamelOthersFileFilter implements FileFilter {
-
-        @Override
-        public boolean accept(File pathname) {
-            if (pathname.isFile() && pathname.getName().endsWith(".json")) {
-                // must be a language json file
-                try {
-                    String json = loadText(new FileInputStream(pathname));
-                    return json != null && json.contains("\"kind\": \"other\"");
-                } catch (IOException e) {
-                    // ignore
-                }
-            }
-            return pathname.isDirectory() || (pathname.isFile() && pathname.getName().equals("other.properties"));
-        }
-    }
-
-    public static void copyFile(File from, File to) throws IOException {
-        FileChannel in = null;
-        FileChannel out = null;
-        try (FileInputStream fis = new FileInputStream(from); FileOutputStream fos = new FileOutputStream(to)) {
-            try {
-                in = fis.getChannel();
-                out = fos.getChannel();
-
-                long size = in.size();
-                long position = 0;
-                while (position < size) {
-                    position += in.transferTo(position, BUFFER_SIZE, out);
-                }
-            } finally {
-                if (in != null) {
-                    in.close();
-                }
-                if (out != null) {
-                    out.close();
-                }
-            }
-        }
-    }
-
-    private Set<String> findSpringBootStarters() {
-        Set<String> answer = new LinkedHashSet<>();
-
-        String[] names = componentsStarterDir.list();
-        if (names != null) {
-            for (String name : names) {
-                if (name.startsWith("camel-") && name.endsWith("-starter")) {
-                    // remove ending -starter
-                    String regular = name.substring(0, name.length() - 8);
-                    answer.add(regular);
-                }
-            }
-        }
-
-        getLog().info("Found " + answer.size() + " Camel Spring Boot starters from: " + componentsStarterDir);
-
-        return answer;
-    }
-
-}
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootHelper.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootHelper.java
deleted file mode 100644
index ac65159..0000000
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootHelper.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.maven.packaging;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Useful methods for spring-boot mojos.
- */
-public final class SpringBootHelper {
-
-    public static final String STARTER_SUFFIX = "-starter";
-
-    private SpringBootHelper() {
-    }
-
-    public static File starterSrcDir(File baseDir, String artifactId) {
-        return new File(starterDir(baseDir, artifactId), "src/main/java");
-    }
-
-    public static File starterResourceDir(File baseDir, String artifactId) {
-        return new File(starterDir(baseDir, artifactId), "src/main/resources");
-    }
-
-    public static File starterDir(File baseDir, String artifactId) {
-        String starterName = artifactId + STARTER_SUFFIX;
-
-        File allStartersDir = allStartersDir(baseDir);
-        File starterDir = new File(allStartersDir, starterName);
-        return starterDir;
-    }
-
-    public static File allStartersDir(File baseDir) {
-        File allStartersDir = new File(camelProjectRoot(baseDir, "platforms"), "platforms/spring-boot/components-starter");
-        return allStartersDir;
-    }
-
-    public static File camelProjectRoot(File baseDir, String expectedDirName) {
-        // another solution could be to look for pom.xml file and see if that pom.xml is the camel root pom
-        // however looking for a dir named components-starter should be fine also (there is only 1 with such name)
-        try {
-            File root = baseDir.getCanonicalFile();
-            while (root != null) {
-                File[] names = root.listFiles(pathname -> pathname.getName().equals(expectedDirName));
-                if (names != null && names.length == 1) {
-                    break;
-                }
-                root = root.getParentFile();
-            }
-
-            if (root == null) {
-                throw new IllegalStateException("Cannot find Apache Camel project root directory");
-            }
-            return root;
-        } catch (IOException e) {
-            throw new IllegalStateException("Error while getting directory", e);
-        }
-    }
-}
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateSpringBootAutoConfigurationReadmeMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateSpringBootAutoConfigurationReadmeMojo.java
deleted file mode 100644
index 7c5dc0f..0000000
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateSpringBootAutoConfigurationReadmeMojo.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.maven.packaging;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.FileInputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-import java.util.stream.Collectors;
-
-import org.apache.camel.maven.packaging.model.SpringBootAutoConfigureOptionModel;
-import org.apache.camel.maven.packaging.model.SpringBootModel;
-import org.apache.camel.util.json.DeserializationException;
-import org.apache.camel.util.json.JsonArray;
-import org.apache.camel.util.json.JsonObject;
-import org.apache.camel.util.json.Jsoner;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.project.MavenProject;
-import org.mvel2.templates.TemplateRuntime;
-import org.sonatype.plexus.build.incremental.BuildContext;
-
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
-import static org.apache.camel.maven.packaging.PackageHelper.writeText;
-
-/**
- * For all the Camel components that has Spring Boot starter JAR, their documentation
- * .adoc files in their component directory is updated to include spring boot auto configuration options.
- */
-@Mojo(name = "update-spring-boot-auto-configuration-readme", threadSafe = true)
-public class UpdateSpringBootAutoConfigurationReadmeMojo extends AbstractMojo {
-
-    /**
-     * The maven project.
-     */
-    @Parameter(property = "project", required = true, readonly = true)
-    protected MavenProject project;
-
-    /**
-     * The project build directory
-     *
-     */
-    @Parameter(defaultValue = "${project.build.directory}")
-    protected File buildDir;
-
-    /**
-     * The documentation directory
-     *
-     */
-    @Parameter(defaultValue = "${basedir}/../../../../components/")
-    protected File componentsDir;
-
-    /**
-     * Whether to fail the build fast if any Warnings was detected.
-     */
-    @Parameter
-    protected Boolean failFast;
-
-    /**
-     * Whether to fail if an option has no documentation.
-     */
-    @Parameter
-    protected Boolean failOnMissingDescription;
-
-    /**
-     * build context to check changed files and mark them for refresh (used for
-     * m2e compatibility)
-     */
-    @Component
-    private BuildContext buildContext;
-
-    @Override
-    public void execute() throws MojoExecutionException, MojoFailureException {
-        try {
-            executeStarter(project.getBasedir());
-        } catch (Exception e) {
-            throw new MojoFailureException("Error processing spring-configuration-metadata.json", e);
-        }
-    }
-
-    private void executeStarter(File starter) throws Exception {
-        File jsonFile = new File(buildDir, "classes/META-INF/spring-configuration-metadata.json");
-
-        // only if there is components we should update the documentation files
-        if (jsonFile.exists()) {
-            getLog().debug("Processing Spring Boot auto-configuration file: " + jsonFile);
-            Object js = Jsoner.deserialize(new FileReader(jsonFile));
-            if (js != null) {
-                String name = starter.getName();
-
-                if (!isValidStarter(name)) {
-                    return;
-                }
-
-                File compDir = getComponentsDir(name);
-
-                File[] docFiles;
-                File docFolder;
-                String componentName;
-                if ("camel-spring-boot".equals(name)) {
-                    // special for camel-spring-boot where we also want to auto-generate the options in the adoc file
-                    componentName = "spring-boot";
-                    docFolder = new File(compDir, "/src/main/docs/");
-                    docFiles = docFolder.listFiles(new ComponentDocFilter(componentName));
-                } else if ("camel-univocity-parsers-starter".equals(name)) {
-                    // special for univocity-parsers
-                    componentName = "univocity";
-                    docFolder = new File(compDir, "camel-univocity-parsers/src/main/docs/");
-                    docFiles = docFolder.listFiles(new ComponentDocFilter(componentName));
-                } else {
-                    // skip camel-  and -starter in the end
-                    componentName = name.substring(6, name.length() - 8);
-                    getLog().debug("Camel component: " + componentName);
-                    docFolder = new File(compDir, "camel-" + componentName + "/src/main/docs/");
-                    docFiles = docFolder.listFiles(new ComponentDocFilter(componentName));
-
-                    // maybe its one of those component that has subfolders with -api and -component
-                    if (docFiles == null || docFiles.length == 0) {
-                        docFolder = new File(compDir, "camel-" + componentName + "/camel-" + componentName + "-component/src/main/docs/");
-                        docFiles = docFolder.listFiles(new ComponentDocFilter(componentName));
-                    }
-                }
-
-                if (docFiles != null && docFiles.length > 0) {
-                    List<File> files = Arrays.asList(docFiles);
-
-                    // find out if the JAR has a Camel component, dataformat, or language
-                    boolean hasComponentDataFormatOrLanguage = files.stream().anyMatch(
-                        f -> f.getName().endsWith("-component.adoc") || f.getName().endsWith("-dataformat.adoc") || f.getName().endsWith("-language.adoc"));
-
-                    // if so then skip the root adoc file as its just a introduction to the others
-                    if (hasComponentDataFormatOrLanguage) {
-                        files = Arrays.stream(docFiles).filter(f -> !f.getName().equals(componentName + ".adoc")).collect(Collectors.toList());
-                    }
-
-                    if (files.size() == 1) {
-                        List<SpringBootAutoConfigureOptionModel> models = parseSpringBootAutoConfigureModels(jsonFile, null);
-
-                        // special for other kind of JARs that is not a regular Camel component,dataformat,language
-                        boolean onlyOther = files.size() == 1 && !hasComponentDataFormatOrLanguage;
-                        if (models.isEmpty() && onlyOther) {
-                            // there are no spring-boot auto configuration for this other kind of JAR so lets just ignore this
-                            return;
-                        }
-                        File docFile = files.get(0);
-
-                        // check for missing description on options
-                        boolean noDescription = false;
-                        for (SpringBootAutoConfigureOptionModel o : models) {
-                            if (StringHelper.isEmpty(o.getDescription())) {
-                                noDescription = true;
-                                getLog().warn("Option " + o.getName() + " has no description");
-                            }
-                        }
-                        if (noDescription && isFailOnNoDescription()) {
-                            throw new MojoExecutionException("Failed build due failOnMissingDescription=true");
-                        }
-
-                        String changed = templateAutoConfigurationOptions(models, componentName);
-                        boolean updated = updateAutoConfigureOptions(docFile, changed);
-                        if (updated) {
-                            getLog().info("Updated doc file: " + docFile);
-                        } else {
-                            getLog().debug("No changes to doc file: " + docFile);
-                        }
-                    } else if (files.size() > 1) {
-                        // when we have 2 or more files we need to filter the model options accordingly
-                        for (File docFile : files) {
-                            String docName = docFile.getName();
-                            int pos = docName.lastIndexOf("-");
-                            // spring-boot use lower cased keys
-                            String prefix = pos > 0 ? docName.substring(0, pos).toLowerCase(Locale.US) : null;
-
-                            List<SpringBootAutoConfigureOptionModel> models = parseSpringBootAutoConfigureModels(jsonFile, prefix);
-
-                            // check for missing description on options
-                            boolean noDescription = false;
-                            for (SpringBootAutoConfigureOptionModel o : models) {
-                                if (StringHelper.isEmpty(o.getDescription())) {
-                                    noDescription = true;
-                                    getLog().warn("Option " + o.getName() + " has no description");
-                                }
-                            }
-                            if (noDescription && isFailOnNoDescription()) {
-                                throw new MojoExecutionException("Failed build due failOnMissingDescription=true");
-                            }
-
-                            String changed = templateAutoConfigurationOptions(models, componentName);
-                            boolean updated = updateAutoConfigureOptions(docFile, changed);
-                            if (updated) {
-                                getLog().info("Updated doc file: " + docFile);
-                            } else {
-                                getLog().debug("No changes to doc file: " + docFile);
-                            }
-                        }
-                    }
-                } else {
-                    getLog().warn("No component docs found in folder: " + docFolder);
-                    if (isFailFast()) {
-                        throw new MojoExecutionException("Failed build due failFast=true");
-                    }
-                }
-            }
-        }
-    }
-
-    private File getComponentsDir(String name) {
-        if ("camel-spring-boot".equals(name)) {
-            // special for camel-spring-boot
-            return project.getBasedir();
-        } else {
-            return componentsDir;
-        }
-    }
-
-    private static final class ComponentDocFilter implements FileFilter {
-
-        private final String componentName;
-
-        public ComponentDocFilter(String componentName) {
-            this.componentName = asComponentName(componentName);
-        }
-
-        @Override
-        public boolean accept(File pathname) {
-            String name = pathname.getName();
-            return name.startsWith(componentName) && name.endsWith(".adoc");
-        }
-    }
-
-    private static String asComponentName(String componentName) {
-        if ("fastjson".equals(componentName)) {
-            return "json-fastjson";
-        } else if ("gson".equals(componentName)) {
-            return "json-gson";
-        } else if ("jackson".equals(componentName)) {
-            return "json-jackson";
-        } else if ("johnzon".equals(componentName)) {
-            return "json-johnzon";
-        } else if ("snakeyaml".equals(componentName)) {
-            return "yaml-snakeyaml";
-        } else if ("cassandraql".equals(componentName)) {
-            return "cql";
-        } else if ("josql".equals(componentName)) {
-            return "sql";
-        } else if ("juel".equals(componentName)) {
-            return "el";
-        } else if ("jsch".equals(componentName)) {
-            return "scp";
-        } else if ("printer".equals(componentName)) {
-            return "lpr";
-        } else if ("saxon".equals(componentName)) {
-            return "xquery";
-        } else if ("stringtemplate".equals(componentName)) {
-            return "string-template";
-        } else if ("tagsoup".equals(componentName)) {
-            return "tidyMarkup";
-        }
-        return componentName;
-    }
-
-    private static boolean isValidStarter(String name) {
-        // skip these
-        if ("camel-core-starter".equals(name)) {
-            return false;
-        }
-        return true;
-    }
-
-    private List<SpringBootAutoConfigureOptionModel> parseSpringBootAutoConfigureModels(File file, String include) throws IOException, DeserializationException {
-        getLog().debug("Parsing Spring Boot AutoConfigureModel using include: " + include);
-        List<SpringBootAutoConfigureOptionModel> answer = new ArrayList<>();
-
-        JsonObject obj = (JsonObject) Jsoner.deserialize(new FileReader(file));
-
-        JsonArray arr = obj.getCollection("properties");
-        if (arr != null && !arr.isEmpty()) {
-            arr.forEach(e -> {
-                JsonObject row = (JsonObject) e;
-                String name = row.getString("name");
-                String javaType = row.getString("type");
-                String desc = row.getStringOrDefault("description", "");
-                String defaultValue = row.getStringOrDefault("defaultValue", "");
-
-                // is the option deprecated then include that as well in the description
-                String deprecated = row.getStringOrDefault("deprecated", "");
-                String deprecationNote = row.getStringOrDefault("deprecationNote", "");
-                if ("true".equals(deprecated)) {
-                    desc = "*Deprecated* " + desc;
-                    if (!StringHelper.isEmpty(deprecationNote)) {
-                        if (!desc.endsWith(".")) {
-                            desc = desc + ". Deprecation note: " + deprecationNote;
-                        } else {
-                            desc = desc + " Deprecation note: " + deprecationNote;
-                        }
-                    }
-                }
-
-                // skip this special option and also if not matching the filter
-                boolean skip = name.endsWith("customizer.enabled") || include != null && !name.contains("." + include + ".");
-                if (!skip) {
-                    SpringBootAutoConfigureOptionModel model = new SpringBootAutoConfigureOptionModel();
-                    model.setName(name);
-                    model.setJavaType(javaType);
-                    model.setDefaultValue(defaultValue);
-                    model.setDescription(desc);
-                    answer.add(model);
-                }
-            });
-        }
-
-        return answer;
-    }
-
-    private boolean updateAutoConfigureOptions(File file, String changed) throws MojoExecutionException {
-        if (!file.exists()) {
-            return false;
-        }
-
-        try {
-            String text = loadText(new FileInputStream(file));
-
-            String existing = StringHelper.between(text, "// spring-boot-auto-configure options: START", "// spring-boot-auto-configure options: END");
-            if (existing != null) {
-                // remove leading line breaks etc
-                existing = existing.trim();
-                changed = changed.trim();
-                if (existing.equals(changed)) {
-                    return false;
-                } else {
-                    String before = StringHelper.before(text, "// spring-boot-auto-configure options: START");
-                    String after = StringHelper.after(text, "// spring-boot-auto-configure options: END");
-                    text = before + "// spring-boot-auto-configure options: START\n" + changed + "\n// spring-boot-auto-configure options: END" + after;
-                    writeText(file, text);
-                    return true;
-                }
-            } else {
-                getLog().warn("Cannot find markers in file " + file);
-                getLog().warn("Add the following markers");
-                getLog().warn("\t// spring-boot-auto-configure options: START");
-                getLog().warn("\t// spring-boot-auto-configure options: END");
-                if (isFailFast()) {
-                    throw new MojoExecutionException("Failed build due failFast=true");
-                }
-                return false;
-            }
-        } catch (Exception e) {
-            throw new MojoExecutionException("Error reading file " + file + " Reason: " + e, e);
-        }
-    }
-
-    private String templateAutoConfigurationOptions(List<SpringBootAutoConfigureOptionModel> options, String componentName) throws MojoExecutionException {
-        SpringBootModel model = new SpringBootModel();
-        model.setGroupId(project.getGroupId());
-        model.setArtifactId("camel-" + componentName + "-starter");
-        model.setVersion(project.getVersion());
-        model.setOptions(options);
-
-        try {
-            String template = loadText(UpdateSpringBootAutoConfigurationReadmeMojo.class.getClassLoader().getResourceAsStream("spring-boot-auto-configure-options.mvel"));
-            String out = (String) TemplateRuntime.eval(template, model, Collections.singletonMap("util", MvelHelper.INSTANCE));
-            return out;
-        } catch (Exception e) {
-            throw new MojoExecutionException("Error processing mvel template. Reason: " + e, e);
-        }
-    }
-
-    private boolean isFailFast() {
-        return failFast != null && failFast;
-    }
-
-    private boolean isFailOnNoDescription() {
-        return failOnMissingDescription != null && failOnMissingDescription;
-    }
-
-}


[camel] 05/07: [CAMEL-14404] Provide a lightweight xml parser

Posted by gn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8a8431c5d832d76698e0ad56abdb4daa6839bc67
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Wed Jan 15 14:50:35 2020 +0100

    [CAMEL-14404] Provide a lightweight xml parser
---
 core/camel-xml-io/pom.xml                          |   73 +
 .../java/org/apache/camel/xml/in/BaseParser.java   |  245 ++
 .../java/org/apache/camel/xml/in/ModelParser.java  | 3033 ++++++++++++++++++
 .../java/org/apache/camel/xml/io/MXParser.java     | 3243 ++++++++++++++++++++
 .../org/apache/camel/xml/io/XmlPullParser.java     |  964 ++++++
 .../camel/xml/io/XmlPullParserException.java       |   55 +
 .../org/apache/camel/xml/io/XmlStreamReader.java   |  747 +++++
 .../camel/xml/io/XmlStreamReaderException.java     |  150 +
 .../org/apache/camel/xml/in/ModelParserTest.java   |   77 +
 .../src/test/resources/barInterceptorRoute.xml     |   31 +
 .../src/test/resources/barOnExceptionRoute.xml     |   37 +
 .../src/test/resources/barPolicyRoute.xml          |   37 +
 core/camel-xml-io/src/test/resources/barRest.xml   |   26 +
 core/camel-xml-io/src/test/resources/barRoute.xml  |   31 +
 .../src/test/resources/barUpdatedRoute.xml         |   34 +
 .../src/test/resources/convertBody.xml             |   25 +
 .../src/test/resources/dynamicRecipientList.xml    |   27 +
 core/camel-xml-io/src/test/resources/loop.xml      |   27 +
 core/camel-xml-io/src/test/resources/processor.xml |   25 +
 .../src/test/resources/processorWithFilter.xml     |   28 +
 .../test/resources/processorWithGroovyFilter.xml   |   28 +
 .../test/resources/processorWithHeaderFilter.xml   |   28 +
 .../test/resources/processorWithSimpleFilter.xml   |   28 +
 .../src/test/resources/resequencerBatch.xml        |   32 +
 .../src/test/resources/resequencerStream.xml       |   29 +
 .../camel-xml-io/src/test/resources/routeGroup.xml |   31 +
 .../src/test/resources/routeProperties.xml         |   34 +
 .../test/resources/routeWithBindyDataFormat.xml    |   30 +
 .../src/test/resources/routeWithChoice.xml         |   37 +
 .../routeWithCircuitBreakerLoadBalance.xml         |   33 +
 .../src/test/resources/routeWithCvsDataFormat.xml  |   30 +
 .../resources/routeWithFailoverLoadBalance.xml     |   33 +
 .../test/resources/routeWithFlatpackDataFormat.xml |   30 +
 .../src/test/resources/routeWithHL7DataFormat.xml  |   30 +
 .../src/test/resources/routeWithJSonDataFormat.xml |   30 +
 .../src/test/resources/routeWithJaxbDataFormat.xml |   30 +
 .../src/test/resources/routeWithLoadBalance.xml    |   30 +
 .../src/test/resources/routeWithNamespace.xml      |   34 +
 .../src/test/resources/routeWithRSSDataFormat.xml  |   30 +
 .../test/resources/routeWithRandomLoadBalance.xml  |   30 +
 .../test/resources/routeWithStickyLoadBalance.xml  |   34 +
 .../resources/routeWithTidyMarkupDataFormat.xml    |   30 +
 .../test/resources/routeWithTopicLoadBalance.xml   |   30 +
 .../resources/routeWithXMLSecurityDataFormat.xml   |   30 +
 .../test/resources/routeWithXStreamDataFormat.xml  |   30 +
 .../test/resources/routeWithZipFileDataFormat.xml  |   30 +
 .../src/test/resources/routingSlip.xml             |   27 +
 .../resources/routingSlipHeaderAndDelimiterSet.xml |   27 +
 .../src/test/resources/routingSlipHeaderSet.xml    |   27 +
 core/camel-xml-io/src/test/resources/saga.xml      |   31 +
 .../camel-xml-io/src/test/resources/scan-route.xml |   29 +
 core/camel-xml-io/src/test/resources/script.xml    |   28 +
 core/camel-xml-io/src/test/resources/setBody.xml   |   28 +
 core/camel-xml-io/src/test/resources/setHeader.xml |   28 +
 .../src/test/resources/setHeaderToConstant.xml     |   28 +
 .../camel-xml-io/src/test/resources/simpleRest.xml |   29 +
 .../src/test/resources/simpleRestToD.xml           |   29 +
 .../src/test/resources/simpleRoute.xml             |   31 +
 core/camel-xml-io/src/test/resources/splitter.xml  |   28 +
 .../src/test/resources/staticRecipientList.xml     |   27 +
 core/camel-xml-io/src/test/resources/transform.xml |   28 +
 core/pom.xml                                       |    1 +
 .../apache/camel/tooling/util/srcgen/Method.java   |    5 +-
 .../camel/maven/packaging/EndpointDslMojo.java     |    2 +-
 .../packaging/ModelXmlParserGeneratorMojo.java     |  717 +++++
 65 files changed, 10864 insertions(+), 2 deletions(-)

diff --git a/core/camel-xml-io/pom.xml b/core/camel-xml-io/pom.xml
new file mode 100644
index 0000000..f38185f
--- /dev/null
+++ b/core/camel-xml-io/pom.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>core</artifactId>
+        <version>3.1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-xml-io</artifactId>
+
+    <name>Camel :: XML IO</name>
+    <description>Camel XML IO</description>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core-engine</artifactId>
+        </dependency>
+
+        <!-- testing -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-package-maven-plugin</artifactId>
+                <version>${project.version}</version>
+                <executions>
+                    <execution>
+                        <id>generate</id>
+                        <phase>process-classes</phase>
+                        <goals>
+                            <goal>generate-xml-parser</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/BaseParser.java b/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/BaseParser.java
new file mode 100644
index 0000000..b081e4a
--- /dev/null
+++ b/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/BaseParser.java
@@ -0,0 +1,245 @@
+/*
+ * 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.xml.in;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Consumer;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+import javax.xml.namespace.QName;
+
+import org.apache.camel.model.OtherAttributesAware;
+import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.xml.io.MXParser;
+import org.apache.camel.xml.io.XmlPullParser;
+import org.apache.camel.xml.io.XmlPullParserException;
+
+public class BaseParser {
+
+    protected final MXParser parser;
+    protected String namespace;
+
+    public BaseParser(InputStream input) throws IOException, XmlPullParserException {
+        this(input, null);
+    }
+
+    public BaseParser(Reader reader) throws IOException, XmlPullParserException {
+        this(reader, null);
+    }
+
+    public BaseParser(InputStream input, String namespace) throws IOException, XmlPullParserException {
+        this.parser = new MXParser();
+        this.parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
+        this.parser.setInput(input, null);
+        this.namespace = namespace != null ? namespace : "";
+    }
+
+    public BaseParser(Reader reader, String namespace) throws IOException, XmlPullParserException {
+        this.parser = new MXParser();
+        this.parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
+        this.parser.setInput(reader);
+        this.namespace = namespace != null ? namespace : "";
+    }
+
+    protected <T> T doParse(T definition,
+                            AttributeHandler<T> attributeHandler,
+                            ElementHandler<T> elementHandler,
+                            ValueHandler<T> valueHandler)
+            throws IOException, XmlPullParserException {
+        for (int i = 0; i < parser.getAttributeCount(); i++) {
+            String name = parser.getAttributeName(i);
+            String ns = parser.getAttributeNamespace(i);
+            String val = parser.getAttributeValue(i);
+            if (Objects.equals(ns, "") || Objects.equals(ns, namespace)) {
+                if (attributeHandler == null || !attributeHandler.accept(definition, name, val)) {
+                    handleUnexpectedAttribute(namespace, name);
+                }
+            } else {
+                handleOtherAttribute(definition, name, ns, val);
+            }
+        }
+        while (true) {
+            int event = parser.next();
+            if (event == XmlPullParser.TEXT) {
+                if (!parser.isWhitespace()) {
+                    valueHandler.accept(definition, parser.getText());
+                }
+            } else if (event == XmlPullParser.START_TAG) {
+                String ns = parser.getNamespace();
+                String name = parser.getName();
+                if (Objects.equals(ns, namespace)) {
+                    if (elementHandler == null || !elementHandler.accept(definition, name)) {
+                        handleUnexpectedElement(namespace, name);
+                    }
+                } else {
+                    handleUnexpectedElement(ns, name);
+                }
+            } else if (event == XmlPullParser.END_TAG) {
+                return definition;
+            } else {
+                throw new XmlPullParserException("expected START_TAG or END_TAG not "
+                        + XmlPullParser.TYPES[ event ], parser, null);
+            }
+        }
+    }
+
+    protected Class<?> asClass(String val) throws XmlPullParserException {
+        try {
+            return Class.forName(val);
+        } catch (ClassNotFoundException e) {
+            throw new XmlPullParserException("Unable to load class " + val, parser, e);
+        }
+    }
+
+    protected Class<?>[] asClassArray(String val) throws XmlPullParserException {
+        String[] vals = val.split(" ");
+        Class<?>[] cls = new Class<?>[vals.length];
+        for (int i = 0; i < vals.length; i++) {
+            cls[i] = asClass(vals[i]);
+        }
+        return cls;
+    }
+
+    protected byte[] asByteArray(String val) {
+        return Base64.getDecoder().decode(val);
+    }
+
+    protected List<String> asStringList(String val) {
+        return new ArrayList<>(Arrays.asList(val.split(" ")));
+    }
+
+    protected Set<String> asStringSet(String val) {
+        return new LinkedHashSet<>(Arrays.asList(val.split(" ")));
+    }
+
+    protected <T> void doAdd(T element, List<T> existing, Consumer<List<T>> setter) {
+        if (existing == null) {
+            existing = new ArrayList<>();
+            setter.accept(existing);
+        }
+        existing.add(element);
+    }
+
+    protected <V, B> B unmarshal(XmlAdapter<V,B> adapter, V value) throws XmlPullParserException {
+        try {
+            return adapter.unmarshal(value);
+        } catch (Exception e) {
+            throw new XmlPullParserException("Unable to unmarshal value", parser, e);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    protected <T> void doAdd(T element, T[] existing, Consumer<T[]> setter) {
+        int len = existing != null ? existing.length : 0;
+        T[] newArray = (T[]) Array.newInstance(element.getClass(), len + 1);
+        if (len > 0) {
+            System.arraycopy(existing, 0, newArray, 0, len);
+        }
+        newArray[len] = element;
+        setter.accept(newArray);
+    }
+
+    protected String doParseText() throws IOException, XmlPullParserException {
+        String s = "";
+        int e = parser.next();
+        if (e == XmlPullParser.TEXT) {
+            s = parser.getText();
+            e = parser.next();
+        }
+        if (e != XmlPullParser.END_TAG) {
+            throw new XmlPullParserException("Expected text element");
+        }
+        return s;
+    }
+
+    protected boolean handleUnexpectedAttribute(String namespace, String name) throws XmlPullParserException {
+        throw new XmlPullParserException("Unexpected attribute '{" + namespace + "}" + name + "'");
+    }
+
+    protected boolean handleUnexpectedElement(String namespace, String name) throws XmlPullParserException {
+        throw new XmlPullParserException("Unexpected element '{" + namespace + "}" + name + "'");
+    }
+
+    protected void handleUnexpectedText(String text) throws XmlPullParserException {
+        throw new XmlPullParserException("Unexpected text '" + text + "'");
+    }
+
+    protected void expectTag(String name) throws XmlPullParserException, IOException {
+        if (parser.nextTag() != XmlPullParser.START_TAG) {
+            throw new XmlPullParserException("Expected starting tag '{" + namespace + "}" + name + "', read ending tag '{" +
+                    parser.getNamespace() + "}" + parser.getName() + "' instead");
+        }
+        if (!Objects.equals(name, parser.getName())
+                || !Objects.equals(namespace, parser.getNamespace())) {
+            throw new XmlPullParserException("Expected starting tag '{" + namespace + "}" + name + "', read starting tag '{" +
+                    parser.getNamespace() + "}" + parser.getName() + "' instead");
+        }
+    }
+
+    protected void handleOtherAttribute(Object definition, String name, String ns, String val) throws XmlPullParserException {
+        if (definition instanceof OtherAttributesAware) {
+            Map<QName, Object> others = ((OtherAttributesAware) definition).getOtherAttributes();
+            if (others == null) {
+                others = new LinkedHashMap<>();
+                ((OtherAttributesAware) definition).setOtherAttributes(others);
+            }
+            others.put(new QName(ns, name), val);
+        } else {
+            throw new XmlPullParserException("Unsupported attribute '{" + ns + "}" + name + "'");
+        }
+    }
+
+    protected <T> AttributeHandler<T> noAttributeHandler() {
+        return null;
+    }
+
+    protected <T> ElementHandler<T> noElementHandler() {
+        return (def, name) -> handleUnexpectedElement(namespace, name);
+    }
+
+    protected <T> ValueHandler<T> noValueHandler() {
+        return (def, text) -> handleUnexpectedText(text);
+    }
+
+    protected <T extends ExpressionDefinition> ValueHandler<T> expressionDefinitionValueHandler() {
+        return ExpressionDefinition::setExpression;
+    }
+
+    interface AttributeHandler<T> {
+        boolean accept(T definition, String name, String value) throws IOException, XmlPullParserException;
+    }
+
+    interface ElementHandler<T> {
+        boolean accept(T definition, String name) throws IOException, XmlPullParserException;
+    }
+
+    interface ValueHandler<T> {
+        void accept(T definition, String value) throws IOException, XmlPullParserException;
+    }
+}
diff --git a/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/ModelParser.java b/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/ModelParser.java
new file mode 100644
index 0000000..1b4ed77
--- /dev/null
+++ b/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/ModelParser.java
@@ -0,0 +1,3033 @@
+/*
+ * 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.xml.in;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.util.concurrent.TimeUnit;
+import javax.annotation.Generated;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.ShutdownRoute;
+import org.apache.camel.ShutdownRunningTask;
+import org.apache.camel.model.*;
+import org.apache.camel.model.cloud.*;
+import org.apache.camel.model.config.BatchResequencerConfig;
+import org.apache.camel.model.config.ResequencerConfig;
+import org.apache.camel.model.config.StreamResequencerConfig;
+import org.apache.camel.model.dataformat.*;
+import org.apache.camel.model.language.*;
+import org.apache.camel.model.loadbalancer.*;
+import org.apache.camel.model.rest.*;
+import org.apache.camel.model.transformer.*;
+import org.apache.camel.model.validator.*;
+import org.apache.camel.util.concurrent.ThreadPoolRejectedPolicy;
+import org.apache.camel.xml.io.XmlPullParserException;
+
+@SuppressWarnings("unused")
+@Generated("org.apache.camel.maven.packaging.ModelXmlParserGeneratorMojo")
+public class ModelParser extends BaseParser {
+
+    public ModelParser(
+            InputStream input)
+            throws IOException, XmlPullParserException {
+        super(input);
+    }
+    public ModelParser(Reader reader) throws IOException, XmlPullParserException {
+        super(reader);
+    }
+    public ModelParser(
+            InputStream input,
+            String namespace)
+            throws IOException, XmlPullParserException {
+        super(input, namespace);
+    }
+    public ModelParser(
+            Reader reader,
+            String namespace)
+            throws IOException, XmlPullParserException {
+        super(reader, namespace);
+    }
+    protected AggregateDefinition doParseAggregateDefinition() throws IOException, XmlPullParserException {
+        return doParse(new AggregateDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "aggregateControllerRef": def.setAggregateControllerRef(val); break;
+                case "aggregationRepositoryRef": def.setAggregationRepositoryRef(val); break;
+                case "closeCorrelationKeyOnCompletion": def.setCloseCorrelationKeyOnCompletion(val); break;
+                case "completeAllOnStop": def.setCompleteAllOnStop(val); break;
+                case "completionFromBatchConsumer": def.setCompletionFromBatchConsumer(val); break;
+                case "completionInterval": def.setCompletionInterval(val); break;
+                case "completionOnNewCorrelationGroup": def.setCompletionOnNewCorrelationGroup(val); break;
+                case "completionSize": def.setCompletionSize(val); break;
+                case "completionTimeout": def.setCompletionTimeout(val); break;
+                case "completionTimeoutCheckerInterval": def.setCompletionTimeoutCheckerInterval(val); break;
+                case "discardOnAggregationFailure": def.setDiscardOnAggregationFailure(val); break;
+                case "discardOnCompletionTimeout": def.setDiscardOnCompletionTimeout(val); break;
+                case "eagerCheckCompletion": def.setEagerCheckCompletion(val); break;
+                case "executorServiceRef": def.setExecutorServiceRef(val); break;
+                case "forceCompletionOnStop": def.setForceCompletionOnStop(val); break;
+                case "ignoreInvalidCorrelationKeys": def.setIgnoreInvalidCorrelationKeys(val); break;
+                case "optimisticLocking": def.setOptimisticLocking(val); break;
+                case "parallelProcessing": def.setParallelProcessing(val); break;
+                case "strategyMethodAllowNull": def.setStrategyMethodAllowNull(val); break;
+                case "strategyMethodName": def.setStrategyMethodName(val); break;
+                case "strategyRef": def.setStrategyRef(val); break;
+                case "timeoutCheckerExecutorServiceRef": def.setTimeoutCheckerExecutorServiceRef(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            switch (key) {
+                case "completionPredicate": def.setCompletionPredicate(doParseExpressionSubElementDefinition()); break;
+                case "completionSizeExpression": def.setCompletionSizeExpression(doParseExpressionSubElementDefinition()); break;
+                case "completionTimeoutExpression": def.setCompletionTimeoutExpression(doParseExpressionSubElementDefinition()); break;
+                case "correlationExpression": def.setCorrelationExpression(doParseExpressionSubElementDefinition()); break;
+                case "optimisticLockRetryPolicy": def.setOptimisticLockRetryPolicyDefinition(doParseOptimisticLockRetryPolicyDefinition()); break;
+                default: return outputDefinitionElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected ExpressionSubElementDefinition doParseExpressionSubElementDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ExpressionSubElementDefinition(),
+            noAttributeHandler(), (def, key) -> {
+            ExpressionDefinition v = doParseExpressionDefinitionRef(key);
+            if (v != null) { 
+                def.setExpressionType(v);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected OptimisticLockRetryPolicyDefinition doParseOptimisticLockRetryPolicyDefinition() throws IOException, XmlPullParserException {
+        return doParse(new OptimisticLockRetryPolicyDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "exponentialBackOff": def.setExponentialBackOff(val); break;
+                case "maximumRetries": def.setMaximumRetries(val); break;
+                case "maximumRetryDelay": def.setMaximumRetryDelay(val); break;
+                case "randomBackOff": def.setRandomBackOff(val); break;
+                case "retryDelay": def.setRetryDelay(val); break;
+                default: return false;
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected <T extends OutputDefinition> ElementHandler<T> outputDefinitionElementHandler() {
+        return (def, key) -> {
+            ProcessorDefinition v = doParseProcessorDefinitionRef(key);
+            if (v != null) { 
+                doAdd(v, def.getOutputs(), def::setOutputs);
+                return true;
+            }
+            return optionalIdentifiedDefinitionElementHandler().accept(def, key);
+        };
+    }
+    protected OutputDefinition doParseOutputDefinition() throws IOException, XmlPullParserException {
+        return doParse(new OutputDefinition(), 
+            processorDefinitionAttributeHandler(), outputDefinitionElementHandler(), noValueHandler());
+    }
+    protected <T extends ProcessorDefinition> AttributeHandler<T> processorDefinitionAttributeHandler() {
+        return (def, key, val) -> {
+            if ("inheritErrorHandler".equals(key)) {
+                def.setInheritErrorHandler(Boolean.valueOf(val));
+                return true;
+            }
+            return optionalIdentifiedDefinitionAttributeHandler().accept(def, key, val);
+        };
+    }
+    protected <T extends OptionalIdentifiedDefinition> AttributeHandler<T> optionalIdentifiedDefinitionAttributeHandler() {
+        return (def, key, val) -> {
+            switch (key) {
+                case "customId": def.setCustomId(Boolean.valueOf(val)); break;
+                case "id": def.setId(val); break;
+                default: return false;
+            }
+            return true;
+        };
+    }
+    protected <T extends OptionalIdentifiedDefinition> ElementHandler<T> optionalIdentifiedDefinitionElementHandler() {
+        return (def, key) -> {
+            if ("description".equals(key)) {
+                def.setDescription(doParseDescriptionDefinition());
+                return true;
+            }
+            return false;
+        };
+    }
+    protected DescriptionDefinition doParseDescriptionDefinition() throws IOException, XmlPullParserException {
+        return doParse(new DescriptionDefinition(), (def, key, val) -> {
+            if ("lang".equals(key)) {
+                def.setLang(val);
+                return true;
+            }
+            return false;
+        }, noElementHandler(), (def, val) -> def.setText(val));
+    }
+    protected BeanDefinition doParseBeanDefinition() throws IOException, XmlPullParserException {
+        return doParse(new BeanDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "beanType": def.setBeanType(val); break;
+                case "cache": def.setCache(val); break;
+                case "method": def.setMethod(val); break;
+                case "ref": def.setRef(val); break;
+                case "scope": def.setScope(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected CatchDefinition doParseCatchDefinition() throws IOException, XmlPullParserException {
+        return doParse(new CatchDefinition(),
+            processorDefinitionAttributeHandler(), (def, key) -> {
+            switch (key) {
+                case "exception": doAdd(doParseText(), def.getExceptions(), def::setExceptions); break;
+                case "onWhen": def.setOnWhen(doParseWhenDefinition()); break;
+                default: return outputDefinitionElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected WhenDefinition doParseWhenDefinition() throws IOException, XmlPullParserException {
+        return doParse(new WhenDefinition(), 
+            processorDefinitionAttributeHandler(),  outputExpressionNodeElementHandler(), noValueHandler());
+    }
+    protected ChoiceDefinition doParseChoiceDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ChoiceDefinition(),
+            processorDefinitionAttributeHandler(), (def, key) -> {
+            switch (key) {
+                case "when": doAdd(doParseWhenDefinition(), def.getWhenClauses(), def::setWhenClauses); break;
+                case "whenSkipSendToEndpoint": doAdd(doParseWhenSkipSendToEndpointDefinition(), def.getWhenClauses(), def::setWhenClauses); break;
+                case "otherwise": def.setOtherwise(doParseOtherwiseDefinition()); break;
+                default: return optionalIdentifiedDefinitionElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected OtherwiseDefinition doParseOtherwiseDefinition() throws IOException, XmlPullParserException {
+        return doParse(new OtherwiseDefinition(),
+            processorDefinitionAttributeHandler(), outputDefinitionElementHandler(), noValueHandler());
+    }
+    protected CircuitBreakerDefinition doParseCircuitBreakerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new CircuitBreakerDefinition(), (def, key, val) -> {
+            if ("configurationRef".equals(key)) {
+                def.setConfigurationRef(val);
+                return true;
+            }
+            return processorDefinitionAttributeHandler().accept(def, key, val);
+        }, (def, key) -> {
+            switch (key) {
+                case "hystrixConfiguration": def.setHystrixConfiguration(doParseHystrixConfigurationDefinition()); break;
+                case "resilience4jConfiguration": def.setResilience4jConfiguration(doParseResilience4jConfigurationDefinition()); break;
+                default: return outputDefinitionElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected HystrixConfigurationDefinition doParseHystrixConfigurationDefinition() throws IOException, XmlPullParserException {
+        return doParse(new HystrixConfigurationDefinition(),
+            hystrixConfigurationCommonAttributeHandler(), noElementHandler(), noValueHandler());
+    }
+    protected Resilience4jConfigurationDefinition doParseResilience4jConfigurationDefinition() throws IOException, XmlPullParserException {
+        return doParse(new Resilience4jConfigurationDefinition(),
+            resilience4jConfigurationCommonAttributeHandler(), resilience4jConfigurationCommonElementHandler(), noValueHandler());
+    }
+    protected ClaimCheckDefinition doParseClaimCheckDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ClaimCheckDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "filter": def.setFilter(val); break;
+                case "key": def.setKey(val); break;
+                case "operation": def.setOperation(val); break;
+                case "strategyMethodName": def.setAggregationStrategyMethodName(val); break;
+                case "strategyRef": def.setAggregationStrategyRef(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected ContextScanDefinition doParseContextScanDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ContextScanDefinition(), (def, key, val) -> {
+            if ("includeNonSingletons".equals(key)) {
+                def.setIncludeNonSingletons(val);
+                return true;
+            }
+            return false;
+        }, (def, key) -> {
+            switch (key) {
+                case "excludes": doAdd(doParseText(), def.getExcludes(), def::setExcludes); break;
+                case "includes": doAdd(doParseText(), def.getIncludes(), def::setIncludes); break;
+                default: return false;
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected ConvertBodyDefinition doParseConvertBodyDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ConvertBodyDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "charset": def.setCharset(val); break;
+                case "type": def.setType(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected <T extends DataFormatDefinition> AttributeHandler<T> dataFormatDefinitionAttributeHandler() {
+        return (def, key, val) -> {
+            if ("contentTypeHeader".equals(key)) {
+                def.setContentTypeHeader(val);
+                return true;
+            }
+            return identifiedTypeAttributeHandler().accept(def, key, val);
+        };
+    }
+    protected DataFormatDefinition doParseDataFormatDefinition() throws IOException, XmlPullParserException {
+        return doParse(new DataFormatDefinition(), dataFormatDefinitionAttributeHandler(),  noElementHandler(), noValueHandler());
+    }
+    protected <T extends IdentifiedType> AttributeHandler<T> identifiedTypeAttributeHandler() {
+        return (def, key, val) -> {
+            if ("id".equals(key)) {
+                def.setId(val);
+                return true;
+            }
+            return false;
+        };
+    }
+    protected DelayDefinition doParseDelayDefinition() throws IOException, XmlPullParserException {
+        return doParse(new DelayDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "asyncDelayed": def.setAsyncDelayed(val); break;
+                case "callerRunsWhenRejected": def.setCallerRunsWhenRejected(val); break;
+                case "executorServiceRef": def.setExecutorServiceRef(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, expressionNodeElementHandler(), noValueHandler());
+    }
+    protected <T extends ExpressionNode> ElementHandler<T> expressionNodeElementHandler() {
+        return (def, key) -> {
+            ExpressionDefinition v = doParseExpressionDefinitionRef(key);
+            if (v != null) { 
+                def.setExpression(v);
+                return true;
+            }
+            return optionalIdentifiedDefinitionElementHandler().accept(def, key);
+        };
+    }
+    protected <T extends ExpressionDefinition> AttributeHandler<T> expressionDefinitionAttributeHandler() {
+        return (def, key, val) -> {
+            switch (key) {
+                case "id": def.setId(val); break;
+                case "trim": def.setTrim(val); break;
+                default: return false;
+            }
+            return true;
+        };
+    }
+    protected ExpressionDefinition doParseExpressionDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ExpressionDefinition(), expressionDefinitionAttributeHandler(),  noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected DynamicRouterDefinition doParseDynamicRouterDefinition() throws IOException, XmlPullParserException {
+        return doParse(new DynamicRouterDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "cacheSize": def.setCacheSize(val); break;
+                case "ignoreInvalidEndpoints": def.setIgnoreInvalidEndpoints(val); break;
+                case "uriDelimiter": def.setUriDelimiter(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, expressionNodeElementHandler(), noValueHandler());
+    }
+    protected EnrichDefinition doParseEnrichDefinition() throws IOException, XmlPullParserException {
+        return doParse(new EnrichDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "aggregateOnException": def.setAggregateOnException(val); break;
+                case "cacheSize": def.setCacheSize(val); break;
+                case "ignoreInvalidEndpoint": def.setIgnoreInvalidEndpoint(val); break;
+                case "shareUnitOfWork": def.setShareUnitOfWork(val); break;
+                case "strategyMethodAllowNull": def.setAggregationStrategyMethodAllowNull(val); break;
+                case "strategyMethodName": def.setAggregationStrategyMethodName(val); break;
+                case "strategyRef": def.setAggregationStrategyRef(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, expressionNodeElementHandler(), noValueHandler());
+    }
+    protected FilterDefinition doParseFilterDefinition() throws IOException, XmlPullParserException {
+        return doParse(new FilterDefinition(),
+            processorDefinitionAttributeHandler(), outputExpressionNodeElementHandler(), noValueHandler());
+    }
+    protected <T extends OutputExpressionNode> ElementHandler<T> outputExpressionNodeElementHandler() {
+        return (def, key) -> {
+            ProcessorDefinition v = doParseProcessorDefinitionRef(key);
+            if (v != null) { 
+                doAdd(v, def.getOutputs(), def::setOutputs);
+                return true;
+            }
+            return expressionNodeElementHandler().accept(def, key);
+        };
+    }
+    protected FinallyDefinition doParseFinallyDefinition() throws IOException, XmlPullParserException {
+        return doParse(new FinallyDefinition(),
+            processorDefinitionAttributeHandler(), outputDefinitionElementHandler(), noValueHandler());
+    }
+    protected FromDefinition doParseFromDefinition() throws IOException, XmlPullParserException {
+        return doParse(new FromDefinition(), (def, key, val) -> {
+            if ("uri".equals(key)) {
+                def.setUri(val);
+                return true;
+            }
+            return optionalIdentifiedDefinitionAttributeHandler().accept(def, key, val);
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected GlobalOptionDefinition doParseGlobalOptionDefinition() throws IOException, XmlPullParserException {
+        return doParse(new GlobalOptionDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "key": def.setKey(val); break;
+                case "value": def.setValue(val); break;
+                default: return false;
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected GlobalOptionsDefinition doParseGlobalOptionsDefinition() throws IOException, XmlPullParserException {
+        return doParse(new GlobalOptionsDefinition(),
+            noAttributeHandler(), (def, key) -> {
+            if ("globalOption".equals(key)) {
+                doAdd(doParseGlobalOptionDefinition(), def.getGlobalOptions(), def::setGlobalOptions);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected <T extends HystrixConfigurationCommon> AttributeHandler<T> hystrixConfigurationCommonAttributeHandler() {
+        return (def, key, val) -> {
+            switch (key) {
+                case "allowMaximumSizeToDivergeFromCoreSize": def.setAllowMaximumSizeToDivergeFromCoreSize(val); break;
+                case "circuitBreakerEnabled": def.setCircuitBreakerEnabled(val); break;
+                case "circuitBreakerErrorThresholdPercentage": def.setCircuitBreakerErrorThresholdPercentage(val); break;
+                case "circuitBreakerForceClosed": def.setCircuitBreakerForceClosed(val); break;
+                case "circuitBreakerForceOpen": def.setCircuitBreakerForceOpen(val); break;
+                case "circuitBreakerRequestVolumeThreshold": def.setCircuitBreakerRequestVolumeThreshold(val); break;
+                case "circuitBreakerSleepWindowInMilliseconds": def.setCircuitBreakerSleepWindowInMilliseconds(val); break;
+                case "corePoolSize": def.setCorePoolSize(val); break;
+                case "executionIsolationSemaphoreMaxConcurrentRequests": def.setExecutionIsolationSemaphoreMaxConcurrentRequests(val); break;
+                case "executionIsolationStrategy": def.setExecutionIsolationStrategy(val); break;
+                case "executionIsolationThreadInterruptOnTimeout": def.setExecutionIsolationThreadInterruptOnTimeout(val); break;
+                case "executionTimeoutEnabled": def.setExecutionTimeoutEnabled(val); break;
+                case "executionTimeoutInMilliseconds": def.setExecutionTimeoutInMilliseconds(val); break;
+                case "fallbackEnabled": def.setFallbackEnabled(val); break;
+                case "fallbackIsolationSemaphoreMaxConcurrentRequests": def.setFallbackIsolationSemaphoreMaxConcurrentRequests(val); break;
+                case "groupKey": def.setGroupKey(val); break;
+                case "keepAliveTime": def.setKeepAliveTime(val); break;
+                case "maxQueueSize": def.setMaxQueueSize(val); break;
+                case "maximumSize": def.setMaximumSize(val); break;
+                case "metricsHealthSnapshotIntervalInMilliseconds": def.setMetricsHealthSnapshotIntervalInMilliseconds(val); break;
+                case "metricsRollingPercentileBucketSize": def.setMetricsRollingPercentileBucketSize(val); break;
+                case "metricsRollingPercentileEnabled": def.setMetricsRollingPercentileEnabled(val); break;
+                case "metricsRollingPercentileWindowBuckets": def.setMetricsRollingPercentileWindowBuckets(val); break;
+                case "metricsRollingPercentileWindowInMilliseconds": def.setMetricsRollingPercentileWindowInMilliseconds(val); break;
+                case "metricsRollingStatisticalWindowBuckets": def.setMetricsRollingStatisticalWindowBuckets(val); break;
+                case "metricsRollingStatisticalWindowInMilliseconds": def.setMetricsRollingStatisticalWindowInMilliseconds(val); break;
+                case "queueSizeRejectionThreshold": def.setQueueSizeRejectionThreshold(val); break;
+                case "requestLogEnabled": def.setRequestLogEnabled(val); break;
+                case "threadPoolKey": def.setThreadPoolKey(val); break;
+                case "threadPoolRollingNumberStatisticalWindowBuckets": def.setThreadPoolRollingNumberStatisticalWindowBuckets(val); break;
+                case "threadPoolRollingNumberStatisticalWindowInMilliseconds": def.setThreadPoolRollingNumberStatisticalWindowInMilliseconds(val); break;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        };
+    }
+    protected HystrixConfigurationCommon doParseHystrixConfigurationCommon() throws IOException, XmlPullParserException {
+        return doParse(new HystrixConfigurationCommon(), hystrixConfigurationCommonAttributeHandler(),  noElementHandler(), noValueHandler());
+    }
+    protected IdempotentConsumerDefinition doParseIdempotentConsumerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new IdempotentConsumerDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "completionEager": def.setCompletionEager(val); break;
+                case "eager": def.setEager(val); break;
+                case "messageIdRepositoryRef": def.setMessageIdRepositoryRef(val); break;
+                case "removeOnFailure": def.setRemoveOnFailure(val); break;
+                case "skipDuplicate": def.setSkipDuplicate(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, outputExpressionNodeElementHandler(), noValueHandler());
+    }
+    protected InOnlyDefinition doParseInOnlyDefinition() throws IOException, XmlPullParserException {
+        return doParse(new InOnlyDefinition(),
+            sendDefinitionAttributeHandler(), optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected <T extends SendDefinition> AttributeHandler<T> sendDefinitionAttributeHandler() {
+        return (def, key, val) -> {
+            if ("uri".equals(key)) {
+                def.setUri(val);
+                return true;
+            }
+            return processorDefinitionAttributeHandler().accept(def, key, val);
+        };
+    }
+    protected InOutDefinition doParseInOutDefinition() throws IOException, XmlPullParserException {
+        return doParse(new InOutDefinition(),
+            sendDefinitionAttributeHandler(), optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected InputTypeDefinition doParseInputTypeDefinition() throws IOException, XmlPullParserException {
+        return doParse(new InputTypeDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "urn": def.setUrn(val); break;
+                case "validate": def.setValidate(val); break;
+                default: return optionalIdentifiedDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected InterceptDefinition doParseInterceptDefinition() throws IOException, XmlPullParserException {
+        return doParse(new InterceptDefinition(), 
+            processorDefinitionAttributeHandler(),  outputDefinitionElementHandler(), noValueHandler());
+    }
+    protected InterceptFromDefinition doParseInterceptFromDefinition() throws IOException, XmlPullParserException {
+        return doParse(new InterceptFromDefinition(), (def, key, val) -> {
+            if ("uri".equals(key)) {
+                def.setUri(val);
+                return true;
+            }
+            return processorDefinitionAttributeHandler().accept(def, key, val);
+        }, outputDefinitionElementHandler(), noValueHandler());
+    }
+    protected InterceptSendToEndpointDefinition doParseInterceptSendToEndpointDefinition() throws IOException, XmlPullParserException {
+        return doParse(new InterceptSendToEndpointDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "afterUri": def.setAfterUri(val); break;
+                case "skipSendToOriginalEndpoint": def.setSkipSendToOriginalEndpoint(val); break;
+                case "uri": def.setUri(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, outputDefinitionElementHandler(), noValueHandler());
+    }
+    protected LoadBalanceDefinition doParseLoadBalanceDefinition() throws IOException, XmlPullParserException {
+        return doParse(new LoadBalanceDefinition(),
+            processorDefinitionAttributeHandler(), (def, key) -> {
+            switch (key) {
+                case "failover": def.setLoadBalancerType(doParseFailoverLoadBalancerDefinition()); break;
+                case "random": def.setLoadBalancerType(doParseRandomLoadBalancerDefinition()); break;
+                case "customLoadBalancer": def.setLoadBalancerType(doParseCustomLoadBalancerDefinition()); break;
+                case "roundRobin": def.setLoadBalancerType(doParseRoundRobinLoadBalancerDefinition()); break;
+                case "sticky": def.setLoadBalancerType(doParseStickyLoadBalancerDefinition()); break;
+                case "topic": def.setLoadBalancerType(doParseTopicLoadBalancerDefinition()); break;
+                case "weighted": def.setLoadBalancerType(doParseWeightedLoadBalancerDefinition()); break;
+                default: return outputDefinitionElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected LoadBalancerDefinition doParseLoadBalancerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new LoadBalancerDefinition(), 
+            identifiedTypeAttributeHandler(),  noElementHandler(), noValueHandler());
+    }
+    protected LogDefinition doParseLogDefinition() throws IOException, XmlPullParserException {
+        return doParse(new LogDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "logName": def.setLogName(val); break;
+                case "loggerRef": def.setLoggerRef(val); break;
+                case "loggingLevel": def.setLoggingLevel(val); break;
+                case "marker": def.setMarker(val); break;
+                case "message": def.setMessage(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected LoopDefinition doParseLoopDefinition() throws IOException, XmlPullParserException {
+        return doParse(new LoopDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "copy": def.setCopy(val); break;
+                case "doWhile": def.setDoWhile(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, outputExpressionNodeElementHandler(), noValueHandler());
+    }
+    protected MarshalDefinition doParseMarshalDefinition() throws IOException, XmlPullParserException {
+        return doParse(new MarshalDefinition(),
+            processorDefinitionAttributeHandler(), (def, key) -> {
+            DataFormatDefinition v = doParseDataFormatDefinitionRef(key);
+            if (v != null) { 
+                def.setDataFormatType(v);
+                return true;
+            }
+            return optionalIdentifiedDefinitionElementHandler().accept(def, key);
+        }, noValueHandler());
+    }
+    protected MulticastDefinition doParseMulticastDefinition() throws IOException, XmlPullParserException {
+        return doParse(new MulticastDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "executorServiceRef": def.setExecutorServiceRef(val); break;
+                case "onPrepareRef": def.setOnPrepareRef(val); break;
+                case "parallelAggregate": def.setParallelAggregate(val); break;
+                case "parallelProcessing": def.setParallelProcessing(val); break;
+                case "shareUnitOfWork": def.setShareUnitOfWork(val); break;
+                case "stopOnAggregateException": def.setStopOnAggregateException(val); break;
+                case "stopOnException": def.setStopOnException(val); break;
+                case "strategyMethodAllowNull": def.setStrategyMethodAllowNull(val); break;
+                case "strategyMethodName": def.setStrategyMethodName(val); break;
+                case "strategyRef": def.setStrategyRef(val); break;
+                case "streaming": def.setStreaming(val); break;
+                case "timeout": def.setTimeout(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, outputDefinitionElementHandler(), noValueHandler());
+    }
+    protected OnCompletionDefinition doParseOnCompletionDefinition() throws IOException, XmlPullParserException {
+        return doParse(new OnCompletionDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "executorServiceRef": def.setExecutorServiceRef(val); break;
+                case "mode": def.setMode(OnCompletionMode.valueOf(val)); break;
+                case "onCompleteOnly": def.setOnCompleteOnly(val); break;
+                case "onFailureOnly": def.setOnFailureOnly(val); break;
+                case "parallelProcessing": def.setParallelProcessing(val); break;
+                case "useOriginalMessage": def.setUseOriginalMessage(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            if ("onWhen".equals(key)) {
+                def.setOnWhen(doParseWhenDefinition());
+                return true;
+            }
+            return outputDefinitionElementHandler().accept(def, key);
+        }, noValueHandler());
+    }
+    protected OnExceptionDefinition doParseOnExceptionDefinition() throws IOException, XmlPullParserException {
+        return doParse(new OnExceptionDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "onExceptionOccurredRef": def.setOnExceptionOccurredRef(val); break;
+                case "onRedeliveryRef": def.setOnRedeliveryRef(val); break;
+                case "redeliveryPolicyRef": def.setRedeliveryPolicyRef(val); break;
+                case "useOriginalBody": def.setUseOriginalBody(val); break;
+                case "useOriginalMessage": def.setUseOriginalMessage(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            switch (key) {
+                case "continued": def.setContinued(doParseExpressionSubElementDefinition()); break;
+                case "exception": doAdd(doParseText(), def.getExceptions(), def::setExceptions); break;
+                case "handled": def.setHandled(doParseExpressionSubElementDefinition()); break;
+                case "onWhen": def.setOnWhen(doParseWhenDefinition()); break;
+                case "redeliveryPolicy": def.setRedeliveryPolicyType(doParseRedeliveryPolicyDefinition()); break;
+                case "retryWhile": def.setRetryWhile(doParseExpressionSubElementDefinition()); break;
+                default: return outputDefinitionElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected RedeliveryPolicyDefinition doParseRedeliveryPolicyDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RedeliveryPolicyDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "allowRedeliveryWhileStopping": def.setAllowRedeliveryWhileStopping(val); break;
+                case "asyncDelayedRedelivery": def.setAsyncDelayedRedelivery(val); break;
+                case "backOffMultiplier": def.setBackOffMultiplier(val); break;
+                case "collisionAvoidanceFactor": def.setCollisionAvoidanceFactor(val); break;
+                case "delayPattern": def.setDelayPattern(val); break;
+                case "disableRedelivery": def.setDisableRedelivery(val); break;
+                case "exchangeFormatterRef": def.setExchangeFormatterRef(val); break;
+                case "logContinued": def.setLogContinued(val); break;
+                case "logExhausted": def.setLogExhausted(val); break;
+                case "logExhaustedMessageBody": def.setLogExhaustedMessageBody(val); break;
+                case "logExhaustedMessageHistory": def.setLogExhaustedMessageHistory(val); break;
+                case "logHandled": def.setLogHandled(val); break;
+                case "logNewException": def.setLogNewException(val); break;
+                case "logRetryAttempted": def.setLogRetryAttempted(val); break;
+                case "logRetryStackTrace": def.setLogRetryStackTrace(val); break;
+                case "logStackTrace": def.setLogStackTrace(val); break;
+                case "maximumRedeliveries": def.setMaximumRedeliveries(val); break;
+                case "maximumRedeliveryDelay": def.setMaximumRedeliveryDelay(val); break;
+                case "redeliveryDelay": def.setRedeliveryDelay(val); break;
+                case "retriesExhaustedLogLevel": def.setRetriesExhaustedLogLevel(val); break;
+                case "retryAttemptedLogInterval": def.setRetryAttemptedLogInterval(val); break;
+                case "retryAttemptedLogLevel": def.setRetryAttemptedLogLevel(val); break;
+                case "useCollisionAvoidance": def.setUseCollisionAvoidance(val); break;
+                case "useExponentialBackOff": def.setUseExponentialBackOff(val); break;
+                default: return false;
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected OnFallbackDefinition doParseOnFallbackDefinition() throws IOException, XmlPullParserException {
+        return doParse(new OnFallbackDefinition(), (def, key, val) -> {
+            if ("fallbackViaNetwork".equals(key)) {
+                def.setFallbackViaNetwork(val);
+                return true;
+            }
+            return processorDefinitionAttributeHandler().accept(def, key, val);
+        }, outputDefinitionElementHandler(), noValueHandler());
+    }
+    protected OutputTypeDefinition doParseOutputTypeDefinition() throws IOException, XmlPullParserException {
+        return doParse(new OutputTypeDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "urn": def.setUrn(val); break;
+                case "validate": def.setValidate(val); break;
+                default: return optionalIdentifiedDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected PackageScanDefinition doParsePackageScanDefinition() throws IOException, XmlPullParserException {
+        return doParse(new PackageScanDefinition(),
+            noAttributeHandler(), (def, key) -> {
+            switch (key) {
+                case "excludes": doAdd(doParseText(), def.getExcludes(), def::setExcludes); break;
+                case "includes": doAdd(doParseText(), def.getIncludes(), def::setIncludes); break;
+                case "package": doAdd(doParseText(), def.getPackages(), def::setPackages); break;
+                default: return false;
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected PipelineDefinition doParsePipelineDefinition() throws IOException, XmlPullParserException {
+        return doParse(new PipelineDefinition(),
+            processorDefinitionAttributeHandler(), outputDefinitionElementHandler(), noValueHandler());
+    }
+    protected PolicyDefinition doParsePolicyDefinition() throws IOException, XmlPullParserException {
+        return doParse(new PolicyDefinition(), (def, key, val) -> {
+            if ("ref".equals(key)) {
+                def.setRef(val);
+                return true;
+            }
+            return processorDefinitionAttributeHandler().accept(def, key, val);
+        }, outputDefinitionElementHandler(), noValueHandler());
+    }
+    protected PollEnrichDefinition doParsePollEnrichDefinition() throws IOException, XmlPullParserException {
+        return doParse(new PollEnrichDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "aggregateOnException": def.setAggregateOnException(val); break;
+                case "cacheSize": def.setCacheSize(val); break;
+                case "ignoreInvalidEndpoint": def.setIgnoreInvalidEndpoint(val); break;
+                case "strategyMethodAllowNull": def.setAggregationStrategyMethodAllowNull(val); break;
+                case "strategyMethodName": def.setAggregationStrategyMethodName(val); break;
+                case "strategyRef": def.setAggregationStrategyRef(val); break;
+                case "timeout": def.setTimeout(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, expressionNodeElementHandler(), noValueHandler());
+    }
+    protected ProcessDefinition doParseProcessDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ProcessDefinition(), (def, key, val) -> {
+            if ("ref".equals(key)) {
+                def.setRef(val);
+                return true;
+            }
+            return processorDefinitionAttributeHandler().accept(def, key, val);
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected PropertyDefinition doParsePropertyDefinition() throws IOException, XmlPullParserException {
+        return doParse(new PropertyDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "key": def.setKey(val); break;
+                case "value": def.setValue(val); break;
+                default: return false;
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected PropertyDefinitions doParsePropertyDefinitions() throws IOException, XmlPullParserException {
+        return doParse(new PropertyDefinitions(),
+            noAttributeHandler(), (def, key) -> {
+            if ("properties".equals(key)) {
+                doAdd(doParsePropertyDefinition(), def.getProperties(), def::setProperties);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected RecipientListDefinition doParseRecipientListDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RecipientListDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "cacheSize": def.setCacheSize(val); break;
+                case "delimiter": def.setDelimiter(val); break;
+                case "executorServiceRef": def.setExecutorServiceRef(val); break;
+                case "ignoreInvalidEndpoints": def.setIgnoreInvalidEndpoints(val); break;
+                case "onPrepareRef": def.setOnPrepareRef(val); break;
+                case "parallelAggregate": def.setParallelAggregate(val); break;
+                case "parallelProcessing": def.setParallelProcessing(val); break;
+                case "shareUnitOfWork": def.setShareUnitOfWork(val); break;
+                case "stopOnAggregateException": def.setStopOnAggregateException(val); break;
+                case "stopOnException": def.setStopOnException(val); break;
+                case "strategyMethodAllowNull": def.setStrategyMethodAllowNull(val); break;
+                case "strategyMethodName": def.setStrategyMethodName(val); break;
+                case "strategyRef": def.setStrategyRef(val); break;
+                case "streaming": def.setStreaming(val); break;
+                case "timeout": def.setTimeout(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, expressionNodeElementHandler(), noValueHandler());
+    }
+    protected RemoveHeaderDefinition doParseRemoveHeaderDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RemoveHeaderDefinition(), (def, key, val) -> {
+            if ("headerName".equals(key)) {
+                def.setHeaderName(val);
+                return true;
+            }
+            return processorDefinitionAttributeHandler().accept(def, key, val);
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected RemoveHeadersDefinition doParseRemoveHeadersDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RemoveHeadersDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "excludePattern": def.setExcludePattern(val); break;
+                case "pattern": def.setPattern(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected RemovePropertiesDefinition doParseRemovePropertiesDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RemovePropertiesDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "excludePattern": def.setExcludePattern(val); break;
+                case "pattern": def.setPattern(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected RemovePropertyDefinition doParseRemovePropertyDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RemovePropertyDefinition(), (def, key, val) -> {
+            if ("propertyName".equals(key)) {
+                def.setPropertyName(val);
+                return true;
+            }
+            return processorDefinitionAttributeHandler().accept(def, key, val);
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected ResequenceDefinition doParseResequenceDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ResequenceDefinition(),
+            processorDefinitionAttributeHandler(), (def, key) -> {
+            switch (key) {
+                case "batch-config": def.setResequencerConfig(doParseBatchResequencerConfig()); break;
+                case "stream-config": def.setResequencerConfig(doParseStreamResequencerConfig()); break;
+                default: 
+                    ExpressionDefinition v = doParseExpressionDefinitionRef(key);
+                    if (v != null) { 
+                        def.setExpression(v);
+                        return true;
+                    }
+                    return outputDefinitionElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected <T extends Resilience4jConfigurationCommon> AttributeHandler<T> resilience4jConfigurationCommonAttributeHandler() {
+        return (def, key, val) -> {
+            switch (key) {
+                case "automaticTransitionFromOpenToHalfOpenEnabled": def.setAutomaticTransitionFromOpenToHalfOpenEnabled(Boolean.valueOf(val)); break;
+                case "circuitBreakerRef": def.setCircuitBreakerRef(val); break;
+                case "configRef": def.setConfigRef(val); break;
+                case "failureRateThreshold": def.setFailureRateThreshold(Float.valueOf(val)); break;
+                case "minimumNumberOfCalls": def.setMinimumNumberOfCalls(Integer.valueOf(val)); break;
+                case "permittedNumberOfCallsInHalfOpenState": def.setPermittedNumberOfCallsInHalfOpenState(Integer.valueOf(val)); break;
+                case "slidingWindowSize": def.setSlidingWindowSize(Integer.valueOf(val)); break;
+                case "slidingWindowType": def.setSlidingWindowType(val); break;
+                case "slowCallDurationThreshold": def.setSlowCallDurationThreshold(Integer.valueOf(val)); break;
+                case "slowCallRateThreshold": def.setSlowCallRateThreshold(Float.valueOf(val)); break;
+                case "waitDurationInOpenState": def.setWaitDurationInOpenState(Integer.valueOf(val)); break;
+                case "writableStackTraceEnabled": def.setWritableStackTraceEnabled(Boolean.valueOf(val)); break;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        };
+    }
+    protected <T extends Resilience4jConfigurationCommon> ElementHandler<T> resilience4jConfigurationCommonElementHandler() {
+        return (def, key) -> {
+            switch (key) {
+                case "bulkheadEnabled": def.setBulkheadEnabled(Boolean.valueOf(doParseText())); break;
+                case "bulkheadMaxConcurrentCalls": def.setBulkheadMaxConcurrentCalls(Integer.valueOf(doParseText())); break;
+                case "bulkheadMaxWaitDuration": def.setBulkheadMaxWaitDuration(Integer.valueOf(doParseText())); break;
+                case "timeoutCancelRunningFuture": def.setTimeoutCancelRunningFuture(Boolean.valueOf(doParseText())); break;
+                case "timeoutDuration": def.setTimeoutDuration(Integer.valueOf(doParseText())); break;
+                case "timeoutEnabled": def.setTimeoutEnabled(Boolean.valueOf(doParseText())); break;
+                case "timeoutExecutorServiceRef": def.setTimeoutExecutorServiceRef(doParseText()); break;
+                default: return false;
+            }
+            return true;
+        };
+    }
+    protected Resilience4jConfigurationCommon doParseResilience4jConfigurationCommon() throws IOException, XmlPullParserException {
+        return doParse(new Resilience4jConfigurationCommon(), resilience4jConfigurationCommonAttributeHandler(), resilience4jConfigurationCommonElementHandler(), noValueHandler());
+    }
+    protected RestContextRefDefinition doParseRestContextRefDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RestContextRefDefinition(), (def, key, val) -> {
+            if ("ref".equals(key)) {
+                def.setRef(val);
+                return true;
+            }
+            return false;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected RollbackDefinition doParseRollbackDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RollbackDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "markRollbackOnly": def.setMarkRollbackOnly(val); break;
+                case "markRollbackOnlyLast": def.setMarkRollbackOnlyLast(val); break;
+                case "message": def.setMessage(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected RouteBuilderDefinition doParseRouteBuilderDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RouteBuilderDefinition(), (def, key, val) -> {
+            if ("ref".equals(key)) {
+                def.setRef(val);
+                return true;
+            }
+            return identifiedTypeAttributeHandler().accept(def, key, val);
+        }, noElementHandler(), noValueHandler());
+    }
+    protected RouteContextRefDefinition doParseRouteContextRefDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RouteContextRefDefinition(), (def, key, val) -> {
+            if ("ref".equals(key)) {
+                def.setRef(val);
+                return true;
+            }
+            return false;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected RouteDefinition doParseRouteDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RouteDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "autoStartup": def.setAutoStartup(val); break;
+                case "delayer": def.setDelayer(val); break;
+                case "errorHandlerRef": def.setErrorHandlerRef(val); break;
+                case "group": def.setGroup(val); break;
+                case "logMask": def.setLogMask(val); break;
+                case "messageHistory": def.setMessageHistory(val); break;
+                case "routePolicyRef": def.setRoutePolicyRef(val); break;
+                case "shutdownRoute": def.setShutdownRoute(ShutdownRoute.valueOf(val)); break;
+                case "shutdownRunningTask": def.setShutdownRunningTask(ShutdownRunningTask.valueOf(val)); break;
+                case "startupOrder": def.setStartupOrder(Integer.valueOf(val)); break;
+                case "streamCache": def.setStreamCache(val); break;
+                case "trace": def.setTrace(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            switch (key) {
+                case "from": def.setInput(doParseFromDefinition()); break;
+                case "inputType": def.setInputType(doParseInputTypeDefinition()); break;
+                case "outputType": def.setOutputType(doParseOutputTypeDefinition()); break;
+                case "routeProperty": doAdd(doParsePropertyDefinition(), def.getRouteProperties(), def::setRouteProperties); break;
+                default: return outputDefinitionElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected RestDefinition doParseRestDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RestDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "apiDocs": def.setApiDocs(val); break;
+                case "bindingMode": def.setBindingMode(val); break;
+                case "clientRequestValidation": def.setClientRequestValidation(val); break;
+                case "consumes": def.setConsumes(val); break;
+                case "enableCORS": def.setEnableCORS(val); break;
+                case "path": def.setPath(val); break;
+                case "produces": def.setProduces(val); break;
+                case "skipBindingOnErrorCode": def.setSkipBindingOnErrorCode(val); break;
+                case "tag": def.setTag(val); break;
+                default: return optionalIdentifiedDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            switch (key) {
+                case "delete": doAdd(doParseDeleteVerbDefinition(), def.getVerbs(), def::setVerbs); break;
+                case "verb": doAdd(doParseVerbDefinition(), def.getVerbs(), def::setVerbs); break;
+                case "get": doAdd(doParseGetVerbDefinition(), def.getVerbs(), def::setVerbs); break;
+                case "head": doAdd(doParseHeadVerbDefinition(), def.getVerbs(), def::setVerbs); break;
+                case "patch": doAdd(doParsePatchVerbDefinition(), def.getVerbs(), def::setVerbs); break;
+                case "post": doAdd(doParsePostVerbDefinition(), def.getVerbs(), def::setVerbs); break;
+                case "put": doAdd(doParsePutVerbDefinition(), def.getVerbs(), def::setVerbs); break;
+                case "securityDefinitions": def.setSecurityDefinitions(doParseRestSecuritiesDefinition()); break;
+                default: return optionalIdentifiedDefinitionElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected RestBindingDefinition doParseRestBindingDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RestBindingDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "bindingMode": def.setBindingMode(val); break;
+                case "clientRequestValidation": def.setClientRequestValidation(val); break;
+                case "component": def.setComponent(val); break;
+                case "consumes": def.setConsumes(val); break;
+                case "enableCORS": def.setEnableCORS(val); break;
+                case "outType": def.setOutType(val); break;
+                case "produces": def.setProduces(val); break;
+                case "skipBindingOnErrorCode": def.setSkipBindingOnErrorCode(val); break;
+                case "type": def.setType(val); break;
+                default: return optionalIdentifiedDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    public RoutesDefinition parseRoutesDefinition()
+            throws IOException, XmlPullParserException {
+        expectTag("routes");
+        return doParseRoutesDefinition();
+    }
+    protected RoutesDefinition doParseRoutesDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RoutesDefinition(),
+            optionalIdentifiedDefinitionAttributeHandler(), (def, key) -> {
+            if ("route".equals(key)) {
+                doAdd(doParseRouteDefinition(), def.getRoutes(), def::setRoutes);
+                return true;
+            }
+            return optionalIdentifiedDefinitionElementHandler().accept(def, key);
+        }, noValueHandler());
+    }
+    protected RoutingSlipDefinition doParseRoutingSlipDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RoutingSlipDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "cacheSize": def.setCacheSize(val); break;
+                case "ignoreInvalidEndpoints": def.setIgnoreInvalidEndpoints(val); break;
+                case "uriDelimiter": def.setUriDelimiter(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, expressionNodeElementHandler(), noValueHandler());
+    }
+    protected SagaDefinition doParseSagaDefinition() throws IOException, XmlPullParserException {
+        return doParse(new SagaDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "completionMode": def.setCompletionMode(SagaCompletionMode.valueOf(val)); break;
+                case "propagation": def.setPropagation(SagaPropagation.valueOf(val)); break;
+                case "sagaServiceRef": def.setSagaServiceRef(val); break;
+                case "timeoutInMilliseconds": def.setTimeoutInMilliseconds(Long.valueOf(val)); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            switch (key) {
+                case "compensation": def.setCompensation(doParseSagaActionUriDefinition()); break;
+                case "completion": def.setCompletion(doParseSagaActionUriDefinition()); break;
+                case "option": doAdd(doParseSagaOptionDefinition(), def.getOptions(), def::setOptions); break;
+                default: return outputDefinitionElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected SagaActionUriDefinition doParseSagaActionUriDefinition() throws IOException, XmlPullParserException {
+        return doParse(new SagaActionUriDefinition(), (def, key, val) -> {
+            if ("uri".equals(key)) {
+                def.setUri(val);
+                return true;
+            }
+            return false;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected SagaOptionDefinition doParseSagaOptionDefinition() throws IOException, XmlPullParserException {
+        return doParse(new SagaOptionDefinition(), (def, key, val) -> {
+            if ("optionName".equals(key)) {
+                def.setOptionName(val);
+                return true;
+            }
+            return false;
+        }, (def, key) -> {
+            ExpressionDefinition v = doParseExpressionDefinitionRef(key);
+            if (v != null) { 
+                def.setExpression(v);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected SamplingDefinition doParseSamplingDefinition() throws IOException, XmlPullParserException {
+        return doParse(new SamplingDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "messageFrequency": def.setMessageFrequency(Long.valueOf(val)); break;
+                case "samplePeriod": def.setSamplePeriod(Long.valueOf(val)); break;
+                case "units": def.setUnits(TimeUnit.valueOf(val)); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected ScriptDefinition doParseScriptDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ScriptDefinition(),
+            processorDefinitionAttributeHandler(), expressionNodeElementHandler(), noValueHandler());
+    }
+    protected SetBodyDefinition doParseSetBodyDefinition() throws IOException, XmlPullParserException {
+        return doParse(new SetBodyDefinition(),
+            processorDefinitionAttributeHandler(), expressionNodeElementHandler(), noValueHandler());
+    }
+    protected SetExchangePatternDefinition doParseSetExchangePatternDefinition() throws IOException, XmlPullParserException {
+        return doParse(new SetExchangePatternDefinition(), (def, key, val) -> {
+            if ("pattern".equals(key)) {
+                def.setPattern(ExchangePattern.valueOf(val));
+                return true;
+            }
+            return processorDefinitionAttributeHandler().accept(def, key, val);
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected SetHeaderDefinition doParseSetHeaderDefinition() throws IOException, XmlPullParserException {
+        return doParse(new SetHeaderDefinition(), (def, key, val) -> {
+            if ("name".equals(key)) {
+                def.setName(val);
+                return true;
+            }
+            return processorDefinitionAttributeHandler().accept(def, key, val);
+        }, expressionNodeElementHandler(), noValueHandler());
+    }
+    protected SetPropertyDefinition doParseSetPropertyDefinition() throws IOException, XmlPullParserException {
+        return doParse(new SetPropertyDefinition(), (def, key, val) -> {
+            if ("name".equals(key)) {
+                def.setName(val);
+                return true;
+            }
+            return processorDefinitionAttributeHandler().accept(def, key, val);
+        }, expressionNodeElementHandler(), noValueHandler());
+    }
+    protected SortDefinition doParseSortDefinition() throws IOException, XmlPullParserException {
+        return doParse(new SortDefinition(), (def, key, val) -> {
+            if ("comparatorRef".equals(key)) {
+                def.setComparatorRef(val);
+                return true;
+            }
+            return processorDefinitionAttributeHandler().accept(def, key, val);
+        }, expressionNodeElementHandler(), noValueHandler());
+    }
+    protected SplitDefinition doParseSplitDefinition() throws IOException, XmlPullParserException {
+        return doParse(new SplitDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "executorServiceRef": def.setExecutorServiceRef(val); break;
+                case "onPrepareRef": def.setOnPrepareRef(val); break;
+                case "parallelAggregate": def.setParallelAggregate(Boolean.valueOf(val)); break;
+                case "parallelProcessing": def.setParallelProcessing(Boolean.valueOf(val)); break;
+                case "shareUnitOfWork": def.setShareUnitOfWork(Boolean.valueOf(val)); break;
+                case "stopOnAggregateException": def.setStopOnAggregateException(Boolean.valueOf(val)); break;
+                case "stopOnException": def.setStopOnException(Boolean.valueOf(val)); break;
+                case "strategyMethodAllowNull": def.setStrategyMethodAllowNull(Boolean.valueOf(val)); break;
+                case "strategyMethodName": def.setStrategyMethodName(val); break;
+                case "strategyRef": def.setStrategyRef(val); break;
+                case "streaming": def.setStreaming(Boolean.valueOf(val)); break;
+                case "timeout": def.setTimeout(Long.valueOf(val)); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, outputExpressionNodeElementHandler(), noValueHandler());
+    }
+    protected StepDefinition doParseStepDefinition() throws IOException, XmlPullParserException {
+        return doParse(new StepDefinition(),
+            processorDefinitionAttributeHandler(), outputDefinitionElementHandler(), noValueHandler());
+    }
+    protected StopDefinition doParseStopDefinition() throws IOException, XmlPullParserException {
+        return doParse(new StopDefinition(),
+            processorDefinitionAttributeHandler(), optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected ThreadPoolProfileDefinition doParseThreadPoolProfileDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ThreadPoolProfileDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "allowCoreThreadTimeOut": def.setAllowCoreThreadTimeOut(val); break;
+                case "defaultProfile": def.setDefaultProfile(Boolean.valueOf(val)); break;
+                case "keepAliveTime": def.setKeepAliveTime(val); break;
+                case "maxPoolSize": def.setMaxPoolSize(val); break;
+                case "maxQueueSize": def.setMaxQueueSize(val); break;
+                case "poolSize": def.setPoolSize(val); break;
+                case "rejectedPolicy": def.setRejectedPolicy(val); break;
+                case "timeUnit": def.setTimeUnit(TimeUnit.valueOf(val)); break;
+                default: return optionalIdentifiedDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected ThreadsDefinition doParseThreadsDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ThreadsDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "allowCoreThreadTimeOut": def.setAllowCoreThreadTimeOut(val); break;
+                case "callerRunsWhenRejected": def.setCallerRunsWhenRejected(val); break;
+                case "executorServiceRef": def.setExecutorServiceRef(val); break;
+                case "keepAliveTime": def.setKeepAliveTime(val); break;
+                case "maxPoolSize": def.setMaxPoolSize(val); break;
+                case "maxQueueSize": def.setMaxQueueSize(val); break;
+                case "poolSize": def.setPoolSize(val); break;
+                case "rejectedPolicy": def.setRejectedPolicy(ThreadPoolRejectedPolicy.valueOf(val)); break;
+                case "threadName": def.setThreadName(val); break;
+                case "timeUnit": def.setTimeUnit(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected ThrottleDefinition doParseThrottleDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ThrottleDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "asyncDelayed": def.setAsyncDelayed(Boolean.valueOf(val)); break;
+                case "callerRunsWhenRejected": def.setCallerRunsWhenRejected(Boolean.valueOf(val)); break;
+                case "executorServiceRef": def.setExecutorServiceRef(val); break;
+                case "rejectExecution": def.setRejectExecution(Boolean.valueOf(val)); break;
+                case "timePeriodMillis": def.setTimePeriodMillis(Long.valueOf(val)); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            if ("correlationExpression".equals(key)) {
+                def.setCorrelationExpression(doParseExpressionSubElementDefinition());
+                return true;
+            }
+            return expressionNodeElementHandler().accept(def, key);
+        }, noValueHandler());
+    }
+    protected ThrowExceptionDefinition doParseThrowExceptionDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ThrowExceptionDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "exceptionType": def.setExceptionType(val); break;
+                case "message": def.setMessage(val); break;
+                case "ref": def.setRef(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected ToDefinition doParseToDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ToDefinition(), (def, key, val) -> {
+            if ("pattern".equals(key)) {
+                def.setPattern(val);
+                return true;
+            }
+            return sendDefinitionAttributeHandler().accept(def, key, val);
+        }, optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected <T extends ToDynamicDefinition> AttributeHandler<T> toDynamicDefinitionAttributeHandler() {
+        return (def, key, val) -> {
+            switch (key) {
+                case "allowOptimisedComponents": def.setAllowOptimisedComponents(val); break;
+                case "cacheSize": def.setCacheSize(val); break;
+                case "ignoreInvalidEndpoint": def.setIgnoreInvalidEndpoint(val); break;
+                case "pattern": def.setPattern(val); break;
+                case "uri": def.setUri(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        };
+    }
+    protected ToDynamicDefinition doParseToDynamicDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ToDynamicDefinition(), toDynamicDefinitionAttributeHandler(),  optionalIdentifiedDefinitionElementHandler(), noValueHandler());
+    }
+    protected TransactedDefinition doParseTransactedDefinition() throws IOException, XmlPullParserException {
+        return doParse(new TransactedDefinition(), (def, key, val) -> {
+            if ("ref".equals(key)) {
+                def.setRef(val);
+                return true;
+            }
+            return processorDefinitionAttributeHandler().accept(def, key, val);
+        }, outputDefinitionElementHandler(), noValueHandler());
+    }
+    protected TransformDefinition doParseTransformDefinition() throws IOException, XmlPullParserException {
+        return doParse(new TransformDefinition(),
+            processorDefinitionAttributeHandler(), expressionNodeElementHandler(), noValueHandler());
+    }
+    protected TryDefinition doParseTryDefinition() throws IOException, XmlPullParserException {
+        return doParse(new TryDefinition(),
+            processorDefinitionAttributeHandler(), outputDefinitionElementHandler(), noValueHandler());
+    }
+    protected UnmarshalDefinition doParseUnmarshalDefinition() throws IOException, XmlPullParserException {
+        return doParse(new UnmarshalDefinition(),
+            processorDefinitionAttributeHandler(), (def, key) -> {
+            DataFormatDefinition v = doParseDataFormatDefinitionRef(key);
+            if (v != null) { 
+                def.setDataFormatType(v);
+                return true;
+            }
+            return optionalIdentifiedDefinitionElementHandler().accept(def, key);
+        }, noValueHandler());
+    }
+    protected ValidateDefinition doParseValidateDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ValidateDefinition(),
+            processorDefinitionAttributeHandler(), expressionNodeElementHandler(), noValueHandler());
+    }
+    protected WhenSkipSendToEndpointDefinition doParseWhenSkipSendToEndpointDefinition() throws IOException, XmlPullParserException {
+        return doParse(new WhenSkipSendToEndpointDefinition(),
+            processorDefinitionAttributeHandler(), outputExpressionNodeElementHandler(), noValueHandler());
+    }
+    protected WireTapDefinition doParseWireTapDefinition() throws IOException, XmlPullParserException {
+        return doParse(new WireTapDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "copy": def.setCopy(val); break;
+                case "dynamicUri": def.setDynamicUri(val); break;
+                case "executorServiceRef": def.setExecutorServiceRef(val); break;
+                case "onPrepareRef": def.setOnPrepareRef(val); break;
+                case "processorRef": def.setNewExchangeProcessorRef(val); break;
+                default: return toDynamicDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            switch (key) {
+                case "setHeader": doAdd(doParseSetHeaderDefinition(), def.getHeaders(), def::setHeaders); break;
+                case "body": def.setNewExchangeExpression(doParseExpressionSubElementDefinition()); break;
+                default: return optionalIdentifiedDefinitionElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected BlacklistServiceCallServiceFilterConfiguration doParseBlacklistServiceCallServiceFilterConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new BlacklistServiceCallServiceFilterConfiguration(),
+            identifiedTypeAttributeHandler(), (def, key) -> {
+            if ("servers".equals(key)) {
+                doAdd(doParseText(), def.getServers(), def::setServers);
+                return true;
+            }
+            return serviceCallConfigurationElementHandler().accept(def, key);
+        }, noValueHandler());
+    }
+    protected ServiceCallServiceFilterConfiguration doParseServiceCallServiceFilterConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new ServiceCallServiceFilterConfiguration(), 
+            identifiedTypeAttributeHandler(),  serviceCallConfigurationElementHandler(), noValueHandler());
+    }
+    protected <T extends ServiceCallConfiguration> ElementHandler<T> serviceCallConfigurationElementHandler() {
+        return (def, key) -> {
+            if ("properties".equals(key)) {
+                doAdd(doParsePropertyDefinition(), def.getProperties(), def::setProperties);
+                return true;
+            }
+            return false;
+        };
+    }
+    protected CachingServiceCallServiceDiscoveryConfiguration doParseCachingServiceCallServiceDiscoveryConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new CachingServiceCallServiceDiscoveryConfiguration(), (def, key, val) -> {
+            switch (key) {
+                case "timeout": def.setTimeout(val); break;
+                case "units": def.setUnits(TimeUnit.valueOf(val)); break;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            switch (key) {
+                case "consulServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseConsulServiceCallServiceDiscoveryConfiguration()); break;
+                case "dnsServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseDnsServiceCallServiceDiscoveryConfiguration()); break;
+                case "etcdServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseEtcdServiceCallServiceDiscoveryConfiguration()); break;
+                case "kubernetesServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseKubernetesServiceCallServiceDiscoveryConfiguration()); break;
+                case "combinedServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseCombinedServiceCallServiceDiscoveryConfiguration()); break;
+                case "staticServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseStaticServiceCallServiceDiscoveryConfiguration()); break;
+                default: return serviceCallConfigurationElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected ServiceCallServiceDiscoveryConfiguration doParseServiceCallServiceDiscoveryConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new ServiceCallServiceDiscoveryConfiguration(), 
+            identifiedTypeAttributeHandler(),  serviceCallConfigurationElementHandler(), noValueHandler());
+    }
+    protected CombinedServiceCallServiceDiscoveryConfiguration doParseCombinedServiceCallServiceDiscoveryConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new CombinedServiceCallServiceDiscoveryConfiguration(),
+            identifiedTypeAttributeHandler(), (def, key) -> {
+            switch (key) {
+                case "consulServiceDiscovery": doAdd(doParseConsulServiceCallServiceDiscoveryConfiguration(), def.getServiceDiscoveryConfigurations(), def::setServiceDiscoveryConfigurations); break;
+                case "dnsServiceDiscovery": doAdd(doParseDnsServiceCallServiceDiscoveryConfiguration(), def.getServiceDiscoveryConfigurations(), def::setServiceDiscoveryConfigurations); break;
+                case "etcdServiceDiscovery": doAdd(doParseEtcdServiceCallServiceDiscoveryConfiguration(), def.getServiceDiscoveryConfigurations(), def::setServiceDiscoveryConfigurations); break;
+                case "kubernetesServiceDiscovery": doAdd(doParseKubernetesServiceCallServiceDiscoveryConfiguration(), def.getServiceDiscoveryConfigurations(), def::setServiceDiscoveryConfigurations); break;
+                case "staticServiceDiscovery": doAdd(doParseStaticServiceCallServiceDiscoveryConfiguration(), def.getServiceDiscoveryConfigurations(), def::setServiceDiscoveryConfigurations); break;
+                case "cachingServiceDiscovery": doAdd(doParseCachingServiceCallServiceDiscoveryConfiguration(), def.getServiceDiscoveryConfigurations(), def::setServiceDiscoveryConfigurations); break;
+                default: return serviceCallConfigurationElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected CombinedServiceCallServiceFilterConfiguration doParseCombinedServiceCallServiceFilterConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new CombinedServiceCallServiceFilterConfiguration(),
+            identifiedTypeAttributeHandler(), (def, key) -> {
+            switch (key) {
+                case "blacklistServiceFilter": doAdd(doParseBlacklistServiceCallServiceFilterConfiguration(), def.getServiceFilterConfigurations(), def::setServiceFilterConfigurations); break;
+                case "customServiceFilter": doAdd(doParseCustomServiceCallServiceFilterConfiguration(), def.getServiceFilterConfigurations(), def::setServiceFilterConfigurations); break;
+                case "healthyServiceFilter": doAdd(doParseHealthyServiceCallServiceFilterConfiguration(), def.getServiceFilterConfigurations(), def::setServiceFilterConfigurations); break;
+                case "passThroughServiceFilter": doAdd(doParsePassThroughServiceCallServiceFilterConfiguration(), def.getServiceFilterConfigurations(), def::setServiceFilterConfigurations); break;
+                default: return serviceCallConfigurationElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected ConsulServiceCallServiceDiscoveryConfiguration doParseConsulServiceCallServiceDiscoveryConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new ConsulServiceCallServiceDiscoveryConfiguration(), (def, key, val) -> {
+            switch (key) {
+                case "aclToken": def.setAclToken(val); break;
+                case "blockSeconds": def.setBlockSeconds(Integer.valueOf(val)); break;
+                case "connectTimeoutMillis": def.setConnectTimeoutMillis(Long.valueOf(val)); break;
+                case "datacenter": def.setDatacenter(val); break;
+                case "password": def.setPassword(val); break;
+                case "readTimeoutMillis": def.setReadTimeoutMillis(Long.valueOf(val)); break;
+                case "url": def.setUrl(val); break;
+                case "userName": def.setUserName(val); break;
+                case "writeTimeoutMillis": def.setWriteTimeoutMillis(Long.valueOf(val)); break;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, serviceCallConfigurationElementHandler(), noValueHandler());
+    }
+    protected CustomServiceCallServiceFilterConfiguration doParseCustomServiceCallServiceFilterConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new CustomServiceCallServiceFilterConfiguration(), (def, key, val) -> {
+            if ("ref".equals(key)) {
+                def.setServiceFilterRef(val);
+                return true;
+            }
+            return identifiedTypeAttributeHandler().accept(def, key, val);
+        }, serviceCallConfigurationElementHandler(), noValueHandler());
+    }
+    protected DefaultServiceCallServiceLoadBalancerConfiguration doParseDefaultServiceCallServiceLoadBalancerConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new DefaultServiceCallServiceLoadBalancerConfiguration(),
+            identifiedTypeAttributeHandler(), serviceCallConfigurationElementHandler(), noValueHandler());
+    }
+    protected ServiceCallServiceLoadBalancerConfiguration doParseServiceCallServiceLoadBalancerConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new ServiceCallServiceLoadBalancerConfiguration(), 
+            identifiedTypeAttributeHandler(),  serviceCallConfigurationElementHandler(), noValueHandler());
+    }
+    protected DnsServiceCallServiceDiscoveryConfiguration doParseDnsServiceCallServiceDiscoveryConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new DnsServiceCallServiceDiscoveryConfiguration(), (def, key, val) -> {
+            switch (key) {
+                case "domain": def.setDomain(val); break;
+                case "proto": def.setProto(val); break;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, serviceCallConfigurationElementHandler(), noValueHandler());
+    }
+    protected EtcdServiceCallServiceDiscoveryConfiguration doParseEtcdServiceCallServiceDiscoveryConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new EtcdServiceCallServiceDiscoveryConfiguration(), (def, key, val) -> {
+            switch (key) {
+                case "password": def.setPassword(val); break;
+                case "servicePath": def.setServicePath(val); break;
+                case "timeout": def.setTimeout(Long.valueOf(val)); break;
+                case "type": def.setType(val); break;
+                case "uris": def.setUris(val); break;
+                case "userName": def.setUserName(val); break;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, serviceCallConfigurationElementHandler(), noValueHandler());
+    }
+    protected HealthyServiceCallServiceFilterConfiguration doParseHealthyServiceCallServiceFilterConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new HealthyServiceCallServiceFilterConfiguration(),
+            identifiedTypeAttributeHandler(), serviceCallConfigurationElementHandler(), noValueHandler());
+    }
+    protected KubernetesServiceCallServiceDiscoveryConfiguration doParseKubernetesServiceCallServiceDiscoveryConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new KubernetesServiceCallServiceDiscoveryConfiguration(), (def, key, val) -> {
+            switch (key) {
+                case "apiVersion": def.setApiVersion(val); break;
+                case "caCertData": def.setCaCertData(val); break;
+                case "caCertFile": def.setCaCertFile(val); break;
+                case "clientCertData": def.setClientCertData(val); break;
+                case "clientCertFile": def.setClientCertFile(val); break;
+                case "clientKeyAlgo": def.setClientKeyAlgo(val); break;
+                case "clientKeyData": def.setClientKeyData(val); break;
+                case "clientKeyFile": def.setClientKeyFile(val); break;
+                case "clientKeyPassphrase": def.setClientKeyPassphrase(val); break;
+                case "dnsDomain": def.setDnsDomain(val); break;
+                case "lookup": def.setLookup(val); break;
+                case "masterUrl": def.setMasterUrl(val); break;
+                case "namespace": def.setNamespace(val); break;
+                case "oauthToken": def.setOauthToken(val); break;
+                case "password": def.setPassword(val); break;
+                case "portName": def.setPortName(val); break;
+                case "portProtocol": def.setPortProtocol(val); break;
+                case "trustCerts": def.setTrustCerts(Boolean.valueOf(val)); break;
+                case "username": def.setUsername(val); break;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, serviceCallConfigurationElementHandler(), noValueHandler());
+    }
+    protected PassThroughServiceCallServiceFilterConfiguration doParsePassThroughServiceCallServiceFilterConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new PassThroughServiceCallServiceFilterConfiguration(),
+            identifiedTypeAttributeHandler(), serviceCallConfigurationElementHandler(), noValueHandler());
+    }
+    protected RibbonServiceCallServiceLoadBalancerConfiguration doParseRibbonServiceCallServiceLoadBalancerConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new RibbonServiceCallServiceLoadBalancerConfiguration(), (def, key, val) -> {
+            switch (key) {
+                case "clientName": def.setClientName(val); break;
+                case "namespace": def.setNamespace(val); break;
+                case "password": def.setPassword(val); break;
+                case "username": def.setUsername(val); break;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, serviceCallConfigurationElementHandler(), noValueHandler());
+    }
+    protected ServiceCallConfigurationDefinition doParseServiceCallConfigurationDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ServiceCallConfigurationDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "component": def.setComponent(val); break;
+                case "expressionRef": def.setExpressionRef(val); break;
+                case "loadBalancerRef": def.setLoadBalancerRef(val); break;
+                case "pattern": def.setPattern(ExchangePattern.valueOf(val)); break;
+                case "serviceChooserRef": def.setServiceChooserRef(val); break;
+                case "serviceDiscoveryRef": def.setServiceDiscoveryRef(val); break;
+                case "serviceFilterRef": def.setServiceFilterRef(val); break;
+                case "uri": def.setUri(val); break;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            switch (key) {
+                case "expression": def.setExpressionConfiguration(doParseServiceCallExpressionConfiguration()); break;
+                case "ribbonLoadBalancer": def.setLoadBalancerConfiguration(doParseRibbonServiceCallServiceLoadBalancerConfiguration()); break;
+                case "defaultLoadBalancer": def.setLoadBalancerConfiguration(doParseDefaultServiceCallServiceLoadBalancerConfiguration()); break;
+                case "cachingServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseCachingServiceCallServiceDiscoveryConfiguration()); break;
+                case "combinedServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseCombinedServiceCallServiceDiscoveryConfiguration()); break;
+                case "consulServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseConsulServiceCallServiceDiscoveryConfiguration()); break;
+                case "dnsServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseDnsServiceCallServiceDiscoveryConfiguration()); break;
+                case "etcdServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseEtcdServiceCallServiceDiscoveryConfiguration()); break;
+                case "kubernetesServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseKubernetesServiceCallServiceDiscoveryConfiguration()); break;
+                case "staticServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseStaticServiceCallServiceDiscoveryConfiguration()); break;
+                case "zookeeperServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseZooKeeperServiceCallServiceDiscoveryConfiguration()); break;
+                case "blacklistServiceFilter": def.setServiceFilterConfiguration(doParseBlacklistServiceCallServiceFilterConfiguration()); break;
+                case "combinedServiceFilter": def.setServiceFilterConfiguration(doParseCombinedServiceCallServiceFilterConfiguration()); break;
+                case "customServiceFilter": def.setServiceFilterConfiguration(doParseCustomServiceCallServiceFilterConfiguration()); break;
+                case "healthyServiceFilter": def.setServiceFilterConfiguration(doParseHealthyServiceCallServiceFilterConfiguration()); break;
+                case "passThroughServiceFilter": def.setServiceFilterConfiguration(doParsePassThroughServiceCallServiceFilterConfiguration()); break;
+                default: return false;
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected ServiceCallExpressionConfiguration doParseServiceCallExpressionConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new ServiceCallExpressionConfiguration(), (def, key, val) -> {
+            switch (key) {
+                case "hostHeader": def.setHostHeader(val); break;
+                case "portHeader": def.setPortHeader(val); break;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            ExpressionDefinition v = doParseExpressionDefinitionRef(key);
+            if (v != null) { 
+                def.setExpressionType(v);
+                return true;
+            }
+            return serviceCallConfigurationElementHandler().accept(def, key);
+        }, noValueHandler());
+    }
+    protected ServiceCallDefinition doParseServiceCallDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ServiceCallDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "component": def.setComponent(val); break;
+                case "configurationRef": def.setConfigurationRef(val); break;
+                case "expressionRef": def.setExpressionRef(val); break;
+                case "loadBalancerRef": def.setLoadBalancerRef(val); break;
+                case "name": def.setName(val); break;
+                case "pattern": def.setPattern(ExchangePattern.valueOf(val)); break;
+                case "serviceChooserRef": def.setServiceChooserRef(val); break;
+                case "serviceDiscoveryRef": def.setServiceDiscoveryRef(val); break;
+                case "serviceFilterRef": def.setServiceFilterRef(val); break;
+                case "uri": def.setUri(val); break;
+                default: return processorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            switch (key) {
+                case "expressionConfiguration": def.setExpressionConfiguration(doParseServiceCallExpressionConfiguration()); break;
+                case "ribbonLoadBalancer": def.setLoadBalancerConfiguration(doParseRibbonServiceCallServiceLoadBalancerConfiguration()); break;
+                case "defaultLoadBalancer": def.setLoadBalancerConfiguration(doParseDefaultServiceCallServiceLoadBalancerConfiguration()); break;
+                case "cachingServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseCachingServiceCallServiceDiscoveryConfiguration()); break;
+                case "combinedServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseCombinedServiceCallServiceDiscoveryConfiguration()); break;
+                case "consulServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseConsulServiceCallServiceDiscoveryConfiguration()); break;
+                case "dnsServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseDnsServiceCallServiceDiscoveryConfiguration()); break;
+                case "etcdServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseEtcdServiceCallServiceDiscoveryConfiguration()); break;
+                case "kubernetesServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseKubernetesServiceCallServiceDiscoveryConfiguration()); break;
+                case "staticServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseStaticServiceCallServiceDiscoveryConfiguration()); break;
+                case "zookeeperServiceDiscovery": def.setServiceDiscoveryConfiguration(doParseZooKeeperServiceCallServiceDiscoveryConfiguration()); break;
+                case "blacklistServiceFilter": def.setServiceFilterConfiguration(doParseBlacklistServiceCallServiceFilterConfiguration()); break;
+                case "combinedServiceFilter": def.setServiceFilterConfiguration(doParseCombinedServiceCallServiceFilterConfiguration()); break;
+                case "customServiceFilter": def.setServiceFilterConfiguration(doParseCustomServiceCallServiceFilterConfiguration()); break;
+                case "healthyServiceFilter": def.setServiceFilterConfiguration(doParseHealthyServiceCallServiceFilterConfiguration()); break;
+                case "passThroughServiceFilter": def.setServiceFilterConfiguration(doParsePassThroughServiceCallServiceFilterConfiguration()); break;
+                default: return optionalIdentifiedDefinitionElementHandler().accept(def, key);
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected ServiceCallServiceChooserConfiguration doParseServiceCallServiceChooserConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new ServiceCallServiceChooserConfiguration(),
+            identifiedTypeAttributeHandler(), serviceCallConfigurationElementHandler(), noValueHandler());
+    }
+    protected StaticServiceCallServiceDiscoveryConfiguration doParseStaticServiceCallServiceDiscoveryConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new StaticServiceCallServiceDiscoveryConfiguration(),
+            identifiedTypeAttributeHandler(), (def, key) -> {
+            if ("servers".equals(key)) {
+                doAdd(doParseText(), def.getServers(), def::setServers);
+                return true;
+            }
+            return serviceCallConfigurationElementHandler().accept(def, key);
+        }, noValueHandler());
+    }
+    protected ZooKeeperServiceCallServiceDiscoveryConfiguration doParseZooKeeperServiceCallServiceDiscoveryConfiguration() throws IOException, XmlPullParserException {
+        return doParse(new ZooKeeperServiceCallServiceDiscoveryConfiguration(), (def, key, val) -> {
+            switch (key) {
+                case "basePath": def.setBasePath(val); break;
+                case "connectionTimeout": def.setConnectionTimeout(val); break;
+                case "namespace": def.setNamespace(val); break;
+                case "nodes": def.setNodes(val); break;
+                case "reconnectBaseSleepTime": def.setReconnectBaseSleepTime(val); break;
+                case "reconnectMaxRetries": def.setReconnectMaxRetries(val); break;
+                case "reconnectMaxSleepTime": def.setReconnectMaxSleepTime(val); break;
+                case "sessionTimeout": def.setSessionTimeout(val); break;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, serviceCallConfigurationElementHandler(), noValueHandler());
+    }
+    protected BatchResequencerConfig doParseBatchResequencerConfig() throws IOException, XmlPullParserException {
+        return doParse(new BatchResequencerConfig(), (def, key, val) -> {
+            switch (key) {
+                case "allowDuplicates": def.setAllowDuplicates(val); break;
+                case "batchSize": def.setBatchSize(val); break;
+                case "batchTimeout": def.setBatchTimeout(val); break;
+                case "ignoreInvalidExchanges": def.setIgnoreInvalidExchanges(val); break;
+                case "reverse": def.setReverse(val); break;
+                default: return false;
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected StreamResequencerConfig doParseStreamResequencerConfig() throws IOException, XmlPullParserException {
+        return doParse(new StreamResequencerConfig(), (def, key, val) -> {
+            switch (key) {
+                case "capacity": def.setCapacity(val); break;
+                case "comparatorRef": def.setComparatorRef(val); break;
+                case "deliveryAttemptInterval": def.setDeliveryAttemptInterval(val); break;
+                case "ignoreInvalidExchanges": def.setIgnoreInvalidExchanges(val); break;
+                case "rejectOld": def.setRejectOld(val); break;
+                case "timeout": def.setTimeout(val); break;
+                default: return false;
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected ASN1DataFormat doParseASN1DataFormat() throws IOException, XmlPullParserException {
+        return doParse(new ASN1DataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "clazzName": def.setClazzName(val); break;
+                case "usingIterator": def.setUsingIterator(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected Any23DataFormat doParseAny23DataFormat() throws IOException, XmlPullParserException {
+        return doParse(new Any23DataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "baseURI": def.setBaseURI(val); break;
+                case "outputFormat": def.setOutputFormat(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            switch (key) {
+                case "configuration": def.setConfiguration(unmarshal(new PropertyDescriptionsAdapter(), doParsePropertyDefinitions())); break;
+                case "extractors": doAdd(doParseText(), def.getExtractors(), def::setExtractors); break;
+                default: return false;
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected AvroDataFormat doParseAvroDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new AvroDataFormat(), (def, key, val) -> {
+            if ("instanceClassName".equals(key)) {
+                def.setInstanceClassName(val);
+                return true;
+            }
+            return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+        }, noElementHandler(), noValueHandler());
+    }
+    protected BarcodeDataFormat doParseBarcodeDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new BarcodeDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "barcodeFormat": def.setBarcodeFormat(val); break;
+                case "height": def.setHeight(val); break;
+                case "imageType": def.setImageType(val); break;
+                case "width": def.setWidth(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected Base64DataFormat doParseBase64DataFormat() throws IOException, XmlPullParserException {
+        return doParse(new Base64DataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "lineLength": def.setLineLength(val); break;
+                case "lineSeparator": def.setLineSeparator(val); break;
+                case "urlSafe": def.setUrlSafe(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected BeanioDataFormat doParseBeanioDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new BeanioDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "beanReaderErrorHandlerType": def.setBeanReaderErrorHandlerType(val); break;
+                case "encoding": def.setEncoding(val); break;
+                case "ignoreInvalidRecords": def.setIgnoreInvalidRecords(val); break;
+                case "ignoreUnexpectedRecords": def.setIgnoreUnexpectedRecords(val); break;
+                case "ignoreUnidentifiedRecords": def.setIgnoreUnidentifiedRecords(val); break;
+                case "mapping": def.setMapping(val); break;
+                case "streamName": def.setStreamName(val); break;
+                case "unmarshalSingleObject": def.setUnmarshalSingleObject(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected BindyDataFormat doParseBindyDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new BindyDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "allowEmptyStream": def.setAllowEmptyStream(Boolean.valueOf(val)); break;
+                case "classType": def.setClassType(val); break;
+                case "locale": def.setLocale(val); break;
+                case "type": def.setType(BindyType.valueOf(val)); break;
+                case "unwrapSingleInstance": def.setUnwrapSingleInstance(Boolean.valueOf(val)); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected CBORDataFormat doParseCBORDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new CBORDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "allowJmsType": def.setAllowJmsType(val); break;
+                case "allowUnmarshallType": def.setAllowUnmarshallType(val); break;
+                case "collectionTypeName": def.setCollectionTypeName(val); break;
+                case "disableFeatures": def.setDisableFeatures(val); break;
+                case "enableFeatures": def.setEnableFeatures(val); break;
+                case "objectMapper": def.setObjectMapper(val); break;
+                case "prettyPrint": def.setPrettyPrint(val); break;
+                case "unmarshalTypeName": def.setUnmarshalTypeName(val); break;
+                case "useDefaultObjectMapper": def.setUseDefaultObjectMapper(val); break;
+                case "useList": def.setUseList(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected CryptoDataFormat doParseCryptoDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new CryptoDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "algorithm": def.setAlgorithm(val); break;
+                case "algorithmParameterRef": def.setAlgorithmParameterRef(val); break;
+                case "buffersize": def.setBuffersize(val); break;
+                case "cryptoProvider": def.setCryptoProvider(val); break;
+                case "initVectorRef": def.setInitVectorRef(val); break;
+                case "inline": def.setInline(val); break;
+                case "keyRef": def.setKeyRef(val); break;
+                case "macAlgorithm": def.setMacAlgorithm(val); break;
+                case "shouldAppendHMAC": def.setShouldAppendHMAC(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected CsvDataFormat doParseCsvDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new CsvDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "allowMissingColumnNames": def.setAllowMissingColumnNames(Boolean.valueOf(val)); break;
+                case "commentMarker": def.setCommentMarker(val); break;
+                case "commentMarkerDisabled": def.setCommentMarkerDisabled(Boolean.valueOf(val)); break;
+                case "delimiter": def.setDelimiter(val); break;
+                case "escape": def.setEscape(val); break;
+                case "escapeDisabled": def.setEscapeDisabled(Boolean.valueOf(val)); break;
+                case "formatName": def.setFormatName(val); break;
+                case "formatRef": def.setFormatRef(val); break;
+                case "headerDisabled": def.setHeaderDisabled(Boolean.valueOf(val)); break;
+                case "ignoreEmptyLines": def.setIgnoreEmptyLines(Boolean.valueOf(val)); break;
+                case "ignoreHeaderCase": def.setIgnoreHeaderCase(Boolean.valueOf(val)); break;
+                case "ignoreSurroundingSpaces": def.setIgnoreSurroundingSpaces(Boolean.valueOf(val)); break;
+                case "lazyLoad": def.setLazyLoad(Boolean.valueOf(val)); break;
+                case "marshallerFactoryRef": def.setMarshallerFactoryRef(val); break;
+                case "nullString": def.setNullString(val); break;
+                case "nullStringDisabled": def.setNullStringDisabled(Boolean.valueOf(val)); break;
+                case "quote": def.setQuote(val); break;
+                case "quoteDisabled": def.setQuoteDisabled(Boolean.valueOf(val)); break;
+                case "quoteMode": def.setQuoteMode(val); break;
+                case "recordConverterRef": def.setRecordConverterRef(val); break;
+                case "recordSeparator": def.setRecordSeparator(val); break;
+                case "recordSeparatorDisabled": def.setRecordSeparatorDisabled(val); break;
+                case "skipHeaderRecord": def.setSkipHeaderRecord(Boolean.valueOf(val)); break;
+                case "trailingDelimiter": def.setTrailingDelimiter(Boolean.valueOf(val)); break;
+                case "trim": def.setTrim(Boolean.valueOf(val)); break;
+                case "useMaps": def.setUseMaps(Boolean.valueOf(val)); break;
+                case "useOrderedMaps": def.setUseOrderedMaps(Boolean.valueOf(val)); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            if ("header".equals(key)) {
+                doAdd(doParseText(), def.getHeader(), def::setHeader);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected CustomDataFormat doParseCustomDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new CustomDataFormat(), (def, key, val) -> {
+            if ("ref".equals(key)) {
+                def.setRef(val);
+                return true;
+            }
+            return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+        }, noElementHandler(), noValueHandler());
+    }
+    protected DataFormatsDefinition doParseDataFormatsDefinition() throws IOException, XmlPullParserException {
+        return doParse(new DataFormatsDefinition(),
+            noAttributeHandler(), (def, key) -> {
+            DataFormatDefinition v = doParseDataFormatDefinitionRef(key);
+            if (v != null) { 
+                doAdd(v, def.getDataFormats(), def::setDataFormats);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected FhirJsonDataFormat doParseFhirJsonDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new FhirJsonDataFormat(),
+            fhirDataformatAttributeHandler(), noElementHandler(), noValueHandler());
+    }
+    protected <T extends FhirDataformat> AttributeHandler<T> fhirDataformatAttributeHandler() {
+        return (def, key, val) -> {
+            switch (key) {
+                case "dontEncodeElements": def.setDontEncodeElements(asStringSet(val)); break;
+                case "dontStripVersionsFromReferencesAtPaths": def.setDontStripVersionsFromReferencesAtPaths(asStringList(val)); break;
+                case "encodeElements": def.setEncodeElements(asStringSet(val)); break;
+                case "encodeElementsAppliesToChildResourcesOnly": def.setEncodeElementsAppliesToChildResourcesOnly(Boolean.valueOf(val)); break;
+                case "fhirVersion": def.setFhirVersion(val); break;
+                case "omitResourceId": def.setOmitResourceId(Boolean.valueOf(val)); break;
+                case "overrideResourceIdWithBundleEntryFullUrl": def.setOverrideResourceIdWithBundleEntryFullUrl(Boolean.valueOf(val)); break;
+                case "prettyPrint": def.setPrettyPrint(Boolean.valueOf(val)); break;
+                case "serverBaseUrl": def.setServerBaseUrl(val); break;
+                case "stripVersionsFromReferences": def.setStripVersionsFromReferences(Boolean.valueOf(val)); break;
+                case "summaryMode": def.setSummaryMode(Boolean.valueOf(val)); break;
+                case "suppressNarratives": def.setSuppressNarratives(Boolean.valueOf(val)); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        };
+    }
+    protected FhirXmlDataFormat doParseFhirXmlDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new FhirXmlDataFormat(),
+            fhirDataformatAttributeHandler(), noElementHandler(), noValueHandler());
+    }
+    protected FlatpackDataFormat doParseFlatpackDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new FlatpackDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "allowShortLines": def.setAllowShortLines(Boolean.valueOf(val)); break;
+                case "definition": def.setDefinition(val); break;
+                case "delimiter": def.setDelimiter(val); break;
+                case "fixed": def.setFixed(Boolean.valueOf(val)); break;
+                case "ignoreExtraColumns": def.setIgnoreExtraColumns(Boolean.valueOf(val)); break;
+                case "ignoreFirstRecord": def.setIgnoreFirstRecord(Boolean.valueOf(val)); break;
+                case "parserFactoryRef": def.setParserFactoryRef(val); break;
+                case "textQualifier": def.setTextQualifier(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected GrokDataFormat doParseGrokDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new GrokDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "allowMultipleMatchesPerLine": def.setAllowMultipleMatchesPerLine(Boolean.valueOf(val)); break;
+                case "flattened": def.setFlattened(Boolean.valueOf(val)); break;
+                case "namedOnly": def.setNamedOnly(Boolean.valueOf(val)); break;
+                case "pattern": def.setPattern(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected GzipDataFormat doParseGzipDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new GzipDataFormat(),
+            dataFormatDefinitionAttributeHandler(), noElementHandler(), noValueHandler());
+    }
+    protected HL7DataFormat doParseHL7DataFormat() throws IOException, XmlPullParserException {
+        return doParse(new HL7DataFormat(), (def, key, val) -> {
+            if ("validate".equals(key)) {
+                def.setValidate(Boolean.valueOf(val));
+                return true;
+            }
+            return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+        }, noElementHandler(), noValueHandler());
+    }
+    protected IcalDataFormat doParseIcalDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new IcalDataFormat(), (def, key, val) -> {
+            if ("validating".equals(key)) {
+                def.setValidating(Boolean.valueOf(val));
+                return true;
+            }
+            return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+        }, noElementHandler(), noValueHandler());
+    }
+    protected JacksonXMLDataFormat doParseJacksonXMLDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new JacksonXMLDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "allowJmsType": def.setAllowJmsType(val); break;
+                case "allowUnmarshallType": def.setAllowUnmarshallType(val); break;
+                case "collectionTypeName": def.setCollectionTypeName(val); break;
+                case "disableFeatures": def.setDisableFeatures(val); break;
+                case "enableFeatures": def.setEnableFeatures(val); break;
+                case "enableJaxbAnnotationModule": def.setEnableJaxbAnnotationModule(val); break;
+                case "include": def.setInclude(val); break;
+                case "jsonView": def.setJsonView(asClass(val)); break;
+                case "moduleClassNames": def.setModuleClassNames(val); break;
+                case "moduleRefs": def.setModuleRefs(val); break;
+                case "prettyPrint": def.setPrettyPrint(val); break;
+                case "unmarshalTypeName": def.setUnmarshalTypeName(val); break;
+                case "useList": def.setUseList(val); break;
+                case "xmlMapper": def.setXmlMapper(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected JaxbDataFormat doParseJaxbDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new JaxbDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "contextPath": def.setContextPath(val); break;
+                case "encoding": def.setEncoding(val); break;
+                case "filterNonXmlChars": def.setFilterNonXmlChars(Boolean.valueOf(val)); break;
+                case "fragment": def.setFragment(Boolean.valueOf(val)); break;
+                case "ignoreJAXBElement": def.setIgnoreJAXBElement(Boolean.valueOf(val)); break;
+                case "jaxbProviderProperties": def.setJaxbProviderProperties(val); break;
+                case "mustBeJAXBElement": def.setMustBeJAXBElement(Boolean.valueOf(val)); break;
+                case "namespacePrefixRef": def.setNamespacePrefixRef(val); break;
+                case "noNamespaceSchemaLocation": def.setNoNamespaceSchemaLocation(val); break;
+                case "objectFactory": def.setObjectFactory(Boolean.valueOf(val)); break;
+                case "partClass": def.setPartClass(val); break;
+                case "partNamespace": def.setPartNamespace(val); break;
+                case "prettyPrint": def.setPrettyPrint(Boolean.valueOf(val)); break;
+                case "schema": def.setSchema(val); break;
+                case "schemaLocation": def.setSchemaLocation(val); break;
+                case "schemaSeverityLevel": def.setSchemaSeverityLevel(Integer.valueOf(val)); break;
+                case "xmlStreamWriterWrapper": def.setXmlStreamWriterWrapper(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected JsonApiDataFormat doParseJsonApiDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new JsonApiDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "dataFormatTypes": def.setDataFormatTypes(asClassArray(val)); break;
+                case "mainFormatType": def.setMainFormatType(asClass(val)); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected JsonDataFormat doParseJsonDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new JsonDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "allowJmsType": def.setAllowJmsType(Boolean.valueOf(val)); break;
+                case "allowUnmarshallType": def.setAllowUnmarshallType(Boolean.valueOf(val)); break;
+                case "autoDiscoverObjectMapper": def.setAutoDiscoverObjectMapper(Boolean.valueOf(val)); break;
+                case "collectionTypeName": def.setCollectionTypeName(val); break;
+                case "disableFeatures": def.setDisableFeatures(val); break;
+                case "enableFeatures": def.setEnableFeatures(val); break;
+                case "enableJaxbAnnotationModule": def.setEnableJaxbAnnotationModule(Boolean.valueOf(val)); break;
+                case "include": def.setInclude(val); break;
+                case "jsonView": def.setJsonView(asClass(val)); break;
+                case "library": def.setLibrary(JsonLibrary.valueOf(val)); break;
+                case "moduleClassNames": def.setModuleClassNames(val); break;
+                case "moduleRefs": def.setModuleRefs(val); break;
+                case "objectMapper": def.setObjectMapper(val); break;
+                case "permissions": def.setPermissions(val); break;
+                case "prettyPrint": def.setPrettyPrint(Boolean.valueOf(val)); break;
+                case "timezone": def.setTimezone(val); break;
+                case "unmarshalTypeName": def.setUnmarshalTypeName(val); break;
+                case "useDefaultObjectMapper": def.setUseDefaultObjectMapper(Boolean.valueOf(val)); break;
+                case "useList": def.setUseList(Boolean.valueOf(val)); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected LZFDataFormat doParseLZFDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new LZFDataFormat(), (def, key, val) -> {
+            if ("usingParallelCompression".equals(key)) {
+                def.setUsingParallelCompression(Boolean.valueOf(val));
+                return true;
+            }
+            return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+        }, noElementHandler(), noValueHandler());
+    }
+    protected MimeMultipartDataFormat doParseMimeMultipartDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new MimeMultipartDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "binaryContent": def.setBinaryContent(Boolean.valueOf(val)); break;
+                case "headersInline": def.setHeadersInline(Boolean.valueOf(val)); break;
+                case "includeHeaders": def.setIncludeHeaders(val); break;
+                case "multipartSubType": def.setMultipartSubType(val); break;
+                case "multipartWithoutAttachment": def.setMultipartWithoutAttachment(Boolean.valueOf(val)); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected PGPDataFormat doParsePGPDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new PGPDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "algorithm": def.setAlgorithm(val); break;
+                case "armored": def.setArmored(val); break;
+                case "compressionAlgorithm": def.setCompressionAlgorithm(val); break;
+                case "hashAlgorithm": def.setHashAlgorithm(val); break;
+                case "integrity": def.setIntegrity(val); break;
+                case "keyFileName": def.setKeyFileName(val); break;
+                case "keyUserid": def.setKeyUserid(val); break;
+                case "password": def.setPassword(val); break;
+                case "provider": def.setProvider(val); break;
+                case "signatureKeyFileName": def.setSignatureKeyFileName(val); break;
+                case "signatureKeyRing": def.setSignatureKeyRing(val); break;
+                case "signatureKeyUserid": def.setSignatureKeyUserid(val); break;
+                case "signaturePassword": def.setSignaturePassword(val); break;
+                case "signatureVerificationOption": def.setSignatureVerificationOption(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected ProtobufDataFormat doParseProtobufDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new ProtobufDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "contentTypeFormat": def.setContentTypeFormat(val); break;
+                case "instanceClass": def.setInstanceClass(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected RssDataFormat doParseRssDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new RssDataFormat(),
+            dataFormatDefinitionAttributeHandler(), noElementHandler(), noValueHandler());
+    }
+    protected SoapJaxbDataFormat doParseSoapJaxbDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new SoapJaxbDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "contextPath": def.setContextPath(val); break;
+                case "elementNameStrategyRef": def.setElementNameStrategyRef(val); break;
+                case "encoding": def.setEncoding(val); break;
+                case "namespacePrefixRef": def.setNamespacePrefixRef(val); break;
+                case "schema": def.setSchema(val); break;
+                case "version": def.setVersion(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected SyslogDataFormat doParseSyslogDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new SyslogDataFormat(),
+            dataFormatDefinitionAttributeHandler(), noElementHandler(), noValueHandler());
+    }
+    protected TarFileDataFormat doParseTarFileDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new TarFileDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "allowEmptyDirectory": def.setAllowEmptyDirectory(Boolean.valueOf(val)); break;
+                case "preservePathElements": def.setPreservePathElements(Boolean.valueOf(val)); break;
+                case "usingIterator": def.setUsingIterator(Boolean.valueOf(val)); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected ThriftDataFormat doParseThriftDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new ThriftDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "contentTypeFormat": def.setContentTypeFormat(val); break;
+                case "instanceClass": def.setInstanceClass(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected TidyMarkupDataFormat doParseTidyMarkupDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new TidyMarkupDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "dataObjectType": def.setDataObjectTypeName(val); break;
+                case "omitXmlDeclaration": def.setOmitXmlDeclaration(Boolean.valueOf(val)); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected UniVocityCsvDataFormat doParseUniVocityCsvDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new UniVocityCsvDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "delimiter": def.setDelimiter(val); break;
+                case "quote": def.setQuote(val); break;
+                case "quoteAllFields": def.setQuoteAllFields(Boolean.valueOf(val)); break;
+                case "quoteEscape": def.setQuoteEscape(val); break;
+                default: return uniVocityAbstractDataFormatAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, uniVocityAbstractDataFormatElementHandler(), noValueHandler());
+    }
+    protected <T extends UniVocityAbstractDataFormat> AttributeHandler<T> uniVocityAbstractDataFormatAttributeHandler() {
+        return (def, key, val) -> {
+            switch (key) {
+                case "asMap": def.setAsMap(Boolean.valueOf(val)); break;
+                case "comment": def.setComment(val); break;
+                case "emptyValue": def.setEmptyValue(val); break;
+                case "headerExtractionEnabled": def.setHeaderExtractionEnabled(Boolean.valueOf(val)); break;
+                case "headersDisabled": def.setHeadersDisabled(Boolean.valueOf(val)); break;
+                case "ignoreLeadingWhitespaces": def.setIgnoreLeadingWhitespaces(Boolean.valueOf(val)); break;
+                case "ignoreTrailingWhitespaces": def.setIgnoreTrailingWhitespaces(Boolean.valueOf(val)); break;
+                case "lazyLoad": def.setLazyLoad(Boolean.valueOf(val)); break;
+                case "lineSeparator": def.setLineSeparator(val); break;
+                case "normalizedLineSeparator": def.setNormalizedLineSeparator(val); break;
+                case "nullValue": def.setNullValue(val); break;
+                case "numberOfRecordsToRead": def.setNumberOfRecordsToRead(Integer.valueOf(val)); break;
+                case "skipEmptyLines": def.setSkipEmptyLines(Boolean.valueOf(val)); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        };
+    }
+    protected <T extends UniVocityAbstractDataFormat> ElementHandler<T> uniVocityAbstractDataFormatElementHandler() {
+        return (def, key) -> {
+            if ("univocity-header".equals(key)) {
+                doAdd(doParseUniVocityHeader(), def.getHeaders(), def::setHeaders);
+                return true;
+            }
+            return false;
+        };
+    }
+    protected UniVocityHeader doParseUniVocityHeader() throws IOException, XmlPullParserException {
+        return doParse(new UniVocityHeader(), (def, key, val) -> {
+            if ("length".equals(key)) {
+                def.setLength(val);
+                return true;
+            }
+            return false;
+        }, noElementHandler(), (def, val) -> def.setName(val));
+    }
+    protected UniVocityFixedWidthDataFormat doParseUniVocityFixedWidthDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new UniVocityFixedWidthDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "padding": def.setPadding(val); break;
+                case "recordEndsOnNewline": def.setRecordEndsOnNewline(Boolean.valueOf(val)); break;
+                case "skipTrailingCharsUntilNewline": def.setSkipTrailingCharsUntilNewline(Boolean.valueOf(val)); break;
+                default: return uniVocityAbstractDataFormatAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, uniVocityAbstractDataFormatElementHandler(), noValueHandler());
+    }
+    protected UniVocityTsvDataFormat doParseUniVocityTsvDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new UniVocityTsvDataFormat(), (def, key, val) -> {
+            if ("escapeChar".equals(key)) {
+                def.setEscapeChar(val);
+                return true;
+            }
+            return uniVocityAbstractDataFormatAttributeHandler().accept(def, key, val);
+        }, uniVocityAbstractDataFormatElementHandler(), noValueHandler());
+    }
+    protected XMLSecurityDataFormat doParseXMLSecurityDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new XMLSecurityDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "addKeyValueForEncryptedKey": def.setAddKeyValueForEncryptedKey(Boolean.valueOf(val)); break;
+                case "digestAlgorithm": def.setDigestAlgorithm(val); break;
+                case "keyCipherAlgorithm": def.setKeyCipherAlgorithm(val); break;
+                case "keyOrTrustStoreParametersRef": def.setKeyOrTrustStoreParametersRef(val); break;
+                case "keyPassword": def.setKeyPassword(val); break;
+                case "mgfAlgorithm": def.setMgfAlgorithm(val); break;
+                case "passPhrase": def.setPassPhrase(val); break;
+                case "passPhraseByte": def.setPassPhraseByte(asByteArray(val)); break;
+                case "recipientKeyAlias": def.setRecipientKeyAlias(val); break;
+                case "secureTag": def.setSecureTag(val); break;
+                case "secureTagContents": def.setSecureTagContents(Boolean.valueOf(val)); break;
+                case "xmlCipherAlgorithm": def.setXmlCipherAlgorithm(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected XStreamDataFormat doParseXStreamDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new XStreamDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "driver": def.setDriver(val); break;
+                case "driverRef": def.setDriverRef(val); break;
+                case "encoding": def.setEncoding(val); break;
+                case "mode": def.setMode(val); break;
+                case "permissions": def.setPermissions(val); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            switch (key) {
+                case "aliases": def.setAliases(unmarshal(new XStreamDataFormat.AliasAdapter(), doParseAliasList())); break;
+                case "converters": def.setConverters(unmarshal(new XStreamDataFormat.ConvertersAdapter(), doParseConverterList())); break;
+                case "implicitCollections": def.setImplicitCollections(unmarshal(new XStreamDataFormat.ImplicitCollectionsAdapter(), doParseImplicitCollectionList())); break;
+                case "omitFields": def.setOmitFields(unmarshal(new XStreamDataFormat.OmitFieldsAdapter(), doParseOmitFieldList())); break;
+                default: return false;
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected XStreamDataFormat.ConverterList doParseConverterList() throws IOException, XmlPullParserException {
+        return doParse(new XStreamDataFormat.ConverterList(),
+            noAttributeHandler(), (def, key) -> {
+            if ("converter".equals(key)) {
+                doAdd(doParseConverterEntry(), def.getList(), def::setList);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected XStreamDataFormat.AliasList doParseAliasList() throws IOException, XmlPullParserException {
+        return doParse(new XStreamDataFormat.AliasList(),
+            noAttributeHandler(), (def, key) -> {
+            if ("alias".equals(key)) {
+                doAdd(doParseAliasEntry(), def.getList(), def::setList);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected XStreamDataFormat.OmitFieldList doParseOmitFieldList() throws IOException, XmlPullParserException {
+        return doParse(new XStreamDataFormat.OmitFieldList(),
+            noAttributeHandler(), (def, key) -> {
+            if ("omitField".equals(key)) {
+                doAdd(doParseOmitFieldEntry(), def.getList(), def::setList);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected XStreamDataFormat.ImplicitCollectionList doParseImplicitCollectionList() throws IOException, XmlPullParserException {
+        return doParse(new XStreamDataFormat.ImplicitCollectionList(),
+            noAttributeHandler(), (def, key) -> {
+            if ("class".equals(key)) {
+                doAdd(doParseImplicitCollectionEntry(), def.getList(), def::setList);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected XStreamDataFormat.AliasEntry doParseAliasEntry() throws IOException, XmlPullParserException {
+        return doParse(new XStreamDataFormat.AliasEntry(), (def, key, val) -> {
+            switch (key) {
+                case "class": def.setClsName(val); break;
+                case "name": def.setName(val); break;
+                default: return false;
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected XStreamDataFormat.ConverterEntry doParseConverterEntry() throws IOException, XmlPullParserException {
+        return doParse(new XStreamDataFormat.ConverterEntry(), (def, key, val) -> {
+            if ("class".equals(key)) {
+                def.setClsName(val);
+                return true;
+            }
+            return false;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected XStreamDataFormat.ImplicitCollectionEntry doParseImplicitCollectionEntry() throws IOException, XmlPullParserException {
+        return doParse(new XStreamDataFormat.ImplicitCollectionEntry(), (def, key, val) -> {
+            if ("name".equals(key)) {
+                def.setClsName(val);
+                return true;
+            }
+            return false;
+        }, (def, key) -> {
+            if ("field".equals(key)) {
+                doAdd(doParseText(), def.getFields(), def::setFields);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected XStreamDataFormat.OmitFieldEntry doParseOmitFieldEntry() throws IOException, XmlPullParserException {
+        return doParse(new XStreamDataFormat.OmitFieldEntry(), (def, key, val) -> {
+            if ("class".equals(key)) {
+                def.setClsName(val);
+                return true;
+            }
+            return false;
+        }, (def, key) -> {
+            if ("field".equals(key)) {
+                doAdd(doParseText(), def.getFields(), def::setFields);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected XmlRpcDataFormat doParseXmlRpcDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new XmlRpcDataFormat(), (def, key, val) -> {
+            if ("request".equals(key)) {
+                def.setRequest(Boolean.valueOf(val));
+                return true;
+            }
+            return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+        }, noElementHandler(), noValueHandler());
+    }
+    protected YAMLDataFormat doParseYAMLDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new YAMLDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "allowAnyType": def.setAllowAnyType(Boolean.valueOf(val)); break;
+                case "constructor": def.setConstructor(val); break;
+                case "dumperOptions": def.setDumperOptions(val); break;
+                case "library": def.setLibrary(YAMLLibrary.valueOf(val)); break;
+                case "prettyFlow": def.setPrettyFlow(Boolean.valueOf(val)); break;
+                case "representer": def.setRepresenter(val); break;
+                case "resolver": def.setResolver(val); break;
+                case "unmarshalTypeName": def.setUnmarshalTypeName(val); break;
+                case "useApplicationContextClassLoader": def.setUseApplicationContextClassLoader(Boolean.valueOf(val)); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            if ("typeFilter".equals(key)) {
+                doAdd(doParseYAMLTypeFilterDefinition(), def.getTypeFilters(), def::setTypeFilters);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected YAMLTypeFilterDefinition doParseYAMLTypeFilterDefinition() throws IOException, XmlPullParserException {
+        return doParse(new YAMLTypeFilterDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "type": def.setType(YAMLTypeFilterType.valueOf(val)); break;
+                case "value": def.setValue(val); break;
+                default: return false;
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected ZipDeflaterDataFormat doParseZipDeflaterDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new ZipDeflaterDataFormat(), (def, key, val) -> {
+            if ("compressionLevel".equals(key)) {
+                def.setCompressionLevel(Integer.valueOf(val));
+                return true;
+            }
+            return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+        }, noElementHandler(), noValueHandler());
+    }
+    protected ZipFileDataFormat doParseZipFileDataFormat() throws IOException, XmlPullParserException {
+        return doParse(new ZipFileDataFormat(), (def, key, val) -> {
+            switch (key) {
+                case "allowEmptyDirectory": def.setAllowEmptyDirectory(Boolean.valueOf(val)); break;
+                case "preservePathElements": def.setPreservePathElements(Boolean.valueOf(val)); break;
+                case "usingIterator": def.setUsingIterator(Boolean.valueOf(val)); break;
+                default: return dataFormatDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected ConstantExpression doParseConstantExpression() throws IOException, XmlPullParserException {
+        return doParse(new ConstantExpression(),
+            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected ExchangePropertyExpression doParseExchangePropertyExpression() throws IOException, XmlPullParserException {
+        return doParse(new ExchangePropertyExpression(),
+            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected GroovyExpression doParseGroovyExpression() throws IOException, XmlPullParserException {
+        return doParse(new GroovyExpression(),
+            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected HeaderExpression doParseHeaderExpression() throws IOException, XmlPullParserException {
+        return doParse(new HeaderExpression(),
+            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected Hl7TerserExpression doParseHl7TerserExpression() throws IOException, XmlPullParserException {
+        return doParse(new Hl7TerserExpression(),
+            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected JsonPathExpression doParseJsonPathExpression() throws IOException, XmlPullParserException {
+        return doParse(new JsonPathExpression(), (def, key, val) -> {
+            switch (key) {
+                case "allowEasyPredicate": def.setAllowEasyPredicate(val); break;
+                case "allowSimple": def.setAllowSimple(val); break;
+                case "headerName": def.setHeaderName(val); break;
+                case "resultType": def.setResultTypeName(val); break;
+                case "suppressExceptions": def.setSuppressExceptions(val); break;
+                case "writeAsString": def.setWriteAsString(val); break;
+                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected LanguageExpression doParseLanguageExpression() throws IOException, XmlPullParserException {
+        return doParse(new LanguageExpression(), (def, key, val) -> {
+            if ("language".equals(key)) {
+                def.setLanguage(val);
+                return true;
+            }
+            return expressionDefinitionAttributeHandler().accept(def, key, val);
+        }, noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected MethodCallExpression doParseMethodCallExpression() throws IOException, XmlPullParserException {
+        return doParse(new MethodCallExpression(), (def, key, val) -> {
+            switch (key) {
+                case "beanType": def.setBeanTypeName(val); break;
+                case "method": def.setMethod(val); break;
+                case "ref": def.setRef(val); break;
+                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected MvelExpression doParseMvelExpression() throws IOException, XmlPullParserException {
+        return doParse(new MvelExpression(),
+            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected OgnlExpression doParseOgnlExpression() throws IOException, XmlPullParserException {
+        return doParse(new OgnlExpression(),
+            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected RefExpression doParseRefExpression() throws IOException, XmlPullParserException {
+        return doParse(new RefExpression(),
+            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected SimpleExpression doParseSimpleExpression() throws IOException, XmlPullParserException {
+        return doParse(new SimpleExpression(), (def, key, val) -> {
+            if ("resultType".equals(key)) {
+                def.setResultTypeName(val);
+                return true;
+            }
+            return expressionDefinitionAttributeHandler().accept(def, key, val);
+        }, noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected SpELExpression doParseSpELExpression() throws IOException, XmlPullParserException {
+        return doParse(new SpELExpression(),
+            expressionDefinitionAttributeHandler(), noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected TokenizerExpression doParseTokenizerExpression() throws IOException, XmlPullParserException {
+        return doParse(new TokenizerExpression(), (def, key, val) -> {
+            switch (key) {
+                case "endToken": def.setEndToken(val); break;
+                case "group": def.setGroup(val); break;
+                case "groupDelimiter": def.setGroupDelimiter(val); break;
+                case "headerName": def.setHeaderName(val); break;
+                case "includeTokens": def.setIncludeTokens(val); break;
+                case "inheritNamespaceTagName": def.setInheritNamespaceTagName(val); break;
+                case "regex": def.setRegex(val); break;
+                case "skipFirst": def.setSkipFirst(val); break;
+                case "token": def.setToken(val); break;
+                case "xml": def.setXml(val); break;
+                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected XMLTokenizerExpression doParseXMLTokenizerExpression() throws IOException, XmlPullParserException {
+        return doParse(new XMLTokenizerExpression(), (def, key, val) -> {
+            switch (key) {
+                case "group": def.setGroup(val); break;
+                case "headerName": def.setHeaderName(val); break;
+                case "mode": def.setMode(val); break;
+                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected XPathExpression doParseXPathExpression() throws IOException, XmlPullParserException {
+        return doParse(new XPathExpression(), (def, key, val) -> {
+            switch (key) {
+                case "documentType": def.setDocumentTypeName(val); break;
+                case "factoryRef": def.setFactoryRef(val); break;
+                case "headerName": def.setHeaderName(val); break;
+                case "logNamespaces": def.setLogNamespaces(val); break;
+                case "objectModel": def.setObjectModel(val); break;
+                case "resultType": def.setResultTypeName(val); break;
+                case "saxon": def.setSaxon(val); break;
+                case "threadSafety": def.setThreadSafety(val); break;
+                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected XQueryExpression doParseXQueryExpression() throws IOException, XmlPullParserException {
+        return doParse(new XQueryExpression(), (def, key, val) -> {
+            switch (key) {
+                case "headerName": def.setHeaderName(val); break;
+                case "type": def.setType(val); break;
+                default: return expressionDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), expressionDefinitionValueHandler());
+    }
+    protected CustomLoadBalancerDefinition doParseCustomLoadBalancerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new CustomLoadBalancerDefinition(), (def, key, val) -> {
+            if ("ref".equals(key)) {
+                def.setRef(val);
+                return true;
+            }
+            return identifiedTypeAttributeHandler().accept(def, key, val);
+        }, noElementHandler(), noValueHandler());
+    }
+    protected FailoverLoadBalancerDefinition doParseFailoverLoadBalancerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new FailoverLoadBalancerDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "maximumFailoverAttempts": def.setMaximumFailoverAttempts(val); break;
+                case "roundRobin": def.setRoundRobin(val); break;
+                case "sticky": def.setSticky(val); break;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            if ("exception".equals(key)) {
+                doAdd(doParseText(), def.getExceptions(), def::setExceptions);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected RandomLoadBalancerDefinition doParseRandomLoadBalancerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RandomLoadBalancerDefinition(),
+            identifiedTypeAttributeHandler(), noElementHandler(), noValueHandler());
+    }
+    protected RoundRobinLoadBalancerDefinition doParseRoundRobinLoadBalancerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RoundRobinLoadBalancerDefinition(),
+            identifiedTypeAttributeHandler(), noElementHandler(), noValueHandler());
+    }
+    protected StickyLoadBalancerDefinition doParseStickyLoadBalancerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new StickyLoadBalancerDefinition(),
+            identifiedTypeAttributeHandler(), (def, key) -> {
+            if ("correlationExpression".equals(key)) {
+                def.setCorrelationExpression(doParseExpressionSubElementDefinition());
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected TopicLoadBalancerDefinition doParseTopicLoadBalancerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new TopicLoadBalancerDefinition(),
+            identifiedTypeAttributeHandler(), noElementHandler(), noValueHandler());
+    }
+    protected WeightedLoadBalancerDefinition doParseWeightedLoadBalancerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new WeightedLoadBalancerDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "distributionRatio": def.setDistributionRatio(val); break;
+                case "distributionRatioDelimiter": def.setDistributionRatioDelimiter(val); break;
+                case "roundRobin": def.setRoundRobin(val); break;
+                default: return identifiedTypeAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected DeleteVerbDefinition doParseDeleteVerbDefinition() throws IOException, XmlPullParserException {
+        return doParse(new DeleteVerbDefinition(),
+            verbDefinitionAttributeHandler(), verbDefinitionElementHandler(), noValueHandler());
+    }
+    protected <T extends VerbDefinition> AttributeHandler<T> verbDefinitionAttributeHandler() {
+        return (def, key, val) -> {
+            switch (key) {
+                case "apiDocs": def.setApiDocs(val); break;
+                case "bindingMode": def.setBindingMode(val); break;
+                case "clientRequestValidation": def.setClientRequestValidation(val); break;
+                case "consumes": def.setConsumes(val); break;
+                case "enableCORS": def.setEnableCORS(val); break;
+                case "method": def.setMethod(val); break;
+                case "outType": def.setOutType(val); break;
+                case "produces": def.setProduces(val); break;
+                case "routeId": def.setRouteId(val); break;
+                case "skipBindingOnErrorCode": def.setSkipBindingOnErrorCode(val); break;
+                case "type": def.setType(val); break;
+                case "uri": def.setUri(val); break;
+                default: return optionalIdentifiedDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        };
+    }
+    protected <T extends VerbDefinition> ElementHandler<T> verbDefinitionElementHandler() {
+        return (def, key) -> {
+            switch (key) {
+                case "param": doAdd(doParseRestOperationParamDefinition(), def.getParams(), def::setParams); break;
+                case "responseMessage": doAdd(doParseRestOperationResponseMsgDefinition(), def.getResponseMsgs(), def::setResponseMsgs); break;
+                case "security": doAdd(doParseSecurityDefinition(), def.getSecurity(), def::setSecurity); break;
+                case "to": def.setToOrRoute(doParseToDefinition()); break;
+                case "toD": def.setToOrRoute(doParseToDynamicDefinition()); break;
+                case "route": def.setToOrRoute(doParseRouteDefinition()); break;
+                default: return optionalIdentifiedDefinitionElementHandler().accept(def, key);
+            }
+            return true;
+        };
+    }
+    protected VerbDefinition doParseVerbDefinition() throws IOException, XmlPullParserException {
+        return doParse(new VerbDefinition(), verbDefinitionAttributeHandler(), verbDefinitionElementHandler(), noValueHandler());
+    }
+    protected RestOperationParamDefinition doParseRestOperationParamDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RestOperationParamDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "arrayType": def.setArrayType(val); break;
+                case "collectionFormat": def.setCollectionFormat(CollectionFormat.valueOf(val)); break;
+                case "dataFormat": def.setDataFormat(val); break;
+                case "dataType": def.setDataType(val); break;
+                case "defaultValue": def.setDefaultValue(val); break;
+                case "description": def.setDescription(val); break;
+                case "name": def.setName(val); break;
+                case "required": def.setRequired(Boolean.valueOf(val)); break;
+                case "type": def.setType(RestParamType.valueOf(val)); break;
+                default: return false;
+            }
+            return true;
+        }, (def, key) -> {
+            switch (key) {
+                case "value": doAdd(doParseText(), def.getAllowableValues(), def::setAllowableValues); break;
+                case "examples": doAdd(doParseRestPropertyDefinition(), def.getExamples(), def::setExamples); break;
+                default: return false;
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected RestOperationResponseMsgDefinition doParseRestOperationResponseMsgDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RestOperationResponseMsgDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "code": def.setCode(val); break;
+                case "message": def.setMessage(val); break;
+                case "responseModel": def.setResponseModel(val); break;
+                default: return false;
+            }
+            return true;
+        }, (def, key) -> {
+            switch (key) {
+                case "examples": doAdd(doParseRestPropertyDefinition(), def.getExamples(), def::setExamples); break;
+                case "header": doAdd(doParseRestOperationResponseHeaderDefinition(), def.getHeaders(), def::setHeaders); break;
+                default: return false;
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected SecurityDefinition doParseSecurityDefinition() throws IOException, XmlPullParserException {
+        return doParse(new SecurityDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "key": def.setKey(val); break;
+                case "scopes": def.setScopes(val); break;
+                default: return false;
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected GetVerbDefinition doParseGetVerbDefinition() throws IOException, XmlPullParserException {
+        return doParse(new GetVerbDefinition(),
+            verbDefinitionAttributeHandler(), verbDefinitionElementHandler(), noValueHandler());
+    }
+    protected HeadVerbDefinition doParseHeadVerbDefinition() throws IOException, XmlPullParserException {
+        return doParse(new HeadVerbDefinition(),
+            verbDefinitionAttributeHandler(), verbDefinitionElementHandler(), noValueHandler());
+    }
+    protected PatchVerbDefinition doParsePatchVerbDefinition() throws IOException, XmlPullParserException {
+        return doParse(new PatchVerbDefinition(),
+            verbDefinitionAttributeHandler(), verbDefinitionElementHandler(), noValueHandler());
+    }
+    protected PostVerbDefinition doParsePostVerbDefinition() throws IOException, XmlPullParserException {
+        return doParse(new PostVerbDefinition(),
+            verbDefinitionAttributeHandler(), verbDefinitionElementHandler(), noValueHandler());
+    }
+    protected PutVerbDefinition doParsePutVerbDefinition() throws IOException, XmlPullParserException {
+        return doParse(new PutVerbDefinition(),
+            verbDefinitionAttributeHandler(), verbDefinitionElementHandler(), noValueHandler());
+    }
+    protected RestConfigurationDefinition doParseRestConfigurationDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RestConfigurationDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "apiComponent": def.setApiComponent(val); break;
+                case "apiContextIdPattern": def.setApiContextIdPattern(val); break;
+                case "apiContextListing": def.setApiContextListing(Boolean.valueOf(val)); break;
+                case "apiContextPath": def.setApiContextPath(val); break;
+                case "apiContextRouteId": def.setApiContextRouteId(val); break;
+                case "apiHost": def.setApiHost(val); break;
+                case "apiVendorExtension": def.setApiVendorExtension(Boolean.valueOf(val)); break;
+                case "bindingMode": def.setBindingMode(RestBindingMode.valueOf(val)); break;
+                case "clientRequestValidation": def.setClientRequestValidation(Boolean.valueOf(val)); break;
+                case "component": def.setComponent(val); break;
+                case "contextPath": def.setContextPath(val); break;
+                case "enableCORS": def.setEnableCORS(Boolean.valueOf(val)); break;
+                case "host": def.setHost(val); break;
+                case "hostNameResolver": def.setHostNameResolver(RestHostNameResolver.valueOf(val)); break;
+                case "jsonDataFormat": def.setJsonDataFormat(val); break;
+                case "port": def.setPort(val); break;
+                case "producerApiDoc": def.setProducerApiDoc(val); break;
+                case "producerComponent": def.setProducerComponent(val); break;
+                case "scheme": def.setScheme(val); break;
+                case "skipBindingOnErrorCode": def.setSkipBindingOnErrorCode(Boolean.valueOf(val)); break;
+                case "useXForwardHeaders": def.setUseXForwardHeaders(Boolean.valueOf(val)); break;
+                case "xmlDataFormat": def.setXmlDataFormat(val); break;
+                default: return false;
+            }
+            return true;
+        }, (def, key) -> {
+            switch (key) {
+                case "apiProperty": doAdd(doParseRestPropertyDefinition(), def.getApiProperties(), def::setApiProperties); break;
+                case "componentProperty": doAdd(doParseRestPropertyDefinition(), def.getComponentProperties(), def::setComponentProperties); break;
+                case "consumerProperty": doAdd(doParseRestPropertyDefinition(), def.getConsumerProperties(), def::setConsumerProperties); break;
+                case "corsHeaders": doAdd(doParseRestPropertyDefinition(), def.getCorsHeaders(), def::setCorsHeaders); break;
+                case "dataFormatProperty": doAdd(doParseRestPropertyDefinition(), def.getDataFormatProperties(), def::setDataFormatProperties); break;
+                case "endpointProperty": doAdd(doParseRestPropertyDefinition(), def.getEndpointProperties(), def::setEndpointProperties); break;
+                default: return false;
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected RestPropertyDefinition doParseRestPropertyDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RestPropertyDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "key": def.setKey(val); break;
+                case "value": def.setValue(val); break;
+                default: return false;
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected RestSecuritiesDefinition doParseRestSecuritiesDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RestSecuritiesDefinition(),
+            noAttributeHandler(), (def, key) -> {
+            switch (key) {
+                case "apiKey": doAdd(doParseRestSecurityApiKey(), def.getSecurityDefinitions(), def::setSecurityDefinitions); break;
+                case "basicAuth": doAdd(doParseRestSecurityBasicAuth(), def.getSecurityDefinitions(), def::setSecurityDefinitions); break;
+                case "oauth2": doAdd(doParseRestSecurityOAuth2(), def.getSecurityDefinitions(), def::setSecurityDefinitions); break;
+                default: return false;
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected RestOperationResponseHeaderDefinition doParseRestOperationResponseHeaderDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RestOperationResponseHeaderDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "arrayType": def.setArrayType(val); break;
+                case "collectionFormat": def.setCollectionFormat(CollectionFormat.valueOf(val)); break;
+                case "dataFormat": def.setDataFormat(val); break;
+                case "dataType": def.setDataType(val); break;
+                case "description": def.setDescription(val); break;
+                case "example": def.setExample(val); break;
+                case "name": def.setName(val); break;
+                default: return false;
+            }
+            return true;
+        }, (def, key) -> {
+            if ("value".equals(key)) {
+                doAdd(doParseText(), def.getAllowableValues(), def::setAllowableValues);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected <T extends RestSecurityDefinition> AttributeHandler<T> restSecurityDefinitionAttributeHandler() {
+        return (def, key, val) -> {
+            switch (key) {
+                case "description": def.setDescription(val); break;
+                case "key": def.setKey(val); break;
+                default: return false;
+            }
+            return true;
+        };
+    }
+    protected RestSecurityApiKey doParseRestSecurityApiKey() throws IOException, XmlPullParserException {
+        return doParse(new RestSecurityApiKey(), (def, key, val) -> {
+            switch (key) {
+                case "inHeader": def.setInHeader(Boolean.valueOf(val)); break;
+                case "inQuery": def.setInQuery(Boolean.valueOf(val)); break;
+                case "name": def.setName(val); break;
+                default: return restSecurityDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected RestSecurityBasicAuth doParseRestSecurityBasicAuth() throws IOException, XmlPullParserException {
+        return doParse(new RestSecurityBasicAuth(),
+            restSecurityDefinitionAttributeHandler(), noElementHandler(), noValueHandler());
+    }
+    protected RestSecurityOAuth2 doParseRestSecurityOAuth2() throws IOException, XmlPullParserException {
+        return doParse(new RestSecurityOAuth2(), (def, key, val) -> {
+            switch (key) {
+                case "authorizationUrl": def.setAuthorizationUrl(val); break;
+                case "flow": def.setFlow(val); break;
+                case "tokenUrl": def.setTokenUrl(val); break;
+                default: return restSecurityDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, (def, key) -> {
+            if ("scopes".equals(key)) {
+                doAdd(doParseRestPropertyDefinition(), def.getScopes(), def::setScopes);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    public RestsDefinition parseRestsDefinition()
+            throws IOException, XmlPullParserException {
+        expectTag("rests");
+        return doParseRestsDefinition();
+    }
+    protected RestsDefinition doParseRestsDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RestsDefinition(),
+            optionalIdentifiedDefinitionAttributeHandler(), (def, key) -> {
+            if ("rest".equals(key)) {
+                doAdd(doParseRestDefinition(), def.getRests(), def::setRests);
+                return true;
+            }
+            return optionalIdentifiedDefinitionElementHandler().accept(def, key);
+        }, noValueHandler());
+    }
+    protected CustomTransformerDefinition doParseCustomTransformerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new CustomTransformerDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "className": def.setClassName(val); break;
+                case "ref": def.setRef(val); break;
+                default: return transformerDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected <T extends TransformerDefinition> AttributeHandler<T> transformerDefinitionAttributeHandler() {
+        return (def, key, val) -> {
+            switch (key) {
+                case "fromType": def.setFromType(val); break;
+                case "scheme": def.setScheme(val); break;
+                case "toType": def.setToType(val); break;
+                default: return false;
+            }
+            return true;
+        };
+    }
+    protected DataFormatTransformerDefinition doParseDataFormatTransformerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new DataFormatTransformerDefinition(), (def, key, val) -> {
+            if ("ref".equals(key)) {
+                def.setRef(val);
+                return true;
+            }
+            return transformerDefinitionAttributeHandler().accept(def, key, val);
+        }, (def, key) -> {
+            DataFormatDefinition v = doParseDataFormatDefinitionRef(key);
+            if (v != null) { 
+                def.setDataFormatType(v);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected EndpointTransformerDefinition doParseEndpointTransformerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new EndpointTransformerDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "ref": def.setRef(val); break;
+                case "uri": def.setUri(val); break;
+                default: return transformerDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected TransformersDefinition doParseTransformersDefinition() throws IOException, XmlPullParserException {
+        return doParse(new TransformersDefinition(),
+            noAttributeHandler(), (def, key) -> {
+            switch (key) {
+                case "dataFormatTransformer": doAdd(doParseDataFormatTransformerDefinition(), def.getTransformers(), def::setTransformers); break;
+                case "endpointTransformer": doAdd(doParseEndpointTransformerDefinition(), def.getTransformers(), def::setTransformers); break;
+                case "customTransformer": doAdd(doParseCustomTransformerDefinition(), def.getTransformers(), def::setTransformers); break;
+                default: return false;
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected CustomValidatorDefinition doParseCustomValidatorDefinition() throws IOException, XmlPullParserException {
+        return doParse(new CustomValidatorDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "className": def.setClassName(val); break;
+                case "ref": def.setRef(val); break;
+                default: return validatorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected <T extends ValidatorDefinition> AttributeHandler<T> validatorDefinitionAttributeHandler() {
+        return (def, key, val) -> {
+            if ("type".equals(key)) {
+                def.setType(val);
+                return true;
+            }
+            return false;
+        };
+    }
+    protected EndpointValidatorDefinition doParseEndpointValidatorDefinition() throws IOException, XmlPullParserException {
+        return doParse(new EndpointValidatorDefinition(), (def, key, val) -> {
+            switch (key) {
+                case "ref": def.setRef(val); break;
+                case "uri": def.setUri(val); break;
+                default: return validatorDefinitionAttributeHandler().accept(def, key, val);
+            }
+            return true;
+        }, noElementHandler(), noValueHandler());
+    }
+    protected PredicateValidatorDefinition doParsePredicateValidatorDefinition() throws IOException, XmlPullParserException {
+        return doParse(new PredicateValidatorDefinition(),
+            validatorDefinitionAttributeHandler(), (def, key) -> {
+            ExpressionDefinition v = doParseExpressionDefinitionRef(key);
+            if (v != null) { 
+                def.setExpression(v);
+                return true;
+            }
+            return false;
+        }, noValueHandler());
+    }
+    protected ValidatorsDefinition doParseValidatorsDefinition() throws IOException, XmlPullParserException {
+        return doParse(new ValidatorsDefinition(),
+            noAttributeHandler(), (def, key) -> {
+            switch (key) {
+                case "endpointValidator": doAdd(doParseEndpointValidatorDefinition(), def.getValidators(), def::setValidators); break;
+                case "predicateValidator": doAdd(doParsePredicateValidatorDefinition(), def.getValidators(), def::setValidators); break;
+                case "customValidator": doAdd(doParseCustomValidatorDefinition(), def.getValidators(), def::setValidators); break;
+                default: return false;
+            }
+            return true;
+        }, noValueHandler());
+    }
+    protected ProcessorDefinition doParseProcessorDefinitionRef(String key) throws IOException, XmlPullParserException {
+        switch (key) {
+            case "aggregate": return doParseAggregateDefinition();
+            case "bean": return doParseBeanDefinition();
+            case "doCatch": return doParseCatchDefinition();
+            case "when": return doParseWhenDefinition();
+            case "choice": return doParseChoiceDefinition();
+            case "otherwise": return doParseOtherwiseDefinition();
+            case "circuitBreaker": return doParseCircuitBreakerDefinition();
+            case "claimCheck": return doParseClaimCheckDefinition();
+            case "convertBodyTo": return doParseConvertBodyDefinition();
+            case "delay": return doParseDelayDefinition();
+            case "dynamicRouter": return doParseDynamicRouterDefinition();
+            case "enrich": return doParseEnrichDefinition();
+            case "filter": return doParseFilterDefinition();
+            case "doFinally": return doParseFinallyDefinition();
+            case "idempotentConsumer": return doParseIdempotentConsumerDefinition();
+            case "inOnly": return doParseInOnlyDefinition();
+            case "inOut": return doParseInOutDefinition();
+            case "intercept": return doParseInterceptDefinition();
+            case "interceptFrom": return doParseInterceptFromDefinition();
+            case "interceptSendToEndpoint": return doParseInterceptSendToEndpointDefinition();
+            case "loadBalance": return doParseLoadBalanceDefinition();
+            case "log": return doParseLogDefinition();
+            case "loop": return doParseLoopDefinition();
+            case "marshal": return doParseMarshalDefinition();
+            case "multicast": return doParseMulticastDefinition();
+            case "onCompletion": return doParseOnCompletionDefinition();
+            case "onException": return doParseOnExceptionDefinition();
+            case "onFallback": return doParseOnFallbackDefinition();
+            case "pipeline": return doParsePipelineDefinition();
+            case "policy": return doParsePolicyDefinition();
+            case "pollEnrich": return doParsePollEnrichDefinition();
+            case "process": return doParseProcessDefinition();
+            case "recipientList": return doParseRecipientListDefinition();
+            case "removeHeader": return doParseRemoveHeaderDefinition();
+            case "removeHeaders": return doParseRemoveHeadersDefinition();
+            case "removeProperties": return doParseRemovePropertiesDefinition();
+            case "removeProperty": return doParseRemovePropertyDefinition();
+            case "resequence": return doParseResequenceDefinition();
+            case "rollback": return doParseRollbackDefinition();
+            case "route": return doParseRouteDefinition();
+            case "routingSlip": return doParseRoutingSlipDefinition();
+            case "saga": return doParseSagaDefinition();
+            case "sample": return doParseSamplingDefinition();
+            case "script": return doParseScriptDefinition();
+            case "setBody": return doParseSetBodyDefinition();
+            case "setExchangePattern": return doParseSetExchangePatternDefinition();
+            case "setHeader": return doParseSetHeaderDefinition();
+            case "setProperty": return doParseSetPropertyDefinition();
+            case "sort": return doParseSortDefinition();
+            case "split": return doParseSplitDefinition();
+            case "step": return doParseStepDefinition();
+            case "stop": return doParseStopDefinition();
+            case "threads": return doParseThreadsDefinition();
+            case "throttle": return doParseThrottleDefinition();
+            case "throwException": return doParseThrowExceptionDefinition();
+            case "to": return doParseToDefinition();
+            case "toD": return doParseToDynamicDefinition();
+            case "transacted": return doParseTransactedDefinition();
+            case "transform": return doParseTransformDefinition();
+            case "doTry": return doParseTryDefinition();
+            case "unmarshal": return doParseUnmarshalDefinition();
+            case "validate": return doParseValidateDefinition();
+            case "whenSkipSendToEndpoint": return doParseWhenSkipSendToEndpointDefinition();
+            case "wireTap": return doParseWireTapDefinition();
+            case "serviceCall": return doParseServiceCallDefinition();
+            default: return null;
+        }
+    }
+    protected ExpressionDefinition doParseExpressionDefinitionRef(String key) throws IOException, XmlPullParserException {
+        switch (key) {
+            case "expressionDefinition": return doParseExpressionDefinition();
+            case "constant": return doParseConstantExpression();
+            case "exchangeProperty": return doParseExchangePropertyExpression();
+            case "groovy": return doParseGroovyExpression();
+            case "header": return doParseHeaderExpression();
+            case "hl7terser": return doParseHl7TerserExpression();
+            case "jsonpath": return doParseJsonPathExpression();
+            case "language": return doParseLanguageExpression();
+            case "method": return doParseMethodCallExpression();
+            case "mvel": return doParseMvelExpression();
+            case "ognl": return doParseOgnlExpression();
+            case "ref": return doParseRefExpression();
+            case "simple": return doParseSimpleExpression();
+            case "spel": return doParseSpELExpression();
+            case "tokenize": return doParseTokenizerExpression();
+            case "xtokenize": return doParseXMLTokenizerExpression();
+            case "xpath": return doParseXPathExpression();
+            case "xquery": return doParseXQueryExpression();
+            default: return null;
+        }
+    }
+    protected DataFormatDefinition doParseDataFormatDefinitionRef(String key) throws IOException, XmlPullParserException {
+        switch (key) {
+            case "asn1": return doParseASN1DataFormat();
+            case "any23": return doParseAny23DataFormat();
+            case "avro": return doParseAvroDataFormat();
+            case "barcode": return doParseBarcodeDataFormat();
+            case "base64": return doParseBase64DataFormat();
+            case "beanio": return doParseBeanioDataFormat();
+            case "bindy": return doParseBindyDataFormat();
+            case "cbor": return doParseCBORDataFormat();
+            case "crypto": return doParseCryptoDataFormat();
+            case "csv": return doParseCsvDataFormat();
+            case "customDataFormat": return doParseCustomDataFormat();
+            case "fhirJson": return doParseFhirJsonDataFormat();
+            case "fhirXml": return doParseFhirXmlDataFormat();
+            case "flatpack": return doParseFlatpackDataFormat();
+            case "grok": return doParseGrokDataFormat();
+            case "gzipdeflater": return doParseGzipDataFormat();
+            case "hl7": return doParseHL7DataFormat();
+            case "ical": return doParseIcalDataFormat();
+            case "jacksonxml": return doParseJacksonXMLDataFormat();
+            case "jaxb": return doParseJaxbDataFormat();
+            case "jsonApi": return doParseJsonApiDataFormat();
+            case "json": return doParseJsonDataFormat();
+            case "lzf": return doParseLZFDataFormat();
+            case "mime-multipart": return doParseMimeMultipartDataFormat();
+            case "pgp": return doParsePGPDataFormat();
+            case "protobuf": return doParseProtobufDataFormat();
+            case "rss": return doParseRssDataFormat();
+            case "soapjaxb": return doParseSoapJaxbDataFormat();
+            case "syslog": return doParseSyslogDataFormat();
+            case "tarfile": return doParseTarFileDataFormat();
+            case "thrift": return doParseThriftDataFormat();
+            case "tidyMarkup": return doParseTidyMarkupDataFormat();
+            case "univocity-csv": return doParseUniVocityCsvDataFormat();
+            case "univocity-fixed": return doParseUniVocityFixedWidthDataFormat();
+            case "univocity-tsv": return doParseUniVocityTsvDataFormat();
+            case "secureXML": return doParseXMLSecurityDataFormat();
+            case "xstream": return doParseXStreamDataFormat();
+            case "xmlrpc": return doParseXmlRpcDataFormat();
+            case "yaml": return doParseYAMLDataFormat();
+            case "zipdeflater": return doParseZipDeflaterDataFormat();
+            case "zipfile": return doParseZipFileDataFormat();
+            default: return null;
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/MXParser.java b/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/MXParser.java
new file mode 100644
index 0000000..1126078
--- /dev/null
+++ b/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/MXParser.java
@@ -0,0 +1,3243 @@
+/* -*-             c-basic-offset: 4; indent-tabs-mode: nil; -*-  //------100-columns-wide------>|*/
+/*
+ * Copyright (c) 2003 Extreme! Lab, Indiana University. All rights reserved.
+ *
+ * This software is open source. See the bottom of this file for the license.
+ *
+ * $Id: MXParser.java,v 1.52 2006/11/09 18:29:37 aslom Exp $
+ */
+
+package org.apache.camel.xml.io;
+
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+
+//TODO best handling of interning issues
+//   have isAllNewStringInterned ???
+
+//TODO handling surrogate pairs: http://www.unicode.org/unicode/faq/utf_bom.html#6
+
+//TODO review code for use of bufAbsoluteStart when keeping pos between next()/fillBuf()
+
+/**
+ * Absolutely minimal implementation of XMLPULL V1 API
+ *
+ * @author <a href="http://www.extreme.indiana.edu/~aslom/">Aleksander Slominski</a>
+ */
+
+public class MXParser
+        implements XmlPullParser {
+    //NOTE: no interning of those strings --> by Java lang spec they MUST be already interned
+    protected final static String XML_URI = "http://www.w3.org/XML/1998/namespace";
+    protected final static String XMLNS_URI = "http://www.w3.org/2000/xmlns/";
+    protected final static String FEATURE_XML_ROUNDTRIP =
+            //"http://xmlpull.org/v1/doc/features.html#xml-roundtrip";
+            "http://xmlpull.org/v1/doc/features.html#xml-roundtrip";
+    protected final static String FEATURE_NAMES_INTERNED =
+            "http://xmlpull.org/v1/doc/features.html#names-interned";
+    protected final static String PROPERTY_XMLDECL_VERSION =
+            "http://xmlpull.org/v1/doc/properties.html#xmldecl-version";
+    protected final static String PROPERTY_XMLDECL_STANDALONE =
+            "http://xmlpull.org/v1/doc/properties.html#xmldecl-standalone";
+    protected final static String PROPERTY_XMLDECL_CONTENT =
+            "http://xmlpull.org/v1/doc/properties.html#xmldecl-content";
+    protected final static String PROPERTY_LOCATION =
+            "http://xmlpull.org/v1/doc/properties.html#location";
+
+    /**
+     * Implementation notice:
+     * the is instance variable that controls if newString() is interning.
+     * <p><b>NOTE:</b> newStringIntern <b>always</b> returns interned strings
+     * and newString MAY return interned String depending on this variable.
+     * <p><b>NOTE:</b> by default in this minimal implementation it is false!
+     */
+    protected boolean allStringsInterned;
+
+    protected void resetStringCache() {
+        //System.out.println("resetStringCache() minimum called");
+    }
+
+    protected String newString(char[] cbuf, int off, int len) {
+        return new String(cbuf, off, len);
+    }
+
+    protected String newStringIntern(char[] cbuf, int off, int len) {
+        return (new String(cbuf, off, len)).intern();
+    }
+
+    private static final boolean TRACE_SIZING = false;
+
+    // NOTE: features are not resettable and typically defaults to false ...
+    protected boolean processNamespaces;
+    protected boolean roundtripSupported;
+
+    // global parser state
+    protected String location;
+    protected int lineNumber;
+    protected int columnNumber;
+    protected boolean seenRoot;
+    protected boolean reachedEnd;
+    protected int eventType;
+    protected boolean emptyElementTag;
+    // element stack
+    protected int depth;
+    protected char[] elRawName[];
+    protected int elRawNameEnd[];
+    protected int elRawNameLine[];
+
+    protected String elName[];
+    protected String elPrefix[];
+    protected String elUri[];
+    //protected String elValue[];
+    protected int elNamespaceCount[];
+
+
+    /**
+     * Make sure that we have enough space to keep element stack if passed size.
+     * It will always create one additional slot then current depth
+     */
+    protected void ensureElementsCapacity() {
+        final int elStackSize = elName != null ? elName.length : 0;
+        if ((depth + 1) >= elStackSize) {
+            // we add at least one extra slot ...
+            final int newSize = (depth >= 7 ? 2 * depth : 8) + 2; // = lucky 7 + 1 //25
+            if (TRACE_SIZING) {
+                System.err.println("TRACE_SIZING elStackSize " + elStackSize + " ==> " + newSize);
+            }
+            final boolean needsCopying = elStackSize > 0;
+            String[] arr = null;
+            // reuse arr local variable slot
+            arr = new String[newSize];
+            if (needsCopying) System.arraycopy(elName, 0, arr, 0, elStackSize);
+            elName = arr;
+            arr = new String[newSize];
+            if (needsCopying) System.arraycopy(elPrefix, 0, arr, 0, elStackSize);
+            elPrefix = arr;
+            arr = new String[newSize];
+            if (needsCopying) System.arraycopy(elUri, 0, arr, 0, elStackSize);
+            elUri = arr;
+
+            int[] iarr = new int[newSize];
+            if (needsCopying) {
+                System.arraycopy(elNamespaceCount, 0, iarr, 0, elStackSize);
+            } else {
+                // special initialization
+                iarr[0] = 0;
+            }
+            elNamespaceCount = iarr;
+
+            //TODO: avoid using element raw name ...
+            iarr = new int[newSize];
+            if (needsCopying) {
+                System.arraycopy(elRawNameEnd, 0, iarr, 0, elStackSize);
+            }
+            elRawNameEnd = iarr;
+
+            iarr = new int[newSize];
+            if (needsCopying) {
+                System.arraycopy(elRawNameLine, 0, iarr, 0, elStackSize);
+            }
+            elRawNameLine = iarr;
+
+            final char[][] carr = new char[newSize][];
+            if (needsCopying) {
+                System.arraycopy(elRawName, 0, carr, 0, elStackSize);
+            }
+            elRawName = carr;
+            //            arr = new String[newSize];
+            //            if(needsCopying) System.arraycopy(elLocalName, 0, arr, 0, elStackSize);
+            //            elLocalName = arr;
+            //            arr = new String[newSize];
+            //            if(needsCopying) System.arraycopy(elDefaultNs, 0, arr, 0, elStackSize);
+            //            elDefaultNs = arr;
+            //            int[] iarr = new int[newSize];
+            //            if(needsCopying) System.arraycopy(elNsStackPos, 0, iarr, 0, elStackSize);
+            //            for (int i = elStackSize; i < iarr.length; i++)
+            //            {
+            //                iarr[i] = (i > 0) ? -1 : 0;
+            //            }
+            //            elNsStackPos = iarr;
+            //assert depth < elName.length;
+        }
+    }
+
+
+    // attribute stack
+    protected int attributeCount;
+    protected String attributeName[];
+    protected int attributeNameHash[];
+    //protected int attributeNameStart[];
+    //protected int attributeNameEnd[];
+    protected String attributePrefix[];
+    protected String attributeUri[];
+    protected String attributeValue[];
+    //protected int attributeValueStart[];
+    //protected int attributeValueEnd[];
+
+
+    /**
+     * Make sure that in attributes temporary array is enough space.
+     */
+    protected void ensureAttributesCapacity(int size) {
+        final int attrPosSize = attributeName != null ? attributeName.length : 0;
+        if (size >= attrPosSize) {
+            final int newSize = size > 7 ? 2 * size : 8; // = lucky 7 + 1 //25
+            if (TRACE_SIZING) {
+                System.err.println("TRACE_SIZING attrPosSize " + attrPosSize + " ==> " + newSize);
+            }
+            final boolean needsCopying = attrPosSize > 0;
+            String[] arr = null;
+
+            arr = new String[newSize];
+            if (needsCopying) System.arraycopy(attributeName, 0, arr, 0, attrPosSize);
+            attributeName = arr;
+
+            arr = new String[newSize];
+            if (needsCopying) System.arraycopy(attributePrefix, 0, arr, 0, attrPosSize);
+            attributePrefix = arr;
+
+            arr = new String[newSize];
+            if (needsCopying) System.arraycopy(attributeUri, 0, arr, 0, attrPosSize);
+            attributeUri = arr;
+
+            arr = new String[newSize];
+            if (needsCopying) System.arraycopy(attributeValue, 0, arr, 0, attrPosSize);
+            attributeValue = arr;
+
+            if (!allStringsInterned) {
+                final int[] iarr = new int[newSize];
+                if (needsCopying) System.arraycopy(attributeNameHash, 0, iarr, 0, attrPosSize);
+                attributeNameHash = iarr;
+            }
+
+            arr = null;
+            // //assert attrUri.length > size
+        }
+    }
+
+    // namespace stack
+    protected int namespaceEnd;
+    protected String namespacePrefix[];
+    protected int namespacePrefixHash[];
+    protected String namespaceUri[];
+
+    protected void ensureNamespacesCapacity(int size) {
+        final int namespaceSize = namespacePrefix != null ? namespacePrefix.length : 0;
+        if (size >= namespaceSize) {
+            final int newSize = size > 7 ? 2 * size : 8; // = lucky 7 + 1 //25
+            if (TRACE_SIZING) {
+                System.err.println("TRACE_SIZING namespaceSize " + namespaceSize + " ==> " + newSize);
+            }
+            final String[] newNamespacePrefix = new String[newSize];
+            final String[] newNamespaceUri = new String[newSize];
+            if (namespacePrefix != null) {
+                System.arraycopy(
+                        namespacePrefix, 0, newNamespacePrefix, 0, namespaceEnd);
+                System.arraycopy(
+                        namespaceUri, 0, newNamespaceUri, 0, namespaceEnd);
+            }
+            namespacePrefix = newNamespacePrefix;
+            namespaceUri = newNamespaceUri;
+
+
+            if (!allStringsInterned) {
+                final int[] newNamespacePrefixHash = new int[newSize];
+                if (namespacePrefixHash != null) {
+                    System.arraycopy(
+                            namespacePrefixHash, 0, newNamespacePrefixHash, 0, namespaceEnd);
+                }
+                namespacePrefixHash = newNamespacePrefixHash;
+            }
+            //prefixesSize = newSize;
+            // //assert nsPrefixes.length > size && nsPrefixes.length == newSize
+        }
+    }
+
+    /**
+     * simplistic implementation of hash function that has <b>constant</b>
+     * time to compute - so it also means diminishing hash quality for long strings
+     * but for XML parsing it should be good enough ...
+     */
+    protected static final int fastHash(char ch[], int off, int len) {
+        if (len == 0) return 0;
+        //assert len >0
+        int hash = ch[off]; // hash at beginning
+        //try {
+        hash = (hash << 7) + ch[off + len - 1]; // hash at the end
+        //} catch(ArrayIndexOutOfBoundsException aie) {
+        //    aie.printStackTrace(); //should never happen ...
+        //    throw new RuntimeException("this is violation of pre-condition");
+        //}
+        if (len > 16) hash = (hash << 7) + ch[off + (len / 4)];  // 1/4 from beginning
+        if (len > 8) hash = (hash << 7) + ch[off + (len / 2)];  // 1/2 of string size ...
+        // notice that hash is at most done 3 times <<7 so shifted by 21 bits 8 bit value
+        // so max result == 29 bits so it is quite just below 31 bits for long (2^32) ...
+        //assert hash >= 0;
+        return hash;
+    }
+
+    // entity replacement stack
+    protected int entityEnd;
+
+    protected String entityName[];
+    protected char[] entityNameBuf[];
+    protected String entityReplacement[];
+    protected char[] entityReplacementBuf[];
+
+    protected int entityNameHash[];
+
+    protected void ensureEntityCapacity() {
+        final int entitySize = entityReplacementBuf != null ? entityReplacementBuf.length : 0;
+        if (entityEnd >= entitySize) {
+            final int newSize = entityEnd > 7 ? 2 * entityEnd : 8; // = lucky 7 + 1 //25
+            if (TRACE_SIZING) {
+                System.err.println("TRACE_SIZING entitySize " + entitySize + " ==> " + newSize);
+            }
+            final String[] newEntityName = new String[newSize];
+            final char[] newEntityNameBuf[] = new char[newSize][];
+            final String[] newEntityReplacement = new String[newSize];
+            final char[] newEntityReplacementBuf[] = new char[newSize][];
+            if (entityName != null) {
+                System.arraycopy(entityName, 0, newEntityName, 0, entityEnd);
+                System.arraycopy(entityNameBuf, 0, newEntityNameBuf, 0, entityEnd);
+                System.arraycopy(entityReplacement, 0, newEntityReplacement, 0, entityEnd);
+                System.arraycopy(entityReplacementBuf, 0, newEntityReplacementBuf, 0, entityEnd);
+            }
+            entityName = newEntityName;
+            entityNameBuf = newEntityNameBuf;
+            entityReplacement = newEntityReplacement;
+            entityReplacementBuf = newEntityReplacementBuf;
+
+            if (!allStringsInterned) {
+                final int[] newEntityNameHash = new int[newSize];
+                if (entityNameHash != null) {
+                    System.arraycopy(entityNameHash, 0, newEntityNameHash, 0, entityEnd);
+                }
+                entityNameHash = newEntityNameHash;
+            }
+        }
+    }
+
+    // input buffer management
+    protected static final int READ_CHUNK_SIZE = 8 * 1024; //max data chars in one read() call
+    protected Reader reader;
+    protected String inputEncoding;
+
+
+    protected int bufLoadFactor = 95;  // 99%
+    //protected int bufHardLimit;  // only matters when expanding
+
+    protected char buf[] = new char[
+            Runtime.getRuntime().freeMemory() > 1000000L ? READ_CHUNK_SIZE : 256];
+    protected int bufSoftLimit = (bufLoadFactor * buf.length) / 100; // desirable size of buffer
+    protected boolean preventBufferCompaction;
+
+    protected int bufAbsoluteStart; // this is buf
+    protected int bufStart;
+    protected int bufEnd;
+    protected int pos;
+    protected int posStart;
+    protected int posEnd;
+
+    protected char pc[] = new char[
+            Runtime.getRuntime().freeMemory() > 1000000L ? READ_CHUNK_SIZE : 64];
+    protected int pcStart;
+    protected int pcEnd;
+
+
+    // parsing state
+    //protected boolean needsMore;
+    //protected boolean seenMarkup;
+    protected boolean usePC;
+
+
+    protected boolean seenStartTag;
+    protected boolean seenEndTag;
+    protected boolean pastEndTag;
+    protected boolean seenAmpersand;
+    protected boolean seenMarkup;
+    protected boolean seenDocdecl;
+
+    // transient variable set during each call to next/Token()
+    protected boolean tokenize;
+    protected String text;
+    protected String entityRefName;
+
+    protected String xmlDeclVersion;
+    protected Boolean xmlDeclStandalone;
+    protected String xmlDeclContent;
+
+    protected void reset() {
+        //System.out.println("reset() called");
+        location = null;
+        lineNumber = 1;
+        columnNumber = 0;
+        seenRoot = false;
+        reachedEnd = false;
+        eventType = START_DOCUMENT;
+        emptyElementTag = false;
+
+        depth = 0;
+
+        attributeCount = 0;
+
+        namespaceEnd = 0;
+
+        entityEnd = 0;
+
+        reader = null;
+        inputEncoding = null;
+
+        preventBufferCompaction = false;
+        bufAbsoluteStart = 0;
+        bufEnd = bufStart = 0;
+        pos = posStart = posEnd = 0;
+
+        pcEnd = pcStart = 0;
+
+        usePC = false;
+
+        seenStartTag = false;
+        seenEndTag = false;
+        pastEndTag = false;
+        seenAmpersand = false;
+        seenMarkup = false;
+        seenDocdecl = false;
+
+        xmlDeclVersion = null;
+        xmlDeclStandalone = null;
+        xmlDeclContent = null;
+
+        resetStringCache();
+    }
+
+    public MXParser() {
+    }
+
+
+    /**
+     * Method setFeature
+     *
+     * @param name  a  String
+     * @param state a  boolean
+     * @throws XmlPullParserException
+     */
+    public void setFeature(String name,
+                           boolean state) throws XmlPullParserException {
+        if (name == null) throw new IllegalArgumentException("feature name should not be null");
+        if (FEATURE_PROCESS_NAMESPACES.equals(name)) {
+            if (eventType != START_DOCUMENT) throw new XmlPullParserException(
+                    "namespace processing feature can only be changed before parsing", this, null);
+            processNamespaces = state;
+            //        } else if(FEATURE_REPORT_NAMESPACE_ATTRIBUTES.equals(name)) {
+            //      if(type != START_DOCUMENT) throw new XmlPullParserException(
+            //              "namespace reporting feature can only be changed before parsing", this, null);
+            //            reportNsAttribs = state;
+        } else if (FEATURE_NAMES_INTERNED.equals(name)) {
+            if (state != false) {
+                throw new XmlPullParserException(
+                        "interning names in this implementation is not supported");
+            }
+        } else if (FEATURE_PROCESS_DOCDECL.equals(name)) {
+            if (state != false) {
+                throw new XmlPullParserException(
+                        "processing DOCDECL is not supported");
+            }
+            //} else if(REPORT_DOCDECL.equals(name)) {
+            //    paramNotifyDoctype = state;
+        } else if (FEATURE_XML_ROUNDTRIP.equals(name)) {
+            //if(state == false) {
+            //    throw new XmlPullParserException(
+            //        "roundtrip feature can not be switched off");
+            //}
+            roundtripSupported = state;
+        } else {
+            throw new XmlPullParserException("unsupported feature " + name);
+        }
+    }
+
+    /**
+     * Unknown properties are <strong>always</strong> returned as false
+     */
+    public boolean getFeature(String name) {
+        if (name == null) throw new IllegalArgumentException("feature name should not be null");
+        if (FEATURE_PROCESS_NAMESPACES.equals(name)) {
+            return processNamespaces;
+            //        } else if(FEATURE_REPORT_NAMESPACE_ATTRIBUTES.equals(name)) {
+            //            return reportNsAttribs;
+        } else if (FEATURE_NAMES_INTERNED.equals(name)) {
+            return false;
+        } else if (FEATURE_PROCESS_DOCDECL.equals(name)) {
+            return false;
+            //} else if(REPORT_DOCDECL.equals(name)) {
+            //    return paramNotifyDoctype;
+        } else if (FEATURE_XML_ROUNDTRIP.equals(name)) {
+            //return true;
+            return roundtripSupported;
+        }
+        return false;
+    }
+
+    public void setProperty(String name,
+                            Object value)
+            throws XmlPullParserException {
+        if (PROPERTY_LOCATION.equals(name)) {
+            location = (String) value;
+        } else {
+            throw new XmlPullParserException("unsupported property: '" + name + "'");
+        }
+    }
+
+
+    public Object getProperty(String name) {
+        if (name == null) throw new IllegalArgumentException("property name should not be null");
+        if (PROPERTY_XMLDECL_VERSION.equals(name)) {
+            return xmlDeclVersion;
+        } else if (PROPERTY_XMLDECL_STANDALONE.equals(name)) {
+            return xmlDeclStandalone;
+        } else if (PROPERTY_XMLDECL_CONTENT.equals(name)) {
+            return xmlDeclContent;
+        } else if (PROPERTY_LOCATION.equals(name)) {
+            return location;
+        }
+        return null;
+    }
+
+
+    public void setInput(Reader in) throws XmlPullParserException {
+        if (in == null) {
+            throw new IllegalArgumentException("input reader can not be null");
+        }
+        reset();
+        reader = in;
+    }
+
+    public void setInput(java.io.InputStream inputStream, String inputEncoding)
+            throws XmlPullParserException {
+        if (inputStream == null) {
+            throw new IllegalArgumentException("input stream can not be null");
+        }
+        reset();
+        try {
+            if (inputEncoding != null) {
+                this.reader = new InputStreamReader(inputStream, inputEncoding);
+                this.inputEncoding = inputEncoding;
+            } else {
+                XmlStreamReader xr = new XmlStreamReader(inputStream);
+                this.reader = xr;
+                this.inputEncoding = xr.getEncoding();
+            }
+        } catch (IOException une) {
+            throw new XmlPullParserException(
+                    "could not create reader for encoding " + inputEncoding + " : " + une, this, une);
+        }
+    }
+
+    public String getInputEncoding() {
+        return inputEncoding;
+    }
+
+    public void defineEntityReplacementText(String entityName,
+                                            String replacementText)
+            throws XmlPullParserException {
+        //      throw new XmlPullParserException("not allowed");
+
+        //protected char[] entityReplacement[];
+        ensureEntityCapacity();
+
+        // this is to make sure that if interning works we will take advantage of it ...
+        this.entityName[entityEnd] = newString(entityName.toCharArray(), 0, entityName.length());
+        entityNameBuf[entityEnd] = entityName.toCharArray();
+
+        entityReplacement[entityEnd] = replacementText;
+        entityReplacementBuf[entityEnd] = replacementText.toCharArray();
+        if (!allStringsInterned) {
+            entityNameHash[entityEnd] =
+                    fastHash(entityNameBuf[entityEnd], 0, entityNameBuf[entityEnd].length);
+        }
+        ++entityEnd;
+        //TODO disallow < or & in entity replacement text (or ]]>???)
+        // TOOD keepEntityNormalizedForAttributeValue cached as well ...
+    }
+
+    public int getNamespaceCount(int depth)
+            throws XmlPullParserException {
+        if (processNamespaces == false || depth == 0) {
+            return 0;
+        }
+        //int maxDepth = eventType == END_TAG ? this.depth + 1 : this.depth;
+        //if(depth < 0 || depth > maxDepth) throw new IllegalArgumentException(
+        if (depth < 0 || depth > this.depth) throw new IllegalArgumentException(
+                "allowed namespace depth 0.." + this.depth + " not " + depth);
+        return elNamespaceCount[depth];
+    }
+
+    public String getNamespacePrefix(int pos)
+            throws XmlPullParserException {
+
+        //int end = eventType == END_TAG ? elNamespaceCount[ depth + 1 ] : namespaceEnd;
+        //if(pos < end) {
+        if (pos < namespaceEnd) {
+            return namespacePrefix[pos];
+        } else {
+            throw new XmlPullParserException(
+                    "position " + pos + " exceeded number of available namespaces " + namespaceEnd);
+        }
+    }
+
+    public String getNamespaceUri(int pos) throws XmlPullParserException {
+        //int end = eventType == END_TAG ? elNamespaceCount[ depth + 1 ] : namespaceEnd;
+        //if(pos < end) {
+        if (pos < namespaceEnd) {
+            return namespaceUri[pos];
+        } else {
+            throw new XmlPullParserException(
+                    "position " + pos + " exceeded number of available namespaces " + namespaceEnd);
+        }
+    }
+
+    public String getNamespace(String prefix)
+    //throws XmlPullParserException
+    {
+        //int count = namespaceCount[ depth ];
+        if (prefix != null) {
+            for (int i = namespaceEnd - 1; i >= 0; i--) {
+                if (prefix.equals(namespacePrefix[i])) {
+                    return namespaceUri[i];
+                }
+            }
+            if ("xml".equals(prefix)) {
+                return XML_URI;
+            } else if ("xmlns".equals(prefix)) {
+                return XMLNS_URI;
+            }
+        } else {
+            for (int i = namespaceEnd - 1; i >= 0; i--) {
+                if (namespacePrefix[i] == null) { //"") { //null ) { //TODO check FIXME Alek
+                    return namespaceUri[i];
+                }
+            }
+
+        }
+        return null;
+    }
+
+
+    public int getDepth() {
+        return depth;
+    }
+
+
+    private static int findFragment(int bufMinPos, char[] b, int start, int end) {
+        //System.err.println("bufStart="+bufStart+" b="+printable(new String(b, start, end - start))+" start="+start+" end="+end);
+        if (start < bufMinPos) {
+            start = bufMinPos;
+            if (start > end) start = end;
+            return start;
+        }
+        if (end - start > 65) {
+            start = end - 10; // try to find good location
+        }
+        int i = start + 1;
+        while (--i > bufMinPos) {
+            if ((end - i) > 65) break;
+            final char c = b[i];
+            if (c == '<' && (start - i) > 10) break;
+        }
+        return i;
+    }
+
+
+    /**
+     * Return string describing current position of parsers as
+     * text 'STATE [seen %s...] @line:column'.
+     */
+    public String getPositionDescription() {
+        String fragment = null;
+        if (posStart <= pos) {
+            final int start = findFragment(0, buf, posStart, pos);
+            //System.err.println("start="+start);
+            if (start < pos) {
+                fragment = new String(buf, start, pos - start);
+            }
+            if (bufAbsoluteStart > 0 || start > 0) fragment = "..." + fragment;
+        }
+        //        return " at line "+tokenizerPosRow
+        //            +" and column "+(tokenizerPosCol-1)
+        //            +(fragment != null ? " seen "+printable(fragment)+"..." : "");
+        return " " + TYPES[eventType] +
+                (fragment != null ? " seen " + printable(fragment) + "..." : "")
+                + " " + (location != null ? location : "")
+                + "@" + getLineNumber() + ":" + getColumnNumber();
+    }
+
+    public int getLineNumber() {
+        return lineNumber;
+    }
+
+    public int getColumnNumber() {
+        return columnNumber;
+    }
+
+
+    public boolean isWhitespace() throws XmlPullParserException {
+        if (eventType == TEXT || eventType == CDSECT) {
+            if (usePC) {
+                for (int i = pcStart; i < pcEnd; i++) {
+                    if (!isS(pc[i])) return false;
+                }
+                return true;
+            } else {
+                for (int i = posStart; i < posEnd; i++) {
+                    if (!isS(buf[i])) return false;
+                }
+                return true;
+            }
+        } else if (eventType == IGNORABLE_WHITESPACE) {
+            return true;
+        }
+        throw new XmlPullParserException("no content available to check for white spaces");
+    }
+
+    public String getText() {
+        if (eventType == START_DOCUMENT || eventType == END_DOCUMENT) {
+            //throw new XmlPullParserException("no content available to read");
+            //      if(roundtripSupported) {
+            //          text = new String(buf, posStart, posEnd - posStart);
+            //      } else {
+            return null;
+            //      }
+        } else if (eventType == ENTITY_REF) {
+            return text;
+        }
+        if (text == null) {
+            if (!usePC || eventType == START_TAG || eventType == END_TAG) {
+                text = new String(buf, posStart, posEnd - posStart);
+            } else {
+                text = new String(pc, pcStart, pcEnd - pcStart);
+            }
+        }
+        return text;
+    }
+
+    public char[] getTextCharacters(int[] holderForStartAndLength) {
+        if (eventType == TEXT) {
+            if (usePC) {
+                holderForStartAndLength[0] = pcStart;
+                holderForStartAndLength[1] = pcEnd - pcStart;
+                return pc;
+            } else {
+                holderForStartAndLength[0] = posStart;
+                holderForStartAndLength[1] = posEnd - posStart;
+                return buf;
+
+            }
+        } else if (eventType == START_TAG
+                || eventType == END_TAG
+                || eventType == CDSECT
+                || eventType == COMMENT
+                || eventType == ENTITY_REF
+                || eventType == PROCESSING_INSTRUCTION
+                || eventType == IGNORABLE_WHITESPACE
+                || eventType == DOCDECL) {
+            holderForStartAndLength[0] = posStart;
+            holderForStartAndLength[1] = posEnd - posStart;
+            return buf;
+        } else if (eventType == START_DOCUMENT
+                || eventType == END_DOCUMENT) {
+            //throw new XmlPullParserException("no content available to read");
+            holderForStartAndLength[0] = holderForStartAndLength[1] = -1;
+            return null;
+        } else {
+            throw new IllegalArgumentException("unknown text eventType: " + eventType);
+        }
+        //      String s = getText();
+        //      char[] cb = null;
+        //      if(s!= null) {
+        //          cb = s.toCharArray();
+        //          holderForStartAndLength[0] = 0;
+        //          holderForStartAndLength[1] = s.length();
+        //      } else {
+        //      }
+        //      return cb;
+    }
+
+    public String getNamespace() {
+        if (eventType == START_TAG) {
+            //return processNamespaces ? elUri[ depth - 1 ] : NO_NAMESPACE;
+            return processNamespaces ? elUri[depth] : NO_NAMESPACE;
+        } else if (eventType == END_TAG) {
+            return processNamespaces ? elUri[depth] : NO_NAMESPACE;
+        }
+        return null;
+        //        String prefix = elPrefix[ maxDepth ];
+        //        if(prefix != null) {
+        //            for( int i = namespaceEnd -1; i >= 0; i--) {
+        //                if( prefix.equals( namespacePrefix[ i ] ) ) {
+        //                    return namespaceUri[ i ];
+        //                }
+        //            }
+        //        } else {
+        //            for( int i = namespaceEnd -1; i >= 0; i--) {
+        //                if( namespacePrefix[ i ]  == null ) {
+        //                    return namespaceUri[ i ];
+        //                }
+        //            }
+        //
+        //        }
+        //        return "";
+    }
+
+    public String getName() {
+        if (eventType == START_TAG) {
+            //return elName[ depth - 1 ] ;
+            return elName[depth];
+        } else if (eventType == END_TAG) {
+            return elName[depth];
+        } else if (eventType == ENTITY_REF) {
+            if (entityRefName == null) {
+                entityRefName = newString(buf, posStart, posEnd - posStart);
+            }
+            return entityRefName;
+        } else {
+            return null;
+        }
+    }
+
+    public String getPrefix() {
+        if (eventType == START_TAG) {
+            //return elPrefix[ depth - 1 ] ;
+            return elPrefix[depth];
+        } else if (eventType == END_TAG) {
+            return elPrefix[depth];
+        }
+        return null;
+        //        if(eventType != START_TAG && eventType != END_TAG) return null;
+        //        int maxDepth = eventType == END_TAG ? depth : depth - 1;
+        //        return elPrefix[ maxDepth ];
+    }
+
+
+    public boolean isEmptyElementTag() throws XmlPullParserException {
+        if (eventType != START_TAG) throw new XmlPullParserException(
+                "parser must be on START_TAG to check for empty element", this, null);
+        return emptyElementTag;
+    }
+
+    public int getAttributeCount() {
+        if (eventType != START_TAG) return -1;
+        return attributeCount;
+    }
+
+    public String getAttributeNamespace(int index) {
+        if (eventType != START_TAG) throw new IndexOutOfBoundsException(
+                "only START_TAG can have attributes");
+        if (processNamespaces == false) return NO_NAMESPACE;
+        if (index < 0 || index >= attributeCount) throw new IndexOutOfBoundsException(
+                "attribute position must be 0.." + (attributeCount - 1) + " and not " + index);
+        return attributeUri[index];
+    }
+
+    public String getAttributeName(int index) {
+        if (eventType != START_TAG) throw new IndexOutOfBoundsException(
+                "only START_TAG can have attributes");
+        if (index < 0 || index >= attributeCount) throw new IndexOutOfBoundsException(
+                "attribute position must be 0.." + (attributeCount - 1) + " and not " + index);
+        return attributeName[index];
+    }
+
+    public String getAttributePrefix(int index) {
+        if (eventType != START_TAG) throw new IndexOutOfBoundsException(
+                "only START_TAG can have attributes");
+        if (processNamespaces == false) return null;
+        if (index < 0 || index >= attributeCount) throw new IndexOutOfBoundsException(
+                "attribute position must be 0.." + (attributeCount - 1) + " and not " + index);
+        return attributePrefix[index];
+    }
+
+    public String getAttributeType(int index) {
+        if (eventType != START_TAG) throw new IndexOutOfBoundsException(
+                "only START_TAG can have attributes");
+        if (index < 0 || index >= attributeCount) throw new IndexOutOfBoundsException(
+                "attribute position must be 0.." + (attributeCount - 1) + " and not " + index);
+        return "CDATA";
+    }
+
+    public boolean isAttributeDefault(int index) {
+        if (eventType != START_TAG) throw new IndexOutOfBoundsException(
+                "only START_TAG can have attributes");
+        if (index < 0 || index >= attributeCount) throw new IndexOutOfBoundsException(
+                "attribute position must be 0.." + (attributeCount - 1) + " and not " + index);
+        return false;
+    }
+
+    public String getAttributeValue(int index) {
+        if (eventType != START_TAG) throw new IndexOutOfBoundsException(
+                "only START_TAG can have attributes");
+        if (index < 0 || index >= attributeCount) throw new IndexOutOfBoundsException(
+                "attribute position must be 0.." + (attributeCount - 1) + " and not " + index);
+        return attributeValue[index];
+    }
+
+    public String getAttributeValue(String namespace,
+                                    String name) {
+        if (eventType != START_TAG) throw new IndexOutOfBoundsException(
+                "only START_TAG can have attributes" + getPositionDescription());
+        if (name == null) {
+            throw new IllegalArgumentException("attribute name can not be null");
+        }
+        // TODO make check if namespace is interned!!! etc. for names!!!
+        if (processNamespaces) {
+            if (namespace == null) {
+                namespace = "";
+            }
+
+            for (int i = 0; i < attributeCount; ++i) {
+                if ((namespace == attributeUri[i] ||
+                        namespace.equals(attributeUri[i]))
+                        //(namespace != null && namespace.equals(attributeUri[ i ]))
+                        // taking advantage of String.intern()
+                        && name.equals(attributeName[i])) {
+                    return attributeValue[i];
+                }
+            }
+        } else {
+            if (namespace != null && namespace.length() == 0) {
+                namespace = null;
+            }
+            if (namespace != null) throw new IllegalArgumentException(
+                    "when namespaces processing is disabled attribute namespace must be null");
+            for (int i = 0; i < attributeCount; ++i) {
+                if (name.equals(attributeName[i])) {
+                    return attributeValue[i];
+                }
+            }
+        }
+        return null;
+    }
+
+
+    public int getEventType()
+            throws XmlPullParserException {
+        return eventType;
+    }
+
+    public void require(int type, String namespace, String name)
+            throws XmlPullParserException, IOException {
+        if (processNamespaces == false && namespace != null) {
+            throw new XmlPullParserException(
+                    "processing namespaces must be enabled on parser (or factory)" +
+                            " to have possible namespaces declared on elements"
+                            + (" (position:" + getPositionDescription()) + ")");
+        }
+        if (type != getEventType()
+                || (namespace != null && !namespace.equals(getNamespace()))
+                || (name != null && !name.equals(getName()))) {
+            throw new XmlPullParserException(
+                    "expected event " + TYPES[type]
+                            + (name != null ? " with name '" + name + "'" : "")
+                            + (namespace != null && name != null ? " and" : "")
+                            + (namespace != null ? " with namespace '" + namespace + "'" : "")
+                            + " but got"
+                            + (type != getEventType() ? " " + TYPES[getEventType()] : "")
+                            + (name != null && getName() != null && !name.equals(getName())
+                            ? " name '" + getName() + "'" : "")
+                            + (namespace != null && name != null
+                            && getName() != null && !name.equals(getName())
+                            && getNamespace() != null && !namespace.equals(getNamespace())
+                            ? " and" : "")
+                            + (namespace != null && getNamespace() != null && !namespace.equals(getNamespace())
+                            ? " namespace '" + getNamespace() + "'" : "")
+                            + (" (position:" + getPositionDescription()) + ")");
+        }
+    }
+
+
+    /**
+     * Skip sub tree that is currently parser positioned on.
+     * <br>NOTE: parser must be on START_TAG and when function returns
+     * parser will be positioned on corresponding END_TAG
+     */
+    public void skipSubTree()
+            throws XmlPullParserException, IOException {
+        require(START_TAG, null, null);
+        int level = 1;
+        while (level > 0) {
+            int eventType = next();
+            if (eventType == END_TAG) {
+                --level;
+            } else if (eventType == START_TAG) {
+                ++level;
+            }
+        }
+    }
+
+    //    public String readText() throws XmlPullParserException, IOException
+    //    {
+    //        if (getEventType() != TEXT) return "";
+    //        String result = getText();
+    //        next();
+    //        return result;
+    //    }
+
+    public String nextText() throws XmlPullParserException, IOException {
+        //        String result = null;
+        //        boolean onStartTag = false;
+        //        if(eventType == START_TAG) {
+        //            onStartTag = true;
+        //            next();
+        //        }
+        //        if(eventType == TEXT) {
+        //            result = getText();
+        //            next();
+        //        } else if(onStartTag && eventType == END_TAG) {
+        //            result = "";
+        //        } else {
+        //            throw new XmlPullParserException(
+        //                "parser must be on START_TAG or TEXT to read text", this, null);
+        //        }
+        //        if(eventType != END_TAG) {
+        //            throw new XmlPullParserException(
+        //                "event TEXT it must be immediately followed by END_TAG", this, null);
+        //        }
+        //        return result;
+        if (getEventType() != START_TAG) {
+            throw new XmlPullParserException(
+                    "parser must be on START_TAG to read next text", this, null);
+        }
+        int eventType = next();
+        if (eventType == TEXT) {
+            final String result = getText();
+            eventType = next();
+            if (eventType != END_TAG) {
+                throw new XmlPullParserException(
+                        "TEXT must be immediately followed by END_TAG and not "
+                                + TYPES[getEventType()], this, null);
+            }
+            return result;
+        } else if (eventType == END_TAG) {
+            return "";
+        } else {
+            throw new XmlPullParserException(
+                    "parser must be on START_TAG or TEXT to read text", this, null);
+        }
+    }
+
+    public int nextTag() throws XmlPullParserException, IOException {
+        next();
+        if (eventType == TEXT && isWhitespace()) {  // skip whitespace
+            next();
+        }
+        if (eventType != START_TAG && eventType != END_TAG) {
+            throw new XmlPullParserException("expected START_TAG or END_TAG not "
+                    + TYPES[getEventType()], this, null);
+        }
+        return eventType;
+    }
+
+    public int next()
+            throws XmlPullParserException, IOException {
+        tokenize = false;
+        return nextImpl();
+    }
+
+    public int nextToken()
+            throws XmlPullParserException, IOException {
+        tokenize = true;
+        return nextImpl();
+    }
+
+
+    protected int nextImpl()
+            throws XmlPullParserException, IOException {
+        text = null;
+        pcEnd = pcStart = 0;
+        usePC = false;
+        bufStart = posEnd;
+        if (pastEndTag) {
+            pastEndTag = false;
+            --depth;
+            namespaceEnd = elNamespaceCount[depth]; // less namespaces available
+        }
+        if (emptyElementTag) {
+            emptyElementTag = false;
+            pastEndTag = true;
+            return eventType = END_TAG;
+        }
+
+        // [1] document ::= prolog element Misc*
+        if (depth > 0) {
+
+            if (seenStartTag) {
+                seenStartTag = false;
+                return eventType = parseStartTag();
+            }
+            if (seenEndTag) {
+                seenEndTag = false;
+                return eventType = parseEndTag();
+            }
+
+            // ASSUMPTION: we are _on_ first character of content or markup!!!!
+            // [43] content ::= CharData? ((element | Reference | CDSect | PI | Comment) CharData?)*
+            char ch;
+            if (seenMarkup) {  // we have read ahead ...
+                seenMarkup = false;
+                ch = '<';
+            } else if (seenAmpersand) {
+                seenAmpersand = false;
+                ch = '&';
+            } else {
+                ch = more();
+            }
+            posStart = pos - 1; // VERY IMPORTANT: this is correct start of event!!!
+
+            // when true there is some potential event TEXT to return - keep gathering
+            boolean hadCharData = false;
+
+            // when true TEXT data is not continual (like <![CDATA[text]]>) and requires PC merging
+            boolean needsMerging = false;
+
+            MAIN_LOOP:
+            while (true) {
+                // work on MARKUP
+                if (ch == '<') {
+                    if (hadCharData) {
+                        //posEnd = pos - 1;
+                        if (tokenize) {
+                            seenMarkup = true;
+                            return eventType = TEXT;
+                        }
+                    }
+                    ch = more();
+                    if (ch == '/') {
+                        if (!tokenize && hadCharData) {
+                            seenEndTag = true;
+                            //posEnd = pos - 2;
+                            return eventType = TEXT;
+                        }
+                        return eventType = parseEndTag();
+                    } else if (ch == '!') {
+                        ch = more();
+                        if (ch == '-') {
+                            // note: if(tokenize == false) posStart/End is NOT changed!!!!
+                            parseComment();
+                            if (tokenize) return eventType = COMMENT;
+                            if (!usePC && hadCharData) {
+                                needsMerging = true;
+                            } else {
+                                posStart = pos;  //completely ignore comment
+                            }
+                        } else if (ch == '[') {
+                            //posEnd = pos - 3;
+                            // must remember previous posStart/End as it merges with content of CDATA
+                            //int oldStart = posStart + bufAbsoluteStart;
+                            //int oldEnd = posEnd + bufAbsoluteStart;
+                            parseCDSect(hadCharData);
+                            if (tokenize) return eventType = CDSECT;
+                            final int cdStart = posStart;
+                            final int cdEnd = posEnd;
+                            final int cdLen = cdEnd - cdStart;
+
+
+                            if (cdLen > 0) { // was there anything inside CDATA section?
+                                hadCharData = true;
+                                if (!usePC) {
+                                    needsMerging = true;
+                                }
+                            }
+
+                            //                          posStart = oldStart;
+                            //                          posEnd = oldEnd;
+                            //                          if(cdLen > 0) { // was there anything inside CDATA section?
+                            //                              if(hadCharData) {
+                            //                                  // do merging if there was anything in CDSect!!!!
+                            //                                  //                                    if(!usePC) {
+                            //                                  //                                        // posEnd is correct already!!!
+                            //                                  //                                        if(posEnd > posStart) {
+                            //                                  //                                            joinPC();
+                            //                                  //                                        } else {
+                            //                                  //                                            usePC = true;
+                            //                                  //                                            pcStart = pcEnd = 0;
+                            //                                  //                                        }
+                            //                                  //                                    }
+                            //                                  //                                    if(pcEnd + cdLen >= pc.length) ensurePC(pcEnd + cdLen);
+                            //                                  //                                    // copy [cdStart..cdEnd) into PC
+                            //                                  //                                    System.arraycopy(buf, cdStart, pc, pcEnd, cdLen);
+                            //                                  //                                    pcEnd += cdLen;
+                            //                                  if(!usePC) {
+                            //                                      needsMerging = true;
+                            //                                      posStart = cdStart;
+                            //                                      posEnd = cdEnd;
+                            //                                  }
+                            //                              } else {
+                            //                                  if(!usePC) {
+                            //                                      needsMerging = true;
+                            //                                      posStart = cdStart;
+                            //                                      posEnd = cdEnd;
+                            //                                      hadCharData = true;
+                            //                                  }
+                            //                              }
+                            //                              //hadCharData = true;
+                            //                          } else {
+                            //                              if( !usePC && hadCharData ) {
+                            //                                  needsMerging = true;
+                            //                              }
+                            //                          }
+                        } else {
+                            throw new XmlPullParserException(
+                                    "unexpected character in markup " + printable(ch), this, null);
+                        }
+                    } else if (ch == '?') {
+                        parsePI();
+                        if (tokenize) return eventType = PROCESSING_INSTRUCTION;
+                        if (!usePC && hadCharData) {
+                            needsMerging = true;
+                        } else {
+                            posStart = pos;  //completely ignore PI
+                        }
+
+                    } else if (isNameStartChar(ch)) {
+                        if (!tokenize && hadCharData) {
+                            seenStartTag = true;
+                            //posEnd = pos - 2;
+                            return eventType = TEXT;
+                        }
+                        return eventType = parseStartTag();
+                    } else {
+                        throw new XmlPullParserException(
+                                "unexpected character in markup " + printable(ch), this, null);
+                    }
+                    // do content compaction if it makes sense!!!!
+
+                } else if (ch == '&') {
+                    // work on ENTITTY
+                    //posEnd = pos - 1;
+                    if (tokenize && hadCharData) {
+                        seenAmpersand = true;
+                        return eventType = TEXT;
+                    }
+                    final int oldStart = posStart + bufAbsoluteStart;
+                    final int oldEnd = posEnd + bufAbsoluteStart;
+                    final char[] resolvedEntity = parseEntityRef();
+                    if (tokenize) return eventType = ENTITY_REF;
+                    // check if replacement text can be resolved !!!
+                    if (resolvedEntity == null) {
+                        if (entityRefName == null) {
+                            entityRefName = newString(buf, posStart, posEnd - posStart);
+                        }
+                        throw new XmlPullParserException(
+                                "could not resolve entity named '" + printable(entityRefName) + "'",
+                                this, null);
+                    }
+                    //int entStart = posStart;
+                    //int entEnd = posEnd;
+                    posStart = oldStart - bufAbsoluteStart;
+                    posEnd = oldEnd - bufAbsoluteStart;
+                    if (!usePC) {
+                        if (hadCharData) {
+                            joinPC(); // posEnd is already set correctly!!!
+                            needsMerging = false;
+                        } else {
+                            usePC = true;
+                            pcStart = pcEnd = 0;
+                        }
+                    }
+                    //assert usePC == true;
+                    // write into PC replacement text - do merge for replacement text!!!!
+                    for (int i = 0; i < resolvedEntity.length; i++) {
+                        if (pcEnd >= pc.length) ensurePC(pcEnd);
+                        pc[pcEnd++] = resolvedEntity[i];
+
+                    }
+                    hadCharData = true;
+                    //assert needsMerging == false;
+                } else {
+
+                    if (needsMerging) {
+                        //assert usePC == false;
+                        joinPC();  // posEnd is already set correctly!!!
+                        //posStart = pos  -  1;
+                        needsMerging = false;
+                    }
+
+
+                    //no MARKUP not ENTITIES so work on character data ...
+
+
+                    // [14] CharData ::=   [^<&]* - ([^<&]* ']]>' [^<&]*)
+
+
+                    hadCharData = true;
+
+                    boolean normalizedCR = false;
+                    final boolean normalizeInput = tokenize == false || roundtripSupported == false;
+                    // use loop locality here!!!!
+                    boolean seenBracket = false;
+                    boolean seenBracketBracket = false;
+                    do {
+
+                        // check that ]]> does not show in
+                        if (ch == ']') {
+                            if (seenBracket) {
+                                seenBracketBracket = true;
+                            } else {
+                                seenBracket = true;
+                            }
+                        } else if (seenBracketBracket && ch == '>') {
+                            throw new XmlPullParserException(
+                                    "characters ]]> are not allowed in content", this, null);
+                        } else {
+                            if (seenBracket) {
+                                seenBracketBracket = seenBracket = false;
+                            }
+                            // assert seenTwoBrackets == seenBracket == false;
+                        }
+                        if (normalizeInput) {
+                            // deal with normalization issues ...
+                            if (ch == '\r') {
+                                normalizedCR = true;
+                                posEnd = pos - 1;
+                                // posEnd is already is set
+                                if (!usePC) {
+                                    if (posEnd > posStart) {
+                                        joinPC();
+                                    } else {
+                                        usePC = true;
+                                        pcStart = pcEnd = 0;
+                                    }
+                                }
+                                //assert usePC == true;
+                                if (pcEnd >= pc.length) ensurePC(pcEnd);
+                                pc[pcEnd++] = '\n';
+                            } else if (ch == '\n') {
+                                //   if(!usePC) {  joinPC(); } else { if(pcEnd >= pc.length) ensurePC(); }
+                                if (!normalizedCR && usePC) {
+                                    if (pcEnd >= pc.length) ensurePC(pcEnd);
+                                    pc[pcEnd++] = '\n';
+                                }
+                                normalizedCR = false;
+                            } else {
+                                if (usePC) {
+                                    if (pcEnd >= pc.length) ensurePC(pcEnd);
+                                    pc[pcEnd++] = ch;
+                                }
+                                normalizedCR = false;
+                            }
+                        }
+
+                        ch = more();
+                    } while (ch != '<' && ch != '&');
+                    posEnd = pos - 1;
+                    continue MAIN_LOOP;  // skip ch = more() from below - we are alreayd ahead ...
+                }
+                ch = more();
+            } // endless while(true)
+        } else {
+            if (seenRoot) {
+                return parseEpilog();
+            } else {
+                return parseProlog();
+            }
+        }
+    }
+
+
+    protected int parseProlog()
+            throws XmlPullParserException, IOException {
+        // [2] prolog: ::= XMLDecl? Misc* (doctypedecl Misc*)? and look for [39] element
+
+        char ch;
+        if (seenMarkup) {
+            ch = buf[pos - 1];
+        } else {
+            ch = more();
+        }
+
+        if (eventType == START_DOCUMENT) {
+            // bootstrap parsing with getting first character input!
+            // deal with BOM
+            // detect BOM and drop it (Unicode int Order Mark)
+            if (ch == '\uFFFE') {
+                throw new XmlPullParserException(
+                        "first character in input was UNICODE noncharacter (0xFFFE)" +
+                                "- input requires int swapping", this, null);
+            }
+            if (ch == '\uFEFF') {
+                // skipping UNICODE int Order Mark (so called BOM)
+                ch = more();
+            }
+        }
+        seenMarkup = false;
+        boolean gotS = false;
+        posStart = pos - 1;
+        final boolean normalizeIgnorableWS = tokenize == true && roundtripSupported == false;
+        boolean normalizedCR = false;
+        while (true) {
+            // deal with Misc
+            // [27] Misc ::= Comment | PI | S
+            // deal with docdecl --> mark it!
+            // else parseStartTag seen <[^/]
+            if (ch == '<') {
+                if (gotS && tokenize) {
+                    posEnd = pos - 1;
+                    seenMarkup = true;
+                    return eventType = IGNORABLE_WHITESPACE;
+                }
+                ch = more();
+                if (ch == '?') {
+                    // check if it is 'xml'
+                    // deal with XMLDecl
+                    if (parsePI()) {  // make sure to skip XMLDecl
+                        if (tokenize) {
+                            return eventType = PROCESSING_INSTRUCTION;
+                        }
+                    } else {
+                        // skip over - continue tokenizing
+                        posStart = pos;
+                        gotS = false;
+                    }
+
+                } else if (ch == '!') {
+                    ch = more();
+                    if (ch == 'D') {
+                        if (seenDocdecl) {
+                            throw new XmlPullParserException(
+                                    "only one docdecl allowed in XML document", this, null);
+                        }
+                        seenDocdecl = true;
+                        parseDocdecl();
+                        if (tokenize) return eventType = DOCDECL;
+                    } else if (ch == '-') {
+                        parseComment();
+                        if (tokenize) return eventType = COMMENT;
+                    } else {
+                        throw new XmlPullParserException(
+                                "unexpected markup <!" + printable(ch), this, null);
+                    }
+                } else if (ch == '/') {
+                    throw new XmlPullParserException(
+                            "expected start tag name and not " + printable(ch), this, null);
+                } else if (isNameStartChar(ch)) {
+                    seenRoot = true;
+                    return parseStartTag();
+                } else {
+                    throw new XmlPullParserException(
+                            "expected start tag name and not " + printable(ch), this, null);
+                }
+            } else if (isS(ch)) {
+                gotS = true;
+                if (normalizeIgnorableWS) {
+                    if (ch == '\r') {
+                        normalizedCR = true;
+                        //posEnd = pos -1;
+                        //joinPC();
+                        // posEnd is already is set
+                        if (!usePC) {
+                            posEnd = pos - 1;
+                            if (posEnd > posStart) {
+                                joinPC();
+                            } else {
+                                usePC = true;
+                                pcStart = pcEnd = 0;
+                            }
+                        }
+                        //assert usePC == true;
+                        if (pcEnd >= pc.length) ensurePC(pcEnd);
+                        pc[pcEnd++] = '\n';
+                    } else if (ch == '\n') {
+                        if (!normalizedCR && usePC) {
+                            if (pcEnd >= pc.length) ensurePC(pcEnd);
+                            pc[pcEnd++] = '\n';
+                        }
+                        normalizedCR = false;
+                    } else {
+                        if (usePC) {
+                            if (pcEnd >= pc.length) ensurePC(pcEnd);
+                            pc[pcEnd++] = ch;
+                        }
+                        normalizedCR = false;
+                    }
+                }
+            } else {
+                throw new XmlPullParserException(
+                        "only whitespace content allowed before start tag and not " + printable(ch),
+                        this, null);
+            }
+            ch = more();
+        }
+    }
+
+    protected int parseEpilog()
+            throws XmlPullParserException, IOException {
+        if (eventType == END_DOCUMENT) {
+            throw new XmlPullParserException("already reached end of XML input", this, null);
+        }
+        if (reachedEnd) {
+            return eventType = END_DOCUMENT;
+        }
+        boolean gotS = false;
+        final boolean normalizeIgnorableWS = tokenize == true && roundtripSupported == false;
+        boolean normalizedCR = false;
+        try {
+            // epilog: Misc*
+            char ch;
+            if (seenMarkup) {
+                ch = buf[pos - 1];
+            } else {
+                ch = more();
+            }
+            seenMarkup = false;
+            posStart = pos - 1;
+            if (!reachedEnd) {
+                while (true) {
+                    // deal with Misc
+                    // [27] Misc ::= Comment | PI | S
+                    if (ch == '<') {
+                        if (gotS && tokenize) {
+                            posEnd = pos - 1;
+                            seenMarkup = true;
+                            return eventType = IGNORABLE_WHITESPACE;
+                        }
+                        ch = more();
+                        if (reachedEnd) {
+                            break;
+                        }
+                        if (ch == '?') {
+                            // check if it is 'xml'
+                            // deal with XMLDecl
+                            parsePI();
+                            if (tokenize) return eventType = PROCESSING_INSTRUCTION;
+
+                        } else if (ch == '!') {
+                            ch = more();
+                            if (reachedEnd) {
+                                break;
+                            }
+                            if (ch == 'D') {
+                                parseDocdecl(); //FIXME
+                                if (tokenize) return eventType = DOCDECL;
+                            } else if (ch == '-') {
+                                parseComment();
+                                if (tokenize) return eventType = COMMENT;
+                            } else {
+                                throw new XmlPullParserException(
+                                        "unexpected markup <!" + printable(ch), this, null);
+                            }
+                        } else if (ch == '/') {
+                            throw new XmlPullParserException(
+                                    "end tag not allowed in epilog but got " + printable(ch), this, null);
+                        } else if (isNameStartChar(ch)) {
+                            throw new XmlPullParserException(
+                                    "start tag not allowed in epilog but got " + printable(ch), this, null);
+                        } else {
+                            throw new XmlPullParserException(
+                                    "in epilog expected ignorable content and not " + printable(ch),
+                                    this, null);
+                        }
+                    } else if (isS(ch)) {
+                        gotS = true;
+                        if (normalizeIgnorableWS) {
+                            if (ch == '\r') {
+                                normalizedCR = true;
+                                //posEnd = pos -1;
+                                //joinPC();
+                                // posEnd is alreadys set
+                                if (!usePC) {
+                                    posEnd = pos - 1;
+                                    if (posEnd > posStart) {
+                                        joinPC();
+                                    } else {
+                                        usePC = true;
+                                        pcStart = pcEnd = 0;
+                                    }
+                                }
+                                //assert usePC == true;
+                                if (pcEnd >= pc.length) ensurePC(pcEnd);
+                                pc[pcEnd++] = '\n';
+                            } else if (ch == '\n') {
+                                if (!normalizedCR && usePC) {
+                                    if (pcEnd >= pc.length) ensurePC(pcEnd);
+                                    pc[pcEnd++] = '\n';
+                                }
+                                normalizedCR = false;
+                            } else {
+                                if (usePC) {
+                                    if (pcEnd >= pc.length) ensurePC(pcEnd);
+                                    pc[pcEnd++] = ch;
+                                }
+                                normalizedCR = false;
+                            }
+                        }
+                    } else {
+                        throw new XmlPullParserException(
+                                "in epilog non whitespace content is not allowed but got " + printable(ch),
+                                this, null);
+                    }
+                    ch = more();
+                    if (reachedEnd) {
+                        break;
+                    }
+
+                }
+            }
+
+            // throw Exception("unexpected content in epilog
+            // catch EOFException return END_DOCUEMENT
+            //try {
+        } catch (EOFException ex) {
+            reachedEnd = true;
+        }
+        if (reachedEnd) {
+            if (tokenize && gotS) {
+                posEnd = pos; // well - this is LAST available character pos
+                return eventType = IGNORABLE_WHITESPACE;
+            }
+            return eventType = END_DOCUMENT;
+        } else {
+            throw new XmlPullParserException("internal error in parseEpilog");
+        }
+    }
+
+
+    public int parseEndTag() throws XmlPullParserException, IOException {
+        //ASSUMPTION ch is past "</"
+        // [42] ETag ::=  '</' Name S? '>'
+        char ch = more();
+        if (!isNameStartChar(ch)) {
+            throw new XmlPullParserException(
+                    "expected name start and not " + printable(ch), this, null);
+        }
+        posStart = pos - 3;
+        final int nameStart = pos - 1 + bufAbsoluteStart;
+        do {
+            ch = more();
+        } while (isNameChar(ch));
+
+        // now we go one level down -- do checks
+        //--depth;  //FIXME
+
+        // check that end tag name is the same as start tag
+        //String name = new String(buf, nameStart - bufAbsoluteStart,
+        //                           (pos - 1) - (nameStart - bufAbsoluteStart));
+        //int last = pos - 1;
+        int off = nameStart - bufAbsoluteStart;
+        //final int len = last - off;
+        final int len = (pos - 1) - off;
+        final char[] cbuf = elRawName[depth];
+        if (elRawNameEnd[depth] != len) {
+            // construct strings for exception
+            final String startname = new String(cbuf, 0, elRawNameEnd[depth]);
+            final String endname = new String(buf, off, len);
+            throw new XmlPullParserException(
+                    "end tag name </" + endname + "> must match start tag name <" + startname + ">"
+                            + " from line " + elRawNameLine[depth], this, null);
+        }
+        for (int i = 0; i < len; i++) {
+            if (buf[off++] != cbuf[i]) {
+                // construct strings for exception
+                final String startname = new String(cbuf, 0, len);
+                final String endname = new String(buf, off - i - 1, len);
+                throw new XmlPullParserException(
+                        "end tag name </" + endname + "> must be the same as start tag <" + startname + ">"
+                                + " from line " + elRawNameLine[depth], this, null);
+            }
+        }
+
+        while (isS(ch)) {
+            ch = more();
+        } // skip additional white spaces
+        if (ch != '>') {
+            throw new XmlPullParserException(
+                    "expected > to finish end tag not " + printable(ch)
+                            + " from line " + elRawNameLine[depth], this, null);
+        }
+
+
+        //namespaceEnd = elNamespaceCount[ depth ]; //FIXME
+
+        posEnd = pos;
+        pastEndTag = true;
+        return eventType = END_TAG;
+    }
+
+    public int parseStartTag() throws XmlPullParserException, IOException {
+        //ASSUMPTION ch is past <T
+        // [40] STag ::=  '<' Name (S Attribute)* S? '>'
+        // [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>'
+        ++depth; //FIXME
+
+        posStart = pos - 2;
+
+        emptyElementTag = false;
+        attributeCount = 0;
+        // retrieve name
+        final int nameStart = pos - 1 + bufAbsoluteStart;
+        int colonPos = -1;
+        char ch = buf[pos - 1];
+        if (ch == ':' && processNamespaces) throw new XmlPullParserException(
+                "when namespaces processing enabled colon can not be at element name start",
+                this, null);
+        while (true) {
+            ch = more();
+            if (!isNameChar(ch)) break;
+            if (ch == ':' && processNamespaces) {
+                if (colonPos != -1) throw new XmlPullParserException(
+                        "only one colon is allowed in name of element when namespaces are enabled",
+                        this, null);
+                colonPos = pos - 1 + bufAbsoluteStart;
+            }
+        }
+
+        // retrieve name
+        ensureElementsCapacity();
+
+
+        //TODO check for efficient interning and then use elRawNameInterned!!!!
+
+        int elLen = (pos - 1) - (nameStart - bufAbsoluteStart);
+        if (elRawName[depth] == null || elRawName[depth].length < elLen) {
+            elRawName[depth] = new char[2 * elLen];
+        }
+        System.arraycopy(buf, nameStart - bufAbsoluteStart, elRawName[depth], 0, elLen);
+        elRawNameEnd[depth] = elLen;
+        elRawNameLine[depth] = lineNumber;
+
+        String name = null;
+
+        // work on prefixes and namespace URI
+        String prefix = null;
+        if (processNamespaces) {
+            if (colonPos != -1) {
+                prefix = elPrefix[depth] = newString(buf, nameStart - bufAbsoluteStart,
+                        colonPos - nameStart);
+                name = elName[depth] = newString(buf, colonPos + 1 - bufAbsoluteStart,
+                        //(pos -1) - (colonPos + 1));
+                        pos - 2 - (colonPos - bufAbsoluteStart));
+            } else {
+                prefix = elPrefix[depth] = null;
+                name = elName[depth] = newString(buf, nameStart - bufAbsoluteStart, elLen);
+            }
+        } else {
+
+            name = elName[depth] = newString(buf, nameStart - bufAbsoluteStart, elLen);
+
+        }
+
+
+        while (true) {
+
+            while (isS(ch)) {
+                ch = more();
+            } // skip additional white spaces
+
+            if (ch == '>') {
+                break;
+            } else if (ch == '/') {
+                if (emptyElementTag) throw new XmlPullParserException(
+                        "repeated / in tag declaration", this, null);
+                emptyElementTag = true;
+                ch = more();
+                if (ch != '>') throw new XmlPullParserException(
+                        "expected > to end empty tag not " + printable(ch), this, null);
+                break;
+            } else if (isNameStartChar(ch)) {
+                ch = parseAttribute();
+                ch = more();
+                continue;
+            } else {
+                throw new XmlPullParserException(
+                        "start tag unexpected character " + printable(ch), this, null);
+            }
+            //ch = more(); // skip space
+        }
+
+        // now when namespaces were declared we can resolve them
+        if (processNamespaces) {
+            String uri = getNamespace(prefix);
+            if (uri == null) {
+                if (prefix == null) { // no prefix and no uri => use default namespace
+                    uri = NO_NAMESPACE;
+                } else {
+                    throw new XmlPullParserException(
+                            "could not determine namespace bound to element prefix " + prefix,
+                            this, null);
+                }
+
+            }
+            elUri[depth] = uri;
+
+
+            //String uri = getNamespace(prefix);
+            //if(uri == null && prefix == null) { // no prefix and no uri => use default namespace
+            //  uri = "";
+            //}
+            // resolve attribute namespaces
+            for (int i = 0; i < attributeCount; i++) {
+                final String attrPrefix = attributePrefix[i];
+                if (attrPrefix != null) {
+                    final String attrUri = getNamespace(attrPrefix);
+                    if (attrUri == null) {
+                        throw new XmlPullParserException(
+                                "could not determine namespace bound to attribute prefix " + attrPrefix,
+                                this, null);
+
+                    }
+                    attributeUri[i] = attrUri;
+                } else {
+                    attributeUri[i] = NO_NAMESPACE;
+                }
+            }
+
+            //TODO
+            //[ WFC: Unique Att Spec ]
+            // check attribute uniqueness constraint for attributes that has namespace!!!
+
+            for (int i = 1; i < attributeCount; i++) {
+                for (int j = 0; j < i; j++) {
+                    if (attributeUri[j] == attributeUri[i]
+                            && (allStringsInterned && attributeName[j].equals(attributeName[i])
+                            || (!allStringsInterned
+                            && attributeNameHash[j] == attributeNameHash[i]
+                            && attributeName[j].equals(attributeName[i])))
+
+                    ) {
+                        // prepare data for nice error message?
+                        String attr1 = attributeName[j];
+                        if (attributeUri[j] != null) attr1 = attributeUri[j] + ":" + attr1;
+                        String attr2 = attributeName[i];
+                        if (attributeUri[i] != null) attr2 = attributeUri[i] + ":" + attr2;
+                        throw new XmlPullParserException(
+                                "duplicated attributes " + attr1 + " and " + attr2, this, null);
+                    }
+                }
+            }
+
+
+        } else { // ! processNamespaces
+
+            //[ WFC: Unique Att Spec ]
+            // check raw attribute uniqueness constraint!!!
+            for (int i = 1; i < attributeCount; i++) {
+                for (int j = 0; j < i; j++) {
+                    if ((allStringsInterned && attributeName[j].equals(attributeName[i])
+                            || (!allStringsInterned
+                            && attributeNameHash[j] == attributeNameHash[i]
+                            && attributeName[j].equals(attributeName[i])))
+
+                    ) {
+                        // prepare data for nice error message?
+                        final String attr1 = attributeName[j];
+                        final String attr2 = attributeName[i];
+                        throw new XmlPullParserException(
+                                "duplicated attributes " + attr1 + " and " + attr2, this, null);
+                    }
+                }
+            }
+        }
+
+        elNamespaceCount[depth] = namespaceEnd;
+        posEnd = pos;
+        return eventType = START_TAG;
+    }
+
+    protected char parseAttribute() throws XmlPullParserException, IOException {
+        // parse attribute
+        // [41] Attribute ::= Name Eq AttValue
+        // [WFC: No External Entity References]
+        // [WFC: No < in Attribute Values]
+        final int prevPosStart = posStart + bufAbsoluteStart;
+        final int nameStart = pos - 1 + bufAbsoluteStart;
+        int colonPos = -1;
+        char ch = buf[pos - 1];
+        if (ch == ':' && processNamespaces) throw new XmlPullParserException(
+                "when namespaces processing enabled colon can not be at attribute name start",
+                this, null);
+
+
+        boolean startsWithXmlns = processNamespaces && ch == 'x';
+        int xmlnsPos = 0;
+
+        ch = more();
+        while (isNameChar(ch)) {
+            if (processNamespaces) {
+                if (startsWithXmlns && xmlnsPos < 5) {
+                    ++xmlnsPos;
+                    if (xmlnsPos == 1) {
+                        if (ch != 'm') startsWithXmlns = false;
+                    } else if (xmlnsPos == 2) {
+                        if (ch != 'l') startsWithXmlns = false;
+                    } else if (xmlnsPos == 3) {
+                        if (ch != 'n') startsWithXmlns = false;
+                    } else if (xmlnsPos == 4) {
+                        if (ch != 's') startsWithXmlns = false;
+                    } else {
+                        if (ch != ':') throw new XmlPullParserException(
+                                "after xmlns in attribute name must be colon"
+                                        + " when namespaces are enabled", this, null);
+                        //colonPos = pos - 1 + bufAbsoluteStart;
+                    }
+                }
+                if (ch == ':') {
+                    if (colonPos != -1) throw new XmlPullParserException(
+                            "only one colon is allowed in attribute name"
+                                    + " when namespaces are enabled", this, null);
+                    colonPos = pos - 1 + bufAbsoluteStart;
+                }
+            }
+            ch = more();
+        }
+
+        ensureAttributesCapacity(attributeCount);
+
+        // --- start processing attributes
+        String name = null;
+        String prefix = null;
+        // work on prefixes and namespace URI
+        if (processNamespaces) {
+            if (xmlnsPos < 4) startsWithXmlns = false;
+            if (startsWithXmlns) {
+                if (colonPos != -1) {
+                    //prefix = attributePrefix[ attributeCount ] = null;
+                    final int nameLen = pos - 2 - (colonPos - bufAbsoluteStart);
+                    if (nameLen == 0) {
+                        throw new XmlPullParserException(
+                                "namespace prefix is required after xmlns: "
+                                        + " when namespaces are enabled", this, null);
+                    }
+                    name = //attributeName[ attributeCount ] =
+                            newString(buf, colonPos - bufAbsoluteStart + 1, nameLen);
+                    //pos - 1 - (colonPos + 1 - bufAbsoluteStart)
+                }
+            } else {
+                if (colonPos != -1) {
+                    int prefixLen = colonPos - nameStart;
+                    prefix = attributePrefix[attributeCount] =
+                            newString(buf, nameStart - bufAbsoluteStart, prefixLen);
+                    //colonPos - (nameStart - bufAbsoluteStart));
+                    int nameLen = pos - 2 - (colonPos - bufAbsoluteStart);
+                    name = attributeName[attributeCount] =
+                            newString(buf, colonPos - bufAbsoluteStart + 1, nameLen);
+                    //pos - 1 - (colonPos + 1 - bufAbsoluteStart));
+
+                    //name.substring(0, colonPos-nameStart);
+                } else {
+                    prefix = attributePrefix[attributeCount] = null;
+                    name = attributeName[attributeCount] =
+                            newString(buf, nameStart - bufAbsoluteStart,
+                                    pos - 1 - (nameStart - bufAbsoluteStart));
+                }
+                if (!allStringsInterned) {
+                    attributeNameHash[attributeCount] = name.hashCode();
+                }
+            }
+
+        } else {
+            // retrieve name
+            name = attributeName[attributeCount] =
+                    newString(buf, nameStart - bufAbsoluteStart,
+                            pos - 1 - (nameStart - bufAbsoluteStart));
+            ////assert name != null;
+            if (!allStringsInterned) {
+                attributeNameHash[attributeCount] = name.hashCode();
+            }
+        }
+
+        // [25] Eq ::=  S? '=' S?
+        while (isS(ch)) {
+            ch = more();
+        } // skip additional spaces
+        if (ch != '=') throw new XmlPullParserException(
+                "expected = after attribute name", this, null);
+        ch = more();
+        while (isS(ch)) {
+            ch = more();
+        } // skip additional spaces
+
+        // [10] AttValue ::=   '"' ([^<&"] | Reference)* '"'
+        //                  |  "'" ([^<&'] | Reference)* "'"
+        final char delimit = ch;
+        if (delimit != '"' && delimit != '\'') throw new XmlPullParserException(
+                "attribute value must start with quotation or apostrophe not "
+                        + printable(delimit), this, null);
+        // parse until delimit or < and resolve Reference
+        //[67] Reference ::= EntityRef | CharRef
+        //int valueStart = pos + bufAbsoluteStart;
+
+
+        boolean normalizedCR = false;
+        usePC = false;
+        pcStart = pcEnd;
+        posStart = pos;
+
+        while (true) {
+            ch = more();
+            if (ch == delimit) {
+                break;
+            }
+            if (ch == '<') {
+                throw new XmlPullParserException(
+                        "markup not allowed inside attribute value - illegal < ", this, null);
+            }
+            if (ch == '&') {
+                // extractEntityRef
+                posEnd = pos - 1;
+                if (!usePC) {
+                    final boolean hadCharData = posEnd > posStart;
+                    if (hadCharData) {
+                        // posEnd is already set correctly!!!
+                        joinPC();
+                    } else {
+                        usePC = true;
+                        pcStart = pcEnd = 0;
+                    }
+                }
+                //assert usePC == true;
+
+                final char[] resolvedEntity = parseEntityRef();
+                // check if replacement text can be resolved !!!
+                if (resolvedEntity == null) {
+                    if (entityRefName == null) {
+                        entityRefName = newString(buf, posStart, posEnd - posStart);
+                    }
+                    throw new XmlPullParserException(
+                            "could not resolve entity named '" + printable(entityRefName) + "'",
+                            this, null);
+                }
+                // write into PC replacement text - do merge for replacement text!!!!
+                for (int i = 0; i < resolvedEntity.length; i++) {
+                    if (pcEnd >= pc.length) ensurePC(pcEnd);
+                    pc[pcEnd++] = resolvedEntity[i];
+                }
+            } else if (ch == '\t' || ch == '\n' || ch == '\r') {
+                // do attribute value normalization
+                // as described in http://www.w3.org/TR/REC-xml#AVNormalize
+                // TODO add test for it form spec ...
+                // handle EOL normalization ...
+                if (!usePC) {
+                    posEnd = pos - 1;
+                    if (posEnd > posStart) {
+                        joinPC();
+                    } else {
+                        usePC = true;
+                        pcEnd = pcStart = 0;
+                    }
+                }
+                //assert usePC == true;
+                if (pcEnd >= pc.length) ensurePC(pcEnd);
+                if (ch != '\n' || !normalizedCR) {
+                    pc[pcEnd++] = ' '; //'\n';
+                }
+
+            } else {
+                if (usePC) {
+                    if (pcEnd >= pc.length) ensurePC(pcEnd);
+                    pc[pcEnd++] = ch;
+                }
+            }
+            normalizedCR = ch == '\r';
+        }
+
+
+        if (processNamespaces && startsWithXmlns) {
+            String ns = null;
+            if (!usePC) {
+                ns = newStringIntern(buf, posStart, pos - 1 - posStart);
+            } else {
+                ns = newStringIntern(pc, pcStart, pcEnd - pcStart);
+            }
+            ensureNamespacesCapacity(namespaceEnd);
+            int prefixHash = -1;
+            if (colonPos != -1) {
+                if (ns.length() == 0) {
+                    throw new XmlPullParserException(
+                            "non-default namespace can not be declared to be empty string", this, null);
+                }
+                // declare new namespace
+                namespacePrefix[namespaceEnd] = name;
+                if (!allStringsInterned) {
+                    prefixHash = namespacePrefixHash[namespaceEnd] = name.hashCode();
+                }
+            } else {
+                // declare  new default namespace ...
+                namespacePrefix[namespaceEnd] = null; //""; //null; //TODO check FIXME Alek
+                if (!allStringsInterned) {
+                    prefixHash = namespacePrefixHash[namespaceEnd] = -1;
+                }
+            }
+            namespaceUri[namespaceEnd] = ns;
+
+            // detect duplicate namespace declarations!!!
+            final int startNs = elNamespaceCount[depth - 1];
+            for (int i = namespaceEnd - 1; i >= startNs; --i) {
+                if (((allStringsInterned || name == null) && namespacePrefix[i] == name)
+                        || (!allStringsInterned && name != null &&
+                        namespacePrefixHash[i] == prefixHash
+                        && name.equals(namespacePrefix[i])
+                )) {
+                    final String s = name == null ? "default" : "'" + name + "'";
+                    throw new XmlPullParserException(
+                            "duplicated namespace declaration for " + s + " prefix", this, null);
+                }
+            }
+
+            ++namespaceEnd;
+
+        } else {
+            if (!usePC) {
+                attributeValue[attributeCount] =
+                        new String(buf, posStart, pos - 1 - posStart);
+            } else {
+                attributeValue[attributeCount] =
+                        new String(pc, pcStart, pcEnd - pcStart);
+            }
+            ++attributeCount;
+        }
+        posStart = prevPosStart - bufAbsoluteStart;
+        return ch;
+    }
+
+    protected char[] charRefOneCharBuf = new char[1];
+
+    protected char[] parseEntityRef()
+            throws XmlPullParserException, IOException {
+        // entity reference http://www.w3.org/TR/2000/REC-xml-20001006#NT-Reference
+        // [67] Reference          ::=          EntityRef | CharRef
+
+        // ASSUMPTION just after &
+        entityRefName = null;
+        posStart = pos;
+        char ch = more();
+        if (ch == '#') {
+            // parse character reference
+            char charRef = 0;
+            ch = more();
+            if (ch == 'x') {
+                //encoded in hex
+                while (true) {
+                    ch = more();
+                    if (ch >= '0' && ch <= '9') {
+                        charRef = (char) (charRef * 16 + (ch - '0'));
+                    } else if (ch >= 'a' && ch <= 'f') {
+                        charRef = (char) (charRef * 16 + (ch - ('a' - 10)));
+                    } else if (ch >= 'A' && ch <= 'F') {
+                        charRef = (char) (charRef * 16 + (ch - ('A' - 10)));
+                    } else if (ch == ';') {
+                        break;
+                    } else {
+                        throw new XmlPullParserException(
+                                "character reference (with hex value) may not contain "
+                                        + printable(ch), this, null);
+                    }
+                }
+            } else {
+                // encoded in decimal
+                while (true) {
+                    if (ch >= '0' && ch <= '9') {
+                        charRef = (char) (charRef * 10 + (ch - '0'));
+                    } else if (ch == ';') {
+                        break;
+                    } else {
+                        throw new XmlPullParserException(
+                                "character reference (with decimal value) may not contain "
+                                        + printable(ch), this, null);
+                    }
+                    ch = more();
+                }
+            }
+            posEnd = pos - 1;
+            charRefOneCharBuf[0] = charRef;
+            if (tokenize) {
+                text = newString(charRefOneCharBuf, 0, 1);
+            }
+            return charRefOneCharBuf;
+        } else {
+            // [68]     EntityRef          ::=          '&' Name ';'
+            // scan name until ;
+            if (!isNameStartChar(ch)) {
+                throw new XmlPullParserException(
+                        "entity reference names can not start with character '"
+                                + printable(ch) + "'", this, null);
+            }
+            while (true) {
+                ch = more();
+                if (ch == ';') {
+                    break;
+                }
+                if (!isNameChar(ch)) {
+                    throw new XmlPullParserException(
+                            "entity reference name can not contain character "
+                                    + printable(ch) + "'", this, null);
+                }
+            }
+            posEnd = pos - 1;
+            // determine what name maps to
+            final int len = posEnd - posStart;
+            if (len == 2 && buf[posStart] == 'l' && buf[posStart + 1] == 't') {
+                if (tokenize) {
+                    text = "<";
+                }
+                charRefOneCharBuf[0] = '<';
+                return charRefOneCharBuf;
+                //if(paramPC || isParserTokenizing) {
+                //    if(pcEnd >= pc.length) ensurePC();
+                //   pc[pcEnd++] = '<';
+                //}
+            } else if (len == 3 && buf[posStart] == 'a'
+                    && buf[posStart + 1] == 'm' && buf[posStart + 2] == 'p') {
+                if (tokenize) {
+                    text = "&";
+                }
+                charRefOneCharBuf[0] = '&';
+                return charRefOneCharBuf;
+            } else if (len == 2 && buf[posStart] == 'g' && buf[posStart + 1] == 't') {
+                if (tokenize) {
+                    text = ">";
+                }
+                charRefOneCharBuf[0] = '>';
+                return charRefOneCharBuf;
+            } else if (len == 4 && buf[posStart] == 'a' && buf[posStart + 1] == 'p'
+                    && buf[posStart + 2] == 'o' && buf[posStart + 3] == 's') {
+                if (tokenize) {
+                    text = "'";
+                }
+                charRefOneCharBuf[0] = '\'';
+                return charRefOneCharBuf;
+            } else if (len == 4 && buf[posStart] == 'q' && buf[posStart + 1] == 'u'
+                    && buf[posStart + 2] == 'o' && buf[posStart + 3] == 't') {
+                if (tokenize) {
+                    text = "\"";
+                }
+                charRefOneCharBuf[0] = '"';
+                return charRefOneCharBuf;
+            } else {
+                final char[] result = lookuEntityReplacement(len);
+                if (result != null) {
+                    return result;
+                }
+            }
+            if (tokenize) text = null;
+            return null;
+        }
+    }
+
+    protected char[] lookuEntityReplacement(int entitNameLen)
+            throws XmlPullParserException, IOException {
+        if (!allStringsInterned) {
+            final int hash = fastHash(buf, posStart, posEnd - posStart);
+            LOOP:
+            for (int i = entityEnd - 1; i >= 0; --i) {
+                if (hash == entityNameHash[i] && entitNameLen == entityNameBuf[i].length) {
+                    final char[] entityBuf = entityNameBuf[i];
+                    for (int j = 0; j < entitNameLen; j++) {
+                        if (buf[posStart + j] != entityBuf[j]) continue LOOP;
+                    }
+                    if (tokenize) text = entityReplacement[i];
+                    return entityReplacementBuf[i];
+                }
+            }
+        } else {
+            entityRefName = newString(buf, posStart, posEnd - posStart);
+            for (int i = entityEnd - 1; i >= 0; --i) {
+                // take advantage that interning for newStirng is enforced
+                if (entityRefName == entityName[i]) {
+                    if (tokenize) text = entityReplacement[i];
+                    return entityReplacementBuf[i];
+                }
+            }
+        }
+        return null;
+    }
+
+
+    protected void parseComment()
+            throws XmlPullParserException, IOException {
+        // implements XML 1.0 Section 2.5 Comments
+
+        //ASSUMPTION: seen <!-
+        char ch = more();
+        if (ch != '-') throw new XmlPullParserException(
+                "expected <!-- for comment start", this, null);
+        if (tokenize) posStart = pos;
+
+        final int curLine = lineNumber;
+        final int curColumn = columnNumber;
+        try {
+            final boolean normalizeIgnorableWS = tokenize == true && roundtripSupported == false;
+            boolean normalizedCR = false;
+
+            boolean seenDash = false;
+            boolean seenDashDash = false;
+            while (true) {
+                // scan until it hits -->
+                ch = more();
+                if (seenDashDash && ch != '>') {
+                    throw new XmlPullParserException(
+                            "in comment after two dashes (--) next character must be >"
+                                    + " not " + printable(ch), this, null);
+                }
+                if (ch == '-') {
+                    if (!seenDash) {
+                        seenDash = true;
+                    } else {
+                        seenDashDash = true;
+                        seenDash = false;
+                    }
+                } else if (ch == '>') {
+                    if (seenDashDash) {
+                        break;  // found end sequence!!!!
+                    } else {
+                        seenDashDash = false;
+                    }
+                    seenDash = false;
+                } else {
+                    seenDash = false;
+                }
+                if (normalizeIgnorableWS) {
+                    if (ch == '\r') {
+                        normalizedCR = true;
+                        //posEnd = pos -1;
+                        //joinPC();
+                        // posEnd is already set
+                        if (!usePC) {
+                            posEnd = pos - 1;
+                            if (posEnd > posStart) {
+                                joinPC();
+                            } else {
+                                usePC = true;
+                                pcStart = pcEnd = 0;
+                            }
+                        }
+                        //assert usePC == true;
+                        if (pcEnd >= pc.length) ensurePC(pcEnd);
+                        pc[pcEnd++] = '\n';
+                    } else if (ch == '\n') {
+                        if (!normalizedCR && usePC) {
+                            if (pcEnd >= pc.length) ensurePC(pcEnd);
+                            pc[pcEnd++] = '\n';
+                        }
+                        normalizedCR = false;
+                    } else {
+                        if (usePC) {
+                            if (pcEnd >= pc.length) ensurePC(pcEnd);
+                            pc[pcEnd++] = ch;
+                        }
+                        normalizedCR = false;
+                    }
+                }
+            }
+
+        } catch (EOFException ex) {
+            // detect EOF and create meaningful error ...
+            throw new XmlPullParserException(
+                    "comment started on line " + curLine + " and column " + curColumn + " was not closed",
+                    this, ex);
+        }
+        if (tokenize) {
+            posEnd = pos - 3;
+            if (usePC) {
+                pcEnd -= 2;
+            }
+        }
+    }
+
+    protected boolean parsePI()
+            throws XmlPullParserException, IOException {
+        // implements XML 1.0 Section 2.6 Processing Instructions
+
+        // [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'
+        // [17] PITarget         ::=    Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))
+        //ASSUMPTION: seen <?
+        if (tokenize) posStart = pos;
+        final int curLine = lineNumber;
+        final int curColumn = columnNumber;
+        int piTargetStart = pos + bufAbsoluteStart;
+        int piTargetEnd = -1;
+        final boolean normalizeIgnorableWS = tokenize == true && roundtripSupported == false;
+        boolean normalizedCR = false;
+
+        try {
+            boolean seenQ = false;
+            char ch = more();
+            if (isS(ch)) {
+                throw new XmlPullParserException(
+                        "processing instruction PITarget must be exactly after <? and not white space character",
+                        this, null);
+            }
+            while (true) {
+                // scan until it hits ?>
+                //ch = more();
+
+                if (ch == '?') {
+                    seenQ = true;
+                } else if (ch == '>') {
+                    if (seenQ) {
+                        break;  // found end sequence!!!!
+                    }
+                    seenQ = false;
+                } else {
+                    if (piTargetEnd == -1 && isS(ch)) {
+                        piTargetEnd = pos - 1 + bufAbsoluteStart;
+
+                        // [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))
+                        if ((piTargetEnd - piTargetStart) == 3) {
+                            if ((buf[piTargetStart] == 'x' || buf[piTargetStart] == 'X')
+                                    && (buf[piTargetStart + 1] == 'm' || buf[piTargetStart + 1] == 'M')
+                                    && (buf[piTargetStart + 2] == 'l' || buf[piTargetStart + 2] == 'L')
+                            ) {
+                                if (piTargetStart > 3) {  //<?xml is allowed as first characters in input ...
+                                    throw new XmlPullParserException(
+                                            "processing instruction can not have PITarget with reserveld xml name",
+                                            this, null);
+                                } else {
+                                    if (buf[piTargetStart] != 'x'
+                                            && buf[piTargetStart + 1] != 'm'
+                                            && buf[piTargetStart + 2] != 'l') {
+                                        throw new XmlPullParserException(
+                                                "XMLDecl must have xml name in lowercase",
+                                                this, null);
+                                    }
+                                }
+                                parseXmlDecl(ch);
+                                if (tokenize) posEnd = pos - 2;
+                                final int off = piTargetStart - bufAbsoluteStart + 3;
+                                final int len = pos - 2 - off;
+                                xmlDeclContent = newString(buf, off, len);
+                                return false;
+                            }
+                        }
+                    }
+                    seenQ = false;
+                }
+                if (normalizeIgnorableWS) {
+                    if (ch == '\r') {
+                        normalizedCR = true;
+                        //posEnd = pos -1;
+                        //joinPC();
+                        // posEnd is already set
+                        if (!usePC) {
+                            posEnd = pos - 1;
+                            if (posEnd > posStart) {
+                                joinPC();
+                            } else {
+                                usePC = true;
+                                pcStart = pcEnd = 0;
+                            }
+                        }
+                        //assert usePC == true;
+                        if (pcEnd >= pc.length) ensurePC(pcEnd);
+                        pc[pcEnd++] = '\n';
+                    } else if (ch == '\n') {
+                        if (!normalizedCR && usePC) {
+                            if (pcEnd >= pc.length) ensurePC(pcEnd);
+                            pc[pcEnd++] = '\n';
+                        }
+                        normalizedCR = false;
+                    } else {
+                        if (usePC) {
+                            if (pcEnd >= pc.length) ensurePC(pcEnd);
+                            pc[pcEnd++] = ch;
+                        }
+                        normalizedCR = false;
+                    }
+                }
+                ch = more();
+            }
+        } catch (EOFException ex) {
+            // detect EOF and create meaningful error ...
+            throw new XmlPullParserException(
+                    "processing instruction started on line " + curLine + " and column " + curColumn
+                            + " was not closed",
+                    this, ex);
+        }
+        if (piTargetEnd == -1) {
+            piTargetEnd = pos - 2 + bufAbsoluteStart;
+            //throw new XmlPullParserException(
+            //    "processing instruction must have PITarget name", this, null);
+        }
+        piTargetStart -= bufAbsoluteStart;
+        piTargetEnd -= bufAbsoluteStart;
+        if (tokenize) {
+            posEnd = pos - 2;
+            if (normalizeIgnorableWS) {
+                --pcEnd;
+            }
+        }
+        return true;
+    }
+
+    //    protected final static char[] VERSION = {'v','e','r','s','i','o','n'};
+    //    protected final static char[] NCODING = {'n','c','o','d','i','n','g'};
+    //    protected final static char[] TANDALONE = {'t','a','n','d','a','l','o','n','e'};
+    //    protected final static char[] YES = {'y','e','s'};
+    //    protected final static char[] NO = {'n','o'};
+
+    protected final static char[] VERSION = "version".toCharArray();
+    protected final static char[] NCODING = "ncoding".toCharArray();
+    protected final static char[] TANDALONE = "tandalone".toCharArray();
+    protected final static char[] YES = "yes".toCharArray();
+    protected final static char[] NO = "no".toCharArray();
+
+
+    protected void parseXmlDecl(char ch)
+            throws XmlPullParserException, IOException {
+        // [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
+
+        // first make sure that relative positions will stay OK
+        preventBufferCompaction = true;
+        bufStart = 0; // necessary to keep pos unchanged during expansion!
+
+        // --- parse VersionInfo
+
+        // [24] VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"')
+        // parse is positioned just on first S past <?xml
+        ch = skipS(ch);
+        ch = requireInput(ch, VERSION);
+        // [25] Eq ::= S? '=' S?
+        ch = skipS(ch);
+        if (ch != '=') {
+            throw new XmlPullParserException(
+                    "expected equals sign (=) after version and not " + printable(ch), this, null);
+        }
+        ch = more();
+        ch = skipS(ch);
+        if (ch != '\'' && ch != '"') {
+            throw new XmlPullParserException(
+                    "expected apostrophe (') or quotation mark (\") after version and not "
+                            + printable(ch), this, null);
+        }
+        final char quotChar = ch;
+        //int versionStart = pos + bufAbsoluteStart;  // required if preventBufferCompaction==false
+        final int versionStart = pos;
+        ch = more();
+        // [26] VersionNum ::= ([a-zA-Z0-9_.:] | '-')+
+        while (ch != quotChar) {
+            if ((ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z') && (ch < '0' || ch > '9')
+                    && ch != '_' && ch != '.' && ch != ':' && ch != '-') {
+                throw new XmlPullParserException(
+                        "<?xml version value expected to be in ([a-zA-Z0-9_.:] | '-')"
+                                + " not " + printable(ch), this, null);
+            }
+            ch = more();
+        }
+        final int versionEnd = pos - 1;
+        parseXmlDeclWithVersion(versionStart, versionEnd);
+        preventBufferCompaction = false; // alow again buffer commpaction - pos MAY chnage
+    }
+    //protected String xmlDeclVersion;
+
+    protected void parseXmlDeclWithVersion(int versionStart, int versionEnd)
+            throws XmlPullParserException, IOException {
+        // check version is "1.0"
+        if ((versionEnd - versionStart != 3)
+                || buf[versionStart] != '1'
+                || buf[versionStart + 1] != '.'
+                || buf[versionStart + 2] != '0') {
+            throw new XmlPullParserException(
+                    "only 1.0 is supported as <?xml version not '"
+                            + printable(new String(buf, versionStart, versionEnd - versionStart)) + "'", this, null);
+        }
+        xmlDeclVersion = newString(buf, versionStart, versionEnd - versionStart);
+
+        // [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'" )
+        char ch = more();
+        ch = skipS(ch);
+        if (ch == 'e') {
+            ch = more();
+            ch = requireInput(ch, NCODING);
+            ch = skipS(ch);
+            if (ch != '=') {
+                throw new XmlPullParserException(
+                        "expected equals sign (=) after encoding and not " + printable(ch), this, null);
+            }
+            ch = more();
+            ch = skipS(ch);
+            if (ch != '\'' && ch != '"') {
+                throw new XmlPullParserException(
+                        "expected apostrophe (') or quotation mark (\") after encoding and not "
+                                + printable(ch), this, null);
+            }
+            final char quotChar = ch;
+            final int encodingStart = pos;
+            ch = more();
+            // [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*
+            if ((ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z')) {
+                throw new XmlPullParserException(
+                        "<?xml encoding name expected to start with [A-Za-z]"
+                                + " not " + printable(ch), this, null);
+            }
+            ch = more();
+            while (ch != quotChar) {
+                if ((ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z') && (ch < '0' || ch > '9')
+                        && ch != '.' && ch != '_' && ch != '-') {
+                    throw new XmlPullParserException(
+                            "<?xml encoding value expected to be in ([A-Za-z0-9._] | '-')"
+                                    + " not " + printable(ch), this, null);
+                }
+                ch = more();
+            }
+            final int encodingEnd = pos - 1;
+
+            // TODO reconcile with setInput encodingName
+            inputEncoding = newString(buf, encodingStart, encodingEnd - encodingStart);
+            ch = more();
+        }
+
+        ch = skipS(ch);
+        // [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"'))
+        if (ch == 's') {
+            ch = more();
+            ch = requireInput(ch, TANDALONE);
+            ch = skipS(ch);
+            if (ch != '=') {
+                throw new XmlPullParserException(
+                        "expected equals sign (=) after standalone and not " + printable(ch),
+                        this, null);
+            }
+            ch = more();
+            ch = skipS(ch);
+            if (ch != '\'' && ch != '"') {
+                throw new XmlPullParserException(
+                        "expected apostrophe (') or quotation mark (\") after encoding and not "
+                                + printable(ch), this, null);
+            }
+            char quotChar = ch;
+            int standaloneStart = pos;
+            ch = more();
+            if (ch == 'y') {
+                ch = requireInput(ch, YES);
+                //Boolean standalone = new Boolean(true);
+                xmlDeclStandalone = new Boolean(true);
+            } else if (ch == 'n') {
+                ch = requireInput(ch, NO);
+                //Boolean standalone = new Boolean(false);
+                xmlDeclStandalone = new Boolean(false);
+            } else {
+                throw new XmlPullParserException(
+                        "expected 'yes' or 'no' after standalone and not "
+                                + printable(ch), this, null);
+            }
+            if (ch != quotChar) {
+                throw new XmlPullParserException(
+                        "expected " + quotChar + " after standalone value not "
+                                + printable(ch), this, null);
+            }
+            ch = more();
+        }
+
+
+        ch = skipS(ch);
+        if (ch != '?') {
+            throw new XmlPullParserException(
+                    "expected ?> as last part of <?xml not "
+                            + printable(ch), this, null);
+        }
+        ch = more();
+        if (ch != '>') {
+            throw new XmlPullParserException(
+                    "expected ?> as last part of <?xml not "
+                            + printable(ch), this, null);
+        }
+
+// NOTE: this code is broken as for some types of input streams (URLConnection ...)
+// it is not possible to do more than once new InputStreamReader(inputStream)
+// as it somehow detects it and closes undelrying inout stram (b.....d!)
+// In future one will need better low level byte-by-byte reading of prolog and then doing InputStream ...
+// for more details see http://www.extreme.indiana.edu/bugzilla/show_bug.cgi?id=135
+        //        //reset input stream
+//        if ((this.inputEncoding != oldEncoding) && (this.inputStream != null)) {
+//            if ((this.inputEncoding != null) && (!this.inputEncoding.equalsIgnoreCase(oldEncoding))) {
+//                //              //there is need to reparse input to set location OK
+//                //              reset();
+//                this.reader = new InputStreamReader(this.inputStream, this.inputEncoding);
+//                //              //skip <?xml
+//                //              for (int i = 0; i < 5; i++){
+//                //                  ch=more();
+//                //              }
+//                //              parseXmlDecl(ch);
+//            }
+//        }
+    }
+
+    protected void parseDocdecl()
+            throws XmlPullParserException, IOException {
+        //ASSUMPTION: seen <!D
+        char ch = more();
+        if (ch != 'O') throw new XmlPullParserException(
+                "expected <!DOCTYPE", this, null);
+        ch = more();
+        if (ch != 'C') throw new XmlPullParserException(
+                "expected <!DOCTYPE", this, null);
+        ch = more();
+        if (ch != 'T') throw new XmlPullParserException(
+                "expected <!DOCTYPE", this, null);
+        ch = more();
+        if (ch != 'Y') throw new XmlPullParserException(
+                "expected <!DOCTYPE", this, null);
+        ch = more();
+        if (ch != 'P') throw new XmlPullParserException(
+                "expected <!DOCTYPE", this, null);
+        ch = more();
+        if (ch != 'E') throw new XmlPullParserException(
+                "expected <!DOCTYPE", this, null);
+        posStart = pos;
+        // do simple and crude scanning for end of doctype
+
+        // [28]  doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('['
+        //                      (markupdecl | DeclSep)* ']' S?)? '>'
+        int bracketLevel = 0;
+        final boolean normalizeIgnorableWS = tokenize == true && roundtripSupported == false;
+        boolean normalizedCR = false;
+        while (true) {
+            ch = more();
+            if (ch == '[') ++bracketLevel;
+            if (ch == ']') --bracketLevel;
+            if (ch == '>' && bracketLevel == 0) break;
+            if (normalizeIgnorableWS) {
+                if (ch == '\r') {
+                    normalizedCR = true;
+                    //posEnd = pos -1;
+                    //joinPC();
+                    // posEnd is alreadys set
+                    if (!usePC) {
+                        posEnd = pos - 1;
+                        if (posEnd > posStart) {
+                            joinPC();
+                        } else {
+                            usePC = true;
+                            pcStart = pcEnd = 0;
+                        }
+                    }
+                    //assert usePC == true;
+                    if (pcEnd >= pc.length) ensurePC(pcEnd);
+                    pc[pcEnd++] = '\n';
+                } else if (ch == '\n') {
+                    if (!normalizedCR && usePC) {
+                        if (pcEnd >= pc.length) ensurePC(pcEnd);
+                        pc[pcEnd++] = '\n';
+                    }
+                    normalizedCR = false;
+                } else {
+                    if (usePC) {
+                        if (pcEnd >= pc.length) ensurePC(pcEnd);
+                        pc[pcEnd++] = ch;
+                    }
+                    normalizedCR = false;
+                }
+            }
+
+        }
+        posEnd = pos - 1;
+    }
+
+    protected void parseCDSect(boolean hadCharData)
+            throws XmlPullParserException, IOException {
+        // implements XML 1.0 Section 2.7 CDATA Sections
+
+        // [18] CDSect ::= CDStart CData CDEnd
+        // [19] CDStart ::=  '<![CDATA['
+        // [20] CData ::= (Char* - (Char* ']]>' Char*))
+        // [21] CDEnd ::= ']]>'
+
+        //ASSUMPTION: seen <![
+        char ch = more();
+        if (ch != 'C') throw new XmlPullParserException(
+                "expected <[CDATA[ for comment start", this, null);
+        ch = more();
+        if (ch != 'D') throw new XmlPullParserException(
+                "expected <[CDATA[ for comment start", this, null);
+        ch = more();
+        if (ch != 'A') throw new XmlPullParserException(
+                "expected <[CDATA[ for comment start", this, null);
+        ch = more();
+        if (ch != 'T') throw new XmlPullParserException(
+                "expected <[CDATA[ for comment start", this, null);
+        ch = more();
+        if (ch != 'A') throw new XmlPullParserException(
+                "expected <[CDATA[ for comment start", this, null);
+        ch = more();
+        if (ch != '[') throw new XmlPullParserException(
+                "expected <![CDATA[ for comment start", this, null);
+
+        //if(tokenize) {
+        final int cdStart = pos + bufAbsoluteStart;
+        final int curLine = lineNumber;
+        final int curColumn = columnNumber;
+        final boolean normalizeInput = tokenize == false || roundtripSupported == false;
+        try {
+            if (normalizeInput) {
+                if (hadCharData) {
+                    if (!usePC) {
+                        // posEnd is correct already!!!
+                        if (posEnd > posStart) {
+                            joinPC();
+                        } else {
+                            usePC = true;
+                            pcStart = pcEnd = 0;
+                        }
+                    }
+                }
+            }
+            boolean seenBracket = false;
+            boolean seenBracketBracket = false;
+            boolean normalizedCR = false;
+            while (true) {
+                // scan until it hits "]]>"
+                ch = more();
+                if (ch == ']') {
+                    if (!seenBracket) {
+                        seenBracket = true;
+                    } else {
+                        seenBracketBracket = true;
+                        //seenBracket = false;
+                    }
+                } else if (ch == '>') {
+                    if (seenBracket && seenBracketBracket) {
+                        break;  // found end sequence!!!!
+                    } else {
+                        seenBracketBracket = false;
+                    }
+                    seenBracket = false;
+                } else {
+                    if (seenBracket) {
+                        seenBracket = false;
+                    }
+                }
+                if (normalizeInput) {
+                    // deal with normalization issues ...
+                    if (ch == '\r') {
+                        normalizedCR = true;
+                        posStart = cdStart - bufAbsoluteStart;
+                        posEnd = pos - 1; // posEnd is alreadys set
+                        if (!usePC) {
+                            if (posEnd > posStart) {
+                                joinPC();
+                            } else {
+                                usePC = true;
+                                pcStart = pcEnd = 0;
+                            }
+                        }
+                        //assert usePC == true;
+                        if (pcEnd >= pc.length) ensurePC(pcEnd);
+                        pc[pcEnd++] = '\n';
+                    } else if (ch == '\n') {
+                        if (!normalizedCR && usePC) {
+                            if (pcEnd >= pc.length) ensurePC(pcEnd);
+                            pc[pcEnd++] = '\n';
+                        }
+                        normalizedCR = false;
+                    } else {
+                        if (usePC) {
+                            if (pcEnd >= pc.length) ensurePC(pcEnd);
+                            pc[pcEnd++] = ch;
+                        }
+                        normalizedCR = false;
+                    }
+                }
+            }
+        } catch (EOFException ex) {
+            // detect EOF and create meaningful error ...
+            throw new XmlPullParserException(
+                    "CDATA section started on line " + curLine + " and column " + curColumn + " was not closed",
+                    this, ex);
+        }
+        if (normalizeInput) {
+            if (usePC) {
+                pcEnd = pcEnd - 2;
+            }
+        }
+        posStart = cdStart - bufAbsoluteStart;
+        posEnd = pos - 3;
+    }
+
+    protected void fillBuf() throws IOException, XmlPullParserException {
+        if (reader == null) throw new XmlPullParserException(
+                "reader must be set before parsing is started");
+
+        // see if we are in compaction area
+        if (bufEnd > bufSoftLimit) {
+
+            // expand buffer it makes sense!!!!
+            boolean compact = bufStart > bufSoftLimit;
+            boolean expand = false;
+            if (preventBufferCompaction) {
+                compact = false;
+                expand = true;
+            } else if (!compact) {
+                //freeSpace
+                if (bufStart < buf.length / 2) {
+                    // less then half buffer available forcompactin --> expand instead!!!
+                    expand = true;
+                } else {
+                    // at least half of buffer can be reclaimed --> worthwhile effort!!!
+                    compact = true;
+                }
+            }
+
+            // if buffer almost full then compact it
+            if (compact) {
+                //TODO: look on trashing
+                // //assert bufStart > 0
+                System.arraycopy(buf, bufStart, buf, 0, bufEnd - bufStart);
+                if (TRACE_SIZING) System.out.println(
+                        "TRACE_SIZING fillBuf() compacting " + bufStart
+                                + " bufEnd=" + bufEnd
+                                + " pos=" + pos + " posStart=" + posStart + " posEnd=" + posEnd
+                                + " buf first 100 chars:" + new String(buf, bufStart,
+                                bufEnd - bufStart < 100 ? bufEnd - bufStart : 100));
+
+            } else if (expand) {
+                final int newSize = 2 * buf.length;
+                final char newBuf[] = new char[newSize];
+                if (TRACE_SIZING) System.out.println("TRACE_SIZING fillBuf() " + buf.length + " => " + newSize);
+                System.arraycopy(buf, bufStart, newBuf, 0, bufEnd - bufStart);
+                buf = newBuf;
+                if (bufLoadFactor > 0) {
+                    //bufSoftLimit = ( bufLoadFactor * buf.length ) /100;
+                    bufSoftLimit = (int) ((((long) bufLoadFactor) * buf.length) / 100);
+                }
+
+            } else {
+                throw new XmlPullParserException("internal error in fillBuffer()");
+            }
+            bufEnd -= bufStart;
+            pos -= bufStart;
+            posStart -= bufStart;
+            posEnd -= bufStart;
+            bufAbsoluteStart += bufStart;
+            bufStart = 0;
+            if (TRACE_SIZING) System.out.println(
+                    "TRACE_SIZING fillBuf() after bufEnd=" + bufEnd
+                            + " pos=" + pos + " posStart=" + posStart + " posEnd=" + posEnd
+                            + " buf first 100 chars:" + new String(buf, 0, bufEnd < 100 ? bufEnd : 100));
+        }
+        // at least one character must be read or error
+        final int len = buf.length - bufEnd > READ_CHUNK_SIZE ? READ_CHUNK_SIZE : buf.length - bufEnd;
+        final int ret = reader.read(buf, bufEnd, len);
+        if (ret > 0) {
+            bufEnd += ret;
+            if (TRACE_SIZING) System.out.println(
+                    "TRACE_SIZING fillBuf() after filling in buffer"
+                            + " buf first 100 chars:" + new String(buf, 0, bufEnd < 100 ? bufEnd : 100));
+
+            return;
+        }
+        if (ret == -1) {
+            if (bufAbsoluteStart == 0 && pos == 0) {
+                throw new EOFException("input contained no data");
+            } else {
+                if (seenRoot && depth == 0) { // inside parsing epilog!!!
+                    reachedEnd = true;
+                    return;
+                } else {
+                    StringBuffer expectedTagStack = new StringBuffer();
+                    if (depth > 0) {
+                        //final char[] cbuf = elRawName[depth];
+                        //final String startname = new String(cbuf, 0, elRawNameEnd[depth]);
+                        expectedTagStack.append(" - expected end tag");
+                        if (depth > 1) {
+                            expectedTagStack.append("s"); //more than one end tag
+                        }
+                        expectedTagStack.append(" ");
+                        for (int i = depth; i > 0; i--) {
+                            String tagName = new String(elRawName[i], 0, elRawNameEnd[i]);
+                            expectedTagStack.append("</").append(tagName).append('>');
+                        }
+                        expectedTagStack.append(" to close");
+                        for (int i = depth; i > 0; i--) {
+                            if (i != depth) {
+                                expectedTagStack.append(" and"); //more than one end tag
+                            }
+                            String tagName = new String(elRawName[i], 0, elRawNameEnd[i]);
+                            expectedTagStack.append(" start tag <" + tagName + ">");
+                            expectedTagStack.append(" from line " + elRawNameLine[i]);
+                        }
+                        expectedTagStack.append(", parser stopped on");
+                    }
+                    throw new EOFException("no more data available"
+                            + expectedTagStack.toString() + getPositionDescription());
+                }
+            }
+        } else {
+            throw new IOException("error reading input, returned " + ret);
+        }
+    }
+
+    protected char more() throws IOException, XmlPullParserException {
+        if (pos >= bufEnd) {
+            fillBuf();
+            // this return value should be ignonored as it is used in epilog parsing ...
+            if (reachedEnd) return (char) -1;
+        }
+        final char ch = buf[pos++];
+        //line/columnNumber
+        if (ch == '\n') {
+            ++lineNumber;
+            columnNumber = 1;
+        } else {
+            ++columnNumber;
+        }
+        //System.out.print(ch);
+        return ch;
+    }
+
+    //    /**
+    //     * This function returns position of parser in XML input stream
+    //     * (how many <b>characters</b> were processed.
+    //     * <p><b>NOTE:</b> this logical position and not byte offset as encodings
+    //     * such as UTF8 may use more than one byte to encode one character.
+    //     */
+    //    public int getCurrentInputPosition() {
+    //        return pos + bufAbsoluteStart;
+    //    }
+
+    protected void ensurePC(int end) {
+        //assert end >= pc.length;
+        final int newSize = end > READ_CHUNK_SIZE ? 2 * end : 2 * READ_CHUNK_SIZE;
+        final char[] newPC = new char[newSize];
+        if (TRACE_SIZING)
+            System.out.println("TRACE_SIZING ensurePC() " + pc.length + " ==> " + newSize + " end=" + end);
+        System.arraycopy(pc, 0, newPC, 0, pcEnd);
+        pc = newPC;
+        //assert end < pc.length;
+    }
+
+    protected void joinPC() {
+        //assert usePC == false;
+        //assert posEnd > posStart;
+        final int len = posEnd - posStart;
+        final int newEnd = pcEnd + len + 1;
+        if (newEnd >= pc.length) ensurePC(newEnd); // add 1 for extra space for one char
+        //assert newEnd < pc.length;
+        System.arraycopy(buf, posStart, pc, pcEnd, len);
+        pcEnd += len;
+        usePC = true;
+
+    }
+
+    protected char requireInput(char ch, char[] input)
+            throws XmlPullParserException, IOException {
+        for (int i = 0; i < input.length; i++) {
+            if (ch != input[i]) {
+                throw new XmlPullParserException(
+                        "expected " + printable(input[i]) + " in " + new String(input)
+                                + " and not " + printable(ch), this, null);
+            }
+            ch = more();
+        }
+        return ch;
+    }
+
+    protected char requireNextS()
+            throws XmlPullParserException, IOException {
+        final char ch = more();
+        if (!isS(ch)) {
+            throw new XmlPullParserException(
+                    "white space is required and not " + printable(ch), this, null);
+        }
+        return skipS(ch);
+    }
+
+    protected char skipS(char ch)
+            throws XmlPullParserException, IOException {
+        while (isS(ch)) {
+            ch = more();
+        } // skip additional spaces
+        return ch;
+    }
+
+    // nameStart / name lookup tables based on XML 1.1 http://www.w3.org/TR/2001/WD-xml11-20011213/
+    protected static final int LOOKUP_MAX = 0x400;
+    protected static final char LOOKUP_MAX_CHAR = (char) LOOKUP_MAX;
+    //    protected static int lookupNameStartChar[] = new int[ LOOKUP_MAX_CHAR / 32 ];
+    //    protected static int lookupNameChar[] = new int[ LOOKUP_MAX_CHAR / 32 ];
+    protected static boolean lookupNameStartChar[] = new boolean[LOOKUP_MAX];
+    protected static boolean lookupNameChar[] = new boolean[LOOKUP_MAX];
+
+    private static final void setName(char ch)
+    //{ lookupNameChar[ (int)ch / 32 ] |= (1 << (ch % 32)); }
+    {
+        lookupNameChar[ch] = true;
+    }
+
+    private static final void setNameStart(char ch)
+    //{ lookupNameStartChar[ (int)ch / 32 ] |= (1 << (ch % 32)); setName(ch); }
+    {
+        lookupNameStartChar[ch] = true;
+        setName(ch);
+    }
+
+    static {
+        setNameStart(':');
+        for (char ch = 'A'; ch <= 'Z'; ++ch) setNameStart(ch);
+        setNameStart('_');
+        for (char ch = 'a'; ch <= 'z'; ++ch) setNameStart(ch);
+        for (char ch = '\u00c0'; ch <= '\u02FF'; ++ch) setNameStart(ch);
+        for (char ch = '\u0370'; ch <= '\u037d'; ++ch) setNameStart(ch);
+        for (char ch = '\u037f'; ch < '\u0400'; ++ch) setNameStart(ch);
+
+        setName('-');
+        setName('.');
+        for (char ch = '0'; ch <= '9'; ++ch) setName(ch);
+        setName('\u00b7');
+        for (char ch = '\u0300'; ch <= '\u036f'; ++ch) setName(ch);
+    }
+
+    //private final static boolean isNameStartChar(char ch) {
+    protected boolean isNameStartChar(char ch) {
+        return (ch < LOOKUP_MAX_CHAR && lookupNameStartChar[ch])
+                || (ch >= LOOKUP_MAX_CHAR && ch <= '\u2027')
+                || (ch >= '\u202A' && ch <= '\u218F')
+                || (ch >= '\u2800' && ch <= '\uFFEF')
+                ;
+
+        //      if(ch < LOOKUP_MAX_CHAR) return lookupNameStartChar[ ch ];
+        //      else return ch <= '\u2027'
+        //              || (ch >= '\u202A' &&  ch <= '\u218F')
+        //              || (ch >= '\u2800' &&  ch <= '\uFFEF')
+        //              ;
+        //return false;
+        //        return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch == ':'
+        //          || (ch >= '0' && ch <= '9');
+        //        if(ch < LOOKUP_MAX_CHAR) return (lookupNameStartChar[ (int)ch / 32 ] & (1 << (ch % 32))) != 0;
+        //        if(ch <= '\u2027') return true;
+        //        //[#x202A-#x218F]
+        //        if(ch < '\u202A') return false;
+        //        if(ch <= '\u218F') return true;
+        //        // added pairts [#x2800-#xD7FF] | [#xE000-#xFDCF] | [#xFDE0-#xFFEF] | [#x10000-#x10FFFF]
+        //        if(ch < '\u2800') return false;
+        //        if(ch <= '\uFFEF') return true;
+        //        return false;
+
+
+        // else return (supportXml11 && ( (ch < '\u2027') || (ch > '\u2029' && ch < '\u2200') ...
+    }
+
+    //private final static boolean isNameChar(char ch) {
+    protected boolean isNameChar(char ch) {
+        //return isNameStartChar(ch);
+
+        //        if(ch < LOOKUP_MAX_CHAR) return (lookupNameChar[ (int)ch / 32 ] & (1 << (ch % 32))) != 0;
+
+        return (ch < LOOKUP_MAX_CHAR && lookupNameChar[ch])
+                || (ch >= LOOKUP_MAX_CHAR && ch <= '\u2027')
+                || (ch >= '\u202A' && ch <= '\u218F')
+                || (ch >= '\u2800' && ch <= '\uFFEF')
+                ;
+        //return false;
+        //        return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch == ':'
+        //          || (ch >= '0' && ch <= '9');
+        //        if(ch < LOOKUP_MAX_CHAR) return (lookupNameStartChar[ (int)ch / 32 ] & (1 << (ch % 32))) != 0;
+
+        //else return
+        //  else if(ch <= '\u2027') return true;
+        //        //[#x202A-#x218F]
+        //        else if(ch < '\u202A') return false;
+        //        else if(ch <= '\u218F') return true;
+        //        // added pairts [#x2800-#xD7FF] | [#xE000-#xFDCF] | [#xFDE0-#xFFEF] | [#x10000-#x10FFFF]
+        //        else if(ch < '\u2800') return false;
+        //        else if(ch <= '\uFFEF') return true;
+        //else return false;
+    }
+
+    protected boolean isS(char ch) {
+        return (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t');
+        // || (supportXml11 && (ch == '\u0085' || ch == '\u2028');
+    }
+
+    //protected boolean isChar(char ch) { return (ch < '\uD800' || ch > '\uDFFF')
+    //  ch != '\u0000' ch < '\uFFFE'
+
+
+    //protected char printable(char ch) { return ch; }
+    protected String printable(char ch) {
+        if (ch == '\n') {
+            return "\\n";
+        } else if (ch == '\r') {
+            return "\\r";
+        } else if (ch == '\t') {
+            return "\\t";
+        } else if (ch == '\'') {
+            return "\\'";
+        }
+        if (ch > 127 || ch < 32) {
+            return "\\u" + Integer.toHexString((int) ch);
+        }
+        return "" + ch;
+    }
+
+    protected String printable(String s) {
+        if (s == null) return null;
+        final int sLen = s.length();
+        StringBuffer buf = new StringBuffer(sLen + 10);
+        for (int i = 0; i < sLen; ++i) {
+            buf.append(printable(s.charAt(i)));
+        }
+        s = buf.toString();
+        return s;
+    }
+}
+
+
+/*
+ * Indiana University Extreme! Lab Software License, Version 1.2
+ *
+ * Copyright (C) 2003 The Trustees of Indiana University.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1) All redistributions of source code must retain the above
+ *    copyright notice, the list of authors in the original source
+ *    code, this list of conditions and the disclaimer listed in this
+ *    license;
+ *
+ * 2) All redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the disclaimer
+ *    listed in this license in the documentation and/or other
+ *    materials provided with the distribution;
+ *
+ * 3) Any documentation included with all redistributions must include
+ *    the following acknowledgement:
+ *
+ *      "This product includes software developed by the Indiana
+ *      University Extreme! Lab.  For further information please visit
+ *      http://www.extreme.indiana.edu/"
+ *
+ *    Alternatively, this acknowledgment may appear in the software
+ *    itself, and wherever such third-party acknowledgments normally
+ *    appear.
+ *
+ * 4) The name "Indiana University" or "Indiana University
+ *    Extreme! Lab" shall not be used to endorse or promote
+ *    products derived from this software without prior written
+ *    permission from Indiana University.  For written permission,
+ *    please contact http://www.extreme.indiana.edu/.
+ *
+ * 5) Products derived from this software may not use "Indiana
+ *    University" name nor may "Indiana University" appear in their name,
+ *    without prior written permission of the Indiana University.
+ *
+ * Indiana University provides no reassurances that the source code
+ * provided does not infringe the patent or any other intellectual
+ * property rights of any other entity.  Indiana University disclaims any
+ * liability to any recipient for claims brought by any other entity
+ * based on infringement of intellectual property rights or otherwise.
+ *
+ * LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH
+ * NO WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA
+ * UNIVERSITY GIVES NO WARRANTIES AND MAKES NO REPRESENTATION THAT
+ * SOFTWARE IS FREE OF INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR
+ * OTHER PROPRIETARY RIGHTS.  INDIANA UNIVERSITY MAKES NO WARRANTIES THAT
+ * SOFTWARE IS FREE FROM "BUGS", "VIRUSES", "TROJAN HORSES", "TRAP
+ * DOORS", "WORMS", OR OTHER HARMFUL CODE.  LICENSEE ASSUMES THE ENTIRE
+ * RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR ASSOCIATED MATERIALS,
+ * AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION GENERATED USING
+ * SOFTWARE.
+ */
+
diff --git a/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlPullParser.java b/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlPullParser.java
new file mode 100644
index 0000000..f31a090
--- /dev/null
+++ b/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlPullParser.java
@@ -0,0 +1,964 @@
+/* -*-             c-basic-offset: 4; indent-tabs-mode: nil; -*-  //------100-columns-wide------>|*/
+// for license please see accompanying LICENSE.txt file (available also at http://www.xmlpull.org/)
+
+package org.apache.camel.xml.io;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.Reader;
+
+/**
+ * XML Pull Parser is an interface that defines parsing functionality provided in
+ * <a href="http://www.xmlpull.org/">XMLPULL V1 API</a> (visit this website to learn more about API and its
+ * implementations).
+ * <p>
+ * There are following different kinds of parser depending on which features are set:
+ * <ul>
+ * <li><b>non-validating</b> parser as defined in XML 1.0 spec when FEATURE_PROCESS_DOCDECL is set to true
+ * <li><b>validating parser</b> as defined in XML 1.0 spec when FEATURE_VALIDATION is true (and that implies that
+ * FEATURE_PROCESS_DOCDECL is true)
+ * <li>when FEATURE_PROCESS_DOCDECL is false (this is default and if different value is required necessary must be
+ * changed before parsing is started) then parser behaves like XML 1.0 compliant non-validating parser under condition
+ * that <em>no DOCDECL is present</em> in XML documents (internal entities can still be defined with
+ * defineEntityReplacementText()). This mode of operation is intended <b>for operation in constrained environments</b>
+ * such as J2ME.
+ * </ul>
+ * <p>
+ * There are two key methods: next() and nextToken(). While next() provides access to high level parsing events,
+ * nextToken() allows access to lower level tokens.
+ * <p>
+ * The current event state of the parser can be determined by calling the <a href="#getEventType()">getEventType()</a>
+ * method. Initially, the parser is in the <a href="#START_DOCUMENT">START_DOCUMENT</a> state.
+ * <p>
+ * The method <a href="#next()">next()</a> advances the parser to the next event. The int value returned from next
+ * determines the current parser state and is identical to the value returned from following calls to getEventType ().
+ * <p>
+ * The following event types are seen by next()
+ * <dl>
+ * <dt><a href="#START_TAG">START_TAG</a>
+ * <dd>An XML start tag was read.
+ * <dt><a href="#TEXT">TEXT</a>
+ * <dd>Text content was read; the text content can be retrieved using the getText() method. (when in validating mode
+ * next() will not report ignorable whitespaces, use nextToken() instead)
+ * <dt><a href="#END_TAG">END_TAG</a>
+ * <dd>An end tag was read
+ * <dt><a href="#END_DOCUMENT">END_DOCUMENT</a>
+ * <dd>No more events are available
+ * </dl>
+ * <p>
+ * after first next() or nextToken() (or any other next*() method) is called user application can obtain XML version,
+ * standalone and encoding from XML declaration in following ways:
+ * <ul>
+ * <li><b>version</b>: getProperty(&quot;<a href=
+ * "http://xmlpull.org/v1/doc/properties.html#xmldecl-version">http://xmlpull.org/v1/doc/properties.html#xmldecl-version</a>&quot;)
+ * returns String ("1.0") or null if XMLDecl was not read or if property is not supported
+ * <li><b>standalone</b>: getProperty(&quot;<a href=
+ * "http://xmlpull.org/v1/doc/features.html#xmldecl-standalone">http://xmlpull.org/v1/doc/features.html#xmldecl-standalone</a>&quot;)
+ * returns Boolean: null if there was no standalone declaration or if property is not supported otherwise returns
+ * Boolean(true) if standalone="yes" and Boolean(false) when standalone="no"
+ * <li><b>encoding</b>: obtained from getInputEncoding() null if stream had unknown encoding (not set in setInputStream)
+ * and it was not declared in XMLDecl
+ * </ul>
+ * A minimal example for using this API may look as follows:
+ *
+ * <pre>
+ * import java.io.IOException;
+ * import java.io.StringReader;
+ *
+ * import org.xmlpull.v1.XmlPullParser;
+ * import org.xmlpull.v1.XmlPullParserException;
+ * import org.xmlpull.v1.XmlPullParserFactory;
+ *
+ * public class SimpleXmlPullApp
+ * {
+ *
+ *     public static void main (String args[])
+ *         throws XmlPullParserException, IOException
+ *     {
+ *         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
+ *         factory.setNamespaceAware(true);
+ *         XmlPullParser xpp = factory.newPullParser();
+ *
+ *         xpp.setInput( new StringReader ( "&lt;foo%gt;Hello World!&lt;/foo&gt;" ) );
+ *         int eventType = xpp.getEventType();
+ *         while (eventType != xpp.END_DOCUMENT) {
+ *          if(eventType == xpp.START_DOCUMENT) {
+ *              System.out.println("Start document");
+ *          } else if(eventType == xpp.END_DOCUMENT) {
+ *              System.out.println("End document");
+ *          } else if(eventType == xpp.START_TAG) {
+ *              System.out.println("Start tag "+xpp.getName());
+ *          } else if(eventType == xpp.END_TAG) {
+ *              System.out.println("End tag "+xpp.getName());
+ *          } else if(eventType == xpp.TEXT) {
+ *              System.out.println("Text "+xpp.getText());
+ *          }
+ *          eventType = xpp.next();
+ *         }
+ *     }
+ * }
+ * </pre>
+ * <p>
+ * The above example will generate the following output:
+ *
+ * <pre>
+ * Start document
+ * Start tag foo
+ * Text Hello World!
+ * End tag foo
+ * </pre>
+ *
+ * For more details on API usage, please refer to the quick Introduction available at
+ * <a href="http://www.xmlpull.org">http://www.xmlpull.org</a>
+ *
+ * @see #defineEntityReplacementText
+ * @see #getName
+ * @see #getNamespace
+ * @see #getText
+ * @see #next
+ * @see #nextToken
+ * @see #setInput
+ * @see #FEATURE_PROCESS_DOCDECL
+ * @see #FEATURE_VALIDATION
+ * @see #START_DOCUMENT
+ * @see #START_TAG
+ * @see #TEXT
+ * @see #END_TAG
+ * @see #END_DOCUMENT
+ * @author <a href="http://www-ai.cs.uni-dortmund.de/PERSONAL/haustein.html">Stefan Haustein</a>
+ * @author <a href="http://www.extreme.indiana.edu/~aslom/">Aleksander Slominski</a>
+ */
+
+public interface XmlPullParser
+{
+
+    /** This constant represents the default namespace (empty string "") */
+    String NO_NAMESPACE = "";
+
+    // ----------------------------------------------------------------------------
+    // EVENT TYPES as reported by next()
+
+    /**
+     * Signalize that parser is at the very beginning of the document and nothing was read yet. This event type can only
+     * be observed by calling getEvent() before the first call to next(), nextToken, or nextTag()).
+     *
+     * @see #next
+     * @see #nextToken
+     */
+    int START_DOCUMENT = 0;
+
+    /**
+     * Logical end of the xml document. Returned from getEventType, next() and nextToken() when the end of the input
+     * document has been reached.
+     * <p>
+     * <strong>NOTE:</strong> calling again <a href="#next()">next()</a> or <a href="#nextToken()">nextToken()</a> will
+     * result in exception being thrown.
+     *
+     * @see #next
+     * @see #nextToken
+     */
+    int END_DOCUMENT = 1;
+
+    /**
+     * Returned from getEventType(), <a href="#next()">next()</a>, <a href="#nextToken()">nextToken()</a> when a start
+     * tag was read. The name of start tag is available from getName(), its namespace and prefix are available from
+     * getNamespace() and getPrefix() if <a href='#FEATURE_PROCESS_NAMESPACES'>namespaces are enabled</a>. See
+     * getAttribute* methods to retrieve element attributes. See getNamespace* methods to retrieve newly declared
+     * namespaces.
+     *
+     * @see #next
+     * @see #nextToken
+     * @see #getName
+     * @see #getPrefix
+     * @see #getNamespace
+     * @see #getAttributeCount
+     * @see #getDepth
+     * @see #getNamespaceCount
+     * @see #getNamespace
+     * @see #FEATURE_PROCESS_NAMESPACES
+     */
+    int START_TAG = 2;
+
+    /**
+     * Returned from getEventType(), <a href="#next()">next()</a>, or <a href="#nextToken()">nextToken()</a> when an end
+     * tag was read. The name of start tag is available from getName(), its namespace and prefix are available from
+     * getNamespace() and getPrefix().
+     *
+     * @see #next
+     * @see #nextToken
+     * @see #getName
+     * @see #getPrefix
+     * @see #getNamespace
+     * @see #FEATURE_PROCESS_NAMESPACES
+     */
+    int END_TAG = 3;
+
+    /**
+     * Character data was read and will is available by calling getText().
+     * <p>
+     * <strong>Please note:</strong> <a href="#next()">next()</a> will accumulate multiple events into one TEXT event,
+     * skipping IGNORABLE_WHITESPACE, PROCESSING_INSTRUCTION and COMMENT events, In contrast,
+     * <a href="#nextToken()">nextToken()</a> will stop reading text when any other event is observed. Also, when the
+     * state was reached by calling next(), the text value will be normalized, whereas getText() will return
+     * unnormalized content in the case of nextToken(). This allows an exact roundtrip without changing line ends when
+     * examining low level events, whereas for high level applications the text is normalized appropriately.
+     *
+     * @see #next
+     * @see #nextToken
+     * @see #getText
+     */
+    int TEXT = 4;
+
+    // ----------------------------------------------------------------------------
+    // additional events exposed by lower level nextToken()
+
+    /**
+     * A CDATA sections was just read; this token is available only from calls to
+     * <a href="#nextToken()">nextToken()</a>. A call to next() will accumulate various text events into a single event
+     * of type TEXT. The text contained in the CDATA section is available by calling getText().
+     *
+     * @see #nextToken
+     * @see #getText
+     */
+    int CDSECT = 5;
+
+    /**
+     * An entity reference was just read; this token is available from <a href="#nextToken()">nextToken()</a> only. The
+     * entity name is available by calling getName(). If available, the replacement text can be obtained by calling
+     * getTextt(); otherwise, the user is responsible for resolving the entity reference. This event type is never
+     * returned from next(); next() will accumulate the replacement text and other text events to a single TEXT event.
+     *
+     * @see #nextToken
+     * @see #getText
+     */
+    int ENTITY_REF = 6;
+
+    /**
+     * Ignorable whitespace was just read. This token is available only from <a href="#nextToken()">nextToken()</a>).
+     * For non-validating parsers, this event is only reported by nextToken() when outside the root element. Validating
+     * parsers may be able to detect ignorable whitespace at other locations. The ignorable whitespace string is
+     * available by calling getText()
+     * <p>
+     * <strong>NOTE:</strong> this is different from calling the isWhitespace() method, since text content may be
+     * whitespace but not ignorable. Ignorable whitespace is skipped by next() automatically; this event type is never
+     * returned from next().
+     *
+     * @see #nextToken
+     * @see #getText
+     */
+    int IGNORABLE_WHITESPACE = 7;
+
+    /**
+     * An XML processing instruction declaration was just read. This event type is available only via
+     * <a href="#nextToken()">nextToken()</a>. getText() will return text that is inside the processing instruction.
+     * Calls to next() will skip processing instructions automatically.
+     *
+     * @see #nextToken
+     * @see #getText
+     */
+    int PROCESSING_INSTRUCTION = 8;
+
+    /**
+     * An XML comment was just read. This event type is this token is available via
+     * <a href="#nextToken()">nextToken()</a> only; calls to next() will skip comments automatically. The content of the
+     * comment can be accessed using the getText() method.
+     *
+     * @see #nextToken
+     * @see #getText
+     */
+    int COMMENT = 9;
+
+    /**
+     * An XML document type declaration was just read. This token is available from
+     * <a href="#nextToken()">nextToken()</a> only. The unparsed text inside the doctype is available via the getText()
+     * method.
+     *
+     * @see #nextToken
+     * @see #getText
+     */
+    int DOCDECL = 10;
+
+    /**
+     * This array can be used to convert the event type integer constants such as START_TAG or TEXT to to a string. For
+     * example, the value of TYPES[START_TAG] is the string "START_TAG". This array is intended for diagnostic output
+     * only. Relying on the contents of the array may be dangerous since malicious applications may alter the array,
+     * although it is final, due to limitations of the Java language.
+     */
+    String[] TYPES = { "START_DOCUMENT", "END_DOCUMENT", "START_TAG", "END_TAG", "TEXT", "CDSECT", "ENTITY_REF",
+            "IGNORABLE_WHITESPACE", "PROCESSING_INSTRUCTION", "COMMENT", "DOCDECL" };
+
+    // ----------------------------------------------------------------------------
+    // namespace related features
+
+    /**
+     * This feature determines whether the parser processes namespaces. As for all features, the default value is false.
+     * <p>
+     * <strong>NOTE:</strong> The value can not be changed during parsing an must be set before parsing.
+     *
+     * @see #getFeature
+     * @see #setFeature
+     */
+    String FEATURE_PROCESS_NAMESPACES = "http://xmlpull.org/v1/doc/features.html#process-namespaces";
+
+    /**
+     * This feature determines whether namespace attributes are exposed via the attribute access methods. Like all
+     * features, the default value is false. This feature cannot be changed during parsing.
+     *
+     * @see #getFeature
+     * @see #setFeature
+     */
+    String FEATURE_REPORT_NAMESPACE_ATTRIBUTES = "http://xmlpull.org/v1/doc/features.html#report-namespace-prefixes";
+
+    /**
+     * This feature determines whether the document declaration is processed. If set to false, the DOCDECL event type is
+     * reported by nextToken() and ignored by next(). If this feature is activated, then the document declaration must
+     * be processed by the parser.
+     * <p>
+     * <strong>Please note:</strong> If the document type declaration was ignored, entity references may cause
+     * exceptions later in the parsing process. The default value of this feature is false. It cannot be changed during
+     * parsing.
+     *
+     * @see #getFeature
+     * @see #setFeature
+     */
+    String FEATURE_PROCESS_DOCDECL = "http://xmlpull.org/v1/doc/features.html#process-docdecl";
+
+    /**
+     * If this feature is activated, all validation errors as defined in the XML 1.0 specification are reported. This
+     * implies that FEATURE_PROCESS_DOCDECL is true and both, the internal and external document type declaration will
+     * be processed.
+     * <p>
+     * <strong>Please Note:</strong> This feature can not be changed during parsing. The default value is false.
+     *
+     * @see #getFeature
+     * @see #setFeature
+     */
+    String FEATURE_VALIDATION = "http://xmlpull.org/v1/doc/features.html#validation";
+
+    /**
+     * Use this call to change the general behaviour of the parser, such as namespace processing or doctype declaration
+     * handling. This method must be called before the first call to next or nextToken. Otherwise, an exception is
+     * thrown.
+     * <p>
+     * Example: call setFeature(FEATURE_PROCESS_NAMESPACES, true) in order to switch on namespace processing. The
+     * initial settings correspond to the properties requested from the XML Pull Parser factory. If none were requested,
+     * all features are deactivated by default.
+     *
+     * @exception XmlPullParserException If the feature is not supported or can not be set
+     * @exception IllegalArgumentException If string with the feature name is null
+     */
+    void setFeature( String name, boolean state )
+            throws XmlPullParserException;
+
+    /**
+     * Returns the current value of the given feature.
+     * <p>
+     * <strong>Please note:</strong> unknown features are <strong>always</strong> returned as false.
+     *
+     * @param name The name of feature to be retrieved.
+     * @return The value of the feature.
+     * @exception IllegalArgumentException if string the feature name is null
+     */
+
+    boolean getFeature( String name );
+
+    /**
+     * Set the value of a property. The property name is any fully-qualified URI.
+     *
+     * @exception XmlPullParserException If the property is not supported or can not be set
+     * @exception IllegalArgumentException If string with the property name is null
+     */
+    void setProperty( String name, Object value )
+            throws XmlPullParserException;
+
+    /**
+     * Look up the value of a property. The property name is any fully-qualified URI.
+     * <p>
+     * <strong>NOTE:</strong> unknown properties are <strong>always</strong> returned as null.
+     *
+     * @param name The name of property to be retrieved.
+     * @return The value of named property.
+     */
+    Object getProperty( String name );
+
+    /**
+     * Set the input source for parser to the given reader and resets the parser. The event type is set to the initial
+     * value START_DOCUMENT. Setting the reader to null will just stop parsing and reset parser state, allowing the
+     * parser to free internal resources such as parsing buffers.
+     */
+    void setInput( Reader in )
+            throws XmlPullParserException;
+
+    /**
+     * Sets the input stream the parser is going to process. This call resets the parser state and sets the event type
+     * to the initial value START_DOCUMENT.
+     * <p>
+     * <strong>NOTE:</strong> If an input encoding string is passed, it MUST be used. Otherwise, if inputEncoding is
+     * null, the parser SHOULD try to determine input encoding following XML 1.0 specification (see below). If encoding
+     * detection is supported then following feature <a href=
+     * "http://xmlpull.org/v1/doc/features.html#detect-encoding">http://xmlpull.org/v1/doc/features.html#detect-encoding</a>
+     * MUST be true and otherwise it must be false
+     *
+     * @param inputStream contains a raw byte input stream of possibly unknown encoding (when inputEncoding is null).
+     * @param inputEncoding if not null it MUST be used as encoding for inputStream
+     */
+    void setInput( InputStream inputStream, String inputEncoding )
+            throws XmlPullParserException;
+
+    /**
+     * Returns the input encoding if known, null otherwise. If setInput(InputStream, inputEncoding) was called with an
+     * inputEncoding value other than null, this value must be returned from this method. Otherwise, if inputEncoding is
+     * null and the parser supports the encoding detection feature
+     * (http://xmlpull.org/v1/doc/features.html#detect-encoding), it must return the detected encoding. If
+     * setInput(Reader) was called, null is returned. After first call to next if XML declaration was present this
+     * method will return encoding declared.
+     */
+    String getInputEncoding();
+
+    /**
+     * Set new value for entity replacement text as defined in
+     * <a href="http://www.w3.org/TR/REC-xml#intern-replacement">XML 1.0 Section 4.5 Construction of Internal Entity
+     * Replacement Text</a>. If FEATURE_PROCESS_DOCDECL or FEATURE_VALIDATION are set, calling this function will result
+     * in an exception -- when processing of DOCDECL is enabled, there is no need to the entity replacement text
+     * manually.
+     * <p>
+     * The motivation for this function is to allow very small implementations of XMLPULL that will work in J2ME
+     * environments. Though these implementations may not be able to process the document type declaration, they still
+     * can work with known DTDs by using this function.
+     * <p>
+     * <b>Please notes:</b> The given value is used literally as replacement text and it corresponds to declaring entity
+     * in DTD that has all special characters escaped: left angle bracket is replaced with &amp;lt;, ampersand with
+     * &amp;amp; and so on.
+     * <p>
+     * <b>Note:</b> The given value is the literal replacement text and must not contain any other entity reference (if
+     * it contains any entity reference there will be no further replacement).
+     * <p>
+     * <b>Note:</b> The list of pre-defined entity names will always contain standard XML entities such as amp
+     * (&amp;amp;), lt (&amp;lt;), gt (&amp;gt;), quot (&amp;quot;), and apos (&amp;apos;). Those cannot be redefined by
+     * this method!
+     *
+     * @see #setInput
+     * @see #FEATURE_PROCESS_DOCDECL
+     * @see #FEATURE_VALIDATION
+     */
+    void defineEntityReplacementText( String entityName, String replacementText )
+            throws XmlPullParserException;
+
+    /**
+     * Returns the numbers of elements in the namespace stack for the given depth. If namespaces are not enabled, 0 is
+     * returned.
+     * <p>
+     * <b>NOTE:</b> when parser is on END_TAG then it is allowed to call this function with getDepth()+1 argument to
+     * retrieve position of namespace prefixes and URIs that were declared on corresponding START_TAG.
+     * <p>
+     * <b>NOTE:</b> to retrieve lsit of namespaces declared in current element:
+     *
+     * <pre>
+     *       XmlPullParser pp = ...
+     *       int nsStart = pp.getNamespaceCount(pp.getDepth()-1);
+     *       int nsEnd = pp.getNamespaceCount(pp.getDepth());
+     *       for (int i = nsStart; i &gt; nsEnd; i++) {
+     *          String prefix = pp.getNamespacePrefix(i);
+     *          String ns = pp.getNamespaceUri(i);
+     *           // ...
+     *      }
+     * </pre>
+     *
+     * @see #getNamespacePrefix
+     * @see #getNamespaceUri
+     * @see #getNamespace()
+     * @see #getNamespace(String)
+     */
+    int getNamespaceCount( int depth )
+            throws XmlPullParserException;
+
+    /**
+     * Returns the namespace prefix for the given position in the namespace stack. Default namespace declaration
+     * (xmlns='...') will have null as prefix. If the given index is out of range, an exception is thrown.
+     * <p>
+     * <b>Please note:</b> when the parser is on an END_TAG, namespace prefixes that were declared in the corresponding
+     * START_TAG are still accessible although they are no longer in scope.
+     */
+    String getNamespacePrefix( int pos )
+            throws XmlPullParserException;
+
+    /**
+     * Returns the namespace URI for the given position in the namespace stack If the position is out of range, an
+     * exception is thrown.
+     * <p>
+     * <b>NOTE:</b> when parser is on END_TAG then namespace prefixes that were declared in corresponding START_TAG are
+     * still accessible even though they are not in scope
+     */
+    String getNamespaceUri( int pos )
+            throws XmlPullParserException;
+
+    /**
+     * Returns the URI corresponding to the given prefix, depending on current state of the parser.
+     * <p>
+     * If the prefix was not declared in the current scope, null is returned. The default namespace is included in the
+     * namespace table and is available via getNamespace (null).
+     * <p>
+     * This method is a convenience method for
+     *
+     * <pre>
+     * for ( int i = getNamespaceCount( getDepth() ) - 1; i &gt;= 0; i-- )
+     * {
+     *     if ( getNamespacePrefix( i ).equals( prefix ) )
+     *     {
+     *         return getNamespaceUri( i );
+     *     }
+     * }
+     * return null;
+     * </pre>
+     * <p>
+     * <strong>Please note:</strong> parser implementations may provide more efficient lookup, e.g. using a Hashtable.
+     * The 'xml' prefix is bound to "http://www.w3.org/XML/1998/namespace", as defined in the
+     * <a href="http://www.w3.org/TR/REC-xml-names/#ns-using">Namespaces in XML</a> specification. Analogous, the
+     * 'xmlns' prefix is resolved to <a href="http://www.w3.org/2000/xmlns/">http://www.w3.org/2000/xmlns/</a>
+     *
+     * @see #getNamespaceCount
+     * @see #getNamespacePrefix
+     * @see #getNamespaceUri
+     */
+    String getNamespace( String prefix );
+
+    // --------------------------------------------------------------------------
+    // miscellaneous reporting methods
+
+    /**
+     * Returns the current depth of the element. Outside the root element, the depth is 0. The depth is incremented by 1
+     * when a start tag is reached. The depth is decremented AFTER the end tag event was observed.
+     *
+     * <pre>
+     * &lt;!-- outside --&gt;     0
+     * &lt;root&gt;                  1
+     *   sometext                 1
+     *     &lt;foobar&gt;         2
+     *     &lt;/foobar&gt;        2
+     * &lt;/root&gt;              1
+     * &lt;!-- outside --&gt;     0
+     * </pre>
+     */
+    int getDepth();
+
+    /**
+     * Returns a short text describing the current parser state, including the position, a description of the current
+     * event and the data source if known. This method is especially useful to provide meaningful error messages and for
+     * debugging purposes.
+     */
+    String getPositionDescription();
+
+    /**
+     * Returns the current line number, starting from 1. When the parser does not know the current line number or can
+     * not determine it, -1 is returned (e.g. for WBXML).
+     *
+     * @return current line number or -1 if unknown.
+     */
+    int getLineNumber();
+
+    /**
+     * Returns the current column number, starting from 0. When the parser does not know the current column number or
+     * can not determine it, -1 is returned (e.g. for WBXML).
+     *
+     * @return current column number or -1 if unknown.
+     */
+    int getColumnNumber();
+
+    // --------------------------------------------------------------------------
+    // TEXT related methods
+
+    /**
+     * Checks whether the current TEXT event contains only whitespace characters. For IGNORABLE_WHITESPACE, this is
+     * always true. For TEXT and CDSECT, false is returned when the current event text contains at least one non-white
+     * space character. For any other event type an exception is thrown.
+     * <p>
+     * <b>Please note:</b> non-validating parsers are not able to distinguish whitespace and ignorable whitespace,
+     * except from whitespace outside the root element. Ignorable whitespace is reported as separate event, which is
+     * exposed via nextToken only.
+     */
+    boolean isWhitespace()
+            throws XmlPullParserException;
+
+    /**
+     * Returns the text content of the current event as String. The value returned depends on current event type, for
+     * example for TEXT event it is element content (this is typical case when next() is used). See description of
+     * nextToken() for detailed description of possible returned values for different types of events.
+     * <p>
+     * <strong>NOTE:</strong> in case of ENTITY_REF, this method returns the entity replacement text (or null if not
+     * available). This is the only case where getText() and getTextCharacters() return different values.
+     *
+     * @see #getEventType
+     * @see #next
+     * @see #nextToken
+     */
+    String getText();
+
+    /**
+     * Returns the buffer that contains the text of the current event, as well as the start offset and length relevant
+     * for the current event. See getText(), next() and nextToken() for description of possible returned values.
+     * <p>
+     * <strong>Please note:</strong> this buffer must not be modified and its content MAY change after a call to next()
+     * or nextToken(). This method will always return the same value as getText(), except for ENTITY_REF. In the case of
+     * ENTITY ref, getText() returns the replacement text and this method returns the actual input buffer containing the
+     * entity name. If getText() returns null, this method returns null as well and the values returned in the holder
+     * array MUST be -1 (both start and length).
+     *
+     * @see #getText
+     * @see #next
+     * @see #nextToken
+     * @param holderForStartAndLength Must hold an 2-element int array into which the start offset and length values
+     *            will be written.
+     * @return char buffer that contains the text of the current event (null if the current event has no text
+     *         associated).
+     */
+    char[] getTextCharacters( int[] holderForStartAndLength );
+
+    // --------------------------------------------------------------------------
+    // START_TAG / END_TAG shared methods
+
+    /**
+     * Returns the namespace URI of the current element. The default namespace is represented as empty string. If
+     * namespaces are not enabled, an empty String ("") is always returned. The current event must be START_TAG or
+     * END_TAG; otherwise, null is returned.
+     */
+    String getNamespace();
+
+    /**
+     * For START_TAG or END_TAG events, the (local) name of the current element is returned when namespaces are enabled.
+     * When namespace processing is disabled, the raw name is returned. For ENTITY_REF events, the entity name is
+     * returned. If the current event is not START_TAG, END_TAG, or ENTITY_REF, null is returned.
+     * <p>
+     * <b>Please note:</b> To reconstruct the raw element name when namespaces are enabled and the prefix is not null,
+     * you will need to add the prefix and a colon to localName..
+     */
+    String getName();
+
+    /**
+     * Returns the prefix of the current element. If the element is in the default namespace (has no prefix), null is
+     * returned. If namespaces are not enabled, or the current event is not START_TAG or END_TAG, null is returned.
+     */
+    String getPrefix();
+
+    /**
+     * Returns true if the current event is START_TAG and the tag is degenerated (e.g. &lt;foobar/&gt;).
+     * <p>
+     * <b>NOTE:</b> if the parser is not on START_TAG, an exception will be thrown.
+     */
+    boolean isEmptyElementTag()
+            throws XmlPullParserException;
+
+    // --------------------------------------------------------------------------
+    // START_TAG Attributes retrieval methods
+
+    /**
+     * Returns the number of attributes of the current start tag, or -1 if the current event type is not START_TAG
+     *
+     * @see #getAttributeNamespace
+     * @see #getAttributeName
+     * @see #getAttributePrefix
+     * @see #getAttributeValue
+     */
+    int getAttributeCount();
+
+    /**
+     * Returns the namespace URI of the attribute with the given index (starts from 0). Returns an empty string ("") if
+     * namespaces are not enabled or the attribute has no namespace. Throws an IndexOutOfBoundsException if the index is
+     * out of range or the current event type is not START_TAG.
+     * <p>
+     * <strong>NOTE:</strong> if FEATURE_REPORT_NAMESPACE_ATTRIBUTES is set then namespace attributes (xmlns:ns='...')
+     * must be reported with namespace <a href="http://www.w3.org/2000/xmlns/">http://www.w3.org/2000/xmlns/</a> (visit
+     * this URL for description!). The default namespace attribute (xmlns="...") will be reported with empty namespace.
+     * <p>
+     * <strong>NOTE:</strong>The xml prefix is bound as defined in
+     * <a href="http://www.w3.org/TR/REC-xml-names/#ns-using">Namespaces in XML</a> specification to
+     * "http://www.w3.org/XML/1998/namespace".
+     *
+     * @param index zero based index of attribute
+     * @return attribute namespace, empty string ("") is returned if namespaces processing is not enabled or namespaces
+     *         processing is enabled but attribute has no namespace (it has no prefix).
+     */
+    String getAttributeNamespace( int index );
+
+    /**
+     * Returns the local name of the specified attribute if namespaces are enabled or just attribute name if namespaces
+     * are disabled. Throws an IndexOutOfBoundsException if the index is out of range or current event type is not
+     * START_TAG.
+     *
+     * @param index zero based index of attribute
+     * @return attribute name (null is never returned)
+     */
+    String getAttributeName( int index );
+
+    /**
+     * Returns the prefix of the specified attribute Returns null if the element has no prefix. If namespaces are
+     * disabled it will always return null. Throws an IndexOutOfBoundsException if the index is out of range or current
+     * event type is not START_TAG.
+     *
+     * @param index zero based index of attribute
+     * @return attribute prefix or null if namespaces processing is not enabled.
+     */
+    String getAttributePrefix( int index );
+
+    /**
+     * Returns the type of the specified attribute If parser is non-validating it MUST return CDATA.
+     *
+     * @param index zero based index of attribute
+     * @return attribute type (null is never returned)
+     */
+    String getAttributeType( int index );
+
+    /**
+     * Returns if the specified attribute was not in input was declared in XML. If parser is non-validating it MUST
+     * always return false. This information is part of XML infoset:
+     *
+     * @param index zero based index of attribute
+     * @return false if attribute was in input
+     */
+    boolean isAttributeDefault( int index );
+
+    /**
+     * Returns the given attributes value. Throws an IndexOutOfBoundsException if the index is out of range or current
+     * event type is not START_TAG.
+     * <p>
+     * <strong>NOTE:</strong> attribute value must be normalized (including entity replacement text if PROCESS_DOCDECL
+     * is false) as described in <a href="http://www.w3.org/TR/REC-xml#AVNormalize">XML 1.0 section 3.3.3
+     * Attribute-Value Normalization</a>
+     *
+     * @see #defineEntityReplacementText
+     * @param index zero based index of attribute
+     * @return value of attribute (null is never returned)
+     */
+    String getAttributeValue( int index );
+
+    /**
+     * Returns the attributes value identified by namespace URI and namespace localName. If namespaces are disabled
+     * namespace must be null. If current event type is not START_TAG then IndexOutOfBoundsException will be thrown.
+     * <p>
+     * <strong>NOTE:</strong> attribute value must be normalized (including entity replacement text if PROCESS_DOCDECL
+     * is false) as described in <a href="http://www.w3.org/TR/REC-xml#AVNormalize">XML 1.0 section 3.3.3
+     * Attribute-Value Normalization</a>
+     *
+     * @see #defineEntityReplacementText
+     * @param namespace Namespace of the attribute if namespaces are enabled otherwise must be null
+     * @param name If namespaces enabled local name of attribute otherwise just attribute name
+     * @return value of attribute or null if attribute with given name does not exist
+     */
+    String getAttributeValue( String namespace, String name );
+
+    // --------------------------------------------------------------------------
+    // actual parsing methods
+
+    /**
+     * Returns the type of the current event (START_TAG, END_TAG, TEXT, etc.)
+     *
+     * @see #next()
+     * @see #nextToken()
+     */
+    int getEventType()
+            throws XmlPullParserException;
+
+    /**
+     * Get next parsing event - element content wil be coalesced and only one TEXT event must be returned for whole
+     * element content (comments and processing instructions will be ignored and entity references must be expanded or
+     * exception mus be thrown if entity reference can not be expanded). If element content is empty (content is "")
+     * then no TEXT event will be reported.
+     * <p>
+     * <b>NOTE:</b> empty element (such as &lt;tag/&gt;) will be reported with two separate events: START_TAG, END_TAG - it
+     * must be so to preserve parsing equivalency of empty element to &lt;tag&gt;&lt;/tag&gt;. (see isEmptyElementTag ())
+     *
+     * @see #isEmptyElementTag
+     * @see #START_TAG
+     * @see #TEXT
+     * @see #END_TAG
+     * @see #END_DOCUMENT
+     */
+
+    int next()
+            throws XmlPullParserException, IOException;
+
+    /**
+     * This method works similarly to next() but will expose additional event types (COMMENT, CDSECT, DOCDECL,
+     * ENTITY_REF, PROCESSING_INSTRUCTION, or IGNORABLE_WHITESPACE) if they are available in input.
+     * <p>
+     * If special feature <a href="http://xmlpull.org/v1/doc/features.html#xml-roundtrip">FEATURE_XML_ROUNDTRIP</a>
+     * (identified by URI: http://xmlpull.org/v1/doc/features.html#xml-roundtrip) is enabled it is possible to do XML
+     * document round trip ie. reproduce exactly on output the XML input using getText(): returned content is always
+     * unnormalized (exactly as in input). Otherwise returned content is end-of-line normalized as described
+     * <a href="http://www.w3.org/TR/REC-xml#sec-line-ends">XML 1.0 End-of-Line Handling</a> and. Also when this feature
+     * is enabled exact content of START_TAG, END_TAG, DOCDECL and PROCESSING_INSTRUCTION is available.
+     * <p>
+     * Here is the list of tokens that can be returned from nextToken() and what getText() and getTextCharacters()
+     * returns:
+     * <dl>
+     * <dt>START_DOCUMENT
+     * <dd>null
+     * <dt>END_DOCUMENT
+     * <dd>null
+     * <dt>START_TAG
+     * <dd>null unless FEATURE_XML_ROUNDTRIP enabled and then returns XML tag, ex: &lt;tag attr='val'&gt;
+     * <dt>END_TAG
+     * <dd>null unless FEATURE_XML_ROUNDTRIP id enabled and then returns XML tag, ex: &lt;/tag&gt;
+     * <dt>TEXT
+     * <dd>return element content. <br>
+     * Note: that element content may be delivered in multiple consecutive TEXT events.
+     * <dt>IGNORABLE_WHITESPACE
+     * <dd>return characters that are determined to be ignorable white space. If the FEATURE_XML_ROUNDTRIP is enabled
+     * all whitespace content outside root element will always reported as IGNORABLE_WHITESPACE otherwise reporting is
+     * optional. <br>
+     * Note: that element content may be delivered in multiple consecutive IGNORABLE_WHITESPACE events.
+     * <dt>CDSECT
+     * <dd>return text <em>inside</em> CDATA (ex. 'fo&lt;o' from &lt;!CDATA[fo&lt;o]]&gt;)
+     * <dt>PROCESSING_INSTRUCTION
+     * <dd>if FEATURE_XML_ROUNDTRIP is true return exact PI content ex: 'pi foo' from &lt;?pi foo?&gt; otherwise it may be
+     * exact PI content or concatenation of PI target, space and data so for example for &lt;?target data?&gt; string
+     * &quot;target data&quot; may be returned if FEATURE_XML_ROUNDTRIP is false.
+     * <dt>COMMENT
+     * <dd>return comment content ex. 'foo bar' from &lt;!--foo bar--&gt;
+     * <dt>ENTITY_REF
+     * <dd>getText() MUST return entity replacement text if PROCESS_DOCDECL is false otherwise getText() MAY return
+     * null, additionally getTextCharacters() MUST return entity name (for example 'entity_name' for &amp;entity_name;).
+     * <br>
+     * <b>NOTE:</b> this is the only place where value returned from getText() and getTextCharacters() <b>are
+     * different</b> <br>
+     * <b>NOTE:</b> it is user responsibility to resolve entity reference if PROCESS_DOCDECL is false and there is no
+     * entity replacement text set in defineEntityReplacementText() method (getText() will be null) <br>
+     * <b>NOTE:</b> character entities (ex. &amp;#32;) and standard entities such as &amp;amp; &amp;lt; &amp;gt;
+     * &amp;quot; &amp;apos; are reported as well and are <b>not</b> reported as TEXT tokens but as ENTITY_REF tokens!
+     * This requirement is added to allow to do roundtrip of XML documents!
+     * <dt>DOCDECL
+     * <dd>if FEATURE_XML_ROUNDTRIP is true or PROCESS_DOCDECL is false then return what is inside of DOCDECL for
+     * example it returns:
+     *
+     * <pre>
+     * &quot; titlepage SYSTEM "http://www.foo.bar/dtds/typo.dtd"
+     * [&lt;!ENTITY % active.links "INCLUDE"&gt;]&quot;
+     * </pre>
+     * <p>
+     * for input document that contained:
+     *
+     * <pre>
+     * &lt;!DOCTYPE titlepage SYSTEM "http://www.foo.bar/dtds/typo.dtd"
+     * [&lt;!ENTITY % active.links "INCLUDE"&gt;]&gt;
+     * </pre>
+     *
+     * otherwise if FEATURE_XML_ROUNDTRIP is false and PROCESS_DOCDECL is true then what is returned is undefined (it
+     * may be even null)</dd>
+     * </dl>
+     * <p>
+     * <strong>NOTE:</strong> there is no guarantee that there will only one TEXT or IGNORABLE_WHITESPACE event from
+     * nextToken() as parser may chose to deliver element content in multiple tokens (dividing element content into
+     * chunks)
+     * <p>
+     * <strong>NOTE:</strong> whether returned text of token is end-of-line normalized is depending on
+     * FEATURE_XML_ROUNDTRIP.
+     * <p>
+     * <strong>NOTE:</strong> XMLDecl (&lt;?xml ...?&gt;) is not reported but its content is available through optional
+     * properties (see class description above).
+     *
+     * @see #next
+     * @see #START_TAG
+     * @see #TEXT
+     * @see #END_TAG
+     * @see #END_DOCUMENT
+     * @see #COMMENT
+     * @see #DOCDECL
+     * @see #PROCESSING_INSTRUCTION
+     * @see #ENTITY_REF
+     * @see #IGNORABLE_WHITESPACE
+     */
+    int nextToken()
+            throws XmlPullParserException, IOException;
+
+    // -----------------------------------------------------------------------------
+    // utility methods to mak XML parsing easier ...
+
+    /**
+     * Test if the current event is of the given type and if the namespace and name do match. null will match any
+     * namespace and any name. If the test is not passed, an exception is thrown. The exception text indicates the
+     * parser position, the expected event and the current event that is not meeting the requirement.
+     * <p>
+     * Essentially it does this
+     *
+     * <pre>
+     * if ( type != getEventType() || ( namespace != null &amp;&amp; !namespace.equals( getNamespace() ) )
+     *     || ( name != null &amp;&amp; !name.equals( getName() ) ) )
+     *     throw new XmlPullParserException( "expected " + TYPES[type] + getPositionDescription() );
+     * </pre>
+     */
+    void require( int type, String namespace, String name )
+            throws XmlPullParserException, IOException;
+
+    /**
+     * If current event is START_TAG then if next element is TEXT then element content is returned or if next event is
+     * END_TAG then empty string is returned, otherwise exception is thrown. After calling this function successfully
+     * parser will be positioned on END_TAG.
+     * <p>
+     * The motivation for this function is to allow to parse consistently both empty elements and elements that has non
+     * empty content, for example for input:
+     * <ol>
+     * <li>&lt;tag&gt;foo&lt;/tag&gt;
+     * <li>&lt;tag&gt;&lt;/tag&gt; (which is equivalent to &lt;tag/&gt; both input can be parsed with the same code:
+     *
+     * <pre>
+     *   p.nextTag()
+     *   p.requireEvent(p.START_TAG, "", "tag");
+     *   String content = p.nextText();
+     *   p.requireEvent(p.END_TAG, "", "tag");
+     * </pre></li></ol>
+     *
+     * This function together with nextTag make it very easy to parse XML that has no mixed content.
+     * <p>
+     * Essentially it does this
+     *
+     * <pre>
+     * if ( getEventType() != START_TAG )
+     * {
+     *     throw new XmlPullParserException( "parser must be on START_TAG to read next text", this, null );
+     * }
+     * int eventType = next();
+     * if ( eventType == TEXT )
+     * {
+     *     String result = getText();
+     *     eventType = next();
+     *     if ( eventType != END_TAG )
+     *     {
+     *         throw new XmlPullParserException( "event TEXT it must be immediately followed by END_TAG", this, null );
+     *     }
+     *     return result;
+     * }
+     * else if ( eventType == END_TAG )
+     * {
+     *     return "";
+     * }
+     * else
+     * {
+     *     throw new XmlPullParserException( "parser must be on START_TAG or TEXT to read text", this, null );
+     * }
+     * </pre>
+     */
+    String nextText()
+            throws XmlPullParserException, IOException;
+
+    /**
+     * Call next() and return event if it is START_TAG or END_TAG otherwise throw an exception. It will skip whitespace
+     * TEXT before actual tag if any.
+     * <p>
+     * essentially it does this
+     *
+     * <pre>
+     * int eventType = next();
+     * if ( eventType == TEXT &amp;&amp; isWhitespace() )
+     * { // skip whitespace
+     *     eventType = next();
+     * }
+     * if ( eventType != START_TAG &amp;&amp; eventType != END_TAG )
+     * {
+     *     throw new XmlPullParserException( "expected start or end tag", this, null );
+     * }
+     * return eventType;
+     * </pre>
+     */
+    int nextTag()
+            throws XmlPullParserException, IOException;
+
+}
diff --git a/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlPullParserException.java b/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlPullParserException.java
new file mode 100644
index 0000000..2d9c9d1
--- /dev/null
+++ b/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlPullParserException.java
@@ -0,0 +1,55 @@
+/* -*-             c-basic-offset: 4; indent-tabs-mode: nil; -*-  //------100-columns-wide------>|*/
+// for license please see accompanying LICENSE.txt file (available also at http://www.xmlpull.org/)
+
+package org.apache.camel.xml.io;
+
+/**
+ * This exception is thrown to signal XML Pull Parser related faults.
+ *
+ * @author <a href="http://www.extreme.indiana.edu/~aslom/">Aleksander Slominski</a>
+ */
+public class XmlPullParserException
+        extends Exception
+{
+    protected int row = -1;
+
+    protected int column = -1;
+
+    public XmlPullParserException( String s )
+    {
+        super( s );
+    }
+
+    /*
+     * public XmlPullParserException(String s, Throwable throwable) { super(s); this.detail = throwable; } public
+     * XmlPullParserException(String s, int row, int column) { super(s); this.row = row; this.column = column; }
+     */
+
+    public XmlPullParserException(String msg, XmlPullParser parser, Throwable cause )
+    {
+        super( ( msg == null ? "" : msg + " " )
+                + ( parser == null ? "" : "(position:" + parser.getPositionDescription() + ") " )
+                + ( cause == null ? "" : "caused by: " + cause ), cause );
+
+        if ( parser != null )
+        {
+            this.row = parser.getLineNumber();
+            this.column = parser.getColumnNumber();
+        }
+        if (cause != null)
+        {
+            initCause(cause);
+        }
+    }
+
+    public int getLineNumber()
+    {
+        return row;
+    }
+
+    public int getColumnNumber()
+    {
+        return column;
+    }
+
+}
diff --git a/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlStreamReader.java b/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlStreamReader.java
new file mode 100644
index 0000000..a3d52a7
--- /dev/null
+++ b/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlStreamReader.java
@@ -0,0 +1,747 @@
+/*
+ * Copyright 2004 Sun Microsystems, Inc.
+ *
+ * Licensed 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.xml.io;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.text.MessageFormat;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Character stream that handles (or at least attemtps to) all the necessary Voodo to figure out the
+ * charset encoding of the XML document within the stream.
+ * <p>
+ * IMPORTANT: This class is not related in any way to the org.xml.sax.XMLReader. This one IS a
+ * character stream.
+ * <p>
+ * All this has to be done without consuming characters from the stream, if not the XML parser will
+ * not recognized the document as a valid XML. This is not 100% true, but it's close enough (UTF-8
+ * BOM is not handled by all parsers right now, XmlReader handles it and things work in all
+ * parsers).
+ * <p>
+ * The XmlReader class handles the charset encoding of XML documents in Files, raw streams and HTTP
+ * streams by offering a wide set of constructors.
+ * <P>
+ * By default the charset encoding detection is lenient, the constructor with the lenient flag can
+ * be used for an script (following HTTP MIME and XML specifications). All this is nicely explained
+ * by Mark Pilgrim in his blog, <a
+ * href="https://web.archive.org/web/20060706153721/http://diveintomark.org/archives/2004/02/13/xml-media-types">
+ * Determining the character encoding of a feed</a>.
+ */
+public class XmlStreamReader extends Reader {
+
+    private static final int BUFFER_SIZE = 4096;
+    private static final String US_ASCII = "US-ASCII";
+    private static final String UTF_8 = "UTF-8";
+    private static final String UTF_16BE = "UTF-16BE";
+    private static final String UTF_16LE = "UTF-16LE";
+    private static final String UTF_16 = "UTF-16";
+    private static final String CP1047 = "CP1047";
+    private static final Pattern CHARSET_PATTERN = Pattern.compile("charset=([.[^; ]]*)");
+    private static final Pattern ENCODING_PATTERN = Pattern.compile("<\\?xml.*encoding[\\s]*=[\\s]*((?:\".[^\"]*\")|(?:'.[^']*'))", Pattern.MULTILINE);
+    private static final MessageFormat RAW_EX_1 = new MessageFormat("Invalid encoding, BOM [{0}] XML guess [{1}] XML prolog [{2}] encoding mismatch");
+    private static final MessageFormat RAW_EX_2 = new MessageFormat("Invalid encoding, BOM [{0}] XML guess [{1}] XML prolog [{2}] unknown BOM");
+    private static final MessageFormat HTTP_EX_1 = new MessageFormat(
+            "Invalid encoding, CT-MIME [{0}] CT-Enc [{1}] BOM [{2}] XML guess [{3}] XML prolog [{4}], BOM must be NULL");
+    private static final MessageFormat HTTP_EX_2 = new MessageFormat(
+            "Invalid encoding, CT-MIME [{0}] CT-Enc [{1}] BOM [{2}] XML guess [{3}] XML prolog [{4}], encoding mismatch");
+    private static final MessageFormat HTTP_EX_3 = new MessageFormat(
+            "Invalid encoding, CT-MIME [{0}] CT-Enc [{1}] BOM [{2}] XML guess [{3}] XML prolog [{4}], Invalid MIME");
+
+    private static String staticDefaultEncoding = null;
+
+    private final String defaultEncoding;
+
+    private Reader reader;
+    private String encoding;
+
+    /**
+     * Creates a Reader for a File.
+     * <p>
+     * It looks for the UTF-8 BOM first, if none sniffs the XML prolog charset, if this is also
+     * missing defaults to UTF-8.
+     * <p>
+     * It does a lenient charset encoding detection, check the constructor with the lenient
+     * parameter for details.
+     * <p>
+     *
+     * @param file File to create a Reader from.
+     * @throws IOException thrown if there is a problem reading the file.
+     *
+     */
+    public XmlStreamReader(final File file) throws IOException {
+        this(new FileInputStream(file));
+    }
+
+    /**
+     * Creates a Reader for a raw InputStream.
+     * <p>
+     * It follows the same logic used for files.
+     * <p>
+     * It does a lenient charset encoding detection, check the constructor with the lenient
+     * parameter for details.
+     * <p>
+     *
+     * @param is InputStream to create a Reader from.
+     * @throws IOException thrown if there is a problem reading the stream.
+     *
+     */
+    public XmlStreamReader(final InputStream is) throws IOException {
+        this(is, true);
+    }
+
+    /**
+     * Creates a Reader for a raw InputStream and uses the provided default encoding if none is
+     * determined.
+     * <p>
+     * It follows the same logic used for files.
+     * <p>
+     * If lenient detection is indicated and the detection above fails as per specifications it then
+     * attempts the following:
+     * <p>
+     * If the content type was 'text/html' it replaces it with 'text/xml' and tries the detection
+     * again.
+     * <p>
+     * Else if the XML prolog had a charset encoding that encoding is used.
+     * <p>
+     * Else if the content type had a charset encoding that encoding is used.
+     * <p>
+     * Else 'UTF-8' is used.
+     * <p>
+     * If lenient detection is indicated an XmlStreamReaderException is never thrown.
+     * <p>
+     *
+     * @param is InputStream to create a Reader from.
+     * @param lenient indicates if the charset encoding detection should be relaxed.
+     * @param defaultEncoding default encoding to use if one cannot be detected.
+     * @throws IOException thrown if there is a problem reading the stream.
+     * @throws XmlStreamReaderException thrown if the charset encoding could not be determined according
+     *             to the specs.
+     *
+     */
+    public XmlStreamReader(final InputStream is, final boolean lenient, final String defaultEncoding) throws IOException, XmlStreamReaderException {
+        if (defaultEncoding == null) {
+            this.defaultEncoding = staticDefaultEncoding;
+        } else {
+            this.defaultEncoding = defaultEncoding;
+        }
+        try {
+            doRawStream(is, lenient);
+        } catch (final XmlStreamReaderException ex) {
+            if (!lenient) {
+                throw ex;
+            } else {
+                doLenientDetection(null, ex);
+            }
+        }
+    }
+
+    /**
+     * Creates a Reader for a raw InputStream.
+     * <p>
+     * It follows the same logic used for files.
+     * <p>
+     * If lenient detection is indicated and the detection above fails as per specifications it then
+     * attempts the following:
+     * <p>
+     * If the content type was 'text/html' it replaces it with 'text/xml' and tries the detection
+     * again.
+     * <p>
+     * Else if the XML prolog had a charset encoding that encoding is used.
+     * <p>
+     * Else if the content type had a charset encoding that encoding is used.
+     * <p>
+     * Else 'UTF-8' is used.
+     * <p>
+     * If lenient detection is indicated an XmlStreamReaderException is never thrown.
+     * <p>
+     *
+     * @param is InputStream to create a Reader from.
+     * @param lenient indicates if the charset encoding detection should be relaxed.
+     * @throws IOException thrown if there is a problem reading the stream.
+     * @throws XmlStreamReaderException thrown if the charset encoding could not be determined according
+     *             to the specs.
+     *
+     */
+    public XmlStreamReader(final InputStream is, final boolean lenient) throws IOException, XmlStreamReaderException {
+        this(is, lenient, null);
+    }
+
+    /**
+     * Creates a Reader using the InputStream of a URL.
+     * <p>
+     * If the URL is not of type HTTP and there is not 'content-type' header in the fetched data it
+     * uses the same logic used for Files.
+     * <p>
+     * If the URL is a HTTP Url or there is a 'content-type' header in the fetched data it uses the
+     * same logic used for an InputStream with content-type.
+     * <p>
+     * It does a lenient charset encoding detection, check the constructor with the lenient
+     * parameter for details.
+     * <p>
+     *
+     * @param url URL to create a Reader from.
+     * @throws IOException thrown if there is a problem reading the stream of the URL.
+     *
+     */
+    public XmlStreamReader(final URL url) throws IOException {
+        this(url, null);
+    }
+
+    /**
+     * Creates a Reader using the InputStream of a URL.
+     * <p>
+     * If the URL is not of type HTTP and there is not 'content-type' header in the fetched data it
+     * uses the same logic used for Files.
+     * <p>
+     * If the URL is a HTTP Url or there is a 'content-type' header in the fetched data it uses the
+     * same logic used for an InputStream with content-type.
+     * <p>
+     * It does a lenient charset encoding detection, check the constructor with the lenient
+     * parameter for details.
+     * <p>
+     *
+     * @param url URL to create a Reader from.
+     * @param requestHeaders optional Map of headers to set on http request.
+     * @throws IOException thrown if there is a problem reading the stream of the URL.
+     *
+     */
+    public XmlStreamReader(final URL url, final Map<String, String> requestHeaders) throws IOException {
+        this(url.openConnection(), requestHeaders);
+    }
+
+    /**
+     * Creates a Reader using the InputStream of a URLConnection.
+     * <p>
+     * If the URLConnection is not of type HttpURLConnection and there is not 'content-type' header
+     * in the fetched data it uses the same logic used for files.
+     * <p>
+     * If the URLConnection is a HTTP Url or there is a 'content-type' header in the fetched data it
+     * uses the same logic used for an InputStream with content-type.
+     * <p>
+     * It does a lenient charset encoding detection, check the constructor with the lenient
+     * parameter for details.
+     * <p>
+     *
+     * @param conn URLConnection to create a Reader from.
+     * @throws IOException thrown if there is a problem reading the stream of the URLConnection.
+     *
+     */
+    public XmlStreamReader(final URLConnection conn) throws IOException {
+        this(conn, null);
+    }
+
+    /**
+     * Creates a Reader using the InputStream of a URLConnection.
+     * <p>
+     * If the URLConnection is not of type HttpURLConnection and there is not 'content-type' header
+     * in the fetched data it uses the same logic used for files.
+     * <p>
+     * If the URLConnection is a HTTP Url or there is a 'content-type' header in the fetched data it
+     * uses the same logic used for an InputStream with content-type.
+     * <p>
+     * It does a lenient charset encoding detection, check the constructor with the lenient
+     * parameter for details.
+     * <p>
+     *
+     * @param conn URLConnection to create a Reader from.
+     * @param requestHeaders optional Map of headers to set on http request.
+     * @throws IOException thrown if there is a problem reading the stream of the URLConnection.
+     *
+     */
+    public XmlStreamReader(final URLConnection conn, final Map<String, String> requestHeaders) throws IOException {
+        defaultEncoding = staticDefaultEncoding;
+        final boolean lenient = true;
+        if (conn instanceof HttpURLConnection) {
+            final Package pckg = this.getClass().getPackage();
+            setRequestHeader(conn, requestHeaders);
+            try {
+                doHttpStream(conn.getInputStream(), conn.getContentType(), lenient);
+            } catch (final XmlStreamReaderException ex) {
+                doLenientDetection(conn.getContentType(), ex);
+            }
+        } else if (conn.getContentType() != null) {
+            try {
+                doHttpStream(conn.getInputStream(), conn.getContentType(), lenient);
+            } catch (final XmlStreamReaderException ex) {
+                doLenientDetection(conn.getContentType(), ex);
+            }
+        } else {
+            try {
+                doRawStream(conn.getInputStream(), lenient);
+            } catch (final XmlStreamReaderException ex) {
+                doLenientDetection(null, ex);
+            }
+        }
+    }
+
+    /**
+     * Creates a Reader using an InputStream and the associated content-type header.
+     * <p>
+     * First it checks if the stream has BOM. If there is not BOM checks the content-type encoding.
+     * If there is not content-type encoding checks the XML prolog encoding. If there is not XML
+     * prolog encoding uses the default encoding mandated by the content-type MIME type.
+     * <p>
+     * It does a lenient charset encoding detection, check the constructor with the lenient
+     * parameter for details.
+     * <p>
+     *
+     * @param is InputStream to create the reader from.
+     * @param httpContentType content-type header to use for the resolution of the charset encoding.
+     * @throws IOException thrown if there is a problem reading the file.
+     *
+     */
+    public XmlStreamReader(final InputStream is, final String httpContentType) throws IOException {
+        this(is, httpContentType, true);
+    }
+
+    /**
+     * Creates a Reader using an InputStream and the associated content-type header.
+     * <p>
+     * First it checks if the stream has BOM. If there is not BOM checks the content-type encoding.
+     * If there is not content-type encoding checks the XML prolog encoding. If there is not XML
+     * prolog encoding uses the default encoding mandated by the content-type MIME type.
+     * <p>
+     * If lenient detection is indicated and the detection above fails as per specifications it then
+     * attempts the following:
+     * <p>
+     * If the content type was 'text/html' it replaces it with 'text/xml' and tries the detection
+     * again.
+     * <p>
+     * Else if the XML prolog had a charset encoding that encoding is used.
+     * <p>
+     * Else if the content type had a charset encoding that encoding is used.
+     * <p>
+     * Else 'UTF-8' is used.
+     * <p>
+     * If lenient detection is indicated and XmlStreamReaderException is never thrown.
+     * <p>
+     *
+     * @param is InputStream to create the reader from.
+     * @param httpContentType content-type header to use for the resolution of the charset encoding.
+     * @param lenient indicates if the charset encoding detection should be relaxed.
+     * @param defaultEncoding default encoding to use if one cannot be detected.
+     * @throws IOException thrown if there is a problem reading the file.
+     * @throws XmlStreamReaderException thrown if the charset encoding could not be determined according
+     *             to the specs.
+     *
+     */
+    public XmlStreamReader(final InputStream is, final String httpContentType, final boolean lenient, final String defaultEncoding) throws IOException,
+            XmlStreamReaderException {
+        if (defaultEncoding == null) {
+            this.defaultEncoding = staticDefaultEncoding;
+        } else {
+            this.defaultEncoding = defaultEncoding;
+        }
+        try {
+            doHttpStream(is, httpContentType, lenient);
+        } catch (final XmlStreamReaderException ex) {
+            if (!lenient) {
+                throw ex;
+            } else {
+                doLenientDetection(httpContentType, ex);
+            }
+        }
+    }
+
+    /**
+     * Creates a Reader using an InputStream and the associated content-type header.
+     * <p>
+     * First it checks if the stream has BOM. If there is not BOM checks the content-type encoding.
+     * If there is not content-type encoding checks the XML prolog encoding. If there is not XML
+     * prolog encoding uses the default encoding mandated by the content-type MIME type.
+     * <p>
+     * If lenient detection is indicated and the detection above fails as per specifications it then
+     * attempts the following:
+     * <p>
+     * If the content type was 'text/html' it replaces it with 'text/xml' and tries the detection
+     * again.
+     * <p>
+     * Else if the XML prolog had a charset encoding that encoding is used.
+     * <p>
+     * Else if the content type had a charset encoding that encoding is used.
+     * <p>
+     * Else 'UTF-8' is used.
+     * <p>
+     * If lenient detection is indicated and XmlStreamReaderException is never thrown.
+     * <p>
+     *
+     * @param is InputStream to create the reader from.
+     * @param httpContentType content-type header to use for the resolution of the charset encoding.
+     * @param lenient indicates if the charset encoding detection should be relaxed.
+     * @throws IOException thrown if there is a problem reading the file.
+     * @throws XmlStreamReaderException thrown if the charset encoding could not be determined according
+     *             to the specs.
+     *
+     */
+    public XmlStreamReader(final InputStream is, final String httpContentType, final boolean lenient) throws IOException, XmlStreamReaderException {
+        this(is, httpContentType, lenient, null);
+    }
+
+    /**
+     * Returns the default encoding to use if none is set in HTTP content-type, XML prolog and the
+     * rules based on content-type are not adequate.
+     * <p/>
+     * If it is NULL the content-type based rules are used.
+     * <p/>
+     *
+     * @return the default encoding to use.
+     */
+    public static String getDefaultEncoding() {
+        return staticDefaultEncoding;
+    }
+
+    /**
+     * Sets the default encoding to use if none is set in HTTP content-type, XML prolog and the
+     * rules based on content-type are not adequate.
+     * <p/>
+     * If it is set to NULL the content-type based rules are used.
+     * <p/>
+     * By default it is NULL.
+     * <p/>
+     *
+     * @param encoding charset encoding to default to.
+     */
+    public static void setDefaultEncoding(final String encoding) {
+        staticDefaultEncoding = encoding;
+    }
+
+    /**
+     * Returns the charset encoding of the XmlReader.
+     * <p>
+     *
+     * @return charset encoding.
+     *
+     */
+    public String getEncoding() {
+        return encoding;
+    }
+
+    private void doLenientDetection(String httpContentType, XmlStreamReaderException ex) throws IOException {
+        if (httpContentType != null) {
+            if (httpContentType.startsWith("text/html")) {
+                httpContentType = httpContentType.substring("text/html".length());
+                httpContentType = "text/xml" + httpContentType;
+                try {
+                    doHttpStream(ex.getInputStream(), httpContentType, true);
+                    ex = null;
+                } catch (final XmlStreamReaderException ex2) {
+                    ex = ex2;
+                }
+            }
+        }
+        if (ex != null) {
+            String encoding = ex.getXmlEncoding();
+            if (encoding == null) {
+                encoding = ex.getContentTypeEncoding();
+            }
+            if (encoding == null) {
+                if (defaultEncoding == null) {
+                    encoding = UTF_8;
+                } else {
+                    encoding = defaultEncoding;
+                }
+            }
+            prepareReader(ex.getInputStream(), encoding);
+        }
+    }
+
+    @Override
+    public int read(final char[] buf, final int offset, final int len) throws IOException {
+        return reader.read(buf, offset, len);
+    }
+
+    /**
+     * Closes the XmlReader stream.
+     * <p>
+     *
+     * @throws IOException thrown if there was a problem closing the stream.
+     *
+     */
+    @Override
+    public void close() throws IOException {
+        reader.close();
+    }
+
+    private void doRawStream(final InputStream is, final boolean lenient) throws IOException {
+        final BufferedInputStream pis = new BufferedInputStream(is, BUFFER_SIZE);
+        final String bomEnc = getBOMEncoding(pis);
+        final String xmlGuessEnc = getXMLGuessEncoding(pis);
+        final String xmlEnc = getXmlProlog(pis, xmlGuessEnc);
+        final String encoding = calculateRawEncoding(bomEnc, xmlGuessEnc, xmlEnc, pis);
+        prepareReader(pis, encoding);
+    }
+
+    private void doHttpStream(final InputStream is, final String httpContentType, final boolean lenient) throws IOException {
+        final BufferedInputStream pis = new BufferedInputStream(is, BUFFER_SIZE);
+        final String cTMime = getContentTypeMime(httpContentType);
+        final String cTEnc = getContentTypeEncoding(httpContentType);
+        final String bomEnc = getBOMEncoding(pis);
+        final String xmlGuessEnc = getXMLGuessEncoding(pis);
+        final String xmlEnc = getXmlProlog(pis, xmlGuessEnc);
+        final String encoding = calculateHttpEncoding(cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc, pis, lenient);
+        prepareReader(pis, encoding);
+    }
+
+    private void prepareReader(final InputStream is, final String encoding) throws IOException {
+        reader = new InputStreamReader(is, encoding);
+        this.encoding = encoding;
+    }
+
+    // InputStream is passed for XmlStreamReaderException creation only
+    private String calculateRawEncoding(final String bomEnc, final String xmlGuessEnc, final String xmlEnc, final InputStream is) throws IOException {
+        String encoding;
+        if (bomEnc == null) {
+            if (xmlGuessEnc == null || xmlEnc == null) {
+                if (defaultEncoding == null) {
+                    encoding = UTF_8;
+                } else {
+                    encoding = defaultEncoding;
+                }
+            } else if (xmlEnc.equals(UTF_16) && (xmlGuessEnc.equals(UTF_16BE) || xmlGuessEnc.equals(UTF_16LE))) {
+                encoding = xmlGuessEnc;
+            } else {
+                encoding = xmlEnc;
+            }
+        } else if (bomEnc.equals(UTF_8)) {
+            if (xmlGuessEnc != null && !xmlGuessEnc.equals(UTF_8)) {
+                throw new XmlStreamReaderException(RAW_EX_1.format(new Object[] { bomEnc, xmlGuessEnc, xmlEnc }), bomEnc, xmlGuessEnc, xmlEnc, is);
+            }
+            if (xmlEnc != null && !xmlEnc.equals(UTF_8)) {
+                throw new XmlStreamReaderException(RAW_EX_1.format(new Object[] { bomEnc, xmlGuessEnc, xmlEnc }), bomEnc, xmlGuessEnc, xmlEnc, is);
+            }
+            encoding = UTF_8;
+        } else if (bomEnc.equals(UTF_16BE) || bomEnc.equals(UTF_16LE)) {
+            if (xmlGuessEnc != null && !xmlGuessEnc.equals(bomEnc)) {
+                throw new IOException(RAW_EX_1.format(new Object[] { bomEnc, xmlGuessEnc, xmlEnc }));
+            }
+            if (xmlEnc != null && !xmlEnc.equals(UTF_16) && !xmlEnc.equals(bomEnc)) {
+                throw new XmlStreamReaderException(RAW_EX_1.format(new Object[] { bomEnc, xmlGuessEnc, xmlEnc }), bomEnc, xmlGuessEnc, xmlEnc, is);
+            }
+            encoding = bomEnc;
+        } else {
+            throw new XmlStreamReaderException(RAW_EX_2.format(new Object[] { bomEnc, xmlGuessEnc, xmlEnc }), bomEnc, xmlGuessEnc, xmlEnc, is);
+        }
+        return encoding;
+    }
+
+    private void setRequestHeader(final URLConnection conn, final Map<String, String> requestHeaders) {
+        final Package pckg = this.getClass().getPackage();
+        if (pckg.getImplementationTitle() != null && pckg.getImplementationVersion() != null) {
+            conn.setRequestProperty("User-Agent", pckg.getImplementationTitle() + "/" + pckg.getImplementationVersion());
+        } else {
+            conn.setRequestProperty("User-Agent", "ROME");
+        }
+        if (requestHeaders != null) {
+            for (final Entry<String, String> requestHeader : requestHeaders.entrySet()) {
+                conn.setRequestProperty(requestHeader.getKey(), requestHeader.getValue());
+            }
+        }
+    }
+
+    // InputStream is passed for XmlStreamReaderException creation only
+    private String calculateHttpEncoding(final String cTMime, final String cTEnc, final String bomEnc, final String xmlGuessEnc, final String xmlEnc,
+                                         final InputStream is, final boolean lenient) throws IOException {
+        String encoding;
+        if (lenient && xmlEnc != null) {
+            encoding = xmlEnc;
+        } else {
+            final boolean appXml = isAppXml(cTMime);
+            final boolean textXml = isTextXml(cTMime);
+            if (appXml || textXml) {
+                if (cTEnc == null) {
+                    if (appXml) {
+                        encoding = calculateRawEncoding(bomEnc, xmlGuessEnc, xmlEnc, is);
+                    } else {
+                        if (defaultEncoding == null) {
+                            encoding = US_ASCII;
+                        } else {
+                            encoding = defaultEncoding;
+                        }
+                    }
+                } else if (bomEnc != null && (cTEnc.equals(UTF_16BE) || cTEnc.equals(UTF_16LE))) {
+                    throw new XmlStreamReaderException(HTTP_EX_1.format(new Object[] { cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc }), cTMime, cTEnc, bomEnc,
+                            xmlGuessEnc, xmlEnc, is);
+                } else if (cTEnc.equals(UTF_16)) {
+                    if (bomEnc != null && bomEnc.startsWith(UTF_16)) {
+                        encoding = bomEnc;
+                    } else {
+                        throw new XmlStreamReaderException(HTTP_EX_2.format(new Object[] { cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc }), cTMime, cTEnc, bomEnc,
+                                xmlGuessEnc, xmlEnc, is);
+                    }
+                } else {
+                    encoding = cTEnc;
+                }
+            } else {
+                throw new XmlStreamReaderException(HTTP_EX_3.format(new Object[] { cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc }), cTMime, cTEnc, bomEnc, xmlGuessEnc,
+                        xmlEnc, is);
+            }
+        }
+        return encoding;
+    }
+
+    // returns MIME type or NULL if httpContentType is NULL
+    private static String getContentTypeMime(final String httpContentType) {
+        String mime = null;
+        if (httpContentType != null) {
+            final int i = httpContentType.indexOf(";");
+            if (i == -1) {
+                mime = httpContentType.trim();
+            } else {
+                mime = httpContentType.substring(0, i).trim();
+            }
+        }
+        return mime;
+    }
+
+    // returns charset parameter value, NULL if not present, NULL if
+    // httpContentType is NULL
+    private static String getContentTypeEncoding(final String httpContentType) {
+        String encoding = null;
+        if (httpContentType != null) {
+            final int i = httpContentType.indexOf(";");
+            if (i > -1) {
+                final String postMime = httpContentType.substring(i + 1);
+                final Matcher m = CHARSET_PATTERN.matcher(postMime);
+                if (m.find()) {
+                    encoding = m.group(1);
+                }
+                if (encoding != null) {
+                    encoding = encoding.toUpperCase(Locale.ENGLISH);
+                }
+            }
+            if (encoding != null && (encoding.startsWith("\"") && encoding.endsWith("\"") || encoding.startsWith("'") && encoding.endsWith("'"))) {
+                encoding = encoding.substring(1, encoding.length() - 1);
+            }
+        }
+        return encoding;
+    }
+
+    // returns the BOM in the stream, NULL if not present,
+    // if there was BOM the in the stream it is consumed
+    private static String getBOMEncoding(final BufferedInputStream is) throws IOException {
+        String encoding = null;
+        final int[] bytes = new int[3];
+        is.mark(3);
+        bytes[0] = is.read();
+        bytes[1] = is.read();
+        bytes[2] = is.read();
+
+        if (bytes[0] == 0xFE && bytes[1] == 0xFF) {
+            encoding = UTF_16BE;
+            is.reset();
+            is.read();
+            is.read();
+        } else if (bytes[0] == 0xFF && bytes[1] == 0xFE) {
+            encoding = UTF_16LE;
+            is.reset();
+            is.read();
+            is.read();
+        } else if (bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) {
+            encoding = UTF_8;
+        } else {
+            is.reset();
+        }
+        return encoding;
+    }
+
+    // returns the best guess for the encoding by looking the first bytes of the
+    // stream, '<?xm'
+    private static String getXMLGuessEncoding(final BufferedInputStream is) throws IOException {
+        String encoding = null;
+        final int[] bytes = new int[4];
+        is.mark(4);
+        bytes[0] = is.read();
+        bytes[1] = is.read();
+        bytes[2] = is.read();
+        bytes[3] = is.read();
+        is.reset();
+
+        if (bytes[0] == 0x00 && bytes[1] == 0x3C && bytes[2] == 0x00 && bytes[3] == 0x3F) {
+            encoding = UTF_16BE;
+        } else if (bytes[0] == 0x3C && bytes[1] == 0x00 && bytes[2] == 0x3F && bytes[3] == 0x00) {
+            encoding = UTF_16LE;
+        } else if (bytes[0] == 0x3C && bytes[1] == 0x3F && bytes[2] == 0x78 && bytes[3] == 0x6D) {
+            encoding = UTF_8;
+        } else if (bytes[0] == 0x4C && bytes[1] == 0x6F && bytes[2] == 0xA7 && bytes[3] == 0x94) {
+            encoding = CP1047;
+        }
+        return encoding;
+    }
+
+    // returns the encoding declared in the <?xml encoding=...?>, NULL if none
+    static String getXmlProlog(final InputStream is, final String guessedEnc) throws IOException {
+        String encoding = null;
+        if (guessedEnc != null) {
+            final byte[] bytes = new byte[BUFFER_SIZE];
+            is.mark(BUFFER_SIZE);
+            int offset = 0;
+            int max = BUFFER_SIZE;
+            int c = is.read(bytes, offset, max);
+            int firstGT = -1;
+            while (c != -1 && firstGT == -1 && offset < BUFFER_SIZE) {
+                offset += c;
+                max -= c;
+                c = is.read(bytes, offset, max);
+                firstGT = new String(bytes, 0, offset, guessedEnc).indexOf(">");
+            }
+            if (firstGT == -1) {
+                if (c == -1) {
+                    throw new IOException("Unexpected end of XML stream");
+                } else {
+                    throw new IOException("XML prolog or ROOT element not found on first " + offset + " bytes");
+                }
+            }
+            final int bytesRead = offset;
+            if (bytesRead > 0) {
+                is.reset();
+                String prolog = new String(bytes, guessedEnc).substring(0, firstGT);
+                final Matcher m = ENCODING_PATTERN.matcher(prolog);
+                if (m.find()) {
+                    encoding = m.group(1).toUpperCase(Locale.ENGLISH);
+                    encoding = encoding.substring(1, encoding.length() - 1);
+                }
+            }
+        }
+        return encoding;
+    }
+
+    // indicates if the MIME type belongs to the APPLICATION XML family
+    private static boolean isAppXml(final String mime) {
+        return mime != null
+                && (mime.equals("application/xml") || mime.equals("application/xml-dtd") || mime.equals("application/xml-external-parsed-entity") || mime
+                .startsWith("application/") && mime.endsWith("+xml"));
+    }
+
+    // indicates if the MIME type belongs to the TEXT XML family
+    private static boolean isTextXml(final String mime) {
+        return mime != null && (mime.equals("text/xml") || mime.equals("text/xml-external-parsed-entity") || mime.startsWith("text/") && mime.endsWith("+xml"));
+    }
+
+}
\ No newline at end of file
diff --git a/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlStreamReaderException.java b/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlStreamReaderException.java
new file mode 100644
index 0000000..97d798c
--- /dev/null
+++ b/core/camel-xml-io/src/main/java/org/apache/camel/xml/io/XmlStreamReaderException.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2004 Sun Microsystems, Inc.
+ *
+ * Licensed 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.xml.io;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+/**
+ * The XmlReaderException is thrown by the XmlReader constructors if the charset encoding can not be
+ * determined according to the XML 1.0 specification and RFC 3023.
+ * <p>
+ * The exception returns the unconsumed InputStream to allow the application to do an alternate
+ * processing with the stream. Note that the original InputStream given to the XmlReader cannot be
+ * used as that one has been already read.
+ */
+public class XmlStreamReaderException extends IOException {
+    private static final long serialVersionUID = 1L;
+    private final String bomEncoding;
+    private final String xmlGuessEncoding;
+    private final String xmlEncoding;
+    private final String contentTypeMime;
+    private final String contentTypeEncoding;
+    private final InputStream is;
+
+    /**
+     * Creates an exception instance if the charset encoding could not be determined.
+     * <p>
+     * Instances of this exception are thrown by the XmlReader.
+     * <p>
+     *
+     * @param msg message describing the reason for the exception.
+     * @param bomEnc BOM encoding.
+     * @param xmlGuessEnc XML guess encoding.
+     * @param xmlEnc XML prolog encoding.
+     * @param is the unconsumed InputStream.
+     *
+     */
+    public XmlStreamReaderException(final String msg, final String bomEnc, final String xmlGuessEnc, final String xmlEnc, final InputStream is) {
+        this(msg, null, null, bomEnc, xmlGuessEnc, xmlEnc, is);
+    }
+
+    /**
+     * Creates an exception instance if the charset encoding could not be determined.
+     * <p>
+     * Instances of this exception are thrown by the XmlReader.
+     * <p>
+     *
+     * @param msg message describing the reason for the exception.
+     * @param ctMime MIME type in the content-type.
+     * @param ctEnc encoding in the content-type.
+     * @param bomEnc BOM encoding.
+     * @param xmlGuessEnc XML guess encoding.
+     * @param xmlEnc XML prolog encoding.
+     * @param is the unconsumed InputStream.
+     *
+     */
+    public XmlStreamReaderException(final String msg, final String ctMime, final String ctEnc, final String bomEnc, final String xmlGuessEnc, final String xmlEnc,
+                                    final InputStream is) {
+        super(msg);
+        contentTypeMime = ctMime;
+        contentTypeEncoding = ctEnc;
+        bomEncoding = bomEnc;
+        xmlGuessEncoding = xmlGuessEnc;
+        xmlEncoding = xmlEnc;
+        this.is = is;
+    }
+
+    /**
+     * Returns the BOM encoding found in the InputStream.
+     * <p>
+     *
+     * @return the BOM encoding, null if none.
+     *
+     */
+    public String getBomEncoding() {
+        return bomEncoding;
+    }
+
+    /**
+     * Returns the encoding guess based on the first bytes of the InputStream.
+     * <p>
+     *
+     * @return the encoding guess, null if it couldn't be guessed.
+     *
+     */
+    public String getXmlGuessEncoding() {
+        return xmlGuessEncoding;
+    }
+
+    /**
+     * Returns the encoding found in the XML prolog of the InputStream.
+     * <p>
+     *
+     * @return the encoding of the XML prolog, null if none.
+     *
+     */
+    public String getXmlEncoding() {
+        return xmlEncoding;
+    }
+
+    /**
+     * Returns the MIME type in the content-type used to attempt determining the encoding.
+     * <p>
+     *
+     * @return the MIME type in the content-type, null if there was not content-type or the encoding
+     *         detection did not involve HTTP.
+     *
+     */
+    public String getContentTypeMime() {
+        return contentTypeMime;
+    }
+
+    /**
+     * Returns the encoding in the content-type used to attempt determining the encoding.
+     * <p>
+     *
+     * @return the encoding in the content-type, null if there was not content-type, no encoding in
+     *         it or the encoding detection did not involve HTTP.
+     *
+     */
+    public String getContentTypeEncoding() {
+        return contentTypeEncoding;
+    }
+
+    /**
+     * Returns the unconsumed InputStream to allow the application to do an alternate encoding
+     * detection on the InputStream.
+     * <p>
+     *
+     * @return the unconsumed InputStream.
+     *
+     */
+    public InputStream getInputStream() {
+        return is;
+    }
+}
diff --git a/core/camel-xml-io/src/test/java/org/apache/camel/xml/in/ModelParserTest.java b/core/camel-xml-io/src/test/java/org/apache/camel/xml/in/ModelParserTest.java
new file mode 100644
index 0000000..c90a932
--- /dev/null
+++ b/core/camel-xml-io/src/test/java/org/apache/camel/xml/in/ModelParserTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.xml.in;
+
+import java.io.StringReader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.camel.model.RoutesDefinition;
+import org.apache.camel.model.rest.RestsDefinition;
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+
+public class ModelParserTest {
+
+    public static final String NAMESPACE = "http://camel.apache.org/schema/spring";
+    private static List<String> REST_XMLS = Arrays.asList("barRest.xml", "simpleRest.xml", "simpleRestToD.xml");
+
+    @Test
+    public void testFiles() throws Exception {
+        Path dir = getResourceFolder();
+        List<Path> files = Files.list(dir).sorted().filter(Files::isRegularFile).collect(Collectors.toList());
+        for (Path path : files) {
+            ModelParser parser = new ModelParser(Files.newInputStream(path), NAMESPACE);
+            boolean isRest = REST_XMLS.contains(path.getFileName().toString());
+            if (isRest) {
+                RestsDefinition rests = parser.parseRestsDefinition();
+                assertNotNull(rests);
+            } else {
+                RoutesDefinition routes = parser.parseRoutesDefinition();
+                assertNotNull(routes);
+            }
+        }
+    }
+
+    @Test
+    public void testSimpleString() throws Exception {
+        RoutesDefinition routes = new ModelParser(new StringReader(
+                "<routes>" +
+                        "<route id='foo'>" +
+                            "<from uri='my:bar'/>" +
+                            "<to uri='mock:res'/>" +
+                        "</route>" +
+                "</routes>"
+        )).parseRoutesDefinition();
+        assertNotNull(routes);
+    }
+
+    private Path getResourceFolder() {
+        String url = getClass().getClassLoader().getResource("barInterceptorRoute.xml").toString();
+        if (url.startsWith("file:")) {
+            url = url.substring("file:".length(), url.indexOf("barInterceptorRoute.xml"));
+        } else if (url.startsWith("jar:file:")) {
+            url = url.substring("jar:file:".length(), url.indexOf("!"));
+        }
+        return Paths.get(url);
+    }
+}
diff --git a/core/camel-xml-io/src/test/resources/barInterceptorRoute.xml b/core/camel-xml-io/src/test/resources/barInterceptorRoute.xml
new file mode 100644
index 0000000..c7dbf76
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/barInterceptorRoute.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes xmlns="http://camel.apache.org/schema/spring">
+
+    <route id="bar">
+        <from uri="direct:bar"/>
+        <intercept>
+            <to uri="log:intercept"/>
+            <to uri="mock:intercept"/>
+        </intercept>
+        <to uri="mock:bar"/>
+    </route>
+
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/barOnExceptionRoute.xml b/core/camel-xml-io/src/test/resources/barOnExceptionRoute.xml
new file mode 100644
index 0000000..7eda513
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/barOnExceptionRoute.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes xmlns="http://camel.apache.org/schema/spring">
+
+    <route id="bar">
+        <from uri="direct:bar"/>
+        <onException>
+            <exception>java.lang.Exception</exception>
+            <handled>
+                <constant>true</constant>
+            </handled>
+            <to uri="log:error"/>
+            <to uri="mock:error"/>
+        </onException>
+        <process ref="myProcessor"/>
+        <to uri="log:bar"/>
+        <to uri="mock:bar"/>
+    </route>
+
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/barPolicyRoute.xml b/core/camel-xml-io/src/test/resources/barPolicyRoute.xml
new file mode 100644
index 0000000..f7ce1ad
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/barPolicyRoute.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes xmlns="http://camel.apache.org/schema/spring">
+
+    <route id="foo">
+        <from uri="direct:start"/>
+        <policy ref="foo">
+            <to uri="mock:foo"/>
+            <to uri="mock:bar"/>
+            <to uri="mock:result"/>
+        </policy>
+    </route>
+
+    <route id="bar">
+        <from uri="direct:send"/>
+        <to uri="direct:start"/>
+        <to uri="mock:response"/>
+    </route>
+
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/barRest.xml b/core/camel-xml-io/src/test/resources/barRest.xml
new file mode 100644
index 0000000..dc50305
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/barRest.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<rests xmlns="http://camel.apache.org/schema/spring">
+	<rest id="bar" path="/say/hello">
+	    <get uri="/bar">
+	      <to uri="mock:bar"/>
+	    </get>
+    </rest>
+</rests>
\ No newline at end of file
diff --git a/core/camel-xml-io/src/test/resources/barRoute.xml b/core/camel-xml-io/src/test/resources/barRoute.xml
new file mode 100644
index 0000000..e96c1f2
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/barRoute.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<!-- START SNIPPET: e1 -->
+<routes xmlns="http://camel.apache.org/schema/spring">
+    <!-- here we define the bar route -->
+    <route id="bar">
+        <from uri="direct:bar"/>
+        <to uri="mock:bar"/>
+    </route>
+
+    <!-- we could add more routes if we like,
+         but in this example we stick to one route only -->
+</routes>
+<!-- END SNIPPET: e1 -->
\ No newline at end of file
diff --git a/core/camel-xml-io/src/test/resources/barUpdatedRoute.xml b/core/camel-xml-io/src/test/resources/barUpdatedRoute.xml
new file mode 100644
index 0000000..e7ce805
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/barUpdatedRoute.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<!-- START SNIPPET: e1 -->
+<routes xmlns="http://camel.apache.org/schema/spring">
+    <!-- here we define the bar route -->
+    <route id="bar">
+        <from uri="direct:bar"/>
+        <transform>
+          <simple>Bye ${body}</simple>
+        </transform>
+        <to uri="mock:bar"/>
+    </route>
+
+    <!-- we could add more routes if we like,
+         but in this example we stick to one route only -->
+</routes>
+<!-- END SNIPPET: e1 -->
\ No newline at end of file
diff --git a/core/camel-xml-io/src/test/resources/convertBody.xml b/core/camel-xml-io/src/test/resources/convertBody.xml
new file mode 100644
index 0000000..7b66154
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/convertBody.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+  <route>
+    <from uri="seda:a"/>
+    <convertBodyTo type="java.lang.Integer"/>
+  </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/dynamicRecipientList.xml b/core/camel-xml-io/src/test/resources/dynamicRecipientList.xml
new file mode 100644
index 0000000..d924ded
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/dynamicRecipientList.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+  <route>
+    <from uri="seda:a"/>
+    <recipientList>
+      <header>foo</header>
+    </recipientList>
+  </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/loop.xml b/core/camel-xml-io/src/test/resources/loop.xml
new file mode 100644
index 0000000..9aa9214
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/loop.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+  <route>
+    <from uri="direct:a"/>
+    <loop>
+      <constant>8</constant>
+    </loop>
+  </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/processor.xml b/core/camel-xml-io/src/test/resources/processor.xml
new file mode 100644
index 0000000..07b319a
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/processor.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+  <route>
+    <from uri="seda:a"/>
+    <process ref="myProcessor"/>
+  </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/processorWithFilter.xml b/core/camel-xml-io/src/test/resources/processorWithFilter.xml
new file mode 100644
index 0000000..975a53d
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/processorWithFilter.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+  <route>
+    <from uri="seda:a"/>
+    <filter>
+      <language language="juel">in.header.foo == 'bar'</language>
+      <process ref="myProcessor"/>
+    </filter>
+  </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/processorWithGroovyFilter.xml b/core/camel-xml-io/src/test/resources/processorWithGroovyFilter.xml
new file mode 100644
index 0000000..7edf514
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/processorWithGroovyFilter.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+  <route>
+    <from uri="seda:a"/>
+    <filter>
+      <groovy>in.headers.any { h -> h.startsWith('foo')}</groovy>
+      <process ref="myProcessor"/>
+    </filter>
+  </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/processorWithHeaderFilter.xml b/core/camel-xml-io/src/test/resources/processorWithHeaderFilter.xml
new file mode 100644
index 0000000..89d6540
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/processorWithHeaderFilter.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+  <route>
+    <from uri="seda:a"/>
+    <filter>
+      <header>foo</header>
+      <process ref="myProcessor"/>
+    </filter>
+  </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/processorWithSimpleFilter.xml b/core/camel-xml-io/src/test/resources/processorWithSimpleFilter.xml
new file mode 100644
index 0000000..e5d5884
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/processorWithSimpleFilter.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+  <route>
+    <from uri="seda:a"/>
+    <filter>
+      <simple>${in.header.foo} == 'bar'</simple>
+      <process ref="myProcessor"/>
+    </filter>
+  </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/resequencerBatch.xml b/core/camel-xml-io/src/test/resources/resequencerBatch.xml
new file mode 100644
index 0000000..69e42fe
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/resequencerBatch.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+    	<from uri="direct:start" />
+    	<resequence>
+            <!--
+                batch-config can be ommitted for default resequence settings
+            -->
+            <batch-config batchTimeout="2000" batchSize="500"/>
+    		<simple>body</simple>
+    		<to uri="mock:result" />
+    	</resequence>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/resequencerStream.xml b/core/camel-xml-io/src/test/resources/resequencerStream.xml
new file mode 100644
index 0000000..b9b4594
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/resequencerStream.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+    	<from uri="direct:start" />
+    	<resequence>
+            <stream-config timeout="2000"/> <!-- Use default capacity -->
+    		<simple>in.header.seqnum</simple>
+    		<to uri="mock:result" />
+    	</resequence>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeGroup.xml b/core/camel-xml-io/src/test/resources/routeGroup.xml
new file mode 100644
index 0000000..7548f8c
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeGroup.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes xmlns="http://camel.apache.org/schema/spring"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+  <!--
+       xsi:schemaLocation="http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"
+  -->
+
+  <route id="route-id" group="route-group">
+    <from uri="seda:a"/>
+    <to uri="seda:b"/>
+  </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeProperties.xml b/core/camel-xml-io/src/test/resources/routeProperties.xml
new file mode 100644
index 0000000..b425f6c
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeProperties.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes xmlns="http://camel.apache.org/schema/spring"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+  <!--
+       xsi:schemaLocation="http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"
+  -->
+
+  <route id="route-id">
+    <routeProperty key="key1" value="val1"/>
+    <routeProperty key="key2" value="val2"/>
+
+    <from uri="seda:a"/>
+    <to uri="seda:b"/>
+  </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithBindyDataFormat.xml b/core/camel-xml-io/src/test/resources/routeWithBindyDataFormat.xml
new file mode 100644
index 0000000..6aea276
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithBindyDataFormat.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+        <from uri="seda:a"/>
+        <pipeline>
+            <marshal>
+                <bindy type="Csv" classType="org.apache.camel.MyFoo"/>
+            </marshal>
+            <to uri="seda:b"/>
+        </pipeline>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithChoice.xml b/core/camel-xml-io/src/test/resources/routeWithChoice.xml
new file mode 100644
index 0000000..c74bcc7
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithChoice.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+  <route>
+    <from uri="seda:a"/>
+    <choice>
+      <when>
+        <simple>${header.foo} == 'bar'</simple>
+        <to uri="seda:b"/>
+      </when>
+      <when>
+        <ognl>header[foo] == 'cheese'</ognl>
+        <to uri="seda:c"/>
+      </when>
+      <otherwise>
+        <to uri="seda:d"/>
+      </otherwise>
+    </choice>
+  </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithCircuitBreakerLoadBalance.xml b/core/camel-xml-io/src/test/resources/routeWithCircuitBreakerLoadBalance.xml
new file mode 100644
index 0000000..3c75b19
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithCircuitBreakerLoadBalance.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+        <from uri="direct:start"/>
+        <loadBalance>
+            <throwException exceptionType="java.lang.IllegalArgumentException" message="Forced"/>
+            <onFallback>
+                <transform>
+                    <constant>Fallback message</constant>
+                </transform>
+            </onFallback>
+            <to uri="mock:result"/>
+        </loadBalance>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithCvsDataFormat.xml b/core/camel-xml-io/src/test/resources/routeWithCvsDataFormat.xml
new file mode 100644
index 0000000..3e94bc1
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithCvsDataFormat.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+        <from uri="seda:a"/>
+        <pipeline>
+            <marshal>
+                <csv/>
+            </marshal>
+            <to uri="seda:b"/>
+        </pipeline>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithFailoverLoadBalance.xml b/core/camel-xml-io/src/test/resources/routeWithFailoverLoadBalance.xml
new file mode 100644
index 0000000..0df7b27
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithFailoverLoadBalance.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+        <from uri="seda:a"/>
+        <loadBalance>
+            <failover>
+                <exception>java.io.IOException</exception>
+                <exception>java.text.ParseException</exception>
+            </failover>
+            <to uri="seda:b"/>
+            <to uri="seda:c"/>
+            <to uri="seda:d"/>
+        </loadBalance>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithFlatpackDataFormat.xml b/core/camel-xml-io/src/test/resources/routeWithFlatpackDataFormat.xml
new file mode 100644
index 0000000..db33188
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithFlatpackDataFormat.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+        <from uri="seda:a"/>
+        <pipeline>
+            <marshal>
+                <flatpack/>
+            </marshal>
+            <to uri="seda:b"/>
+        </pipeline>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithHL7DataFormat.xml b/core/camel-xml-io/src/test/resources/routeWithHL7DataFormat.xml
new file mode 100644
index 0000000..1ee6503
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithHL7DataFormat.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+        <from uri="seda:a"/>
+        <pipeline>
+            <marshal>
+                <hl7/>
+            </marshal>
+            <to uri="seda:b"/>
+        </pipeline>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithJSonDataFormat.xml b/core/camel-xml-io/src/test/resources/routeWithJSonDataFormat.xml
new file mode 100644
index 0000000..c8db92d
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithJSonDataFormat.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+        <from uri="seda:a"/>
+        <pipeline>
+            <marshal>
+                <json library="Jackson"/>
+            </marshal>
+            <to uri="seda:b"/>
+        </pipeline>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithJaxbDataFormat.xml b/core/camel-xml-io/src/test/resources/routeWithJaxbDataFormat.xml
new file mode 100644
index 0000000..4bc91e9
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithJaxbDataFormat.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+        <from uri="seda:a"/>
+        <pipeline>
+            <marshal>
+                <jaxb contextPath="org.apache.camel.model"/>
+            </marshal>
+            <to uri="seda:b"/>
+        </pipeline>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithLoadBalance.xml b/core/camel-xml-io/src/test/resources/routeWithLoadBalance.xml
new file mode 100644
index 0000000..5eab226
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithLoadBalance.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+  <route>
+    <from uri="seda:a"/>
+    <loadBalance>
+       <roundRobin/>
+       <to uri="seda:b"/>      
+       <to uri="seda:c"/>      
+       <to uri="seda:d"/>       
+    </loadBalance>    
+  </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithNamespace.xml b/core/camel-xml-io/src/test/resources/routeWithNamespace.xml
new file mode 100644
index 0000000..664e326
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithNamespace.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes xmlns="http://camel.apache.org/schema/spring" xmlns:foo="http://foo">
+    <route id="routeWithNamespace">
+        <from uri="direct:foo" />
+        <choice>
+            <when>
+                <xpath>/foo:foo/foo:bar = 'cheese'</xpath>
+                <setBody>
+                    <constant>Hello from foo</constant>
+                </setBody>
+                <to uri="mock:bar"/>
+            </when>
+        </choice>
+        <to uri="log:end"/>
+    </route>
+</routes>
\ No newline at end of file
diff --git a/core/camel-xml-io/src/test/resources/routeWithRSSDataFormat.xml b/core/camel-xml-io/src/test/resources/routeWithRSSDataFormat.xml
new file mode 100644
index 0000000..bbb79c0
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithRSSDataFormat.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+        <from uri="seda:a"/>
+        <pipeline>
+            <marshal>
+                <rss/>
+            </marshal>
+            <to uri="seda:b"/>
+        </pipeline>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithRandomLoadBalance.xml b/core/camel-xml-io/src/test/resources/routeWithRandomLoadBalance.xml
new file mode 100644
index 0000000..de26430
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithRandomLoadBalance.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+        <from uri="seda:a"/>
+        <loadBalance>
+            <random/>
+            <to uri="seda:b"/>
+            <to uri="seda:c"/>
+            <to uri="seda:d"/>
+        </loadBalance>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithStickyLoadBalance.xml b/core/camel-xml-io/src/test/resources/routeWithStickyLoadBalance.xml
new file mode 100644
index 0000000..f8b0e79
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithStickyLoadBalance.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+  <route>
+    <from uri="seda:a"/>
+    <loadBalance>
+       <sticky>
+           <correlationExpression>
+               <language language="juel">in.header.foo == 'bar'</language>
+           </correlationExpression>
+       </sticky>
+       <to uri="seda:b"/>      
+       <to uri="seda:c"/>      
+       <to uri="seda:d"/>       
+    </loadBalance>    
+  </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithTidyMarkupDataFormat.xml b/core/camel-xml-io/src/test/resources/routeWithTidyMarkupDataFormat.xml
new file mode 100644
index 0000000..f3939e5
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithTidyMarkupDataFormat.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+        <from uri="seda:a"/>
+        <pipeline>
+            <unmarshal>
+                <tidyMarkup/>
+            </unmarshal>
+            <to uri="seda:b"/>
+        </pipeline>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithTopicLoadBalance.xml b/core/camel-xml-io/src/test/resources/routeWithTopicLoadBalance.xml
new file mode 100644
index 0000000..5ade532
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithTopicLoadBalance.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+        <from uri="seda:a"/>
+        <loadBalance>
+            <topic/>
+            <to uri="seda:b"/>
+            <to uri="seda:c"/>
+            <to uri="seda:d"/>
+        </loadBalance>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithXMLSecurityDataFormat.xml b/core/camel-xml-io/src/test/resources/routeWithXMLSecurityDataFormat.xml
new file mode 100644
index 0000000..7ee7d50
--- /dev/null
+++ b/core/camel-xml-io/src/test/resources/routeWithXMLSecurityDataFormat.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<routes id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+        <from uri="seda:a"/>
+        <pipeline>
+            <marshal>
+                <secureXML/>
+            </marshal>
+            <to uri="seda:b"/>
+        </pipeline>
+    </route>
+</routes>
diff --git a/core/camel-xml-io/src/test/resources/routeWithXStreamDataFormat.xml b/core/camel-xml-io/src/test/resources/routeWithXStreamDataFormat.xml
... 1358 lines suppressed ...