You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2020/03/19 08:29:12 UTC

[camel] branch master updated: Rearrange website source to better use Antora capabilities and reduce duplicate pages.

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 6d694f2  Rearrange website source to better use Antora capabilities and reduce duplicate pages.
     new f8a2b82  Merge pull request #3646 from djencks/issue-14698-rearrange-adocs-task-14728
6d694f2 is described below

commit 6d694f21d3ef031a96b0b436dec8382592090d0a
Author: David Jencks <dj...@apache.org>
AuthorDate: Wed Mar 11 14:50:27 2020 -0700

    Rearrange website source to better use Antora capabilities and reduce duplicate pages.
---
 .../camel-bean/src/main/docs/bean-language.adoc    |   6 +-
 .../src/main/docs/controlbus-component.adoc        |   8 +-
 .../src/main/docs/crypto-dataformat.adoc           |   2 +-
 .../src/main/docs/dataformat-component.adoc        |   2 +-
 .../src/main/docs/disruptor-component.adoc         |   2 +-
 .../main/docs/elasticsearch-rest-component.adoc    |   2 +-
 .../camel-elsql/src/main/docs/elsql-component.adoc |   2 +-
 .../camel-file/src/main/docs/file-component.adoc   |  24 +-
 .../src/main/docs/flatpack-dataformat.adoc         |   2 +-
 .../src/main/docs/groovy-language.adoc             |   6 +-
 .../camel-hl7/src/main/docs/hl7-dataformat.adoc    |  10 +-
 .../camel-jetty/src/main/docs/jetty-component.adoc |   2 +-
 .../camel-jms/src/main/docs/jms-component.adoc     |   2 +-
 .../src/main/docs/language-component.adoc          |  10 +-
 .../camel-mina/src/main/docs/mina-component.adoc   |   2 +-
 .../camel-mock/src/main/docs/mock-component.adoc   |   2 +-
 .../camel-mvel/src/main/docs/mvel-language.adoc    |   2 +-
 .../camel-ognl/src/main/docs/ognl-language.adoc    |   2 +-
 .../src/main/docs/quickfix-component.adoc          |   2 +-
 .../src/main/docs/salesforce-component.adoc        |   2 +-
 .../src/main/docs/xquery-component.adoc            |   2 +-
 .../camel-saxon/src/main/docs/xquery-language.adoc |   2 +-
 .../camel-spring/src/main/docs/spel-language.adoc  |   4 +-
 .../src/main/docs/spring-event-component.adoc      |   2 +-
 .../src/main/docs/syslog-dataformat.adoc           |  14 +-
 .../camel-xpath/src/main/docs/xpath-language.adoc  |   6 +-
 .../src/main/docs/properties-component.adoc        |  10 +-
 .../camel-core-engine/src/main/docs/antora.yml     |  17 +-
 .../docs/eips/resilience4jConfiguration-eip.adoc   |   6 -
 .../src/main/docs/eips/toD-eip.adoc                | 220 -----
 .../src/main/docs/eips/wireTap-eip.adoc            | 207 -----
 .../eips/pages}/aggregate-eip.adoc                 |  42 +-
 .../eips/pages}/batch-config-eip.adoc              |   0
 .../{eips => modules/eips/pages}/bean-eip.adoc     |  16 +-
 .../{eips => modules/eips/pages}/choice-eip.adoc   |   6 +-
 .../eips/pages}/circuitBreaker-eip.adoc            |   6 +-
 .../eips/pages}/claimCheck-eip.adoc                |   4 +-
 .../eips/pages}/content-based-router-eip.adoc      |  18 +-
 .../eips/pages}/content-filter-eip.adoc            |  26 +-
 .../eips/pages}/convertBodyTo-eip.adoc             |   0
 .../eips/pages}/customLoadBalancer-eip.adoc        |   0
 .../{eips => modules/eips/pages}/delay-eip.adoc    |   4 +-
 .../eips/pages}/dynamic-router.adoc                |   2 +-
 .../eips/pages}/dynamicRouter-eip.adoc             |   6 +-
 .../{eips => modules/eips/pages}/enrich-eip.adoc   |  10 +-
 .../eips/pages}/eventDrivenConsumer-eip.adoc       |  24 +-
 .../{eips => modules/eips/pages}/failover-eip.adoc |   6 +-
 .../{eips => modules/eips/pages}/filter-eip.adoc   |  12 +-
 .../{eips => modules/eips/pages}/from-eip.adoc     |   0
 .../{eips => modules/eips/pages}/hystrix-eip.adoc  |   0
 .../eips/pages}/hystrixConfiguration-eip.adoc      |  56 +-
 .../eips/pages}/idempotentConsumer-eip.adoc        |  12 +-
 .../{eips => modules/eips/pages}/inOnly-eip.adoc   |   0
 .../{eips => modules/eips/pages}/inOut-eip.adoc    |   0
 .../eips/pages}/loadBalance-eip.adoc               |   0
 .../docs/{eips => modules/eips/pages}/log-eip.adoc |  10 +-
 .../{eips => modules/eips/pages}/loop-eip.adoc     |   4 +-
 .../{eips => modules/eips/pages}/marshal-eip.adoc  |   4 +-
 .../eips/pages}/multicast-eip.adoc                 |  18 +-
 .../eips/pages}/onFallback-eip.adoc                |   2 +-
 .../eips/pages}/otherwise-eip.adoc                 |   4 +-
 .../{eips => modules/eips/pages}/pipeline-eip.adoc |   6 +-
 .../eips/pages}/pollEnrich-eip.adoc                |  10 +-
 .../{eips => modules/eips/pages}/process-eip.adoc  |  10 +-
 .../{eips => modules/eips/pages}/random-eip.adoc   |   0
 .../eips/pages}/recipientList-eip.adoc             |  20 +-
 .../eips/pages}/removeHeader-eip.adoc              |   0
 .../eips/pages}/removeHeaders-eip.adoc             |   0
 .../eips/pages}/removeProperties-eip.adoc          |   0
 .../eips/pages}/removeProperty-eip.adoc            |   0
 .../eips/pages}/requestReply-eip.adoc              |   0
 .../eips/pages}/resequence-eip.adoc                |   0
 .../eips/pages}/resilience4j-eip.adoc              |   0
 .../eips/pages/resilience4jConfiguration-eip.adoc  |  24 +
 .../{eips => modules/eips/pages}/rollback-eip.adoc |  12 +-
 .../eips/pages}/roundRobin-eip.adoc                |   0
 .../eips/pages}/routingSlip-eip.adoc               |   0
 .../{eips => modules/eips/pages}/saga-eip.adoc     |   8 +-
 .../{eips => modules/eips/pages}/sample-eip.adoc   |   0
 .../{eips => modules/eips/pages}/script-eip.adoc   |   2 +-
 .../eips/pages}/serviceCall-eip.adoc               |  10 +-
 .../{eips => modules/eips/pages}/setBody-eip.adoc  |   0
 .../eips/pages}/setHeader-eip.adoc                 |   0
 .../eips/pages}/setOutHeader-eip.adoc              |   0
 .../eips/pages}/setProperty-eip.adoc               |   0
 .../{eips => modules/eips/pages}/sort-eip.adoc     |   0
 .../{eips => modules/eips/pages}/split-eip.adoc    |   2 +-
 .../{eips => modules/eips/pages}/step-eip.adoc     |   2 +-
 .../{eips => modules/eips/pages}/sticky-eip.adoc   |   2 +-
 .../{eips => modules/eips/pages}/stop-eip.adoc     |   0
 .../eips/pages}/stream-config-eip.adoc             |   0
 .../{eips => modules/eips/pages}/threads-eip.adoc  |   4 +-
 .../{eips => modules/eips/pages}/throttle-eip.adoc |   2 +-
 .../docs/{eips => modules/eips/pages}/to-eip.adoc  |  14 +-
 .../src/main/docs/modules/eips}/pages/toD-eip.adoc |  19 +-
 .../{eips => modules/eips/pages}/topic-eip.adoc    |   0
 .../eips/pages}/transform-eip.adoc                 |   2 +-
 .../eips/pages}/unmarshal-eip.adoc                 |   4 +-
 .../{eips => modules/eips/pages}/validate-eip.adoc |   0
 .../{eips => modules/eips/pages}/weighted-eip.adoc |   2 +-
 .../{eips => modules/eips/pages}/when-eip.adoc     |   4 +-
 .../main/docs/modules/eips}/pages/wireTap-eip.adoc |  59 +-
 .../camel-core-languages/src/main/docs}/antora.yml |   3 -
 .../languages/pages}/constant-language.adoc        |   0
 .../pages}/exchangeProperty-language.adoc          |   0
 .../languages/pages}/file-language.adoc            |   0
 .../languages/pages}/header-language.adoc          |   0
 .../languages/pages}/ref-language.adoc             |   0
 .../languages/pages}/simple-language.adoc          |  10 +-
 .../languages/pages}/tokenize-language.adoc        |   0
 .../camel-xml-jaxp/src/main/docs}/antora.yml       |   3 -
 .../languages/pages}/xtokenize-language.adoc       |   0
 ...te.yml => antora-playbook-local-xref-check.yml} |  13 +-
 ...ate => component-dataformats-nav.adoc.template} |   1 +
 ...plate => component-languages-nav.adoc.template} |   1 +
 docs/component-nav.adoc.template                   |   1 +
 docs/components/antora.yml                         |   4 +-
 docs/components/modules/ROOT/nav.adoc              | 803 +++++++++----------
 .../modules/ROOT/pages/constant-language.adoc      |  75 --
 .../modules/ROOT/pages/controlbus-component.adoc   |   8 +-
 .../modules/ROOT/pages/dataformat-component.adoc   |   2 +-
 .../modules/ROOT/pages/disruptor-component.adoc    |   2 +-
 .../ROOT/pages/elasticsearch-rest-component.adoc   |   2 +-
 .../modules/ROOT/pages/elsql-component.adoc        |   2 +-
 .../ROOT/pages/exchangeProperty-language.adoc      |  61 --
 .../modules/ROOT/pages/file-component.adoc         |  24 +-
 .../modules/ROOT/pages/file-language.adoc          | 295 -------
 .../modules/ROOT/pages/header-language.adoc        |  45 --
 docs/components/modules/ROOT/pages/index.adoc      | 124 +--
 .../modules/ROOT/pages/jetty-component.adoc        |   2 +-
 .../modules/ROOT/pages/jms-component.adoc          |   2 +-
 .../modules/ROOT/pages/language-component.adoc     |  10 +-
 .../modules/ROOT/pages/mina-component.adoc         |   2 +-
 .../modules/ROOT/pages/mock-component.adoc         |   2 +-
 .../modules/ROOT/pages/properties-component.adoc   |  10 +-
 .../modules/ROOT/pages/quickfix-component.adoc     |   2 +-
 .../modules/ROOT/pages/ref-language.adoc           |  58 --
 .../modules/ROOT/pages/salesforce-component.adoc   |   2 +-
 .../modules/ROOT/pages/simple-language.adoc        | 885 ---------------------
 .../modules/ROOT/pages/spring-event-component.adoc |   2 +-
 .../modules/ROOT/pages/tokenize-language.adoc      |  40 -
 .../modules/ROOT/pages/xquery-component.adoc       |   2 +-
 .../modules/ROOT/pages/xtokenize-language.adoc     |  32 -
 docs/components/modules/dataformats/nav.adoc       |  47 ++
 .../pages/any23-dataformat.adoc                    |   0
 .../pages/asn1-dataformat.adoc                     |   0
 .../pages/avro-dataformat.adoc                     |   0
 .../pages/barcode-dataformat.adoc                  |   0
 .../pages/base64-dataformat.adoc                   |   0
 .../pages/beanio-dataformat.adoc                   |   0
 .../pages/bindy-dataformat.adoc                    |   0
 .../pages/cbor-dataformat.adoc                     |   0
 .../pages/crypto-dataformat.adoc                   |   2 +-
 .../pages/csv-dataformat.adoc                      |   0
 .../pages/fhirJson-dataformat.adoc                 |   0
 .../pages/fhirXml-dataformat.adoc                  |   0
 .../pages/flatpack-dataformat.adoc                 |   2 +-
 .../pages/grok-dataformat.adoc                     |   0
 .../pages/gzipdeflater-dataformat.adoc             |   0
 .../pages/hl7-dataformat.adoc                      |  10 +-
 .../pages/ical-dataformat.adoc                     |   0
 .../pages/jacksonxml-dataformat.adoc               |   0
 .../pages/jaxb-dataformat.adoc                     |   0
 .../pages/json-fastjson-dataformat.adoc            |   0
 .../pages/json-gson-dataformat.adoc                |   0
 .../pages/json-jackson-dataformat.adoc             |   0
 .../pages/json-johnzon-dataformat.adoc             |   0
 .../pages/json-xstream-dataformat.adoc             |   0
 .../pages/jsonApi-dataformat.adoc                  |   0
 .../pages/lzf-dataformat.adoc                      |   0
 .../pages/mime-multipart-dataformat.adoc           |   0
 .../pages/pgp-dataformat.adoc                      |   0
 .../pages/protobuf-dataformat.adoc                 |   0
 .../pages/rss-dataformat.adoc                      |   0
 .../pages/secureXML-dataformat.adoc                |   0
 .../pages/soapjaxb-dataformat.adoc                 |   0
 .../pages/syslog-dataformat.adoc                   |  14 +-
 .../pages/tarfile-dataformat.adoc                  |   0
 .../pages/thrift-dataformat.adoc                   |   0
 .../pages/tidyMarkup-dataformat.adoc               |   0
 .../pages/univocity-csv-dataformat.adoc            |   0
 .../pages/univocity-fixed-dataformat.adoc          |   0
 .../pages/univocity-tsv-dataformat.adoc            |   0
 .../pages/xstream-dataformat.adoc                  |   0
 .../pages/yaml-snakeyaml-dataformat.adoc           |   0
 .../pages/zipdeflater-dataformat.adoc              |   0
 .../pages/zipfile-dataformat.adoc                  |   0
 docs/components/modules/languages/nav.adoc         |  20 +
 .../{ROOT => languages}/pages/bean-language.adoc   |   6 +-
 .../{ROOT => languages}/pages/groovy-language.adoc |   6 +-
 .../pages/hl7terser-language.adoc                  |   0
 .../pages/jsonpath-language.adoc                   |   0
 .../{ROOT => languages}/pages/mvel-language.adoc   |   2 +-
 .../{ROOT => languages}/pages/ognl-language.adoc   |   2 +-
 .../{ROOT => languages}/pages/spel-language.adoc   |   4 +-
 .../{ROOT => languages}/pages/xpath-language.adoc  |   6 +-
 .../{ROOT => languages}/pages/xquery-language.adoc |   2 +-
 docs/gulpfile.js                                   | 139 +++-
 docs/package.json                                  |   1 +
 docs/pom.xml                                       |  16 +-
 docs/user-manual-nav.adoc.template                 |   4 +-
 docs/user-manual/modules/ROOT/nav.adoc             | 145 ++--
 ...configuration-of-camelcontext-using-spring.adoc |   4 +-
 .../modules/ROOT/pages/aggregate-eip.adoc          | 673 ----------------
 .../modules/ROOT/pages/backlog-tracer.adoc         |   6 +-
 .../modules/ROOT/pages/bam-example.adoc            |   2 +-
 .../modules/ROOT/pages/batch-config-eip.adoc       |  19 -
 .../modules/ROOT/pages/bean-binding.adoc           |  16 +-
 docs/user-manual/modules/ROOT/pages/bean-eip.adoc  |  97 ---
 .../modules/ROOT/pages/bean-integration.adoc       |   6 +-
 .../user-manual/modules/ROOT/pages/choice-eip.adoc |  77 --
 .../modules/ROOT/pages/circuitBreaker-eip.adoc     |  62 --
 .../modules/ROOT/pages/claimCheck-eip.adoc         | 273 -------
 .../modules/ROOT/pages/competing-consumers.adoc    |   2 +-
 .../ROOT/pages/composed-message-processor.adoc     |   8 +-
 .../modules/ROOT/pages/constant-language.adoc      |  75 --
 .../ROOT/pages/content-based-router-eip.adoc       |  80 --
 .../modules/ROOT/pages/content-enricher.adoc       |  34 +-
 .../modules/ROOT/pages/content-filter-eip.adoc     |  65 --
 .../modules/ROOT/pages/convertBodyTo-eip.adoc      |  16 -
 .../modules/ROOT/pages/correlation-identifier.adoc |   4 +-
 .../modules/ROOT/pages/customLoadBalancer-eip.adoc |  82 --
 .../modules/ROOT/pages/data-format.adoc            |  42 +-
 .../modules/ROOT/pages/dead-letter-channel.adoc    |   2 +-
 docs/user-manual/modules/ROOT/pages/delay-eip.adoc | 173 ----
 .../modules/ROOT/pages/dynamic-router.adoc         | 199 -----
 .../modules/ROOT/pages/dynamicRouter-eip.adoc      | 159 ----
 .../user-manual/modules/ROOT/pages/enrich-eip.adoc | 198 -----
 .../pages/enterprise-integration-patterns.adoc     |  56 +-
 .../ROOT/pages/eventDrivenConsumer-eip.adoc        |  59 --
 .../modules/ROOT/pages/exception-clause.adoc       |   2 +-
 .../ROOT/pages/exchangeProperty-language.adoc      |  61 --
 .../user-manual/modules/ROOT/pages/expression.adoc |  26 +-
 .../modules/ROOT/pages/failover-eip.adoc           |  47 --
 ...om-processor-which-sends-multiple-messages.adoc |   2 +-
 ...how-does-camel-look-up-beans-and-endpoints.adoc |   4 +-
 .../faq/how-does-camel-work-with-activemq.adoc     |   2 +-
 ...end-the-same-message-to-multiple-endpoints.adoc |   8 +-
 .../pages/faq/how-to-use-a-dynamic-uri-in-to.adoc  |   2 +-
 ...f-i-use-servicemix-when-should-i-use-camel.adoc |   2 +-
 .../modules/ROOT/pages/faq/what-is-a-router.adoc   |   4 +-
 ...se-when-or-otherwise-in-a-java-camel-route.adoc |  18 +-
 ...ge-with-error-handler-not-work-as-expected.adoc |   8 +-
 .../modules/ROOT/pages/file-language.adoc          | 295 -------
 .../user-manual/modules/ROOT/pages/filter-eip.adoc | 101 ---
 docs/user-manual/modules/ROOT/pages/from-eip.adoc  |  38 -
 .../modules/ROOT/pages/header-language.adoc        |  45 --
 .../modules/ROOT/pages/hystrix-eip.adoc            | 150 ----
 .../ROOT/pages/hystrixConfiguration-eip.adoc       |  44 -
 .../modules/ROOT/pages/idempotentConsumer-eip.adoc |  45 --
 .../user-manual/modules/ROOT/pages/inOnly-eip.adoc |  17 -
 docs/user-manual/modules/ROOT/pages/inOut-eip.adoc |  17 -
 docs/user-manual/modules/ROOT/pages/index.adoc     | 108 +--
 docs/user-manual/modules/ROOT/pages/intercept.adoc |   2 +-
 docs/user-manual/modules/ROOT/pages/languages.adoc |  30 +-
 .../modules/ROOT/pages/loadBalance-eip.adoc        | 251 ------
 docs/user-manual/modules/ROOT/pages/log-eip.adoc   | 204 -----
 docs/user-manual/modules/ROOT/pages/loop-eip.adoc  | 171 ----
 .../modules/ROOT/pages/marshal-eip.adoc            |  45 --
 .../modules/ROOT/pages/message-dispatcher.adoc     |   2 +-
 .../modules/ROOT/pages/message-endpoint.adoc       |   2 +-
 docs/user-manual/modules/ROOT/pages/message.adoc   |   2 +-
 .../modules/ROOT/pages/multicast-eip.adoc          | 145 ----
 .../user-manual/modules/ROOT/pages/normalizer.adoc |   2 +-
 .../modules/ROOT/pages/onFallback-eip.adoc         |  84 --
 .../modules/ROOT/pages/otherwise-eip.adoc          |  62 --
 .../ROOT/pages/parameter-binding-annotations.adoc  |  22 +-
 .../modules/ROOT/pages/pipeline-eip.adoc           |  97 ---
 .../modules/ROOT/pages/pollEnrich-eip.adoc         | 124 ---
 .../modules/ROOT/pages/polling-consumer.adoc       |   2 +-
 docs/user-manual/modules/ROOT/pages/predicate.adoc |  35 +-
 .../modules/ROOT/pages/process-eip.adoc            | 101 ---
 .../modules/ROOT/pages/process-manager.adoc        |   4 +-
 .../modules/ROOT/pages/properties-component.adoc   | 838 -------------------
 .../user-manual/modules/ROOT/pages/random-eip.adoc |   8 -
 .../modules/ROOT/pages/recipientList-eip.adoc      | 375 ---------
 .../modules/ROOT/pages/ref-language.adoc           |  58 --
 .../modules/ROOT/pages/removeHeader-eip.adoc       |  40 -
 .../modules/ROOT/pages/removeHeaders-eip.adoc      |  26 -
 .../modules/ROOT/pages/removeProperties-eip.adoc   |  47 --
 .../modules/ROOT/pages/removeProperty-eip.adoc     |  46 --
 .../modules/ROOT/pages/requestReply-eip.adoc       |  49 --
 .../modules/ROOT/pages/resequence-eip.adoc         | 242 ------
 .../modules/ROOT/pages/resilience4j-eip.adoc       | 150 ----
 .../ROOT/pages/resilience4jConfiguration-eip.adoc  |   7 -
 docs/user-manual/modules/ROOT/pages/rest-dsl.adoc  |   2 +-
 .../modules/ROOT/pages/rollback-eip.adoc           | 242 ------
 .../modules/ROOT/pages/roundRobin-eip.adoc         |  36 -
 .../modules/ROOT/pages/route-policy.adoc           |   6 +-
 .../modules/ROOT/pages/routingSlip-eip.adoc        | 113 ---
 docs/user-manual/modules/ROOT/pages/saga-eip.adoc  | 455 -----------
 .../user-manual/modules/ROOT/pages/sample-eip.adoc |  85 --
 .../modules/ROOT/pages/scatter-gather.adoc         |   4 +-
 .../user-manual/modules/ROOT/pages/script-eip.adoc |  76 --
 docs/user-manual/modules/ROOT/pages/security.adoc  |   4 +-
 .../modules/ROOT/pages/selective-consumer.adoc     |   2 +-
 .../modules/ROOT/pages/serviceCall-eip.adoc        | 619 --------------
 .../modules/ROOT/pages/servlet-tomcat-example.adoc |   2 +-
 .../modules/ROOT/pages/setBody-eip.adoc            |  40 -
 .../modules/ROOT/pages/setHeader-eip.adoc          |  48 --
 .../modules/ROOT/pages/setOutHeader-eip.adoc       |  50 --
 .../modules/ROOT/pages/setProperty-eip.adoc        |  48 --
 .../modules/ROOT/pages/simple-language.adoc        | 885 ---------------------
 docs/user-manual/modules/ROOT/pages/sort-eip.adoc  |  70 --
 docs/user-manual/modules/ROOT/pages/split-eip.adoc | 703 ----------------
 .../modules/ROOT/pages/spring-remoting.adoc        |  16 +-
 docs/user-manual/modules/ROOT/pages/step-eip.adoc  |  99 ---
 .../user-manual/modules/ROOT/pages/sticky-eip.adoc |  46 --
 docs/user-manual/modules/ROOT/pages/stop-eip.adoc  |  23 -
 .../modules/ROOT/pages/stream-caching.adoc         |   2 +-
 .../modules/ROOT/pages/stream-config-eip.adoc      |  20 -
 .../modules/ROOT/pages/threading-model.adoc        |   4 +-
 .../modules/ROOT/pages/threads-eip.adoc            |  52 --
 .../modules/ROOT/pages/throttle-eip.adoc           |  84 --
 docs/user-manual/modules/ROOT/pages/to-eip.adoc    |  90 ---
 .../modules/ROOT/pages/tokenize-language.adoc      |  40 -
 docs/user-manual/modules/ROOT/pages/topic-eip.adoc |  36 -
 .../modules/ROOT/pages/transform-eip.adoc          |  13 -
 .../modules/ROOT/pages/unmarshal-eip.adoc          |  44 -
 .../ROOT/pages/using-propertyplaceholder.adoc      |  14 +-
 .../modules/ROOT/pages/validate-eip.adoc           |  74 --
 .../ROOT/pages/walk-through-another-example.adoc   |   2 +-
 .../modules/ROOT/pages/weighted-eip.adoc           |  44 -
 docs/user-manual/modules/ROOT/pages/when-eip.adoc  |  62 --
 .../modules/ROOT/pages/writing-components.adoc     |   2 +-
 .../modules/ROOT/pages/xtokenize-language.adoc     |  32 -
 .../assets => eips}/images/eip/Aggregator.gif      | Bin
 .../assets => eips}/images/eip/AggregatorIcon.gif  | Bin
 .../images/eip/BroadcastAggregate.gif              | Bin
 .../assets => eips}/images/eip/CDC-Debezium.png    | Bin
 .../images/eip/ChannelAdapterIcon.gif              | Bin
 .../images/eip/ChannelAdapterSolution.gif          | Bin
 .../assets => eips}/images/eip/ChannelIcon.gif     | Bin
 .../assets => eips}/images/eip/CircuitBreaker.png  | Bin
 .../images/eip/CompetingConsumers.gif              | Bin
 .../images/eip/CompetingConsumersIcon.gif          | Bin
 .../images/eip/ContentBasedRouter.gif              | Bin
 .../images/eip/ContentBasedRouterIcon.gif          | Bin
 .../assets => eips}/images/eip/ContentFilter.gif   | Bin
 .../images/eip/ContentFilterIcon.gif               | Bin
 .../assets => eips}/images/eip/ControlBusIcon.gif  | Bin
 .../images/eip/CorrelationIdentifierIcon.gif       | Bin
 .../images/eip/CorrelationIdentifierSolution.gif   | Bin
 .../assets => eips}/images/eip/DataEnricher.gif    | Bin
 .../images/eip/DataEnricherIcon.gif                | Bin
 .../images/eip/DeadLetterChannelIcon.gif           | Bin
 .../images/eip/DeadLetterChannelSolution.gif       | Bin
 .../assets => eips}/images/eip/DetourIcon.gif      | Bin
 .../images/eip/DistributionAggregate.gif           | Bin
 .../images/eip/DistributionAggregateIcon.gif       | Bin
 .../images/eip/DurableSubscriptionIcon.gif         | Bin
 .../images/eip/DurableSubscriptionSolution.gif     | Bin
 .../assets => eips}/images/eip/DynamicRouter.gif   | Bin
 .../images/eip/DynamicRouterIcon.gif               | Bin
 .../images/eip/EventDrivenConsumerIcon.gif         | Bin
 .../images/eip/EventDrivenConsumerSolution.gif     | Bin
 .../images/eip/EventMessageIcon.gif                | Bin
 .../images/eip/EventMessageSolution.gif            | Bin
 .../images/eip/GuaranteedMessagingIcon.gif         | Bin
 .../images/eip/GuaranteedMessagingSolution.gif     | Bin
 .../assets => eips}/images/eip/MessageBroker.gif   | Bin
 .../images/eip/MessageBrokerIcon.gif               | Bin
 .../assets => eips}/images/eip/MessageBusIcon.gif  | Bin
 .../images/eip/MessageBusSolution.gif              | Bin
 .../images/eip/MessageChannelSolution.gif          | Bin
 .../images/eip/MessageDispatcher.gif               | Bin
 .../images/eip/MessageDispatcherIcon.gif           | Bin
 .../images/eip/MessageEndpointIcon.gif             | Bin
 .../images/eip/MessageEndpointSolution.gif         | Bin
 .../images/eip/MessageExpirationIcon.gif           | Bin
 .../images/eip/MessageExpirationSolution.gif       | Bin
 .../assets => eips}/images/eip/MessageFilter.gif   | Bin
 .../images/eip/MessageFilterIcon.gif               | Bin
 .../assets => eips}/images/eip/MessageHistory.gif  | Bin
 .../assets => eips}/images/eip/MessageIcon.gif     | Bin
 .../assets => eips}/images/eip/MessageRouter.gif   | Bin
 .../images/eip/MessageSelectorIcon.gif             | Bin
 .../images/eip/MessageSelectorSolution.gif         | Bin
 .../assets => eips}/images/eip/MessageSolution.gif | Bin
 .../images/eip/MessageTranslator.gif               | Bin
 .../images/eip/MessageTranslatorIcon.gif           | Bin
 .../images/eip/MessagingAdapterIcon.gif            | Bin
 .../images/eip/MessagingAdapterSolution.gif        | Bin
 .../assets => eips}/images/eip/MessagingBridge.gif | Bin
 .../images/eip/MessagingBridgeIcon.gif             | Bin
 .../images/eip/MessagingGatewayIcon.gif            | Bin
 .../images/eip/MessagingGatewaySolution.gif        | Bin
 .../images/eip/MessagingMapperClassDiagram.gif     | Bin
 .../images/eip/NormalizerDetail.gif                | Bin
 .../assets => eips}/images/eip/NormalizerIcon.gif  | Bin
 .../assets => eips}/images/eip/PipesAndFilters.gif | Bin
 .../images/eip/PipesAndFiltersIcon.gif             | Bin
 .../images/eip/PointToPointIcon.gif                | Bin
 .../images/eip/PointToPointSolution.gif            | Bin
 .../images/eip/PollingConsumerIcon.gif             | Bin
 .../images/eip/PollingConsumerSolution.gif         | Bin
 .../assets => eips}/images/eip/ProcessManager.gif  | Bin
 .../images/eip/ProcessManagerIcon.gif              | Bin
 .../images/eip/PublishSubscribeIcon.gif            | Bin
 .../images/eip/PublishSubscribeSolution.gif        | Bin
 .../assets => eips}/images/eip/RecipientList.gif   | Bin
 .../images/eip/RecipientListIcon.gif               | Bin
 .../assets => eips}/images/eip/RequestReply.gif    | Bin
 .../images/eip/RequestReplyIcon.gif                | Bin
 .../assets => eips}/images/eip/Resequencer.gif     | Bin
 .../assets => eips}/images/eip/ResequencerIcon.gif | Bin
 .../images/eip/ReturnAddressIcon.gif               | Bin
 .../images/eip/ReturnAddressSolution.gif           | Bin
 .../images/eip/RoutingTableIcon.gif                | Bin
 .../images/eip/RoutingTableSimple.gif              | Bin
 .../{ROOT/assets => eips}/images/eip/Sequencer.gif | Bin
 .../assets => eips}/images/eip/SplitterIcon.gif    | Bin
 .../assets => eips}/images/eip/StoreInLibrary.gif  | Bin
 .../images/eip/StoreInLibraryIcon.gif              | Bin
 .../images/eip/TransactionalClientIcon.gif         | Bin
 .../images/eip/TransactionalClientSolution.gif     | Bin
 .../{ROOT/assets => eips}/images/eip/WireTap.gif   | Bin
 .../assets => eips}/images/eip/WireTapIcon.gif     | Bin
 docs/yarn.lock                                     |  56 ++
 .../camel/maven/packaging/UpdateReadmeMojo.java    |  36 +-
 .../camel/maven/packaging/XRefCheckMojo.java       |   3 +-
 .../main/resources/website-dataformats-list.mvel   |   2 +-
 .../src/main/resources/website-languages-list.mvel |   2 +-
 423 files changed, 1471 insertions(+), 13775 deletions(-)

diff --git a/components/camel-bean/src/main/docs/bean-language.adoc b/components/camel-bean/src/main/docs/bean-language.adoc
index 3dc250a..3b47c41 100644
--- a/components/camel-bean/src/main/docs/bean-language.adoc
+++ b/components/camel-bean/src/main/docs/bean-language.adoc
@@ -16,7 +16,7 @@ methods.
 The xref:manual::bean-binding.adoc[Bean Binding] rules are used to bind the
 xref:manual::message.adoc[Message] Exchange to the method parameters; so you can
 annotate the bean to extract headers or other expressions such as
-xref:components::xpath-language.adoc[XPath] or xref:components::xquery-language.adoc[XQuery] from the message.
+xref:xpath-language.adoc[XPath] or xref:xquery-language.adoc[XQuery] from the message.
 
 == Bean Language options
 
@@ -116,7 +116,7 @@ The xref:bean-language.adoc[Bean Language] also supports invoking beans
 that isn't registered in the xref:manual::registry.adoc[Registry]. This is
 usable for quickly to invoke a bean from Java DSL where you don't need
 to register the bean in the xref:manual::registry.adoc[Registry] such as the
-xref:spring.adoc[Spring] *`ApplicationContext`*. Camel can instantiate
+xref:ROOT:spring.adoc[Spring] *`ApplicationContext`*. Camel can instantiate
 the bean and invoke the method if given a class or invoke an already
 existing instance.
 
@@ -177,7 +177,7 @@ We have some test cases you can look at if it'll help
 is a JUnit test case showing the Java xref:manual::dsl.adoc[DSL] use of the bean
 expression being used in a filter
 * https://github.com/apache/camel/blob/master/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aggregator.xml[aggregator.xml]
-is a Spring XML test case for the xref:manual::aggregate-eip.adoc[Aggregator] which
+is a Spring XML test case for the xref:manual:eips:aggregate-eip.adoc[Aggregator] which
 uses a bean method call to test for the completion of the aggregation.
 
 include::camel-spring-boot::page$bean-starter.adoc[]
diff --git a/components/camel-controlbus/src/main/docs/controlbus-component.adoc b/components/camel-controlbus/src/main/docs/controlbus-component.adoc
index 382cd41..c14935a 100644
--- a/components/camel-controlbus/src/main/docs/controlbus-component.adoc
+++ b/components/camel-controlbus/src/main/docs/controlbus-component.adoc
@@ -161,7 +161,7 @@ String xml = template.requestBody("controlbus:route?action=stats", null, String.
 
 == Using Simple language
 
-You can use the xref:manual::simple-language.adoc[Simple] language with the control bus,
+You can use the xref:languages:simple-language.adoc[Simple] language with the control bus,
 for example to stop a specific route, you can send a message to the
 `"controlbus:language:simple"` endpoint containing the following
 message:
@@ -181,8 +181,8 @@ String status = template.requestBody("controlbus:language:simple", "${camelConte
 
 It's easier to use the `route` command to control lifecycle of
 routes. The `language` command allows you to execute a language script
-that has stronger powers such as xref:groovy-language.adoc[Groovy] or to some
-extend the xref:manual::simple-language.adoc[Simple] language.
+that has stronger powers such as xref:languages:groovy-language.adoc[Groovy] or to some
+extend the xref:languages:simple-language.adoc[Simple] language.
 
 For example to shutdown Camel itself you can do:
 
@@ -197,7 +197,7 @@ message we sent to the control bus component.
 
 [TIP]
 ====
-You can also use other languages such as xref:groovy-language.adoc[Groovy], etc.
+You can also use other languages such as xref:languages:groovy-language.adoc[Groovy], etc.
 ====
 
 include::camel-spring-boot::page$controlbus-starter.adoc[]
diff --git a/components/camel-crypto/src/main/docs/crypto-dataformat.adoc b/components/camel-crypto/src/main/docs/crypto-dataformat.adoc
index 607b2fd..eb430eb 100644
--- a/components/camel-crypto/src/main/docs/crypto-dataformat.adoc
+++ b/components/camel-crypto/src/main/docs/crypto-dataformat.adoc
@@ -263,7 +263,7 @@ or with spring.
 
 == Dependencies
 
-To use the xref:crypto-component.adoc[Crypto] dataformat in your camel routes you
+To use the xref:ROOT:crypto-component.adoc[Crypto] dataformat in your camel routes you
 need to add the following dependency to your pom.
 
 [source,xml]
diff --git a/components/camel-dataformat/src/main/docs/dataformat-component.adoc b/components/camel-dataformat/src/main/docs/dataformat-component.adoc
index 527ec39..adcc90b 100644
--- a/components/camel-dataformat/src/main/docs/dataformat-component.adoc
+++ b/components/camel-dataformat/src/main/docs/dataformat-component.adoc
@@ -76,7 +76,7 @@ with the following path and query parameters:
 
 == Samples
 
-For example to use the xref:jaxb-dataformat.adoc[JAXB] xref:manual::data-format.adoc[Data
+For example to use the xref:dataformats:jaxb-dataformat.adoc[JAXB] xref:manual::data-format.adoc[Data
 Format] we can do as follows:
 
 [source,java]
diff --git a/components/camel-disruptor/src/main/docs/disruptor-component.adoc b/components/camel-disruptor/src/main/docs/disruptor-component.adoc
index c93540c..02a9e23 100644
--- a/components/camel-disruptor/src/main/docs/disruptor-component.adoc
+++ b/components/camel-disruptor/src/main/docs/disruptor-component.adoc
@@ -196,7 +196,7 @@ without incurring significant latency spikes.
 
 == Use of Request Reply
 
-The Disruptor component supports using xref:manual::requestReply-eip.adoc[Request
+The Disruptor component supports using xref:manual:eips:requestReply-eip.adoc[Request
 Reply], where the caller will wait for the Async route to complete. For
 instance:
 
diff --git a/components/camel-elasticsearch-rest/src/main/docs/elasticsearch-rest-component.adoc b/components/camel-elasticsearch-rest/src/main/docs/elasticsearch-rest-component.adoc
index e2aabca..fad0f99 100644
--- a/components/camel-elasticsearch-rest/src/main/docs/elasticsearch-rest-component.adoc
+++ b/components/camel-elasticsearch-rest/src/main/docs/elasticsearch-rest-component.adoc
@@ -275,7 +275,7 @@ try (ElasticsearchScrollRequestIterator response = template.requestBody("direct:
 }
 ----
 
-xref:manual::split-eip.adoc[Split EIP] can also be used.
+xref:manual:eips:split-eip.adoc[Split EIP] can also be used.
 
 [source,java]
 ----
diff --git a/components/camel-elsql/src/main/docs/elsql-component.adoc b/components/camel-elsql/src/main/docs/elsql-component.adoc
index 706204c..0899d8a 100644
--- a/components/camel-elsql/src/main/docs/elsql-component.adoc
+++ b/components/camel-elsql/src/main/docs/elsql-component.adoc
@@ -44,7 +44,7 @@ The parameters to the SQL queries are named parameters in the elsql
 mapping files, and maps to corresponding keys from the Camel message, in
 the given precedence:
 
-1. from message body if xref:manual::simple-language.adoc[Simple]
+1. from message body if xref:components:languages:simple-language.adoc[Simple]
 expression.
 
 2. from message body if its a `java.util.Map`
diff --git a/components/camel-file/src/main/docs/file-component.adoc b/components/camel-file/src/main/docs/file-component.adoc
index 3a49981..2b0b4de 100644
--- a/components/camel-file/src/main/docs/file-component.adoc
+++ b/components/camel-file/src/main/docs/file-component.adoc
@@ -220,7 +220,7 @@ bean completes, and thus the route is completed, the file consumer will
 perform the move operation and move the file to the `.done` sub-folder.
 
 The *move* and the *preMove* options are considered as a directory name
-(though if you use an expression such as xref:manual::file-language.adoc[File Language], or xref:manual::simple-language.adoc[Simple] then the result of the expression
+(though if you use an expression such as xref:components:languages:file-language.adoc[File Language], or xref:components:languages:simple-language.adoc[Simple] then the result of the expression
 evaluation is the file name to be used - eg if you set
 
 [source]
@@ -228,7 +228,7 @@ evaluation is the file name to be used - eg if you set
 move=../backup/copy-of-${file:name}
 ----
 
-then that's using the xref:manual::file-language.adoc[File Language] which we
+then that's using the xref:components:languages:file-language.adoc[File Language] which we
 use return the file name to be used), which can be either relative or
 absolute. If relative, the directory is created as a sub-folder from
 within the folder where the file was consumed.
@@ -266,10 +266,10 @@ processed and after it's processed, it's moved to the `.done` folder.
 
 The *move* and *preMove* options
 are Expression-based, so we have the full power of
-the xref:manual::file-language.adoc[File Language] to do advanced configuration
+the xref:components:languages:file-language.adoc[File Language] to do advanced configuration
 of the directory and name pattern. +
  Camel will, in fact, internally convert the directory name you enter
-into a xref:manual::file-language.adoc[File Language] expression. So when we
+into a xref:components:languages:file-language.adoc[File Language] expression. So when we
 enter `move=.done` Camel will convert this into:
 `\${file:parent}/.done/${file:onlyname}`. This is only done if
 Camel detects that you have not provided a $\{ } in the option value
@@ -292,7 +292,7 @@ choice. For example to move the files in an error folder with a
 timestamp you can use
 `moveFailed=/error/${``file:name.noext``}-${date:now:yyyyMMddHHmmssSSS}.${``file:ext`}.
 
-See more examples at xref:manual::file-language.adoc[File Language]
+See more examples at xref:components:languages:file-language.adoc[File Language]
 
 == Message Headers
 
@@ -306,7 +306,7 @@ The following headers are supported by this component:
 
 |`CamelFileName` |Specifies the name of the file to write (relative to the endpoint
 directory). This name can be a `String`; a `String` with a
-xref:manual::file-language.adoc[File Language] or xref:manual::simple-language.adoc[Simple]
+xref:components:languages:file-language.adoc[File Language] or xref:components:languages:simple-language.adoc[Simple]
 expression; or an Expression object. If it's
 `null` then Camel will auto-generate a filename based on the message
 unique ID.
@@ -513,8 +513,8 @@ from("direct:report").to("file:target/reports/?fileName=report.txt");
 == Filename Expression
 
 Filename can be set either using the *expression* option or as a
-string-based xref:manual::file-language.adoc[File Language] expression in the
-`CamelFileName` header. See the xref:manual::file-language.adoc[File Language]
+string-based xref:components:languages:file-language.adoc[File Language] expression in the
+`CamelFileName` header. See the xref:components:languages:file-language.adoc[File Language]
 for syntax and samples.
 
 [[File2-Consumingfilesfromfolderswhereothersdropfilesdirectly]]
@@ -797,7 +797,7 @@ today's date as a sub-folder name:
 from("file://inbox?move=backup/${date:now:yyyyMMdd}/${file:name}").to("...");
 ----
 
-See xref:manual::file-language.adoc[File Language] for more samples.
+See xref:components:languages:file-language.adoc[File Language] for more samples.
 
 == Avoiding reading the same file more than once (idempotent consumer)
 
@@ -998,7 +998,7 @@ Registry for a bean with the ID, `mySorter`.
 === Sorting using sortBy
 
 Camel supports pluggable sorting strategies. This strategy it to use the
-xref:manual::file-language.adoc[File Language] to configure the sorting. The
+xref:components:languages:file-language.adoc[File Language] to configure the sorting. The
 `sortBy` option is configured as follows:
 
 [source]
@@ -1022,7 +1022,7 @@ This will sort by file name, you can reverse the order by prefixing
 sortBy=reverse:file:name
 ----
 
-As we have the full power of xref:manual::file-language.adoc[File Language] we
+As we have the full power of xref:components:languages:file-language.adoc[File Language] we
 can use some of the other parameters, so if we want to sort by file size
 we do:
 
@@ -1066,7 +1066,7 @@ sortBy=file:modified;file:name
 Now there is an issue here, can you spot it? Well the modified timestamp
 of the file is too fine as it will be in milliseconds, but what if we
 want to sort by date only and then subgroup by name? +
- Well as we have the true power of xref:manual::file-language.adoc[File Language] we can use its date command that supports patterns. So this
+ Well as we have the true power of xref:components:languages:file-language.adoc[File Language] we can use its date command that supports patterns. So this
 can be solved as:
 
 [source]
diff --git a/components/camel-flatpack/src/main/docs/flatpack-dataformat.adoc b/components/camel-flatpack/src/main/docs/flatpack-dataformat.adoc
index c8702bd..3871485 100644
--- a/components/camel-flatpack/src/main/docs/flatpack-dataformat.adoc
+++ b/components/camel-flatpack/src/main/docs/flatpack-dataformat.adoc
@@ -3,7 +3,7 @@
 
 *Since Camel 2.1*
 
-The xref:flatpack-component.adoc[Flatpack] component ships with the Flatpack data
+The xref:ROOT:flatpack-component.adoc[Flatpack] component ships with the Flatpack data
 format that can be used to format between fixed width or delimited text
 messages to a `List` of rows as `Map`.
 
diff --git a/components/camel-groovy/src/main/docs/groovy-language.adoc b/components/camel-groovy/src/main/docs/groovy-language.adoc
index f0cd1c7..9248b41 100644
--- a/components/camel-groovy/src/main/docs/groovy-language.adoc
+++ b/components/camel-groovy/src/main/docs/groovy-language.adoc
@@ -17,7 +17,7 @@ To use a Groovy expression use the following Java code
 ---------------------------------------
 
 For example you could use the *groovy* function to create an
-Predicate in a xref:manual::filter-eip.adoc[Message Filter] or as an Expression for a
+Predicate in a xref:manual:eips:filter-eip.adoc[Message Filter] or as an Expression for a
 Recipient List
 
 == Groovy Options
@@ -107,7 +107,7 @@ following attributes all set at `ENGINE_SCOPE`:
 IN message instead.
 
 |properties |`org.apache.camel.builder.script.PropertiesFunction` |Function with a `resolve` method to make it easier to use
-Camels xref:properties-component.adoc[Properties] component from scripts. See
+Camels xref:ROOT:properties-component.adoc[Properties] component from scripts. See
 further below for example.
 |=======================================================================
 
@@ -126,7 +126,7 @@ header on the Camel message with the key `CamelScriptArguments`. +
 
 *Since Camel 2.9*
 
-If you need to use the xref:properties-component.adoc[Properties] component from a
+If you need to use the xref:ROOT:properties-component.adoc[Properties] component from a
 script to lookup property placeholders, then its a bit cumbersome to do
 so. 
 For example to set a header name myHeader with a value from a property
diff --git a/components/camel-hl7/src/main/docs/hl7-dataformat.adoc b/components/camel-hl7/src/main/docs/hl7-dataformat.adoc
index 3bb1d89..a912bf2 100644
--- a/components/camel-hl7/src/main/docs/hl7-dataformat.adoc
+++ b/components/camel-hl7/src/main/docs/hl7-dataformat.adoc
@@ -9,12 +9,12 @@ v2 messages] using the http://hl7api.sourceforge.net[HAPI library].
 
 This component supports the following:
 
-* HL7 MLLP codec for xref:mina-component.adoc[Mina]
-* HL7 MLLP codec for xref:netty-component.adoc[Netty]
+* HL7 MLLP codec for xref:ROOT:mina-component.adoc[Mina]
+* HL7 MLLP codec for xref:ROOT:netty-component.adoc[Netty]
 * Type Converter from/to HAPI and String
 * HL7 DataFormat using the HAPI library
 * Even more ease-of-use as it's integrated well with the
-xref:mina-component.adoc[camel-mina] component.
+xref:ROOT:mina-component.adoc[camel-mina] component.
 
 Maven users will need to add the following dependency to their `pom.xml`
 for this component:
@@ -35,8 +35,8 @@ HL7 is often used with the HL7 MLLP protocol, which is a text based TCP
 socket based protocol. This component ships with a Mina and Netty Codec
 that conforms to the MLLP protocol so you can easily expose an HL7
 listener accepting HL7 requests over the TCP transport layer. To expose
-a HL7 listener service, the xref:mina-component.adoc[camel-mina] or
-xref:netty-component.adoc[camel-netty] component is used with the
+a HL7 listener service, the xref:ROOT:mina-component.adoc[camel-mina] or
+xref:ROOT:netty-component.adoc[camel-netty] component is used with the
 `HL7MLLPCodec` (mina) or `HL7MLLPNettyDecoder/HL7MLLPNettyEncoder`
 (Netty).
 
diff --git a/components/camel-jetty/src/main/docs/jetty-component.adoc b/components/camel-jetty/src/main/docs/jetty-component.adoc
index 51ab58c..d5a34d5 100644
--- a/components/camel-jetty/src/main/docs/jetty-component.adoc
+++ b/components/camel-jetty/src/main/docs/jetty-component.adoc
@@ -225,7 +225,7 @@ Jetty component will copy the HTTP request parameter, `one` to the
 exchange's `in.header`. We can then use the `simple` language to route
 exchanges that contain this header to a specific endpoint and all others
 to another. If we used a language more powerful than
-xref:manual::simple-language.adoc[Simple] (such as xref:ognl-language.adoc[OGNL])
+xref:languages:simple-language.adoc[Simple] (such as xref:languages:ognl-language.adoc[OGNL])
 we could also test for the parameter value and do routing based on the
 header value as well.
 
diff --git a/components/camel-jms/src/main/docs/jms-component.adoc b/components/camel-jms/src/main/docs/jms-component.adoc
index 274403a..3088113 100644
--- a/components/camel-jms/src/main/docs/jms-component.adoc
+++ b/components/camel-jms/src/main/docs/jms-component.adoc
@@ -1209,7 +1209,7 @@ Transactions and [Request Reply] over JMS
 When using Request Reply over JMS you cannot
 use a single transaction; JMS will not send any messages until a commit
 is performed, so the server side won't receive anything at all until the
-transaction commits. Therefore to use xref:manual::requestReply-eip.adoc[Request
+transaction commits. Therefore to use xref:manual:eips:requestReply-eip.adoc[Request
 Reply] you must commit a transaction after sending the request and then
 use a separate transaction for receiving the response.
 
diff --git a/components/camel-language/src/main/docs/language-component.adoc b/components/camel-language/src/main/docs/language-component.adoc
index a3b75cc..040a1bd 100644
--- a/components/camel-language/src/main/docs/language-component.adoc
+++ b/components/camel-language/src/main/docs/language-component.adoc
@@ -12,14 +12,14 @@ to an endpoint which executes a script by any of the supported
 Languages in Camel. +
  By having a component to execute language scripts, it allows more
 dynamic routing capabilities. For example by using the
-Routing Slip or xref:manual::dynamic-router.adoc[Dynamic
+Routing Slip or xref:manual:eips:dynamic-router.adoc[Dynamic
 Router] EIPs you can send messages to `language` endpoints where the
 script is dynamic defined as well.
 
 This component is provided out of the box in `camel-core` and hence no
 additional JARs is needed. You only have to include additional Camel
 components if the language of choice mandates it, such as using
-xref:groovy-language.adoc[Groovy] or xref:groovy-language.adoc[JavaScript] languages.
+xref:languages:groovy-language.adoc[Groovy] or xref:languages:groovy-language.adoc[JavaScript] languages.
 
 == URI format
 
@@ -108,17 +108,17 @@ script configured on the endpoint.
 
 == Examples
 
-For example you can use the xref:manual::simple-language.adoc[Simple] language to
+For example you can use the xref:languages:simple-language.adoc[Simple] language to
 Message Translator a message:
 
 In case you want to convert the message body type you can do this as
 well:
 
-You can also use the xref:groovy-language.adoc[Groovy] language, such as this
+You can also use the xref:languages:groovy-language.adoc[Groovy] language, such as this
 example where the input message will by multiplied with 2:
 
 You can also provide the script as a header as shown below. Here we use
-xref:xpath-language.adoc[XPath] language to extract the text from the `<foo>`
+xref:languages:xpath-language.adoc[XPath] language to extract the text from the `<foo>`
 tag.
 
 [source,java]
diff --git a/components/camel-mina/src/main/docs/mina-component.adoc b/components/camel-mina/src/main/docs/mina-component.adoc
index ed0539e..3783ca8 100644
--- a/components/camel-mina/src/main/docs/mina-component.adoc
+++ b/components/camel-mina/src/main/docs/mina-component.adoc
@@ -185,7 +185,7 @@ See the Mina how to write your own codec. To use your custom codec with
 `camel-mina`, you should register your codec in the
 Registry; for example, by creating a bean in the
 Spring XML file. Then use the `codec` option to specify the bean ID of
-your codec. See xref:hl7-dataformat.adoc[HL7] that has a custom codec.
+your codec. See xref:dataformats:hl7-dataformat.adoc[HL7] that has a custom codec.
 
 === Sample with sync=false
 
diff --git a/components/camel-mock/src/main/docs/mock-component.adoc b/components/camel-mock/src/main/docs/mock-component.adoc
index 901842a..b90f944 100644
--- a/components/camel-mock/src/main/docs/mock-component.adoc
+++ b/components/camel-mock/src/main/docs/mock-component.adoc
@@ -32,7 +32,7 @@ Expression to create an order testing function,
 * Messages arrive match some kind of Predicate such
 as that specific headers have certain values, or that parts of the
 messages match some predicate, such as by evaluating an
-xref:xpath-language.adoc[XPath] or xref:xpath-language.adoc[XQuery]
+xref:languages:xpath-language.adoc[XPath] or xref:languages:xpath-language.adoc[XQuery]
 Expression.
 
 [NOTE]
diff --git a/components/camel-mvel/src/main/docs/mvel-language.adoc b/components/camel-mvel/src/main/docs/mvel-language.adoc
index fff5070..3a4d44a 100644
--- a/components/camel-mvel/src/main/docs/mvel-language.adoc
+++ b/components/camel-mvel/src/main/docs/mvel-language.adoc
@@ -67,7 +67,7 @@ The MVEL language supports 1 options, which are listed below.
 
 == Samples
 
-For example you could use Mvel inside a xref:manual::filter-eip.adoc[Message
+For example you could use Mvel inside a xref:manual:eips:filter-eip.adoc[Message
 Filter] in XML
 
 [source,java]
diff --git a/components/camel-ognl/src/main/docs/ognl-language.adoc b/components/camel-ognl/src/main/docs/ognl-language.adoc
index fa4427a..9c78d45 100644
--- a/components/camel-ognl/src/main/docs/ognl-language.adoc
+++ b/components/camel-ognl/src/main/docs/ognl-language.adoc
@@ -71,7 +71,7 @@ The OGNL language supports 1 options, which are listed below.
 
 == Samples
 
-For example you could use OGNL inside a xref:manual::filter-eip.adoc[Message
+For example you could use OGNL inside a xref:manual:eips:filter-eip.adoc[Message
 Filter] in XML
 
 [source,java]
diff --git a/components/camel-quickfix/src/main/docs/quickfix-component.adoc b/components/camel-quickfix/src/main/docs/quickfix-component.adoc
index 5352f40..8ff1a70 100644
--- a/components/camel-quickfix/src/main/docs/quickfix-component.adoc
+++ b/components/camel-quickfix/src/main/docs/quickfix-component.adoc
@@ -554,7 +554,7 @@ initially as a collection of key value pairs data. You can use this
 object or you can use the method 'toString' to retrieve the original FIX
 message.
 
-*Note:* Alternatively, you can use xref:bindy-dataformat.adoc[camel bindy dataformat] to transform the FIX message into your own java POJO
+*Note:* Alternatively, you can use xref:dataformats:bindy-dataformat.adoc[camel bindy dataformat] to transform the FIX message into your own java POJO
 
 When a message must be send to QuickFix, then you must create a
 QuickFix.Message instance.
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc b/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc
index 76b707a..58a1a87 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc
@@ -365,7 +365,7 @@ For instance, consider that you need to limit the API usage of Salesforce so tha
 other routes. The body of output message contains an instance of
 `org.apache.camel.component.salesforce.api.dto.Limits` object that can be used in conjunction with
 Content Based Router and Content Based Router and 
-xref:spel-language.adoc[Spring Expression Language (SpEL)] to choose when to perform queries.
+xref:languages:spel-language.adoc[Spring Expression Language (SpEL)] to choose when to perform queries.
 
 Notice how multiplying `1.0` with the integer value held in `body.dailyApiRequests.remaining` makes the expression
 evaluate as with floating point arithmetic, without it - it would end up making integral division which would result
diff --git a/components/camel-saxon/src/main/docs/xquery-component.adoc b/components/camel-saxon/src/main/docs/xquery-component.adoc
index e93b58a..4265357 100644
--- a/components/camel-saxon/src/main/docs/xquery-component.adoc
+++ b/components/camel-saxon/src/main/docs/xquery-component.adoc
@@ -11,7 +11,7 @@ Camel supports http://www.w3.org/TR/xquery/[XQuery] to allow an
 Expression or Predicate to be
 used in the DSL or xref:manual::xml-configuration.adoc[Xml
 Configuration]. For example you could use XQuery to create an
-Predicate in a xref:manual::filter-eip.adoc[Message
+Predicate in a xref:manual:eips:filter-eip.adoc[Message
 Filter] or as an Expression for a Recipient List.
 
 == Options
diff --git a/components/camel-saxon/src/main/docs/xquery-language.adoc b/components/camel-saxon/src/main/docs/xquery-language.adoc
index 6204943..30a7e7d 100644
--- a/components/camel-saxon/src/main/docs/xquery-language.adoc
+++ b/components/camel-saxon/src/main/docs/xquery-language.adoc
@@ -7,7 +7,7 @@ Camel supports http://www.w3.org/TR/xquery/[XQuery] to allow an
 Expression or Predicate to be
 used in the DSL or xref:manual::xml-configuration.adoc[Xml
 Configuration]. For example you could use XQuery to create an
-Predicate in a xref:manual::filter-eip.adoc[Message
+Predicate in a xref:manual:eips:filter-eip.adoc[Message
 Filter] or as an Expression for a
 Recipient List.
 
diff --git a/components/camel-spring/src/main/docs/spel-language.adoc b/components/camel-spring/src/main/docs/spel-language.adoc
index e0791c3..c78c0e9 100644
--- a/components/camel-spring/src/main/docs/spel-language.adoc
+++ b/components/camel-spring/src/main/docs/spel-language.adoc
@@ -118,8 +118,8 @@ can invoke the "bar" method on this bean like this:
 
 === SpEL in enterprise integration patterns
 
-You can use SpEL as an expression for xref:manual::recipientList-eip.adoc[Recipient
-List] or as a predicate inside a xref:manual::filter-eip.adoc[Message
+You can use SpEL as an expression for xref:manual:eips:recipientList-eip.adoc[Recipient
+List] or as a predicate inside a xref:manual:eips:filter-eip.adoc[Message
 Filter]:
 
 [source,xml]
diff --git a/components/camel-spring/src/main/docs/spring-event-component.adoc b/components/camel-spring/src/main/docs/spring-event-component.adoc
index fe00110..b44f1ca 100644
--- a/components/camel-spring/src/main/docs/spring-event-component.adoc
+++ b/components/camel-spring/src/main/docs/spring-event-component.adoc
@@ -12,7 +12,7 @@ The Spring Event component provides access to the Spring
 `ApplicationEvent` objects to a Spring `ApplicationContext` or to
 consume them. You can then use
 xref:manual::enterprise-integration-patterns.adoc[Enterprise Integration
-Patterns] to process them such as xref:manual::filter-eip.adoc[Message
+Patterns] to process them such as xref:manual:eips:filter-eip.adoc[Message
 Filter].
 
 == URI format
diff --git a/components/camel-syslog/src/main/docs/syslog-dataformat.adoc b/components/camel-syslog/src/main/docs/syslog-dataformat.adoc
index f7d3a92..c73beb6 100644
--- a/components/camel-syslog/src/main/docs/syslog-dataformat.adoc
+++ b/components/camel-syslog/src/main/docs/syslog-dataformat.adoc
@@ -13,10 +13,10 @@ This component supports the following:
 SyslogMessage model objects.
 * Type Converter from/to SyslogMessage and
 String
-* Integration with the xref:mina-component.adoc[camel-mina] component.
-* Integration with the xref:netty-component.adoc[camel-netty] component.
+* Integration with the xref:ROOT:mina-component.adoc[camel-mina] component.
+* Integration with the xref:ROOT:netty-component.adoc[camel-netty] component.
 * Encoder and decoder for
-the xref:netty-component.adoc[Netty Component] component.
+the xref:ROOT:netty-component.adoc[Netty Component] component.
 * Support for RFC5424 also.
 
 Maven users will need to add the following dependency to their `pom.xml`
@@ -39,7 +39,7 @@ as its underlying transport layer mechanism.
 The UDP port that has been assigned to syslog is 514.
 
 To expose a Syslog listener service we reuse the existing
-xref:mina-component.adoc[Mina Component] component or xref:netty-component.adoc[Netty Component]
+xref:ROOT:mina-component.adoc[Mina Component] component or xref:ROOT:netty-component.adoc[Netty Component]
 where we just use the `Rfc3164SyslogDataFormat` to marshal and unmarshal
 messages. Notice that from *Camel 2.14* onwards the syslog dataformat is
 renamed to `SyslogDataFormat`.
@@ -64,8 +64,8 @@ ND
 *Since Camel 2.14*
 
 To expose a Syslog listener service we reuse the
-existing xref:mina-component.adoc[Mina Component] component
-or xref:netty-component.adoc[Netty Component] where we just use
+existing xref:ROOT:mina-component.adoc[Mina Component] component
+or xref:ROOT:netty-component.adoc[Netty Component] where we just use
 the `SyslogDataFormat` to marshal and unmarshal messages
 
 === Exposing a Syslog listener
@@ -93,7 +93,7 @@ as an InputStream:
 </camelContext>
 ------------------------------------------------------------------------------------------
 
-The same route using xref:mina-component.adoc[Mina Component]
+The same route using xref:ROOT:mina-component.adoc[Mina Component]
 
 [source,xml]
 -------------------------------------------------------------------------
diff --git a/components/camel-xpath/src/main/docs/xpath-language.adoc b/components/camel-xpath/src/main/docs/xpath-language.adoc
index 5677f5c..d401190 100644
--- a/components/camel-xpath/src/main/docs/xpath-language.adoc
+++ b/components/camel-xpath/src/main/docs/xpath-language.adoc
@@ -7,7 +7,7 @@ Camel supports http://www.w3.org/TR/xpath[XPath] to allow an
 Expression or Predicate to be
 used in the DSL or xref:manual::xml-configuration.adoc[Xml
 Configuration]. For example you could use XPath to create an
-Predicate in a xref:manual::filter-eip.adoc[Message
+Predicate in a xref:manual:eips:filter-eip.adoc[Message
 Filter] or as an Expression for a
 Recipient List.
 
@@ -126,9 +126,9 @@ exchange:
 |out:header |the header name |Object |Will return the *out* message header.
 
 |function:properties |key for property |String |To lookup a property using the
-xref:properties-component.adoc[Properties] component (property placeholders).
+xref:ROOT:properties-component.adoc[Properties] component (property placeholders).
 
-|function:simple |simple expression |Object |To evaluate a xref:manual::simple-language.adoc[Simple] expression.
+|function:simple |simple expression |Object |To evaluate a xref:simple-language.adoc[Simple] expression.
 |===
 
 CAUTION: `function:properties` and `function:simple` is not supported
diff --git a/core/camel-base/src/main/docs/properties-component.adoc b/core/camel-base/src/main/docs/properties-component.adoc
index 0fc60e2..c0362aa 100644
--- a/core/camel-base/src/main/docs/properties-component.adoc
+++ b/core/camel-base/src/main/docs/properties-component.adoc
@@ -287,9 +287,9 @@ ProducerTemplate for example:
 template.sendBody("{{cool.start}}", "Hello World");
 ----
 
-== Example with xref:manual::simple-language.adoc[Simple] language
+== Example with xref:languages:simple-language.adoc[Simple] language
 
-The xref:manual::simple-language.adoc[Simple] language now also support using property
+The xref:languages:simple-language.adoc[Simple] language now also support using property
 placeholders, for example in the route below:
 
 [source,java]
@@ -546,7 +546,7 @@ placeholder notation with `{{` and `}}`.
 == Clashing Spring property placeholders with Camels Simple language
 
 Take notice when using Spring bridging placeholder then the spring `${ }`
-syntax clashes with the xref:manual::simple-language.adoc[Simple] in Camel, and therefore
+syntax clashes with the xref:languages:simple-language.adoc[Simple] in Camel, and therefore
 take care. For example:
 
 [source,xml]
@@ -557,7 +557,7 @@ take care. For example:
 ----
 
 clashes with Spring property placeholders, and you should use `$simple{ }`
-to indicate using the xref:manual::simple-language.adoc[Simple] language in Camel.
+to indicate using the xref:languages:simple-language.adoc[Simple] language in Camel.
 
 [source,xml]
 ----
@@ -804,7 +804,7 @@ To register a custom function from Java code is as shown below:
 PropertiesComponent pc = (org.apache.camel.componennt.properties.PropertiesComponent) context.getPropertiesComponent();
 pc.addFunction(new MyBeerFunction());
 ----
- 
+
 
 == Using 3rd-party properties sources
 
diff --git a/docs/site.yml b/core/camel-core-engine/src/main/docs/antora.yml
similarity index 77%
copy from docs/site.yml
copy to core/camel-core-engine/src/main/docs/antora.yml
index 2d3808d..18fe9ae 100644
--- a/docs/site.yml
+++ b/core/camel-core-engine/src/main/docs/antora.yml
@@ -15,18 +15,5 @@
 # limitations under the License.
 #
 
-site:
-  title: Apache Camel
-
-content:
-  sources:
-    - url: ../
-      branches: HEAD
-      start_path: docs/user-manual
-    - url: ../
-      branches: HEAD
-      start_path: docs/components
-
-ui:
-  bundle:
-    url: not-used
+name: manual
+version: latest
diff --git a/core/camel-core-engine/src/main/docs/eips/resilience4jConfiguration-eip.adoc b/core/camel-core-engine/src/main/docs/eips/resilience4jConfiguration-eip.adoc
deleted file mode 100644
index 77f40f9..0000000
--- a/core/camel-core-engine/src/main/docs/eips/resilience4jConfiguration-eip.adoc
+++ /dev/null
@@ -1,6 +0,0 @@
-[[resilience4jConfiguration-eip]]
-= Resilience4j Configuration EIP
-
-
-// eip options: START
-// eip options: END
diff --git a/core/camel-core-engine/src/main/docs/eips/toD-eip.adoc b/core/camel-core-engine/src/main/docs/eips/toD-eip.adoc
deleted file mode 100644
index a52be0d..0000000
--- a/core/camel-core-engine/src/main/docs/eips/toD-eip.adoc
+++ /dev/null
@@ -1,220 +0,0 @@
-[[toD-eip]]
-= To D EIP
-
-There is a new `.toD` / `<toD>` that allows to send a message to a dynamic
-computed xref:endpoint.adoc[Endpoint] using one or
-more xref:expression.adoc[Expression] that are concat together. By
-default the xref:simple-language.adoc[Simple] language is used to compute
-the endpoint.
-
-== Options
-
-// eip options: START
-The To D EIP supports 5 options which are listed below:
-
-[width="100%",cols="2,5,^1,2",options="header"]
-|===
-| Name | Description | Default | Type
-| *uri* | *Required* The uri of the endpoint to send to. The uri can be dynamic computed using the org.apache.camel.language.simple.SimpleLanguage expression. |  | String
-| *pattern* | Sets the optional ExchangePattern used to invoke this endpoint |  | ExchangePattern
-| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ConsumerCache which is used to cache and reuse producers. |  | Integer
-| *ignoreInvalidEndpoint* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint | false | Boolean
-| *allowOptimisedComponents* | Whether to allow components to optimise toD if they are org.apache.camel.spi.SendDynamicAware. | true | Boolean
-|===
-// eip options: END
-
-== Samples
-
-For example to send a message to a endpoint defined by a
-header you can do as shown below:
-
-[source,java]
-----
-from("direct:start")
-  .toD("${header.foo}");
-----
-
-And in XML:
-
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <toD uri="${header.foo}"/>
-</route>
-----
-
-You can also prefix the uri with a value because by default the uri is
-evaluated using the xref:simple-language.adoc[Simple] language
-
-[source,java]
-----
-from("direct:start")
-  .toD("mock:${header.foo}");
-----
-
-And in XML:
-
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <toD uri="mock:${header.foo"/>
-</route>
-----
-
-In the example above we compute an endpoint that has prefix "mock:" and
-then the header foo is appended. So for example if the header foo has
-value order, then the endpoint is computed as "mock:order".
-
-You can also use other languages than xref:simple-language.adoc[Simple] such
-as xref:components::xpath-language.adoc[XPath] - this requires to prefix with language: as
-shown below (simple language is the default language). If you do not
-specify language: then the endpoint is a component name. And in some
-cases there is both a component and language with the same name such as
-xquery.
-
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <toD uri="language:xpath:/order/@uri"/>
-</route>
-----
-
-This is done by specifying the name of the language followed by a colon.
-
-[source,java]
-----
-from("direct:start")
-  .toD("language:xpath:/order/@uri");
-----
-
-You can also concat multiple xref:components::language-component.adoc[Language](s) together
-using the plus sign `+` such as shown below:
-
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <toD uri="jms:${header.base}+language:xpath:/order/@id"/>
-</route>
-----
-
-In the example above the uri is a combination
-of xref:simple-language.adoc[Simple] language and xref:simple-language.adoc[XPath] where
-the first part is simple (simple is default language). And then the plus
-sign separate to another language, where we specify the language name
-followed by a colon
-
-[source,java]
-----
-from("direct:start")
-  .toD("jms:${header.base}+language:xpath:/order/@id");
-----
-
-You can concat as many languages as you want, just separate them with
-the plus sign
-
-== Avoid creating endless dynamic endpoints which takes up resources
-
-When using dynamic computed endpoints with `toD` then you may compute a lot of dynamic endpoints,
-which results in an overhead of resources in use, by each dynamic endpoint uri, and its associated producer.
-
-For example HTTP based endpoints where you may have dynamic values in URI parameters when calling the HTTP service, such as:
-
-[source,java]
-----
-from("direct:login")
-  .toD("http:myloginserver:8080/login?userid=${header.userName}");
-----
-
-In the example above then the parameter `userid` is dynamic computed, and would result in one instance of endpoint and producer
-for each different userid. To avoid having too many dynamic endpoints you can configure `toD` to reduce its cache size, for example:
-
-[source,java]
-----
-from("direct:login")
-  .toD("http:myloginserver:8080/login?cacheSize=10&userid=${header.userName}");
-----
-
-where the cache is 10. *Important* this will only reduce the endpoint cache of the `toD` that has a chance
-of being reused in case a message is routed with the same `userName` header. Therefore reducing the cache size
-will not solve the _endless dynamic endoints_ problem. Instead you should use static endpoints with `to` and
-provide the dynamic parts in Camel message headers (if possible).
-
-=== Using static endpoints
-
-In the example above then the parameter `userid` is dynamic computed, and would result in one instance of endpoint and producer
-for each different userid. To avoid having too dynamic endpoints you use a single static endpoint and use headers to provide the dynamic parts:
-
-[source,java]
-----
-from("direct:login")
-  .setHeader(Exchange.HTTP_PATH, constant("/login"))
-  .setHeader(Exchange.HTTP_QUERY, simple("userid=${header.userName}"))
-  .toD("http:myloginserver:8080");
-----
-
-However, you can use its optimised components for `toD` that can _solve_ this out of the box,
-as documented next.
-
-== Using optimised components
-
-But a better solution would be if the HTTP component could be optimised to handle the variations of dynamic computed endpoint uris.
-This is with the following components, which have been optimised for `toD`:
-
-- camel-http
-- camel-jetty
-- camel-netty-http
-- camel-undertow
-
-For the optimisation to work, then:
-
-1. The optimisation is detected and activated during startup of the Camel routes with `toD`'s.
-2. The dynamic uri in `toD` must provide the component name as either static or resolved via property placeholders.
-3. The supported components must be on the classpath.
-
-The HTTP based components will be optimised to use the same hostname:port for each endpoint, and the dynamic values
-for context-path and query parameters will be provided as headers:
-
-For example this route:
-
-[source,java]
-----
-from("direct:login")
-  .toD("http:myloginserver:8080/login?userid=${header.userName}");
-----
-
-will essentially be optimised to (pseudo route):
-
-[source,java]
-----
-from("direct:login")
-  .setHeader(Exchange.HTTP_PATH, expression("/login"))
-  .setHeader(Exchange.HTTP_QUERY, expression("userid=${header.userName}"))
-  .toD("http:myloginserver:8080")
-  .removeHeader(Exchange.HTTP_PATH)
-  .removeHeader(Exchange.HTTP_QUERY);
-----
-
-Where _expression_ will be evaluated dynamically. Notice how the uri in `toD` is now static (`\http:myloginserver:8080`).
-This optimisation allows Camel to reuse the same endpoint and its associated producer for all dynamic variations.
-This yields much lower resource overhead as the same http producer will be used for all the different variations of userid's.
-
-[NOTE]
-====
-When the optimised component is in use, then you cannot use the headers `Exchange.HTTP_PATH` and `Exchange.HTTP_QUERY`
-to provide dynamic values to override the uri in `toD`. If you want to use these headers, then use the plain `to` DSL instead.
-In other words these headers are used internally by `toD` to carry the dynamic details of the endpoint.
-====
-
-In case of problems then you can turn on DEBUG logging level on `org.apache.camel.processor.SendDynamicProcessor` which will log
-during startup if `toD` was optimised, or if there was a failure loading the optimised component, with a stacktrace logged.
-
-[source,text]
-----
-Detected SendDynamicAware component: http optimising toD: http:myloginserver:8080/login?userid=${header.userName}
-----
-
-
diff --git a/core/camel-core-engine/src/main/docs/eips/wireTap-eip.adoc b/core/camel-core-engine/src/main/docs/eips/wireTap-eip.adoc
deleted file mode 100644
index 7082de2..0000000
--- a/core/camel-core-engine/src/main/docs/eips/wireTap-eip.adoc
+++ /dev/null
@@ -1,207 +0,0 @@
-[[wireTap-eip]]
-= Wire Tap EIP
-
-http://www.enterpriseintegrationpatterns.com/WireTap.html[Wire Tap]
-(from the xref:enterprise-integration-patterns.adoc[EIP patterns])
-allows you to route messages to a separate location while they are being
-forwarded to the ultimate destination.
-
-image::eip/WireTap.gif[image]
-
-== Streams
-
-If you xref:wireTap-eip.adoc[Wire Tap] a stream message body then you
-should consider enabling xref:stream-caching.adoc[Stream caching] to
-ensure the message body can be read at each endpoint. See more details
-at xref:stream-caching.adoc[Stream caching].
-
-TIP: See the `cacheSize` option for more details on _how much cache_ to use depending on how many or few unique endpoints are used.
-
-== Options
-
-// eip options: START
-The Wire Tap EIP supports 11 options which are listed below:
-
-[width="100%",cols="2,5,^1,2",options="header"]
-|===
-| Name | Description | Default | Type
-| *processorRef* | Reference to a Processor to use for creating a new body as the message to use for wire tapping |  | String
-| *body* | Uses the expression for creating a new body as the message to use for wire tapping |  | NamespaceAware Expression
-| *executorServiceRef* | Uses a custom thread pool |  | String
-| *copy* | Uses a copy of the original exchange | true | Boolean
-| *dynamicUri* | Whether the uri is dynamic or static. If the uri is dynamic then the simple language is used to evaluate a dynamic uri to use as the wire-tap destination, for each incoming message. This works similar to how the toD EIP pattern works. If static then the uri is used as-is as the wire-tap destination. | true | Boolean
-| *onPrepareRef* | Uses the Processor when preparing the org.apache.camel.Exchange to be send. This can be used to deep-clone messages that should be send, or any custom logic needed before the exchange is send. |  | String
-| *uri* | *Required* The uri of the endpoint to send to. The uri can be dynamic computed using the org.apache.camel.language.simple.SimpleLanguage expression. |  | String
-| *pattern* | Sets the optional ExchangePattern used to invoke this endpoint |  | ExchangePattern
-| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this dynamic router, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped an [...]
-| *ignoreInvalidEndpoint* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint | false | Boolean
-| *allowOptimisedComponents* | Whether to allow components to optimise toD if they are org.apache.camel.spi.SendDynamicAware. | true | Boolean
-|===
-// eip options: END
-
-== WireTap Thread pool
-
-The WireTap uses a thread pool to process the
-tapped messages. This thread pool will by default use the settings
-detailed at xref:threading-model.adoc[Threading Model]. In particular,
-when the pool is exhausted (with all threads utilized), further wiretaps
-will be executed synchronously by the calling thread. To remedy this,
-you can configure an explicit thread pool on the xref:wireTap-eip.adoc[Wire
-Tap] having either a different rejection policy, a larger worker queue,
-or more worker threads.
-
-== WireTap Node
-
-Camel's Wire Tap node supports two flavors when tapping an
-xref:exchange.adoc[Exchange]:
-
-- With the traditional Wire Tap, Camel will copy the original
-xref:exchange.adoc[Exchange] and set its
-xref:exchange-pattern.adoc[Exchange Pattern] to *`InOnly`*, as we want
-the tapped xref:exchange.adoc[Exchange] to be sent in a fire and forget
-style. The tapped xref:exchange.adoc[Exchange] is then sent in a
-separate thread so it can run in parallel with the original. Beware that
-only the Exchange is copied - Wire Tap won't do a deep clone (unless you
-specify a custom processor via *`onPrepareRef`* which does that). So all
-copies could share objects from the original Exchange.
-- Camel also provides an option of sending a new
-xref:exchange.adoc[Exchange] allowing you to populate it with new
-values.
-
-== Sending a Copy (traditional wiretap)
-
-* Using the xref:fluent-builders.adoc[Fluent Builders]
-
-[source,java]
-----
-    protected RouteBuilder createRouteBuilder() {
-        return new RouteBuilder() {
-            public void configure() {
-                // START SNIPPET: e1
-                from("direct:start")
-                    .to("log:foo")
-                    .wireTap("direct:tap")
-                    .to("mock:result");
-                // END SNIPPET: e1
-
-                from("direct:tap")
-                    .delay(1000).setBody().constant("Tapped")
-                    .to("mock:result", "mock:tap");
-                
-                from("direct:test").wireTap("direct:a").id("wiretap_1").to("mock:a");
-                from("direct:a").to("mock:b");
-            }
-        };
-    }
-----
-
-== Sending a New xref:exchange.adoc[Exchange]
-
-*Using the xref:fluent-builders.adoc[Fluent Builders]*
-
-Camel supports either a processor or an
-xref:expression.adoc[Expression] to populate the new
-xref:exchange.adoc[Exchange]. Using a processor gives you full power
-over how the xref:exchange.adoc[Exchange] is populated as you can set
-properties, headers, etc. An xref:expression.adoc[Expression] can only
-be used to set the *`IN`* body.
-
-The xref:expression.adoc[Expression] or
-xref:processor.adoc[Processor] is pre-populated with a copy of the
-original xref:exchange.adoc[Exchange], which allows you to access the
-original message when you prepare a new xref:exchange.adoc[Exchange] to
-be sent. You can use the *`copy`* option (enabled by default) to
-indicate whether you want this.
-
-Below is the processor variation,
-where we disable *`copy`* by passing in *`false`* to create a new, empty
-xref:exchange.adoc[Exchange]
-
-[source,java]
-----
-    public void testFireAndForgetUsingProcessor() throws Exception {
-        context.addRoutes(new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                // START SNIPPET: e1
-                from("direct:start")
-                    .wireTap("direct:foo", false, new Processor() {
-                        public void process(Exchange exchange) throws Exception {
-                            exchange.getIn().setBody("Bye World");
-                            exchange.getIn().setHeader("foo", "bar");
-                        }
-                    }).to("mock:result");
-
-
-                from("direct:foo").to("mock:foo");
-                // END SNIPPET: e1
-            }
-        });
-    }
-----
-
-
-== Using Dynamic URIs
-
-For example to wire tap to a dynamic URI, then it supports the same
-dynamic URIs as documented in xref:message-endpoint.adoc[Message
-Endpoint]. For example to wire tap to a JMS queue where the header ID is
-part of the queue name:
-
-[source,java]
-----
-    from("direct:start") .wireTap("jms:queue:backup-$\{header.id}")
-        .to("bean:doSomething");
-----
-
-== Sending a New exchange and Set Headers in DSL
-
-If you send a new message using xref:wireTap-eip.adoc[Wire Tap], then you
-could only set the message body using an
-xref:expression.adoc[Expression] from the DSL. If you also need to set
-headers, you would have to use a xref:processor.adoc[Processor]. From
-It's possible to set headers as well using the DSL.
-
-The following example sends a new message which has
-
-* *`Bye World`* as message body.
-* A header with key *`id`* with the value *`123`*.
-* A header with key *`date`* which has current date as value.
-
-== Java DSL
-
-[source,java]
-----
-    @Override
-    protected RouteBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                // START SNIPPET: e1
-                from("direct:start")
-                    // tap a new message and send it to direct:tap
-                    // the new message should be Bye World with 2 headers
-                    .wireTap("direct:tap")
-                        // create the new tap message body and headers
-                        .newExchangeBody(constant("Bye World"))
-                        .newExchangeHeader("id", constant(123))
-                        .newExchangeHeader("date", simple("${date:now:yyyyMMdd}"))
-                    .end()
-                    // here we continue routing the original messages
-                    .to("mock:result");
-
-                // this is the tapped route
-                from("direct:tap")
-                    .to("mock:tap");
-                // END SNIPPET: e1
-            }
-        };
-    }
-
-----
-
-== Using `onPrepare` to Execute Custom Logic when Preparing Messages
-
-See details at xref:multicast-eip.adoc[Multicast]
-
-xref:using-this-pattern.adoc[Using This Pattern]
diff --git a/core/camel-core-engine/src/main/docs/eips/aggregate-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/aggregate-eip.adoc
similarity index 93%
rename from core/camel-core-engine/src/main/docs/eips/aggregate-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/aggregate-eip.adoc
index 923517d..e0ff477 100644
--- a/core/camel-core-engine/src/main/docs/eips/aggregate-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/aggregate-eip.adoc
@@ -3,12 +3,12 @@
 
 The
 http://www.enterpriseintegrationpatterns.com/Aggregator.html[Aggregator]
-from the xref:enterprise-integration-patterns.adoc[EIP patterns] allows
+from the xref:ROOT:enterprise-integration-patterns.adoc[EIP patterns] allows
 you to combine a number of messages together into a single message.
 
 image::eip/Aggregator.gif[image]
 
-A correlation xref:expression.adoc[Expression] is used to determine the
+A correlation xref:ROOT:expression.adoc[Expression] is used to determine the
 messages which should be aggregated together. If you want to aggregate
 all messages into a single message, just use a constant expression. An
 AggregationStrategy is used to combine all the message exchanges for a
@@ -22,30 +22,30 @@ The Aggregate EIP supports 27 options which are listed below:
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *correlationExpression* | *Required* The expression used to calculate the correlation key to use for aggregation. The Exchange which has the same correlation key is aggregated together. If the correlation key could not be evaluated an Exception is thrown. You can disable this by using the ignoreBadCorrelationKeys option. |  | NamespaceAware Expression
-| *completionPredicate* | A Predicate to indicate when an aggregated exchange is complete. If this is not specified and the AggregationStrategy object implements Predicate, the aggregationStrategy object will be used as the completionPredicate. |  | NamespaceAware Expression
-| *completionTimeoutExpression* | Time in millis that an aggregated exchange should be inactive before its complete (timeout). This option can be set as either a fixed value or using an Expression which allows you to evaluate a timeout dynamically - will use Long as result. If both are set Camel will fallback to use the fixed value if the Expression result was null or 0. You cannot use this option together with completionInterval, only one of the two can be used. By default the timeout c [...]
-| *completionSizeExpression* | Number of messages aggregated before the aggregation is complete. This option can be set as either a fixed value or using an Expression which allows you to evaluate a size dynamically - will use Integer as result. If both are set Camel will fallback to use the fixed value if the Expression result was null or 0. |  | NamespaceAware Expression
-| *optimisticLockRetryPolicy* | Allows to configure retry settings when using optimistic locking. |  | OptimisticLockRetry PolicyDefinition
+| *correlationExpression* | *Required* The expression used to calculate the correlation key to use for aggregation. The Exchange which has the same correlation key is aggregated together. If the correlation key could not be evaluated an Exception is thrown. You can disable this by using the ignoreBadCorrelationKeys option. |  | ExpressionSubElementDefinition
+| *completionPredicate* | A Predicate to indicate when an aggregated exchange is complete. If this is not specified and the AggregationStrategy object implements Predicate, the aggregationStrategy object will be used as the completionPredicate. |  | ExpressionSubElementDefinition
+| *completionTimeoutExpression* | Time in millis that an aggregated exchange should be inactive before its complete (timeout). This option can be set as either a fixed value or using an Expression which allows you to evaluate a timeout dynamically - will use Long as result. If both are set Camel will fallback to use the fixed value if the Expression result was null or 0. You cannot use this option together with completionInterval, only one of the two can be used. By default the timeout c [...]
+| *completionSizeExpression* | Number of messages aggregated before the aggregation is complete. This option can be set as either a fixed value or using an Expression which allows you to evaluate a size dynamically - will use Integer as result. If both are set Camel will fallback to use the fixed value if the Expression result was null or 0. |  | ExpressionSubElementDefinition
+| *optimisticLockRetryPolicy* | Allows to configure retry settings when using optimistic locking. |  | OptimisticLockRetryPolicyDefinition
 | *parallelProcessing* | When aggregated are completed they are being send out of the aggregator. This option indicates whether or not Camel should use a thread pool with multiple threads for concurrency. If no custom thread pool has been specified then Camel creates a default pool with 10 concurrent threads. | false | Boolean
-| *optimisticLocking* | Turns on using optimistic locking, which requires the aggregationRepository being used, is supporting this by implementing org.apache.camel.spi.OptimisticLockingAggregationRepository. | false | Boolean
+| *optimisticLocking* | Turns on using optimistic locking, which requires the aggregationRepository being used, is supporting this by implementing org.apache.camel.spi.OptimisticLockingAggregationRepository . | false | Boolean
 | *executorServiceRef* | If using parallelProcessing you can specify a custom thread pool to be used. In fact also if you are not using parallelProcessing this custom thread pool is used to send out aggregated exchanges as well. |  | String
-| *timeoutCheckerExecutor ServiceRef* | If using either of the completionTimeout, completionTimeoutExpression, or completionInterval options a background thread is created to check for the completion for every aggregator. Set this option to provide a custom thread pool to be used rather than creating a new thread for every aggregator. |  | String
-| *aggregationRepositoryRef* | Sets the custom aggregate repository to use Will by default use org.apache.camel.processor.aggregate.MemoryAggregationRepository |  | String
+| *timeoutCheckerExecutorService Ref* | If using either of the completionTimeout, completionTimeoutExpression, or completionInterval options a background thread is created to check for the completion for every aggregator. Set this option to provide a custom thread pool to be used rather than creating a new thread for every aggregator. |  | String
+| *aggregationRepositoryRef* | Sets the custom aggregate repository to use. Will by default use org.apache.camel.processor.aggregate.MemoryAggregationRepository |  | String
 | *strategyRef* | A reference to lookup the AggregationStrategy in the Registry. Configuring an AggregationStrategy is required, and is used to merge the incoming Exchange with the existing already merged exchanges. At first call the oldExchange parameter is null. On subsequent invocations the oldExchange contains the merged exchanges and newExchange is of course the new incoming Exchange. |  | String
 | *strategyMethodName* | This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy. |  | String
 | *strategyMethodAllowNull* | If this option is false then the aggregate method is not used for the very first aggregation. If this option is true then null values is used as the oldExchange (at the very first aggregation), when using POJOs as the AggregationStrategy. | false | Boolean
 | *completionSize* | Number of messages aggregated before the aggregation is complete. This option can be set as either a fixed value or using an Expression which allows you to evaluate a size dynamically - will use Integer as result. If both are set Camel will fallback to use the fixed value if the Expression result was null or 0. |  | Integer
 | *completionInterval* | A repeating period in millis by which the aggregator will complete all current aggregated exchanges. Camel has a background task which is triggered every period. You cannot use this option together with completionTimeout, only one of them can be used. |  | Long
 | *completionTimeout* | Time in millis that an aggregated exchange should be inactive before its complete (timeout). This option can be set as either a fixed value or using an Expression which allows you to evaluate a timeout dynamically - will use Long as result. If both are set Camel will fallback to use the fixed value if the Expression result was null or 0. You cannot use this option together with completionInterval, only one of the two can be used. By default the timeout checker run [...]
-| *completionTimeoutChecker Interval* | Interval in millis that is used by the background task that checks for timeouts (org.apache.camel.TimeoutMap). By default the timeout checker runs every second. The timeout is an approximation and there is no guarantee that the a timeout is triggered exactly after the timeout value. It is not recommended to use very low timeout values or checker intervals. | 1000 | Long
+| *completionTimeoutChecker Interval* | Interval in millis that is used by the background task that checks for timeouts ( org.apache.camel.TimeoutMap ). By default the timeout checker runs every second. The timeout is an approximation and there is no guarantee that the a timeout is triggered exactly after the timeout value. It is not recommended to use very low timeout values or checker intervals. | 1000 | Long
 | *completionFromBatchConsumer* | Enables the batch completion mode where we aggregate from a org.apache.camel.BatchConsumer and aggregate the total number of exchanges the org.apache.camel.BatchConsumer has reported as total by checking the exchange property org.apache.camel.Exchange#BATCH_COMPLETE when its complete. This option cannot be used together with discardOnAggregationFailure. | false | Boolean
 | *completionOnNewCorrelation Group* | Enables completion on all previous groups when a new incoming correlation group. This can for example be used to complete groups with same correlation keys when they are in consecutive order. Notice when this is enabled then only 1 correlation group can be in progress as when a new correlation group starts, then the previous groups is forced completed. | false | Boolean
 | *eagerCheckCompletion* | Use eager completion checking which means that the completionPredicate will use the incoming Exchange. As opposed to without eager completion checking the completionPredicate will use the aggregated Exchange. | false | Boolean
-| *ignoreInvalidCorrelation Keys* | If a correlation key cannot be successfully evaluated it will be ignored by logging a DEBUG and then just ignore the incoming Exchange. | false | Boolean
+| *ignoreInvalidCorrelationKeys* | If a correlation key cannot be successfully evaluated it will be ignored by logging a DEBUG and then just ignore the incoming Exchange. | false | Boolean
 | *closeCorrelationKeyOn Completion* | Closes a correlation key when its complete. Any late received exchanges which has a correlation key that has been closed, it will be defined and a ClosedCorrelationKeyException is thrown. |  | Integer
 | *discardOnCompletionTimeout* | Discards the aggregated message on completion timeout. This means on timeout the aggregated message is dropped and not sent out of the aggregator. | false | Boolean
-| *discardOnAggregationFailure* | Discards the aggregated message when aggregation failed (an exception was thrown from AggregationStrategy. This means the partly aggregated message is dropped and not sent out of the aggregator. This option cannot be used together with completionFromBatchConsumer. | false | Boolean
+| *discardOnAggregationFailure* | Discards the aggregated message when aggregation failed (an exception was thrown from AggregationStrategy . This means the partly aggregated message is dropped and not sent out of the aggregator. This option cannot be used together with completionFromBatchConsumer. | false | Boolean
 | *forceCompletionOnStop* | Indicates to complete all current aggregated exchanges when the context is stopped | false | Boolean
 | *completeAllOnStop* | Indicates to wait to complete all current and partial (pending) aggregated exchanges when the context is stopped. This also means that we will wait for all pending exchanges which are stored in the aggregation repository to complete so the repository is empty before we can stop. You may want to enable this when using the memory based aggregation repository that is memory based only, and do not store data on disk. When this option is enabled, then the aggregator is [...]
 | *aggregateControllerRef* | To use a org.apache.camel.processor.aggregate.AggregateController to allow external sources to control this aggregator. |  | String
@@ -111,7 +111,7 @@ class ArrayListAggregationStrategy implements AggregationStrategy {
 
 == About completion
 
-When aggregation xref:exchange.adoc[Exchange]s at some point you need to
+When aggregation xref:ROOT:exchange.adoc[Exchange]s at some point you need to
 indicate that the aggregated exchanges is complete, so they can be send
 out of the aggregator. Camel allows you to indicate completion in
 various ways as follows:
@@ -123,7 +123,7 @@ key within the period.
 exchanges are completed.
 * completionSize - Is a number indicating that after X aggregated
 exchanges it's complete.
-* completionPredicate - Runs a xref:predicate.adoc[Predicate] when a new
+* completionPredicate - Runs a xref:ROOT:predicate.adoc[Predicate] when a new
 exchange is aggregated to determine if we are complete or not.
 The configured aggregationStrategy can implement the
 Predicate interface and will be used as the completionPredicate if no
@@ -132,7 +132,7 @@ implement `PreCompletionAwareAggregationStrategy` and will be used as
 the completionPredicate in pre-complete check mode. See further below
 for more details.
 * completionFromBatchConsumer - Special option for
-xref:batch-consumer.adoc[Batch Consumer] which allows you to complete
+xref:ROOT:batch-consumer.adoc[Batch Consumer] which allows you to complete
 when all the messages from the batch has been aggregated.
 * forceCompletionOnStop - Indicates to complete all current
 aggregated exchanges when the context is stopped
@@ -152,9 +152,9 @@ aggregator. If not provided Camel will thrown an Exception on startup.
 == Pre-completion mode
 
 There can be use-cases where you want the incoming
-xref:exchange.adoc[Exchange] to determine if the correlation group
+xref:ROOT:exchange.adoc[Exchange] to determine if the correlation group
 should pre-complete, and then the incoming
-xref:exchange.adoc[Exchange] is starting a new group from scratch. To
+xref:ROOT:exchange.adoc[Exchange] is starting a new group from scratch. To
 determine this the `AggregationStrategy` can
 implement `PreCompletionAwareAggregationStrategy` which has
 a `preComplete` method:
@@ -558,7 +558,7 @@ without using POJOs then you may have `null` as `oldExchange` or
 Aggregate EIP will invoke the
 `AggregationStrategy` with `oldExchange` as null, for the first
 Exchange incoming to the aggregator. And then for
-subsequent xref:exchange.adoc[Exchange]s then `oldExchange` and
+subsequent xref:ROOT:exchange.adoc[Exchange]s then `oldExchange` and
 `newExchange` parameters are both not null.
 
 Example with Content Enricher EIP and no data
@@ -614,14 +614,14 @@ public class MyBodyAppender {
 }
 ----
 
-In the example above we use the xref:content-enricher.adoc[Content Enricher]
+In the example above we use the xref:ROOT:content-enricher.adoc[Content Enricher]
 EIP using `pollEnrich`. The `newExchange` will be null in the
 situation we could not get any data from the "seda:foo" endpoint, and
 therefore the timeout was hit after 1 second. So if we need to do some
 special merge logic we would need to set `setAllowNullNewExchange=true`,
 so the `append` method will be invoked. If we do not do that then when
 the timeout was hit, then the append method would normally not be
-invoked, meaning the xref:content-enricher.adoc[Content Enricher] did
+invoked, meaning the xref:ROOT:content-enricher.adoc[Content Enricher] did
 not merge/change the message.
 
 In XML DSL you would configure the `strategyMethodAllowNull` option and
diff --git a/core/camel-core-engine/src/main/docs/eips/batch-config-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/batch-config-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/batch-config-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/batch-config-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/bean-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/bean-eip.adoc
similarity index 68%
rename from core/camel-core-engine/src/main/docs/eips/bean-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/bean-eip.adoc
index 9b997493..eee6fc0 100644
--- a/core/camel-core-engine/src/main/docs/eips/bean-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/bean-eip.adoc
@@ -11,7 +11,7 @@ bean:beanID[?options]
 ----
 
 Where *beanID* can be any string which is used to look up the bean in
-the xref:registry.adoc[Registry]
+the xref:ROOT:registry.adoc[Registry]
 
 == EIP options
 
@@ -24,8 +24,8 @@ The Bean EIP supports 5 options which are listed below:
 | *ref* | Sets a reference to a bean to use |  | String
 | *method* | Sets the method name on the bean to use |  | String
 | *beanType* | Sets the Class of the bean |  | String
-| *cache* | *Deprecated* Use scope option instead. |  | Boolean
-| *scope* | Scope of bean. See below for more details. | Singleton | String |
+| *cache* | *Deprecated* Use singleton option instead | true | Boolean
+| *scope* | Scope of bean. When using singleton scope (default) the bean is created or looked up only once and reused for the lifetime of the endpoint. The bean should be thread-safe in case concurrent threads is calling the bean at the same time. When using request scope the bean is created or looked up once per request (exchange). This can be used if you want to store state on a bean while processing a request and you want to call the same bean instance multiple times while processing  [...]
 |===
 // eip options: END
 
@@ -46,10 +46,10 @@ Camel also supports invoking xref:components::bean-component.adoc[Bean] as an En
 route below:
 
 What happens is that when the exchange is routed to the `myBean` Camel
-will use the xref:bean-binding.adoc[Bean Binding] to invoke the bean. +
+will use the xref:ROOT:bean-binding.adoc[Bean Binding] to invoke the bean. +
  The source for the bean is just a plain POJO:
 
-Camel will use xref:bean-binding.adoc[Bean Binding] to invoke the
+Camel will use xref:ROOT:bean-binding.adoc[Bean Binding] to invoke the
 `sayHello` method, by converting the Exchange's In body to the `String`
 type and storing the output of the method on the Exchange Out body.
 
@@ -89,8 +89,8 @@ from("direct:start").bean(ExampleBean.class);
 
 How bean methods to be invoked are chosen (if they are not specified
 explicitly through the *method* parameter) and how parameter values are
-constructed from the xref:message.adoc[Message] are all defined by the
-xref:bean-binding.adoc[Bean Binding] mechanism which is used throughout
-all of the various xref:bean-integration.adoc[Bean Integration]
+constructed from the xref:ROOT:message.adoc[Message] are all defined by the
+xref:ROOT:bean-binding.adoc[Bean Binding] mechanism which is used throughout
+all of the various xref:ROOT:bean-integration.adoc[Bean Integration]
 mechanisms in Camel.
 
diff --git a/core/camel-core-engine/src/main/docs/eips/choice-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/choice-eip.adoc
similarity index 89%
rename from core/camel-core-engine/src/main/docs/eips/choice-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/choice-eip.adoc
index d1fdd27..c24766d 100644
--- a/core/camel-core-engine/src/main/docs/eips/choice-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/choice-eip.adoc
@@ -3,7 +3,7 @@
 
 The
 http://www.enterpriseintegrationpatterns.com/ContentBasedRouter.html[Content
-Based Router] from the xref:enterprise-integration-patterns.adoc[EIP
+Based Router] from the xref:ROOT:enterprise-integration-patterns.adoc[EIP
 patterns] allows you to route messages to the correct destination based
 on the contents of the message exchanges.
 
@@ -26,7 +26,7 @@ The Choice EIP supports 2 options which are listed below:
 
 The following example shows how to route a request from an input
 *seda:a* endpoint to either *seda:b*, *seda:c* or *seda:d* depending on
-the evaluation of various xref:predicate.adoc[Predicate] expressions
+the evaluation of various xref:ROOT:predicate.adoc[Predicate] expressions
 
 [source,java]
 ----
@@ -46,7 +46,7 @@ RouteBuilder builder = new RouteBuilder() {
 
 [TIP]
 ====
-See xref:faq/why-can-i-not-use-when-or-otherwise-in-a-java-camel-route.adoc[Why
+See xref:ROOT:faq/why-can-i-not-use-when-or-otherwise-in-a-java-camel-route.adoc[Why
 can I not use when or otherwise in a Java Camel route] if you have
 problems with the Java DSL, accepting using `when` or `otherwise`.
 ====
diff --git a/core/camel-core-engine/src/main/docs/eips/circuitBreaker-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/circuitBreaker-eip.adoc
similarity index 97%
rename from core/camel-core-engine/src/main/docs/eips/circuitBreaker-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/circuitBreaker-eip.adoc
index 46909dc..7c60200 100644
--- a/core/camel-core-engine/src/main/docs/eips/circuitBreaker-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/circuitBreaker-eip.adoc
@@ -1,5 +1,4 @@
-[[circuitBreaker-eip]]
-= CircuitBreaker EIP
+= Circuit Breaker EIP
 
 The Circuit Breaker pattern is inspired by the real-world electrical circuit breaker,
 which is used to detect excessive current draw and fail fast to protect electrical equipment.
@@ -57,5 +56,4 @@ And in XML DSL:
 Camel provides two implementations of this pattern:
 
 * xref:hystrix-eip.adoc[Hystrix] - Using the Netflix Hystrix implementation
-* xref:resilience4j-eip.adoc[Resilience4j] - Using the Resilience4j implementation
-
+* xref:resilience4j-eip.adoc[Resilience4j] - Using the Resilience4j implementation
\ No newline at end of file
diff --git a/core/camel-core-engine/src/main/docs/eips/claimCheck-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/claimCheck-eip.adoc
similarity index 94%
rename from core/camel-core-engine/src/main/docs/eips/claimCheck-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/claimCheck-eip.adoc
index c7c238b..d9077c3 100644
--- a/core/camel-core-engine/src/main/docs/eips/claimCheck-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/claimCheck-eip.adoc
@@ -1,7 +1,7 @@
 [[claimCheck-eip]]
 = Claim Check EIP
 
-The http://www.enterpriseintegrationpatterns.com/patterns/messaging/StoreInLibrary.html[Claim Check] from the xref:enterprise-integration-patterns.adoc[EIP patterns]
+The http://www.enterpriseintegrationpatterns.com/patterns/messaging/StoreInLibrary.html[Claim Check] from the xref:ROOT:enterprise-integration-patterns.adoc[EIP patterns]
 allows you to replace message content with a claim check (a unique key), which can be used to retrieve the message content at a later time.
 
 image::eip/StoreInLibrary.gif[image]
@@ -19,7 +19,7 @@ The Claim Check EIP supports 5 options which are listed below:
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *operation* | *Required* The claim check operation to use. The following operations is supported: Get - Gets (does not remove) the claim check by the given key. GetAndRemove - Gets and remove the claim check by the given key. Set - Sets a new (will override if key already exists) claim check with the given key. Push - Sets a new claim check on the stack (does not use key). Pop - Gets the latest claim check from the stack (does not use key). |  | ClaimCheckOperation
+| *operation* | The claim check operation to use. The following operations is supported: Get - Gets (does not remove) the claim check by the given key. GetAndRemove - Gets and remove the claim check by the given key. Set - Sets a new (will override if key already exists) claim check with the given key. Push - Sets a new claim check on the stack (does not use key). Pop - Gets the latest claim check from the stack (does not use key). |  | ClaimCheckOperation
 | *key* | To use a specific key for claim check id (for dynamic keys use simple language syntax as the key). |  | String
 | *filter* | Specified a filter to control what data gets merging data back from the claim check repository. The following syntax is supported: body - to aggregate the message body attachments - to aggregate all the message attachments headers - to aggregate all the message headers header:pattern - to aggregate all the message headers that matches the pattern. The pattern uses the following rules are applied in this order: exact match, returns true wildcard match (pattern ends with a and [...]
 | *strategyRef* | To use a custom AggregationStrategy instead of the default implementation. Notice you cannot use both custom aggregation strategy and configure data at the same time. |  | String
diff --git a/core/camel-core-engine/src/main/docs/eips/content-based-router-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/content-based-router-eip.adoc
similarity index 74%
rename from core/camel-core-engine/src/main/docs/eips/content-based-router-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/content-based-router-eip.adoc
index 48ebb36..f4495de 100644
--- a/core/camel-core-engine/src/main/docs/eips/content-based-router-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/content-based-router-eip.adoc
@@ -3,7 +3,7 @@
 
 The
 http://www.enterpriseintegrationpatterns.com/ContentBasedRouter.html[Content
-Based Router] from the xref:enterprise-integration-patterns.adoc[EIP
+Based Router] from the xref:ROOT:enterprise-integration-patterns.adoc[EIP
 patterns] allows you to route messages to the correct destination based
 on the contents of the message exchanges.
 
@@ -11,9 +11,9 @@ image::eip/ContentBasedRouter.gif[image]
 
 The following example shows how to route a request from an input
 *seda:a* endpoint to either *seda:b*, *seda:c* or *seda:d* depending on
-the evaluation of various xref:predicate.adoc[Predicate] expressions
+the evaluation of various xref:ROOT:predicate.adoc[Predicate] expressions
 
-== Using the xref:fluent-builders.adoc[Fluent Builders]
+== Using the xref:ROOT:fluent-builders.adoc[Fluent Builders]
 
 [source,java]
 ----
@@ -36,12 +36,12 @@ RouteBuilder builder = new RouteBuilder() {
 [TIP]
 ====
 See
-xref:faq/why-can-i-not-use-when-or-otherwise-in-a-java-camel-route.adoc[Why
+xref:ROOT:faq/why-can-i-not-use-when-or-otherwise-in-a-java-camel-route.adoc[Why
 can I not use when or otherwise in a Java Camel route] if you have
 problems with the Java DSL, accepting using `when` or `otherwise`.
 ====
 
-== Using the xref:spring-xml-extensions.adoc[Spring XML Extensions]
+== Using the xref:ROOT:spring-xml-extensions.adoc[Spring XML Extensions]
 
 [source,java]
 ----
@@ -72,8 +72,8 @@ https://github.com/apache/camel/blob/master/core/camel-core/src/test/java/org/ap
 == Using This Pattern
 
 If you would like to use this EIP Pattern then please read the
-xref:getting-started.adoc[Getting Started]. You may also find the
-xref:architecture.adoc[Architecture] useful particularly the description
-of xref:endpoint.adoc[Endpoint] and xref:uris.adoc[URIs]. Then you could
-try out some of the xref:examples.adoc[Examples] first before trying
+xref:ROOT:getting-started.adoc[Getting Started]. You may also find the
+xref:ROOT:architecture.adoc[Architecture] useful particularly the description
+of xref:ROOT:endpoint.adoc[Endpoint] and xref:ROOT:uris.adoc[URIs]. Then you could
+try out some of the xref:ROOT:examples.adoc[Examples] first before trying
 this pattern out.
diff --git a/core/camel-core-engine/src/main/docs/eips/content-filter-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/content-filter-eip.adoc
similarity index 60%
rename from core/camel-core-engine/src/main/docs/eips/content-filter-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/content-filter-eip.adoc
index 6251f51..78299c2 100644
--- a/core/camel-core-engine/src/main/docs/eips/content-filter-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/content-filter-eip.adoc
@@ -4,25 +4,25 @@
 Camel supports the
 http://www.enterpriseintegrationpatterns.com/ContentFilter.html[Content
 Filter] from the
-xref:enterprise-integration-patterns.adoc[EIP patterns]
+xref:ROOT:enterprise-integration-patterns.adoc[EIP patterns]
 using one of the following mechanisms in the routing logic to transform
 content from the inbound message.
 
-* xref:message-translator.adoc[Message Translator]
-* invoking a xref:bean-integration.adoc[Java bean]
-* xref:processor.adoc[Processor] object
+* xref:ROOT:message-translator.adoc[Message Translator]
+* invoking a xref:ROOT:bean-integration.adoc[Java bean]
+* xref:ROOT:processor.adoc[Processor] object
 
 image::eip/ContentFilter.gif[image]
 
 A common way to filter messages is to use an
-xref:expression.adoc[Expression] in the xref:dsl.adoc[DSL] like
-xref:components::xquery-language.adoc[XQuery].
+xref:ROOT:expression.adoc[Expression] in the xref:ROOT:dsl.adoc[DSL] like
+xref:components:languages:xquery-language.adoc[XQuery].
 
-== Using the xref:fluent-builders.adoc[Fluent Builders]
+== Using the xref:ROOT:fluent-builders.adoc[Fluent Builders]
 
-Here is a simple example using the xref:dsl.adoc[DSL] directly
+Here is a simple example using the xref:ROOT:dsl.adoc[DSL] directly
 
-In this example we add our own xref:processor.adoc[Processor]
+In this example we add our own xref:ROOT:processor.adoc[Processor]
 
 For further examples of this pattern in use you could look at one of the
 JUnit tests
@@ -57,8 +57,8 @@ interested in:
 == Using This Pattern
 
 If you would like to use this EIP Pattern then please read the
-xref:getting-started.adoc[Getting Started], you may also find the
-xref:architecture.adoc[Architecture] useful particularly the description
-of xref:endpoint.adoc[Endpoint] and xref:uris.adoc[URIs]. Then you could
-try out some of the xref:examples.adoc[Examples] first before trying
+xref:ROOT:getting-started.adoc[Getting Started], you may also find the
+xref:ROOT:architecture.adoc[Architecture] useful particularly the description
+of xref:ROOT:endpoint.adoc[Endpoint] and xref:ROOT:uris.adoc[URIs]. Then you could
+try out some of the xref:ROOT:examples.adoc[Examples] first before trying
 this pattern out.
diff --git a/core/camel-core-engine/src/main/docs/eips/convertBodyTo-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/convertBodyTo-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/convertBodyTo-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/convertBodyTo-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/customLoadBalancer-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/customLoadBalancer-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/customLoadBalancer-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/customLoadBalancer-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/delay-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/delay-eip.adoc
similarity index 98%
rename from core/camel-core-engine/src/main/docs/eips/delay-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/delay-eip.adoc
index 8b0f273..58af86a 100644
--- a/core/camel-core-engine/src/main/docs/eips/delay-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/delay-eip.adoc
@@ -11,8 +11,8 @@ The Delay EIP supports 3 options which are listed below:
 |===
 | Name | Description | Default | Type
 | *executorServiceRef* | Refers to a custom Thread Pool if asyncDelay has been enabled. |  | String
-| *asyncDelayed* | Enables asynchronous delay which means the thread will not block while delaying. | true | Boolean
-| *callerRunsWhenRejected* | Whether or not the caller should run the task when it was rejected by the thread pool. Is by default true | true | Boolean
+| *asyncDelayed* | Enables asynchronous delay which means the thread will not block while delaying. | true | String
+| *callerRunsWhenRejected* | Whether or not the caller should run the task when it was rejected by the thread pool. Is by default true | true | String
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/eips/dynamic-router.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/dynamic-router.adoc
similarity index 98%
rename from core/camel-core-engine/src/main/docs/eips/dynamic-router.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/dynamic-router.adoc
index f99f2e0..6bd839f 100644
--- a/core/camel-core-engine/src/main/docs/eips/dynamic-router.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/dynamic-router.adoc
@@ -187,7 +187,7 @@ In the above we can use the
 Parameter Binding Annotations
 to bind different parts of the Message to method
 parameters or use an Expression such as using
-xref:components::xpath-language.adoc[XPath] or xref:components::xpath-language.adoc[XQuery].
+xref:components:languages:xpath-language.adoc[XPath] or xref:components:languages:xpath-language.adoc[XQuery].
 
 The method can be invoked in a number of ways as described in the
 Bean Integration such as
diff --git a/core/camel-core-engine/src/main/docs/eips/dynamicRouter-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/dynamicRouter-eip.adoc
similarity index 94%
rename from core/camel-core-engine/src/main/docs/eips/dynamicRouter-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/dynamicRouter-eip.adoc
index 70010e3..e4cca6a 100644
--- a/core/camel-core-engine/src/main/docs/eips/dynamicRouter-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/dynamicRouter-eip.adoc
@@ -1,7 +1,7 @@
 [[dynamicRouter-eip]]
 = Dynamic Router EIP
 
-The http://www.enterpriseintegrationpatterns.com/DynamicRouter.html[Dynamic Router] from the xref:enterprise-integration-patterns.adoc[EIP patterns] allows you to route messages while avoiding the dependency of the router on all possible destinations while maintaining its efficiency.
+The http://www.enterpriseintegrationpatterns.com/DynamicRouter.html[Dynamic Router] from the xref:ROOT:enterprise-integration-patterns.adoc[EIP patterns] allows you to route messages while avoiding the dependency of the router on all possible destinations while maintaining its efficiency.
 
 image::eip/DynamicRouter.gif[image]
 
@@ -26,8 +26,8 @@ The Dynamic Router EIP supports 3 options which are listed below:
 |===
 | Name | Description | Default | Type
 | *uriDelimiter* | Sets the uri delimiter to use | , | String
-| *ignoreInvalidEndpoints* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint | false | Boolean
-| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this dynamic router, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped an [...]
+| *ignoreInvalidEndpoints* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint |  | String
+| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this dynamic router, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped an [...]
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/eips/enrich-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/enrich-eip.adoc
similarity index 96%
rename from core/camel-core-engine/src/main/docs/eips/enrich-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/enrich-eip.adoc
index 8f40c81..5a36c15 100644
--- a/core/camel-core-engine/src/main/docs/eips/enrich-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/enrich-eip.adoc
@@ -15,11 +15,11 @@ The Enrich EIP supports 7 options which are listed below:
 | Name | Description | Default | Type
 | *strategyRef* | Refers to an AggregationStrategy to be used to merge the reply from the external service, into a single outgoing message. By default Camel will use the reply from the external service as outgoing message. |  | String
 | *strategyMethodName* | This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy. |  | String
-| *strategyMethodAllowNull* | If this option is false then the aggregate method is not used if there was no data to enrich. If this option is true then null values is used as the oldExchange (when no data to enrich), when using POJOs as the AggregationStrategy. | false | Boolean
-| *aggregateOnException* | If this option is false then the aggregate method is not used if there was an exception thrown while trying to retrieve the data to enrich from the resource. Setting this option to true allows end users to control what to do if there was an exception in the aggregate method. For example to suppress the exception or set a custom message body etc. | false | Boolean
-| *shareUnitOfWork* | Shares the org.apache.camel.spi.UnitOfWork with the parent and the resource exchange. Enrich will by default not share unit of work between the parent exchange and the resource exchange. This means the resource exchange has its own individual unit of work. | false | Boolean
-| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producer when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped and discarded after use. This reduc [...]
-| *ignoreInvalidEndpoint* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint | false | Boolean
+| *strategyMethodAllowNull* | If this option is false then the aggregate method is not used if there was no data to enrich. If this option is true then null values is used as the oldExchange (when no data to enrich), when using POJOs as the AggregationStrategy. |  | String
+| *aggregateOnException* | If this option is false then the aggregate method is not used if there was an exception thrown while trying to retrieve the data to enrich from the resource. Setting this option to true allows end users to control what to do if there was an exception in the aggregate method. For example to suppress the exception or set a custom message body etc. |  | String
+| *shareUnitOfWork* | Shares the org.apache.camel.spi.UnitOfWork with the parent and the resource exchange. Enrich will by default not share unit of work between the parent exchange and the resource exchange. This means the resource exchange has its own individual unit of work. |  | String
+| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producer when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped and discarded after use. This reduc [...]
+| *ignoreInvalidEndpoint* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint |  | String
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/eips/eventDrivenConsumer-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/eventDrivenConsumer-eip.adoc
similarity index 59%
rename from core/camel-core-engine/src/main/docs/eips/eventDrivenConsumer-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/eventDrivenConsumer-eip.adoc
index d6da362..371ff12 100644
--- a/core/camel-core-engine/src/main/docs/eips/eventDrivenConsumer-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/eventDrivenConsumer-eip.adoc
@@ -4,7 +4,7 @@
 Camel supports the
 http://www.enterpriseintegrationpatterns.com/EventDrivenConsumer.html[Event Driven Consumer]
 from the
-xref:enterprise-integration-patterns.adoc[EIP patterns].
+xref:ROOT:enterprise-integration-patterns.adoc[EIP patterns].
 The default consumer model is event based (i.e. asynchronous)
 as this means that the Camel container can then manage pooling,
 threading and concurrency for you in a declarative manner.
@@ -13,18 +13,18 @@ image::eip/EventDrivenConsumerSolution.gif[image]
 
 The Event Driven Consumer is implemented by consumers implementing the
 http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Processor.html[Processor]
-interface which is invoked by the xref:message-endpoint.adoc[Message Endpoint]
-when a xref:message.adoc[Message] is available for processing.
+interface which is invoked by the xref:ROOT:message-endpoint.adoc[Message Endpoint]
+when a xref:ROOT:message.adoc[Message] is available for processing.
 
 [[eventDrivenConsumer-Example]]
 == Example
 
 The following demonstrates a
 http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Processor.html[Processor]
-defined in the Camel xref:registry.adoc[Registry] which is
+defined in the Camel xref:ROOT:registry.adoc[Registry] which is
 invoked when an event occurs from a xref:components::jms-component.adoc[JMS] queue.
 
-*Using the xref:fluent-builders.adoc[Fluent Builders]*
+*Using the xref:ROOT:fluent-builders.adoc[Fluent Builders]*
 
 [source,java]
 ----
@@ -32,7 +32,7 @@ from("jms:queue:foo")
     .processRef("processor");
 ----
 
-**Using the xref:spring-xml-extensions.adoc[Spring XML Extensions]**
+**Using the xref:ROOT:spring-xml-extensions.adoc[Spring XML Extensions]**
 
 [source,xml]
 ----
@@ -44,15 +44,15 @@ from("jms:queue:foo")
 
 For more details see:
 
-* xref:message.adoc[Message]
-* xref:message-endpoint.adoc[Message Endpoint]
+* xref:ROOT:message.adoc[Message]
+* xref:ROOT:message-endpoint.adoc[Message Endpoint]
 
 [[eventDrivenConsumer-UsingThisPattern]]
 == Using This Pattern
 
 If you would like to use this EIP Pattern then please read the
-xref:getting-started.adoc[Getting Started], you may also find the
-xref:architecture.adoc[Architecture] useful particularly the description
-of xref:endpoint.adoc[Endpoint] and xref:uris.adoc[URIs]. Then you could
-try out some of the xref:examples.adoc[Examples] first before trying
+xref:ROOT:getting-started.adoc[Getting Started], you may also find the
+xref:ROOT:architecture.adoc[Architecture] useful particularly the description
+of xref:ROOT:endpoint.adoc[Endpoint] and xref:ROOT:uris.adoc[URIs]. Then you could
+try out some of the xref:ROOT:examples.adoc[Examples] first before trying
 this pattern out.
diff --git a/core/camel-core-engine/src/main/docs/eips/failover-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/failover-eip.adoc
similarity index 94%
rename from core/camel-core-engine/src/main/docs/eips/failover-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/failover-eip.adoc
index e1a7711..2abcd9f 100644
--- a/core/camel-core-engine/src/main/docs/eips/failover-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/failover-eip.adoc
@@ -12,9 +12,9 @@ The Failover EIP supports 4 options which are listed below:
 |===
 | Name | Description | Default | Type
 | *exception* | A list of class names for specific exceptions to monitor. If no exceptions is configured then all exceptions is monitored |  | List
-| *roundRobin* | Whether or not the failover load balancer should operate in round robin mode or not. If not, then it will always start from the first endpoint when a new message is to be processed. In other words it restart from the top for every message. If round robin is enabled, then it keeps state and will continue with the next endpoint in a round robin fashion. You can also enable sticky mode together with round robin, if so then it will pick the last known good endpoint to use wh [...]
-| *sticky* | Whether or not the failover load balancer should operate in sticky mode or not. If not, then it will always start from the first endpoint when a new message is to be processed. In other words it restart from the top for every message. If sticky is enabled, then it keeps state and will continue with the last known good endpoint. You can also enable sticky mode together with round robin, if so then it will pick the last known good endpoint to use when starting the load balanci [...]
-| *maximumFailoverAttempts* | A value to indicate after X failover attempts we should exhaust (give up). Use -1 to indicate never give up and continuously try to failover. Use 0 to never failover. And use e.g. 3 to failover at most 3 times before giving up. his option can be used whether or not roundRobin is enabled or not. | -1 | Integer
+| *roundRobin* | Whether or not the failover load balancer should operate in round robin mode or not. If not, then it will always start from the first endpoint when a new message is to be processed. In other words it restart from the top for every message. If round robin is enabled, then it keeps state and will continue with the next endpoint in a round robin fashion. You can also enable sticky mode together with round robin, if so then it will pick the last known good endpoint to use wh [...]
+| *sticky* | Whether or not the failover load balancer should operate in sticky mode or not. If not, then it will always start from the first endpoint when a new message is to be processed. In other words it restart from the top for every message. If sticky is enabled, then it keeps state and will continue with the last known good endpoint. You can also enable sticky mode together with round robin, if so then it will pick the last known good endpoint to use when starting the load balanci [...]
+| *maximumFailoverAttempts* | A value to indicate after X failover attempts we should exhaust (give up). Use -1 to indicate never give up and continuously try to failover. Use 0 to never failover. And use e.g. 3 to failover at most 3 times before giving up. his option can be used whether or not roundRobin is enabled or not. | -1 | String
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/eips/filter-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/filter-eip.adoc
similarity index 84%
rename from core/camel-core-engine/src/main/docs/eips/filter-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/filter-eip.adoc
index f7f9982..053abbc 100644
--- a/core/camel-core-engine/src/main/docs/eips/filter-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/filter-eip.adoc
@@ -2,14 +2,14 @@
 = Filter EIP
 
 The http://www.enterpriseintegrationpatterns.com/Filter.html[Message
-Filter] from the xref:enterprise-integration-patterns.adoc[EIP patterns]
+Filter] from the xref:ROOT:enterprise-integration-patterns.adoc[EIP patterns]
 allows you to filter messages
 
 image::eip/MessageFilter.gif[image]
 
 The following example shows how to create a Message Filter route
 consuming messages from an endpoint called *queue:a*, which if the
-xref:predicate.adoc[Predicate] is true will be dispatched to *queue:b*
+xref:ROOT:predicate.adoc[Predicate] is true will be dispatched to *queue:b*
 
 == EIP options
 
@@ -86,15 +86,15 @@ the when predicate by using the `.stop()`.
 == Knowing if Exchange was filtered or not
 
 The xref:filter-eip.adoc[Message Filter] EIP will add a property on
-the xref:exchange.adoc[Exchange] that states if it was filtered or not.
+the xref:ROOT:exchange.adoc[Exchange] that states if it was filtered or not.
 
 The property has the key `Exchange.FILTER_MATCHED`, which has the String
 value of `CamelFilterMatched`. Its value is a boolean indicating `true`
-or `false`. If the value is `true` then the xref:exchange.adoc[Exchange]
+or `false`. If the value is `true` then the xref:ROOT:exchange.adoc[Exchange]
 was routed in the filter block. This property will be visible within the
 xref:filter-eip.adoc[Message Filter] block who's
-xref:predicate.adoc[Predicate] matches (value set to `true`), and to the
+xref:ROOT:predicate.adoc[Predicate] matches (value set to `true`), and to the
 steps immediately following the xref:filter-eip.adoc[Message Filter]
 with the value set based on the results of the last
-xref:filter-eip.adoc[Message Filter] xref:predicate.adoc[Predicate]
+xref:filter-eip.adoc[Message Filter] xref:ROOT:predicate.adoc[Predicate]
 evaluated.
diff --git a/core/camel-core-engine/src/main/docs/eips/from-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/from-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/from-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/from-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/hystrix-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/hystrix-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/hystrix-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/hystrix-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/hystrixConfiguration-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/hystrixConfiguration-eip.adoc
similarity index 67%
rename from core/camel-core-engine/src/main/docs/eips/hystrixConfiguration-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/hystrixConfiguration-eip.adoc
index 877b26b..9c6bef2 100644
--- a/core/camel-core-engine/src/main/docs/eips/hystrixConfiguration-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/hystrixConfiguration-eip.adoc
@@ -10,34 +10,34 @@ The Hystrix Configuration EIP supports 31 options which are listed below:
 | Name | Description | Default | Type
 | *groupKey* | Sets the group key to use. The default value is CamelHystrix. | CamelHystrix | String
 | *threadPoolKey* | Sets the thread pool key to use. Will by default use the same value as groupKey has been configured to use. | CamelHystrix | String
-| *circuitBreakerEnabled* | Whether to use a HystrixCircuitBreaker or not. If false no circuit-breaker logic will be used and all requests permitted. This is similar in effect to circuitBreakerForceClosed() except that continues tracking metrics and knowing whether it should be open/closed, this property results in not even instantiating a circuit-breaker. | true | Boolean
-| *circuitBreakerError ThresholdPercentage* | Error percentage threshold (as whole number such as 50) at which point the circuit breaker will trip open and reject requests. It will stay tripped for the duration defined in circuitBreakerSleepWindowInMilliseconds; The error percentage this is compared against comes from HystrixCommandMetrics.getHealthCounts(). | 50 | Integer
-| *circuitBreakerForceClosed* | If true the HystrixCircuitBreaker#allowRequest() will always return true to allow requests regardless of the error percentage from HystrixCommandMetrics.getHealthCounts(). The circuitBreakerForceOpen() property takes precedence so if it set to true this property does nothing. | false | Boolean
-| *circuitBreakerForceOpen* | If true the HystrixCircuitBreaker.allowRequest() will always return false, causing the circuit to be open (tripped) and reject all requests. This property takes precedence over circuitBreakerForceClosed(); | false | Boolean
-| *circuitBreakerRequestVolume Threshold* | Minimum number of requests in the metricsRollingStatisticalWindowInMilliseconds() that must exist before the HystrixCircuitBreaker will trip. If below this number the circuit will not trip regardless of error percentage. | 20 | Integer
-| *circuitBreakerSleepWindow InMilliseconds* | The time in milliseconds after a HystrixCircuitBreaker trips open that it should wait before trying requests again. | 5000 | Integer
-| *executionIsolationSemaphore MaxConcurrentRequests* | Number of concurrent requests permitted to HystrixCommand.run(). Requests beyond the concurrent limit will be rejected. Applicable only when executionIsolationStrategy == SEMAPHORE. | 20 | Integer
+| *circuitBreakerEnabled* | Whether to use a HystrixCircuitBreaker or not. If false no circuit-breaker logic will be used and all requests permitted. This is similar in effect to circuitBreakerForceClosed() except that continues tracking metrics and knowing whether it should be open/closed, this property results in not even instantiating a circuit-breaker. | true | String
+| *circuitBreakerErrorThreshold Percentage* | Error percentage threshold (as whole number such as 50) at which point the circuit breaker will trip open and reject requests. It will stay tripped for the duration defined in circuitBreakerSleepWindowInMilliseconds; The error percentage this is compared against comes from HystrixCommandMetrics.getHealthCounts(). | 50 | String
+| *circuitBreakerForceClosed* | If true the HystrixCircuitBreaker#allowRequest() will always return true to allow requests regardless of the error percentage from HystrixCommandMetrics.getHealthCounts(). The circuitBreakerForceOpen() property takes precedence so if it set to true this property does nothing. | false | String
+| *circuitBreakerForceOpen* | If true the HystrixCircuitBreaker.allowRequest() will always return false, causing the circuit to be open (tripped) and reject all requests. This property takes precedence over circuitBreakerForceClosed(); | false | String
+| *circuitBreakerRequestVolume Threshold* | Minimum number of requests in the metricsRollingStatisticalWindowInMilliseconds() that must exist before the HystrixCircuitBreaker will trip. If below this number the circuit will not trip regardless of error percentage. | 20 | String
+| *circuitBreakerSleepWindowIn Milliseconds* | The time in milliseconds after a HystrixCircuitBreaker trips open that it should wait before trying requests again. | 5000 | String
+| *executionIsolationSemaphoreMax ConcurrentRequests* | Number of concurrent requests permitted to HystrixCommand.run(). Requests beyond the concurrent limit will be rejected. Applicable only when executionIsolationStrategy == SEMAPHORE. | 20 | String
 | *executionIsolationStrategy* | What isolation strategy HystrixCommand.run() will be executed with. If THREAD then it will be executed on a separate thread and concurrent requests limited by the number of threads in the thread-pool. If SEMAPHORE then it will be executed on the calling thread and concurrent requests limited by the semaphore count. | THREAD | String
-| *executionIsolationThread InterruptOnTimeout* | Whether the execution thread should attempt an interrupt (using Future#cancel) when a thread times out. Applicable only when executionIsolationStrategy() == THREAD. | true | Boolean
-| *executionTimeoutIn Milliseconds* | Time in milliseconds at which point the command will timeout and halt execution. If executionIsolationThreadInterruptOnTimeout == true and the command is thread-isolated, the executing thread will be interrupted. If the command is semaphore-isolated and a HystrixObservableCommand, that command will get unsubscribed. | 1000 | Integer
-| *executionTimeoutEnabled* | Whether the timeout mechanism is enabled for this command | true | Boolean
-| *fallbackIsolationSemaphore MaxConcurrentRequests* | Number of concurrent requests permitted to HystrixCommand.getFallback(). Requests beyond the concurrent limit will fail-fast and not attempt retrieving a fallback. | 10 | Integer
-| *fallbackEnabled* | Whether HystrixCommand.getFallback() should be attempted when failure occurs. | true | Boolean
-| *metricsHealthSnapshot IntervalInMilliseconds* | Time in milliseconds to wait between allowing health snapshots to be taken that calculate success and error percentages and affect HystrixCircuitBreaker.isOpen() status. On high-volume circuits the continual calculation of error percentage can become CPU intensive thus this controls how often it is calculated. | 500 | Integer
-| *metricsRollingPercentile BucketSize* | Maximum number of values stored in each bucket of the rolling percentile. This is passed into HystrixRollingPercentile inside HystrixCommandMetrics. | 10 | Integer
-| *metricsRollingPercentile Enabled* | Whether percentile metrics should be captured using HystrixRollingPercentile inside HystrixCommandMetrics. | true | Boolean
-| *metricsRollingPercentile WindowInMilliseconds* | Duration of percentile rolling window in milliseconds. This is passed into HystrixRollingPercentile inside HystrixCommandMetrics. | 10000 | Integer
-| *metricsRollingPercentile WindowBuckets* | Number of buckets the rolling percentile window is broken into. This is passed into HystrixRollingPercentile inside HystrixCommandMetrics. | 6 | Integer
-| *metricsRollingStatistical WindowInMilliseconds* | This property sets the duration of the statistical rolling window, in milliseconds. This is how long metrics are kept for the thread pool. The window is divided into buckets and rolls by those increments. | 10000 | Integer
-| *metricsRollingStatistical WindowBuckets* | Number of buckets the rolling statistical window is broken into. This is passed into HystrixRollingNumber inside HystrixCommandMetrics. | 10 | Integer
-| *requestLogEnabled* | Whether HystrixCommand execution and events should be logged to HystrixRequestLog. | true | Boolean
-| *corePoolSize* | Core thread-pool size that gets passed to java.util.concurrent.ThreadPoolExecutor#setCorePoolSize(int) | 10 | Integer
-| *maximumSize* | Maximum thread-pool size that gets passed to ThreadPoolExecutor#setMaximumPoolSize(int). This is the maximum amount of concurrency that can be supported without starting to reject HystrixCommands. Please note that this setting only takes effect if you also set allowMaximumSizeToDivergeFromCoreSize | 10 | Integer
-| *keepAliveTime* | Keep-alive time in minutes that gets passed to {link ThreadPoolExecutor#setKeepAliveTime(long, TimeUnit)} | 1 | Integer
-| *maxQueueSize* | Max queue size that gets passed to BlockingQueue in HystrixConcurrencyStrategy.getBlockingQueue(int) This should only affect the instantiation of a threadpool - it is not eliglible to change a queue size on the fly. For that, use queueSizeRejectionThreshold(). | -1 | Integer
-| *queueSizeRejectionThreshold* | Queue size rejection threshold is an artificial max size at which rejections will occur even if maxQueueSize has not been reached. This is done because the maxQueueSize of a BlockingQueue can not be dynamically changed and we want to support dynamically changing the queue size that affects rejections. This is used by HystrixCommand when queuing a thread for execution. | 5 | Integer
-| *threadPoolRollingNumber StatisticalWindowIn Milliseconds* | Duration of statistical rolling window in milliseconds. This is passed into HystrixRollingNumber inside each HystrixThreadPoolMetrics instance. | 10000 | Integer
-| *threadPoolRollingNumber StatisticalWindowBuckets* | Number of buckets the rolling statistical window is broken into. This is passed into HystrixRollingNumber inside each HystrixThreadPoolMetrics instance. | 10 | Integer
-| *allowMaximumSizeToDiverge FromCoreSize* | Allows the configuration for maximumSize to take effect. That value can then be equal to, or higher, than coreSize | false | Boolean
+| *executionIsolationThread InterruptOnTimeout* | Whether the execution thread should attempt an interrupt (using Future#cancel ) when a thread times out. Applicable only when executionIsolationStrategy() == THREAD. | true | String
+| *executionTimeoutInMilliseconds* | Time in milliseconds at which point the command will timeout and halt execution. If executionIsolationThreadInterruptOnTimeout == true and the command is thread-isolated, the executing thread will be interrupted. If the command is semaphore-isolated and a HystrixObservableCommand, that command will get unsubscribed. | 1000 | String
+| *executionTimeoutEnabled* | Whether the timeout mechanism is enabled for this command | true | String
+| *fallbackIsolationSemaphoreMax ConcurrentRequests* | Number of concurrent requests permitted to HystrixCommand.getFallback(). Requests beyond the concurrent limit will fail-fast and not attempt retrieving a fallback. | 10 | String
+| *fallbackEnabled* | Whether HystrixCommand.getFallback() should be attempted when failure occurs. | true | String
+| *metricsHealthSnapshotInterval InMilliseconds* | Time in milliseconds to wait between allowing health snapshots to be taken that calculate success and error percentages and affect HystrixCircuitBreaker.isOpen() status. On high-volume circuits the continual calculation of error percentage can become CPU intensive thus this controls how often it is calculated. | 500 | String
+| *metricsRollingPercentileBucket Size* | Maximum number of values stored in each bucket of the rolling percentile. This is passed into HystrixRollingPercentile inside HystrixCommandMetrics. | 10 | String
+| *metricsRollingPercentile Enabled* | Whether percentile metrics should be captured using HystrixRollingPercentile inside HystrixCommandMetrics. | true | String
+| *metricsRollingPercentileWindow InMilliseconds* | Duration of percentile rolling window in milliseconds. This is passed into HystrixRollingPercentile inside HystrixCommandMetrics. | 10000 | String
+| *metricsRollingPercentileWindow Buckets* | Number of buckets the rolling percentile window is broken into. This is passed into HystrixRollingPercentile inside HystrixCommandMetrics. | 6 | String
+| *metricsRollingStatistical WindowInMilliseconds* | This property sets the duration of the statistical rolling window, in milliseconds. This is how long metrics are kept for the thread pool. The window is divided into buckets and rolls by those increments. | 10000 | String
+| *metricsRollingStatistical WindowBuckets* | Number of buckets the rolling statistical window is broken into. This is passed into HystrixRollingNumber inside HystrixCommandMetrics. | 10 | String
+| *requestLogEnabled* | Whether HystrixCommand execution and events should be logged to HystrixRequestLog. | true | String
+| *corePoolSize* | Core thread-pool size that gets passed to java.util.concurrent.ThreadPoolExecutor#setCorePoolSize(int) | 10 | String
+| *maximumSize* | Maximum thread-pool size that gets passed to ThreadPoolExecutor#setMaximumPoolSize(int) . This is the maximum amount of concurrency that can be supported without starting to reject HystrixCommands. Please note that this setting only takes effect if you also set allowMaximumSizeToDivergeFromCoreSize | 10 | String
+| *keepAliveTime* | Keep-alive time in minutes that gets passed to ThreadPoolExecutor#setKeepAliveTime(long,TimeUnit) | 1 | String
+| *maxQueueSize* | Max queue size that gets passed to BlockingQueue in HystrixConcurrencyStrategy.getBlockingQueue(int) This should only affect the instantiation of a threadpool - it is not eliglible to change a queue size on the fly. For that, use queueSizeRejectionThreshold(). | -1 | String
+| *queueSizeRejectionThreshold* | Queue size rejection threshold is an artificial max size at which rejections will occur even if maxQueueSize has not been reached. This is done because the maxQueueSize of a BlockingQueue can not be dynamically changed and we want to support dynamically changing the queue size that affects rejections. This is used by HystrixCommand when queuing a thread for execution. | 5 | String
+| *threadPoolRollingNumber StatisticalWindowIn Milliseconds* | Duration of statistical rolling window in milliseconds. This is passed into HystrixRollingNumber inside each HystrixThreadPoolMetrics instance. | 10000 | String
+| *threadPoolRollingNumber StatisticalWindowBuckets* | Number of buckets the rolling statistical window is broken into. This is passed into HystrixRollingNumber inside each HystrixThreadPoolMetrics instance. | 10 | String
+| *allowMaximumSizeToDivergeFrom CoreSize* | Allows the configuration for maximumSize to take effect. That value can then be equal to, or higher, than coreSize | false | String
 |===
 // eip options: END
diff --git a/core/camel-core-engine/src/main/docs/eips/idempotentConsumer-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/idempotentConsumer-eip.adoc
similarity index 92%
rename from core/camel-core-engine/src/main/docs/eips/idempotentConsumer-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/idempotentConsumer-eip.adoc
index 8878a5d..2492dd1 100644
--- a/core/camel-core-engine/src/main/docs/eips/idempotentConsumer-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/idempotentConsumer-eip.adoc
@@ -3,7 +3,7 @@
 
 The
 http://www.enterpriseintegrationpatterns.com/IdempotentReceiver.html[Idempotent
-Consumer] from the xref:enterprise-integration-patterns.adoc[EIP
+Consumer] from the xref:ROOT:enterprise-integration-patterns.adoc[EIP
 patterns] is used to filter out duplicate messages.
 
 The Idempotent Consumer essentially acts like a
@@ -23,7 +23,7 @@ Camel provides the following Idempotent Consumer implementations:
 * xref:components::jpa-component.adoc[JpaMessageIdRepository]
 * xref:components::infinispan-component.adoc[InfinispanIdempotentRepository]
 * xref:components::jcache-component.adoc[JCacheIdempotentRepository]
-* xref:spring.adoc[SpringCacheIdempotentRepository]
+* xref:ROOT:spring.adoc[SpringCacheIdempotentRepository]
 * xref:components::ehcache-component.adoc[EhcacheIdempotentRepository]
 * xref:components::kafka-component.adoc[KafkaIdempotentRepository]
 
@@ -36,9 +36,9 @@ The Idempotent Consumer EIP supports 5 options which are listed below:
 |===
 | Name | Description | Default | Type
 | *messageIdRepositoryRef* | *Required* Sets the reference name of the message id repository |  | String
-| *eager* | Sets whether to eagerly add the key to the idempotent repository or wait until the exchange is complete. Eager is default enabled. | true | Boolean
-| *completionEager* | Sets whether to complete the idempotent consumer eager or when the exchange is done. If this option is true to complete eager, then the idempotent consumer will trigger its completion when the exchange reached the end of the block of the idempotent consumer pattern. So if the exchange is continued routed after the block ends, then whatever happens there does not affect the state. If this option is false (default) to not complete eager, then the idempotent consumer w [...]
-| *skipDuplicate* | Sets whether to skip duplicates or not. The default behavior is to skip duplicates. A duplicate message would have the Exchange property org.apache.camel.Exchange#DUPLICATE_MESSAGE set to a Boolean#TRUE value. A none duplicate message will not have this property set. | true | Boolean
-| *removeOnFailure* | Sets whether to remove or keep the key on failure. The default behavior is to remove the key on failure. | true | Boolean
+| *eager* | Sets whether to eagerly add the key to the idempotent repository or wait until the exchange is complete. Eager is default enabled. | true | String
+| *completionEager* | Sets whether to complete the idempotent consumer eager or when the exchange is done. If this option is true to complete eager, then the idempotent consumer will trigger its completion when the exchange reached the end of the block of the idempotent consumer pattern. So if the exchange is continued routed after the block ends, then whatever happens there does not affect the state. If this option is false (default) to not complete eager, then the idempotent consumer w [...]
+| *skipDuplicate* | Sets whether to skip duplicates or not. The default behavior is to skip duplicates. A duplicate message would have the Exchange property org.apache.camel.Exchange#DUPLICATE_MESSAGE set to a Boolean#TRUE value. A none duplicate message will not have this property set. | true | String
+| *removeOnFailure* | Sets whether to remove or keep the key on failure. The default behavior is to remove the key on failure. | true | String
 |===
 // eip options: END
diff --git a/core/camel-core-engine/src/main/docs/eips/inOnly-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/inOnly-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/inOnly-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/inOnly-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/inOut-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/inOut-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/inOut-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/inOut-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/loadBalance-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/loadBalance-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/loadBalance-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/loadBalance-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/log-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/log-eip.adoc
similarity index 93%
rename from core/camel-core-engine/src/main/docs/eips/log-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/log-eip.adoc
index 91b27d7..3383ab2 100644
--- a/core/camel-core-engine/src/main/docs/eips/log-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/log-eip.adoc
@@ -1,12 +1,12 @@
 [[log-eip]]
 = Log EIP
 
-How can I log the processing of a xref:message.adoc[Message]?
+How can I log the processing of a xref:ROOT:message.adoc[Message]?
 
 Camel provides many ways to log the fact that you are processing a message. Here are just a few examples:
 * You can use the xref:components::log-component.adoc[Log] component which logs the Message content.
-* You can use the xref:tracer.adoc[Tracer] which trace logs message flow.
-* You can also use a xref:processor.adoc[Processor] or xref:bean-binding.adoc[Bean] and log from Java code.
+* You can use the xref:ROOT:tracer.adoc[Tracer] which trace logs message flow.
+* You can also use a xref:ROOT:processor.adoc[Processor] or xref:ROOT:bean-binding.adoc[Bean] and log from Java code.
 * You can use the log DSL.
 
 == Options
@@ -18,7 +18,7 @@ The Log EIP supports 5 options which are listed below:
 |===
 | Name | Description | Default | Type
 | *message* | *Required* Sets the log message (uses simple language) |  | String
-| *loggingLevel* | Sets the logging level. The default value is INFO | INFO | LoggingLevel
+| *loggingLevel* | Sets the logging level. The default value is INFO | INFO | String
 | *logName* | Sets the name of the logger |  | String
 | *marker* | To use slf4j marker |  | String
 | *loggerRef* | To refer to a custom logger instance to lookup from the registry. |  | String
@@ -31,7 +31,7 @@ The log DSL is much lighter and meant for logging human logs such as Starting to
 
 == Samples
 
-You can use the log DSL which allows you to use xref:simple-language.adoc[Simple] language to construct a dynamic message which gets logged.
+You can use the log DSL which allows you to use xref:components:languages:simple-language.adoc[Simple] language to construct a dynamic message which gets logged.
 
 For example you can do
 
diff --git a/core/camel-core-engine/src/main/docs/eips/loop-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/loop-eip.adoc
similarity index 98%
rename from core/camel-core-engine/src/main/docs/eips/loop-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/loop-eip.adoc
index 088b8ff..dae1731 100644
--- a/core/camel-core-engine/src/main/docs/eips/loop-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/loop-eip.adoc
@@ -17,8 +17,8 @@ The Loop EIP supports 2 options which are listed below:
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *copy* | If the copy attribute is true, a copy of the input Exchange is used for each iteration. That means each iteration will start from a copy of the same message. By default loop will loop the same exchange all over, so each iteration may have different message content. | false | Boolean
-| *doWhile* | Enables the while loop that loops until the predicate evaluates to false or null. | false | Boolean
+| *copy* | If the copy attribute is true, a copy of the input Exchange is used for each iteration. That means each iteration will start from a copy of the same message. By default loop will loop the same exchange all over, so each iteration may have different message content. |  | String
+| *doWhile* | Enables the while loop that loops until the predicate evaluates to false or null. |  | String
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/eips/marshal-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/marshal-eip.adoc
similarity index 80%
rename from core/camel-core-engine/src/main/docs/eips/marshal-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/marshal-eip.adoc
index ddc53aa..8078e09 100644
--- a/core/camel-core-engine/src/main/docs/eips/marshal-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/marshal-eip.adoc
@@ -1,7 +1,7 @@
 [[marshal-eip]]
 = Marshal EIP
 
-Marshalling is the opposite of unmarshalling, where a bean is marshalled into some binary or textual format for transmission over some transport via a Camel xref:components::index.adoc[Components]. Marshalling is used in the same way as unmarshalling above; in the xref:dsl.adoc[DSL] you can use a DataFormat instance, you can configure the DataFormat dynamically using the DSL or you can refer to a named instance of the format in the xref:registry.adoc[Registry].
+Marshalling is the opposite of unmarshalling, where a bean is marshalled into some binary or textual format for transmission over some transport via a Camel xref:components::index.adoc[Components]. Marshalling is used in the same way as unmarshalling above; in the xref:ROOT:dsl.adoc[DSL] you can use a DataFormat instance, you can configure the DataFormat dynamically using the DSL or you can refer to a named instance of the format in the xref:ROOT:registry.adoc[Registry].
 
 == Options
 
@@ -17,7 +17,7 @@ The Marshal EIP supports 1 options which are listed below:
 
 == Samples
 
-The following example unmarshals via serialization then marshals using a named JAXB data format to perform a kind of xref:message-translator.adoc[Message Translator].
+The following example unmarshals via serialization then marshals using a named JAXB data format to perform a kind of xref:ROOT:message-translator.adoc[Message Translator].
 
 [source,java]
 ----
diff --git a/core/camel-core-engine/src/main/docs/eips/multicast-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc
similarity index 94%
rename from core/camel-core-engine/src/main/docs/eips/multicast-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc
index 55d2d57..6f66b48 100644
--- a/core/camel-core-engine/src/main/docs/eips/multicast-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc
@@ -14,18 +14,18 @@ The Multicast EIP supports 12 options which are listed below:
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *parallelProcessing* | If enabled then sending messages to the multicasts occurs concurrently. Note the caller thread will still wait until all messages has been fully processed, before it continues. Its only the sending and processing the replies from the multicasts which happens concurrently. | false | Boolean
+| *parallelProcessing* | If enabled then sending messages to the multicasts occurs concurrently. Note the caller thread will still wait until all messages has been fully processed, before it continues. Its only the sending and processing the replies from the multicasts which happens concurrently. |  | String
 | *strategyRef* | Refers to an AggregationStrategy to be used to assemble the replies from the multicasts, into a single outgoing message from the Multicast. By default Camel will use the last reply as the outgoing message. You can also use a POJO as the AggregationStrategy |  | String
 | *strategyMethodName* | This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy. |  | String
-| *strategyMethodAllowNull* | If this option is false then the aggregate method is not used if there was no data to enrich. If this option is true then null values is used as the oldExchange (when no data to enrich), when using POJOs as the AggregationStrategy | false | Boolean
+| *strategyMethodAllowNull* | If this option is false then the aggregate method is not used if there was no data to enrich. If this option is true then null values is used as the oldExchange (when no data to enrich), when using POJOs as the AggregationStrategy |  | String
 | *executorServiceRef* | Refers to a custom Thread Pool to be used for parallel processing. Notice if you set this option, then parallel processing is automatic implied, and you do not have to enable that option as well. |  | String
-| *streaming* | If enabled then Camel will process replies out-of-order, eg in the order they come back. If disabled, Camel will process replies in the same order as defined by the multicast. | false | Boolean
-| *stopOnException* | Will now stop further processing if an exception or failure occurred during processing of an org.apache.camel.Exchange and the caused exception will be thrown. Will also stop if processing the exchange failed (has a fault message) or an exception was thrown and handled by the error handler (such as using onException). In all situations the multicast will stop further processing. This is the same behavior as in pipeline, which is used by the routing engine. The defau [...]
-| *timeout* | Sets a total timeout specified in millis, when using parallel processing. If the Multicast hasn't been able to send and process all replies within the given timeframe, then the timeout triggers and the Multicast breaks out and continues. Notice if you provide a TimeoutAwareAggregationStrategy then the timeout method is invoked before breaking out. If the timeout is reached with running tasks still remaining, certain tasks for which it is difficult for Camel to shut down in  [...]
+| *streaming* | If enabled then Camel will process replies out-of-order, eg in the order they come back. If disabled, Camel will process replies in the same order as defined by the multicast. |  | String
+| *stopOnException* | Will now stop further processing if an exception or failure occurred during processing of an org.apache.camel.Exchange and the caused exception will be thrown. Will also stop if processing the exchange failed (has a fault message) or an exception was thrown and handled by the error handler (such as using onException). In all situations the multicast will stop further processing. This is the same behavior as in pipeline, which is used by the routing engine. The defau [...]
+| *timeout* | Sets a total timeout specified in millis, when using parallel processing. If the Multicast hasn't been able to send and process all replies within the given timeframe, then the timeout triggers and the Multicast breaks out and continues. Notice if you provide a TimeoutAwareAggregationStrategy then the timeout method is invoked before breaking out. If the timeout is reached with running tasks still remaining, certain tasks for which it is difficult for Camel to shut down in  [...]
 | *onPrepareRef* | Uses the Processor when preparing the org.apache.camel.Exchange to be send. This can be used to deep-clone messages that should be send, or any custom logic needed before the exchange is send. |  | String
-| *shareUnitOfWork* | Shares the org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. Multicast will by default not share unit of work between the parent exchange and each multicasted exchange. This means each sub exchange has its own individual unit of work. | false | Boolean
-| *parallelAggregate* | If enabled then the aggregate method on AggregationStrategy can be called concurrently. Notice that this would require the implementation of AggregationStrategy to be implemented as thread-safe. By default this is false meaning that Camel synchronizes the call to the aggregate method. Though in some use-cases this can be used to archive higher performance when the AggregationStrategy is implemented as thread-safe. | false | Boolean
-| *stopOnAggregateException* | If enabled, unwind exceptions occurring at aggregation time to the error handler when parallelProcessing is used. Currently, aggregation time exceptions do not stop the route processing when parallelProcessing is used. Enabling this option allows to work around this behavior. The default value is false for the sake of backward compatibility. | false | Boolean
+| *shareUnitOfWork* | Shares the org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. Multicast will by default not share unit of work between the parent exchange and each multicasted exchange. This means each sub exchange has its own individual unit of work. |  | String
+| *parallelAggregate* | If enabled then the aggregate method on AggregationStrategy can be called concurrently. Notice that this would require the implementation of AggregationStrategy to be implemented as thread-safe. By default this is false meaning that Camel synchronizes the call to the aggregate method. Though in some use-cases this can be used to archive higher performance when the AggregationStrategy is implemented as thread-safe. |  | String
+| *stopOnAggregateException* | If enabled, unwind exceptions occurring at aggregation time to the error handler when parallelProcessing is used. Currently, aggregation time exceptions do not stop the route processing when parallelProcessing is used. Enabling this option allows to work around this behavior. The default value is false for the sake of backward compatibility. |  | String
 |===
 // eip options: END
 
@@ -140,5 +140,5 @@ allows you to do this using the processor
 interface.
 
 Notice the `onPrepare` can be used for any kind of custom logic which
-you would like to execute before the xref:exchange.adoc[Exchange] is
+you would like to execute before the xref:ROOT:exchange.adoc[Exchange] is
 being multicasted.
diff --git a/core/camel-core-engine/src/main/docs/eips/onFallback-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/onFallback-eip.adoc
similarity index 99%
rename from core/camel-core-engine/src/main/docs/eips/onFallback-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/onFallback-eip.adoc
index bc083e4..04dc958 100644
--- a/core/camel-core-engine/src/main/docs/eips/onFallback-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/onFallback-eip.adoc
@@ -13,7 +13,7 @@ The On Fallback EIP supports 1 options which are listed below:
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *fallbackViaNetwork* | Whether the fallback goes over the network. If the fallback will go over the network it is another possible point of failure and so it also needs to be wrapped by a HystrixCommand. It is important to execute the fallback command on a separate thread-pool, otherwise if the main command were to become latent and fill the thread-pool this would prevent the fallback from running if the two commands share the same pool. | false | Boolean
+| *fallbackViaNetwork* | Whether the fallback goes over the network. If the fallback will go over the network it is another possible point of failure and so it also needs to be wrapped by a HystrixCommand. It is important to execute the fallback command on a separate thread-pool, otherwise if the main command were to become latent and fill the thread-pool this would prevent the fallback from running if the two commands share the same pool. | false | String
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/eips/otherwise-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/otherwise-eip.adoc
similarity index 90%
rename from core/camel-core-engine/src/main/docs/eips/otherwise-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/otherwise-eip.adoc
index 45d4547..5314c76 100644
--- a/core/camel-core-engine/src/main/docs/eips/otherwise-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/otherwise-eip.adoc
@@ -2,7 +2,7 @@
 = Otherwise EIP
 
 The Otherwise EIP is related to http://www.enterpriseintegrationpatterns.com/ContentBasedRouter.html[Content
-Based Router] from the xref:enterprise-integration-patterns.adoc[EIP
+Based Router] from the xref:ROOT:enterprise-integration-patterns.adoc[EIP
 patterns]
 
 image::eip/ContentBasedRouter.gif[image]
@@ -17,7 +17,7 @@ The Otherwise EIP has no options.
 
 The following example shows how to route a request from an input
 *direct:a* endpoint to either *direct:b*, *direct:c* or *direct:d* depending on
-the evaluation of various xref:predicate.adoc[Predicate] expressions
+the evaluation of various xref:ROOT:predicate.adoc[Predicate] expressions
 
 [source,java]
 ----
diff --git a/core/camel-core-engine/src/main/docs/eips/pipeline-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/pipeline-eip.adoc
similarity index 87%
rename from core/camel-core-engine/src/main/docs/eips/pipeline-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/pipeline-eip.adoc
index 8396970..e949952 100644
--- a/core/camel-core-engine/src/main/docs/eips/pipeline-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/pipeline-eip.adoc
@@ -1,12 +1,12 @@
 [[pipeline-eip]]
 = Pipeline EIP
 
-Camel supports the http://www.enterpriseintegrationpatterns.com/PipesAndFilters.html[Pipes and Filters] from the xref:enterprise-integration-patterns.adoc[EIP patterns] in various ways.
+Camel supports the http://www.enterpriseintegrationpatterns.com/PipesAndFilters.html[Pipes and Filters] from the xref:ROOT:enterprise-integration-patterns.adoc[EIP patterns] in various ways.
 
 image::eip/PipesAndFilters.gif[image]
 
 With Camel you can split your processing across multiple independent
-xref:endpoint.adoc[Endpoint] instances which can then be chained
+xref:ROOT:endpoint.adoc[Endpoint] instances which can then be chained
 together.
 
 == Options
@@ -19,7 +19,7 @@ The Pipeline EIP has no options.
 == Examples
 
 You can create pipelines of logic using multiple
-xref:endpoint.adoc[Endpoint] or xref:message-translator.adoc[Message
+xref:ROOT:endpoint.adoc[Endpoint] or xref:ROOT:message-translator.adoc[Message
 Translator] instances as follows
 
 Though pipeline is the default mode of operation when you specify
diff --git a/core/camel-core-engine/src/main/docs/eips/pollEnrich-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/pollEnrich-eip.adoc
similarity index 95%
rename from core/camel-core-engine/src/main/docs/eips/pollEnrich-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/pollEnrich-eip.adoc
index 87d74c0..ebd5c87 100644
--- a/core/camel-core-engine/src/main/docs/eips/pollEnrich-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/pollEnrich-eip.adoc
@@ -39,13 +39,13 @@ The Poll Enrich EIP supports 7 options which are listed below:
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *timeout* | Timeout in millis when polling from the external service. The timeout has influence about the poll enrich behavior. It basically operations in three different modes: negative value - Waits until a message is available and then returns it. Warning that this method could block indefinitely if no messages are available. 0 - Attempts to receive a message exchange immediately without waiting and returning null if a message exchange is not available yet. positive value - Attempts [...]
+| *timeout* | Timeout in millis when polling from the external service. The timeout has influence about the poll enrich behavior. It basically operations in three different modes: negative value - Waits until a message is available and then returns it. Warning that this method could block indefinitely if no messages are available. 0 - Attempts to receive a message exchange immediately without waiting and returning null if a message exchange is not available yet. positive value - Attempts [...]
 | *strategyRef* | Refers to an AggregationStrategy to be used to merge the reply from the external service, into a single outgoing message. By default Camel will use the reply from the external service as outgoing message. |  | String
 | *strategyMethodName* | This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy. |  | String
-| *strategyMethodAllowNull* | If this option is false then the aggregate method is not used if there was no data to enrich. If this option is true then null values is used as the oldExchange (when no data to enrich), when using POJOs as the AggregationStrategy. | false | Boolean
-| *aggregateOnException* | If this option is false then the aggregate method is not used if there was an exception thrown while trying to retrieve the data to enrich from the resource. Setting this option to true allows end users to control what to do if there was an exception in the aggregate method. For example to suppress the exception or set a custom message body etc. | false | Boolean
-| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ConsumerCache which is used to cache and reuse consumers when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped and discarded after use. This redu [...]
-| *ignoreInvalidEndpoint* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint | false | Boolean
+| *strategyMethodAllowNull* | If this option is false then the aggregate method is not used if there was no data to enrich. If this option is true then null values is used as the oldExchange (when no data to enrich), when using POJOs as the AggregationStrategy. |  | String
+| *aggregateOnException* | If this option is false then the aggregate method is not used if there was an exception thrown while trying to retrieve the data to enrich from the resource. Setting this option to true allows end users to control what to do if there was an exception in the aggregate method. For example to suppress the exception or set a custom message body etc. |  | String
+| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ConsumerCache which is used to cache and reuse consumers when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped and discarded after use. This redu [...]
+| *ignoreInvalidEndpoint* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint |  | String
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/eips/process-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/process-eip.adoc
similarity index 88%
rename from core/camel-core-engine/src/main/docs/eips/process-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/process-eip.adoc
index c7c1c09..ca42f8b 100644
--- a/core/camel-core-engine/src/main/docs/eips/process-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/process-eip.adoc
@@ -1,7 +1,7 @@
 [[process-eip]]
 = Process EIP
 
-The http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Processor.html[Processor] interface is used to implement consumers of message exchanges or to implement a xref:message-translator.adoc[Message Translator]
+The http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Processor.html[Processor] interface is used to implement consumers of message exchanges or to implement a xref:ROOT:message-translator.adoc[Message Translator]
 
 == Options
 
@@ -32,7 +32,7 @@ public class MyProcessor implements Processor {
 
 You can then easily use this inside a route by declaring the bean in
 Spring, say via the XML (or registering it in JNDI if that is your
-xref:registry.adoc[Registry])
+xref:ROOT:registry.adoc[Registry])
 
 [source,xml]
 --------------------------------------------------------
@@ -58,7 +58,7 @@ Processor myProcessor = new MyProcessor();
 from("activemq:myQueue").process(myProcessor);
 ----
 
-If you need to lookup the processor in the xref:registry.adoc[Registry]
+If you need to lookup the processor in the xref:ROOT:registry.adoc[Registry]
 then you should use the *processRef* DSL:
 
 [source,java]
@@ -89,12 +89,12 @@ refactor it into a separate class.
 
 There is a base class called
 http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/ProcessorEndpoint.html[ProcessorEndpoint]
-which supports the full xref:endpoint.adoc[Endpoint] semantics given a
+which supports the full xref:ROOT:endpoint.adoc[Endpoint] semantics given a
 Processor instance.
 
 So you just need to create a https://github.com/apache/camel/tree/master/components[Component] class by
 deriving from
 http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/DefaultComponent.html[DefaultComponent]
 which returns instances of ProcessorEndpoint. For more details see
-xref:writing-components.adoc[Writing Components]
+xref:ROOT:writing-components.adoc[Writing Components]
 
diff --git a/core/camel-core-engine/src/main/docs/eips/random-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/random-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/random-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/random-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/recipientList-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/recipientList-eip.adoc
similarity index 97%
rename from core/camel-core-engine/src/main/docs/eips/recipientList-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/recipientList-eip.adoc
index 0c91120..7c477c6 100644
--- a/core/camel-core-engine/src/main/docs/eips/recipientList-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/recipientList-eip.adoc
@@ -17,20 +17,20 @@ The Recipient List EIP supports 15 options which are listed below:
 |===
 | Name | Description | Default | Type
 | *delimiter* | Delimiter used if the Expression returned multiple endpoints. Can be turned off using the value false. The default value is , | , | String
-| *parallelProcessing* | If enabled then sending messages to the recipients occurs concurrently. Note the caller thread will still wait until all messages has been fully processed, before it continues. Its only the sending and processing the replies from the recipients which happens concurrently. | false | Boolean
+| *parallelProcessing* | If enabled then sending messages to the recipients occurs concurrently. Note the caller thread will still wait until all messages has been fully processed, before it continues. Its only the sending and processing the replies from the recipients which happens concurrently. |  | String
 | *strategyRef* | Sets a reference to the AggregationStrategy to be used to assemble the replies from the recipients, into a single outgoing message from the RecipientList. By default Camel will use the last reply as the outgoing message. You can also use a POJO as the AggregationStrategy |  | String
 | *strategyMethodName* | This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy. |  | String
-| *strategyMethodAllowNull* | If this option is false then the aggregate method is not used if there was no data to enrich. If this option is true then null values is used as the oldExchange (when no data to enrich), when using POJOs as the AggregationStrategy | false | Boolean
+| *strategyMethodAllowNull* | If this option is false then the aggregate method is not used if there was no data to enrich. If this option is true then null values is used as the oldExchange (when no data to enrich), when using POJOs as the AggregationStrategy |  | String
 | *executorServiceRef* | Refers to a custom Thread Pool to be used for parallel processing. Notice if you set this option, then parallel processing is automatic implied, and you do not have to enable that option as well. |  | String
-| *stopOnException* | Will now stop further processing if an exception or failure occurred during processing of an org.apache.camel.Exchange and the caused exception will be thrown. Will also stop if processing the exchange failed (has a fault message) or an exception was thrown and handled by the error handler (such as using onException). In all situations the recipient list will stop further processing. This is the same behavior as in pipeline, which is used by the routing engine. The  [...]
-| *ignoreInvalidEndpoints* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint | false | Boolean
-| *streaming* | If enabled then Camel will process replies out-of-order, eg in the order they come back. If disabled, Camel will process replies in the same order as defined by the recipient list. | false | Boolean
-| *timeout* | Sets a total timeout specified in millis, when using parallel processing. If the Recipient List hasn't been able to send and process all replies within the given timeframe, then the timeout triggers and the Recipient List breaks out and continues. Notice if you provide a TimeoutAwareAggregationStrategy then the timeout method is invoked before breaking out. If the timeout is reached with running tasks still remaining, certain tasks for which it is difficult for Camel to shu [...]
+| *stopOnException* | Will now stop further processing if an exception or failure occurred during processing of an org.apache.camel.Exchange and the caused exception will be thrown. Will also stop if processing the exchange failed (has a fault message) or an exception was thrown and handled by the error handler (such as using onException). In all situations the recipient list will stop further processing. This is the same behavior as in pipeline, which is used by the routing engine. The  [...]
+| *ignoreInvalidEndpoints* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint |  | String
+| *streaming* | If enabled then Camel will process replies out-of-order, eg in the order they come back. If disabled, Camel will process replies in the same order as defined by the recipient list. |  | String
+| *timeout* | Sets a total timeout specified in millis, when using parallel processing. If the Recipient List hasn't been able to send and process all replies within the given timeframe, then the timeout triggers and the Recipient List breaks out and continues. Notice if you provide a TimeoutAwareAggregationStrategy then the timeout method is invoked before breaking out. If the timeout is reached with running tasks still remaining, certain tasks for which it is difficult for Camel to shu [...]
 | *onPrepareRef* | Uses the Processor when preparing the org.apache.camel.Exchange to be send. This can be used to deep-clone messages that should be send, or any custom logic needed before the exchange is send. |  | String
-| *shareUnitOfWork* | Shares the org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. Recipient List will by default not share unit of work between the parent exchange and each recipient exchange. This means each sub exchange has its own individual unit of work. | false | Boolean
-| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this recipient list, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped an [...]
-| *parallelAggregate* | If enabled then the aggregate method on AggregationStrategy can be called concurrently. Notice that this would require the implementation of AggregationStrategy to be implemented as thread-safe. By default this is false meaning that Camel synchronizes the call to the aggregate method. Though in some use-cases this can be used to archive higher performance when the AggregationStrategy is implemented as thread-safe. | false | Boolean
-| *stopOnAggregateException* | If enabled, unwind exceptions occurring at aggregation time to the error handler when parallelProcessing is used. Currently, aggregation time exceptions do not stop the route processing when parallelProcessing is used. Enabling this option allows to work around this behavior. The default value is false for the sake of backward compatibility. | false | Boolean
+| *shareUnitOfWork* | Shares the org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. Recipient List will by default not share unit of work between the parent exchange and each recipient exchange. This means each sub exchange has its own individual unit of work. |  | String
+| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this recipient list, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped an [...]
+| *parallelAggregate* | If enabled then the aggregate method on AggregationStrategy can be called concurrently. Notice that this would require the implementation of AggregationStrategy to be implemented as thread-safe. By default this is false meaning that Camel synchronizes the call to the aggregate method. Though in some use-cases this can be used to archive higher performance when the AggregationStrategy is implemented as thread-safe. |  | String
+| *stopOnAggregateException* | If enabled, unwind exceptions occurring at aggregation time to the error handler when parallelProcessing is used. Currently, aggregation time exceptions do not stop the route processing when parallelProcessing is used. Enabling this option allows to work around this behavior. The default value is false for the sake of backward compatibility. |  | String
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/eips/removeHeader-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/removeHeader-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/removeHeader-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/removeHeader-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/removeHeaders-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/removeHeaders-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/removeHeaders-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/removeHeaders-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/removeProperties-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/removeProperties-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/removeProperties-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/removeProperties-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/removeProperty-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/removeProperty-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/removeProperty-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/removeProperty-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/requestReply-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/requestReply-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/requestReply-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/requestReply-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/resequence-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/resequence-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/resequence-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/resequence-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/resilience4j-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/resilience4j-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/resilience4j-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/resilience4j-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/modules/eips/pages/resilience4jConfiguration-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/resilience4jConfiguration-eip.adoc
new file mode 100644
index 0000000..397fd62
--- /dev/null
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/resilience4jConfiguration-eip.adoc
@@ -0,0 +1,24 @@
+[[resilience4jConfiguration-eip]]
+= Resilience4j Configuration EIP
+
+
+// eip options: START
+The Resilience4j Configuration EIP supports 12 options which are listed below:
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *circuitBreakerRef* | Refers to an existing io.github.resilience4j.circuitbreaker.CircuitBreaker instance to lookup and use from the registry. When using this, then any other circuit breaker options are not in use. |  | String
+| *configRef* | Refers to an existing io.github.resilience4j.circuitbreaker.CircuitBreakerConfig instance to lookup and use from the registry. |  | String
+| *failureRateThreshold* | Configures the failure rate threshold in percentage. If the failure rate is equal or greater than the threshold the CircuitBreaker transitions to open and starts short-circuiting calls. The threshold must be greater than 0 and not greater than 100. Default value is 50 percentage. | 50 | Float
+| *permittedNumberOfCallsInHalf OpenState* | Configures the number of permitted calls when the CircuitBreaker is half open. The size must be greater than 0. Default size is 10. | 10 | Integer
+| *slidingWindowSize* | Configures the size of the sliding window which is used to record the outcome of calls when the CircuitBreaker is closed. slidingWindowSize configures the size of the sliding window. Sliding window can either be count-based or time-based. If slidingWindowType is COUNT_BASED, the last slidingWindowSize calls are recorded and aggregated. If slidingWindowType is TIME_BASED, the calls of the last slidingWindowSize seconds are recorded and aggregated. The slidingWindow [...]
+| *slidingWindowType* | Configures the type of the sliding window which is used to record the outcome of calls when the CircuitBreaker is closed. Sliding window can either be count-based or time-based. If slidingWindowType is COUNT_BASED, the last slidingWindowSize calls are recorded and aggregated. If slidingWindowType is TIME_BASED, the calls of the last slidingWindowSize seconds are recorded and aggregated. Default slidingWindowType is COUNT_BASED. | COUNT_BASED | String
+| *minimumNumberOfCalls* | Configures configures the minimum number of calls which are required (per sliding window period) before the CircuitBreaker can calculate the error rate. For example, if minimumNumberOfCalls is 10, then at least 10 calls must be recorded, before the failure rate can be calculated. If only 9 calls have been recorded the CircuitBreaker will not transition to open even if all 9 calls have failed. Default minimumNumberOfCalls is 100 | 100 | Integer
+| *writableStackTraceEnabled* | Enables writable stack traces. When set to false, Exception.getStackTrace returns a zero length array. This may be used to reduce log spam when the circuit breaker is open as the cause of the exceptions is already known (the circuit breaker is short-circuiting calls). | true | Boolean
+| *waitDurationInOpenState* | Configures the wait duration (in seconds) which specifies how long the CircuitBreaker should stay open, before it switches to half open. Default value is 60 seconds. | 60 | Integer
+| *automaticTransitionFromOpenTo HalfOpenEnabled* | Enables automatic transition from OPEN to HALF_OPEN state once the waitDurationInOpenState has passed. | false | Boolean
+| *slowCallRateThreshold* | Configures a threshold in percentage. The CircuitBreaker considers a call as slow when the call duration is greater than slowCallDurationThreshold(Duration. When the percentage of slow calls is equal or greater the threshold, the CircuitBreaker transitions to open and starts short-circuiting calls. The threshold must be greater than 0 and not greater than 100. Default value is 100 percentage which means that all recorded calls must be slower than slowCallDurat [...]
+| *slowCallDurationThreshold* | Configures the duration threshold (seconds) above which calls are considered as slow and increase the slow calls percentage. Default value is 60 seconds. | 60 | Integer
+|===
+// eip options: END
diff --git a/core/camel-core-engine/src/main/docs/eips/rollback-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/rollback-eip.adoc
similarity index 96%
rename from core/camel-core-engine/src/main/docs/eips/rollback-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/rollback-eip.adoc
index a16a732..2dff166 100644
--- a/core/camel-core-engine/src/main/docs/eips/rollback-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/rollback-eip.adoc
@@ -4,7 +4,7 @@ Rollback might be needed if there is a transaction or transactional pieces in yo
 
 Camel recommends supporting the
 http://www.enterpriseintegrationpatterns.com/TransactionalClient.html[Transactional
-Client] from the xref:enterprise-integration-patterns.adoc[EIP patterns]
+Client] from the xref:ROOT:enterprise-integration-patterns.adoc[EIP patterns]
 using spring transactions.
 
 image::eip/TransactionalClientSolution.gif[image]
@@ -115,7 +115,7 @@ from("activemq:queue:foo").policy(notsupported).to("activemq:queue:bar");
 
 === OSGi Blueprint
 
-If you are using xref:using-osgi-blueprint-with-camel.adoc[OSGi
+If you are using xref:ROOT:using-osgi-blueprint-with-camel.adoc[OSGi
 Blueprint] then you most likely have to explicit declare a policy and
 refer to the policy from the transacted in the route.
 
@@ -187,10 +187,10 @@ Transaction error handler
 
 When a route is marked as transacted using *transacted* Camel will
 automatic use the
-xref:transactionerrorhandler.adoc[TransactionErrorHandler] as
-xref:error-handler.adoc[Error Handler]. It supports basically the same
-feature set as the xref:defaulterrorhandler.adoc[DefaultErrorHandler],
-so you can for instance use xref:exception-clause.adoc[Exception Clause]
+xref:ROOT:transactionerrorhandler.adoc[TransactionErrorHandler] as
+xref:ROOT:error-handler.adoc[Error Handler]. It supports basically the same
+feature set as the xref:ROOT:defaulterrorhandler.adoc[DefaultErrorHandler],
+so you can for instance use xref:ROOT:exception-clause.adoc[Exception Clause]
 as well.
 
 == Integration Testing with Spring
diff --git a/core/camel-core-engine/src/main/docs/eips/roundRobin-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/roundRobin-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/roundRobin-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/roundRobin-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/routingSlip-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/routingSlip-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/routingSlip-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/routingSlip-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/saga-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/saga-eip.adoc
similarity index 99%
rename from core/camel-core-engine/src/main/docs/eips/saga-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/saga-eip.adoc
index 0b2b49d..e217b8d 100644
--- a/core/camel-core-engine/src/main/docs/eips/saga-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/saga-eip.adoc
@@ -21,7 +21,7 @@ with the purpose of restoring the status that was present before the flow execut
 Compensating actions can be declared in Camel routes using the Java or XML DSL and will be invoked by Camel only when needed (if the saga is cancelled due to an error).
 
 // eip options: START
-The Saga EIP supports 6 options which are listed below:
+The Saga EIP supports 7 options which are listed below:
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
@@ -29,10 +29,10 @@ The Saga EIP supports 6 options which are listed below:
 | *propagation* | Set the Saga propagation mode (REQUIRED, REQUIRES_NEW, MANDATORY, SUPPORTS, NOT_SUPPORTED, NEVER). | REQUIRED | SagaPropagation
 | *completionMode* | Determine how the saga should be considered complete. When set to AUTO, the saga is completed when the exchange that initiates the saga is processed successfully, or compensated when it completes exceptionally. When set to MANUAL, the user must complete or compensate the saga using the saga:complete or saga:compensate endpoints. | AUTO | SagaCompletionMode
 | *timeoutInMilliseconds* | Set the maximum amount of time for the Saga. After the timeout is expired, the saga will be compensated automatically (unless a different decision has been taken in the meantime). |  | Long
-| *compensation* | The compensation endpoint URI that must be called to compensate all changes done in the route. The route corresponding to the compensation URI must perform compensation and complete without error. If errors occur during compensation, the saga service may call again the compensation URI to retry. |  | SagaActionUri Definition
-| *completion* | The completion endpoint URI that will be called when the Saga is completed successfully. The route corresponding to the completion URI must perform completion tasks and terminate without error. If errors occur during completion, the saga service may call again the completion URI to retry. |  | SagaActionUri Definition
+| *compensation* | The compensation endpoint URI that must be called to compensate all changes done in the route. The route corresponding to the compensation URI must perform compensation and complete without error. If errors occur during compensation, the saga service may call again the compensation URI to retry. |  | SagaActionUriDefinition
+| *completion* | The completion endpoint URI that will be called when the Saga is completed successfully. The route corresponding to the completion URI must perform completion tasks and terminate without error. If errors occur during completion, the saga service may call again the completion URI to retry. |  | SagaActionUriDefinition
 | *option* | Allows to save properties of the current exchange in order to re-use them in a compensation/completion callback route. Options are usually helpful e.g. to store and retrieve identifiers of objects that should be deleted in compensating actions. Option values will be transformed into input headers of the compensation/completion exchange. |  | List
-| *sagaServiceRef* |  Refers to the id to lookup in the registry for the specific CamelSagaService to use. | | String
+| *sagaServiceRef* | Refers to the id to lookup in the registry for the specific CamelSagaService to use. |  | String
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/eips/sample-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/sample-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/sample-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/sample-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/script-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/script-eip.adoc
similarity index 96%
rename from core/camel-core-engine/src/main/docs/eips/script-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/script-eip.adoc
index a336093..9e52240 100644
--- a/core/camel-core-engine/src/main/docs/eips/script-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/script-eip.adoc
@@ -6,7 +6,7 @@ This is useful when you need to invoke some logic that are not in Java code such
 Groovy or any of the other Languages. The message body is not changed (by default) however the scripting
 context has access to the current Exchange and can essentially change the message or headers directly.
 But the return value from the script is discarded and not used.
-If the return value should be used as a changed message body then use xref:message-translator.adoc[Message Translator] EIP instead.
+If the return value should be used as a changed message body then use xref:ROOT:message-translator.adoc[Message Translator] EIP instead.
 
 == Options
 
diff --git a/core/camel-core-engine/src/main/docs/eips/serviceCall-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/serviceCall-eip.adoc
similarity index 97%
rename from core/camel-core-engine/src/main/docs/eips/serviceCall-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/serviceCall-eip.adoc
index aece528..b38db15 100644
--- a/core/camel-core-engine/src/main/docs/eips/serviceCall-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/serviceCall-eip.adoc
@@ -100,17 +100,17 @@ The Service Call EIP supports 14 options which are listed below:
 | *name* | *Required* Sets the name of the service to use |  | String
 | *uri* | The uri of the endpoint to send to. The uri can be dynamic computed using the org.apache.camel.language.simple.SimpleLanguage expression. |  | String
 | *component* | The component to use. | http | String
-| *pattern* | Sets the optional ExchangePattern used to invoke this endpoint |  | ExchangePattern
+| *pattern* | *Required* Sets the optional ExchangePattern used to invoke this endpoint |  | ExchangePattern
 | *configurationRef* | Refers to a ServiceCall configuration to use |  | String
 | *serviceDiscoveryRef* | Sets a reference to a custom ServiceDiscovery to use. |  | String
 | *serviceFilterRef* | Sets a reference to a custom ServiceFilter to use. |  | String
 | *serviceChooserRef* | Sets a reference to a custom ServiceChooser to use. |  | String
 | *loadBalancerRef* | Sets a reference to a custom ServiceLoadBalancer to use. |  | String
 | *expressionRef* | Set a reference to a custom Expression to use. |  | String
-| *serviceDiscovery Configuration* | *Required* Configures the ServiceDiscovery using the given configuration. |  | ServiceCallService DiscoveryConfiguration
-| *serviceFilterConfiguration* | *Required* Configures the ServiceFilter using the given configuration. |  | ServiceCallService FilterConfiguration
-| *loadBalancerConfiguration* | *Required* Configures the LoadBalancer using the given configuration. |  | ServiceCallServiceLoad BalancerConfiguration
-| *expressionConfiguration* | *Required* Configures the Expression using the given configuration. |  | ServiceCallExpression Configuration
+| *serviceDiscoveryConfiguration* | *Required* Configures the ServiceDiscovery using the given configuration. |  | ServiceCallServiceDiscoveryConfiguration
+| *serviceFilterConfiguration* | *Required* Configures the ServiceFilter using the given configuration. |  | ServiceCallServiceFilterConfiguration
+| *loadBalancerConfiguration* | *Required* Configures the LoadBalancer using the given configuration. |  | ServiceCallServiceLoadBalancerConfiguration
+| *expressionConfiguration* | *Required* Configures the Expression using the given configuration. |  | ServiceCallExpressionConfiguration
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/eips/setBody-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/setBody-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/setBody-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/setBody-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/setHeader-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/setHeader-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/setHeader-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/setHeader-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/setOutHeader-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/setOutHeader-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/setOutHeader-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/setOutHeader-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/setProperty-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/setProperty-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/setProperty-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/setProperty-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/sort-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/sort-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/sort-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/sort-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/split-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/split-eip.adoc
similarity index 99%
rename from core/camel-core-engine/src/main/docs/eips/split-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/split-eip.adoc
index 784510b..5771109 100644
--- a/core/camel-core-engine/src/main/docs/eips/split-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/split-eip.adoc
@@ -1,7 +1,7 @@
 [[split-eip]]
 = Split EIP
 
-The http://www.enterpriseintegrationpatterns.com/patterns/messaging/Sequencer.html[Splitter] from the xref:enterprise-integration-patterns.adoc[EIP patterns] allows you split a message into a number of pieces and process them individually.
+The http://www.enterpriseintegrationpatterns.com/patterns/messaging/Sequencer.html[Splitter] from the xref:ROOT:enterprise-integration-patterns.adoc[EIP patterns] allows you split a message into a number of pieces and process them individually.
 
 image::eip/Sequencer.gif[image]
 
diff --git a/core/camel-core-engine/src/main/docs/eips/step-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/step-eip.adoc
similarity index 94%
rename from core/camel-core-engine/src/main/docs/eips/step-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/step-eip.adoc
index d95fa00..c44b88c 100644
--- a/core/camel-core-engine/src/main/docs/eips/step-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/step-eip.adoc
@@ -1,7 +1,7 @@
 [[step-eip]]
 = Step EIP
 
-Camel supports the http://www.enterpriseintegrationpatterns.com/PipesAndFilters.html[Pipes and Filters] from the xref:enterprise-integration-patterns.adoc[EIP patterns] in various ways.
+Camel supports the http://www.enterpriseintegrationpatterns.com/PipesAndFilters.html[Pipes and Filters] from the xref:ROOT:enterprise-integration-patterns.adoc[EIP patterns] in various ways.
 
 image::eip/PipesAndFilters.gif[image]
 
diff --git a/core/camel-core-engine/src/main/docs/eips/sticky-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/sticky-eip.adoc
similarity index 92%
rename from core/camel-core-engine/src/main/docs/eips/sticky-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/sticky-eip.adoc
index cd04f97..5e1910c 100644
--- a/core/camel-core-engine/src/main/docs/eips/sticky-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/sticky-eip.adoc
@@ -11,7 +11,7 @@ The Sticky EIP supports 1 options which are listed below:
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *correlationExpression* | *Required* The correlation expression to use to calculate the correlation key |  | NamespaceAware Expression
+| *correlationExpression* | *Required* The correlation expression to use to calculate the correlation key |  | ExpressionSubElementDefinition
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/eips/stop-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/stop-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/stop-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/stop-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/stream-config-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/stream-config-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/stream-config-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/stream-config-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/threads-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/threads-eip.adoc
similarity index 94%
rename from core/camel-core-engine/src/main/docs/eips/threads-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/threads-eip.adoc
index a12c023..b415dcf 100644
--- a/core/camel-core-engine/src/main/docs/eips/threads-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/threads-eip.adoc
@@ -18,8 +18,8 @@ The Threads EIP supports 10 options which are listed below:
 | *maxQueueSize* | Sets the maximum number of tasks in the work queue. Use -1 or Integer.MAX_VALUE for an unbounded queue |  | Integer
 | *allowCoreThreadTimeOut* | Whether idle core threads is allowed to timeout and therefore can shrink the pool size below the core pool size Is by default false | false | Boolean
 | *threadName* | Sets the thread name to use. | Threads | String
-| *rejectedPolicy* | Sets the handler for tasks which cannot be executed by the thread pool. |  | ThreadPoolRejected Policy
-| *callerRunsWhenRejected* | Whether or not to use as caller runs as fallback when a task is rejected being added to the thread pool (when its full). This is only used as fallback if no rejectedPolicy has been configured, or the thread pool has no configured rejection handler. Is by default true | true | Boolean
+| *rejectedPolicy* | Sets the handler for tasks which cannot be executed by the thread pool. |  | ThreadPoolRejectedPolicy
+| *callerRunsWhenRejected* | Whether or not to use as caller runs as fallback when a task is rejected being added to the thread pool (when its full). This is only used as fallback if no rejectedPolicy has been configured, or the thread pool has no configured rejection handler. Is by default true | true | String
 |===
 // eip options: END
 
diff --git a/core/camel-core-engine/src/main/docs/eips/throttle-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/throttle-eip.adoc
similarity index 97%
rename from core/camel-core-engine/src/main/docs/eips/throttle-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/throttle-eip.adoc
index 7d6c8d7..6d1a6b1 100644
--- a/core/camel-core-engine/src/main/docs/eips/throttle-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/throttle-eip.adoc
@@ -11,7 +11,7 @@ The Throttle EIP supports 6 options which are listed below:
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *correlationExpression* | The expression used to calculate the correlation key to use for throttle grouping. The Exchange which has the same correlation key is throttled together. |  | NamespaceAware Expression
+| *correlationExpression* | The expression used to calculate the correlation key to use for throttle grouping. The Exchange which has the same correlation key is throttled together. |  | ExpressionSubElementDefinition
 | *executorServiceRef* | To use a custom thread pool (ScheduledExecutorService) by the throttler. |  | String
 | *timePeriodMillis* | Sets the time period during which the maximum request count is valid for | 1000 | Long
 | *asyncDelayed* | Enables asynchronous delay which means the thread will not block while delaying. | false | Boolean
diff --git a/core/camel-core-engine/src/main/docs/eips/to-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/to-eip.adoc
similarity index 83%
rename from core/camel-core-engine/src/main/docs/eips/to-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/to-eip.adoc
index fb1c22c..e6351ea 100644
--- a/core/camel-core-engine/src/main/docs/eips/to-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/to-eip.adoc
@@ -3,12 +3,12 @@
 
 See message related documentation
 
-* xref:message.adoc[Message]
-* xref:message-bus.adoc[Message Bus]
-* xref:message-channel.adoc[Message Channel]
-* xref:message-endpoint.adoc[Message Endpoint]
-* xref:message-router.adoc[Message Router]
-* xref:message-translator.adoc[Message Translator]
+* xref:ROOT:message.adoc[Message]
+* xref:ROOT:message-bus.adoc[Message Bus]
+* xref:ROOT:message-channel.adoc[Message Channel]
+* xref:ROOT:message-endpoint.adoc[Message Endpoint]
+* xref:ROOT:message-router.adoc[Message Router]
+* xref:ROOT:message-translator.adoc[Message Translator]
 
 == Options
 
@@ -19,7 +19,7 @@ The To EIP supports 2 options which are listed below:
 |===
 | Name | Description | Default | Type
 | *uri* | *Required* Sets the uri of the endpoint to send to. |  | String
-| *pattern* | Sets the optional ExchangePattern used to invoke this endpoint |  | ExchangePattern
+| *pattern* | Sets the optional ExchangePattern used to invoke this endpoint |  | String
 |===
 // eip options: END
 
diff --git a/docs/user-manual/modules/ROOT/pages/toD-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/toD-eip.adoc
similarity index 80%
rename from docs/user-manual/modules/ROOT/pages/toD-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/toD-eip.adoc
index fea1078..0402f0e 100644
--- a/docs/user-manual/modules/ROOT/pages/toD-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/toD-eip.adoc
@@ -1,11 +1,10 @@
 [[toD-eip]]
 = To D EIP
-:page-source: core/camel-core-engine/src/main/docs/eips/toD-eip.adoc
 
 There is a new `.toD` / `<toD>` that allows to send a message to a dynamic
-computed xref:endpoint.adoc[Endpoint] using one or
-more xref:expression.adoc[Expression] that are concat together. By
-default the xref:simple-language.adoc[Simple] language is used to compute
+computed xref:ROOT:endpoint.adoc[Endpoint] using one or
+more xref:ROOT:expression.adoc[Expression] that are concat together. By
+default the xref:components:languages:simple-language.adoc[Simple] language is used to compute
 the endpoint.
 
 == Options
@@ -18,9 +17,9 @@ The To D EIP supports 5 options which are listed below:
 | Name | Description | Default | Type
 | *uri* | *Required* The uri of the endpoint to send to. The uri can be dynamic computed using the org.apache.camel.language.simple.SimpleLanguage expression. |  | String
 | *pattern* | Sets the optional ExchangePattern used to invoke this endpoint |  | ExchangePattern
-| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ConsumerCache which is used to cache and reuse producers. |  | Integer
+| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this recipient list, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped an [...]
 | *ignoreInvalidEndpoint* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint | false | Boolean
-| *allowOptimisedComponents* | Whether to allow components to optimise toD if they are org.apache.camel.spi.SendDynamicAware. | true | Boolean
+| *allowOptimisedComponents* | Whether to allow components to optimise toD if they are org.apache.camel.spi.SendDynamicAware . | true | Boolean
 |===
 // eip options: END
 
@@ -46,7 +45,7 @@ And in XML:
 ----
 
 You can also prefix the uri with a value because by default the uri is
-evaluated using the xref:simple-language.adoc[Simple] language
+evaluated using the xref:components:languages:simple-language.adoc[Simple] language
 
 [source,java]
 ----
@@ -68,8 +67,8 @@ In the example above we compute an endpoint that has prefix "mock:" and
 then the header foo is appended. So for example if the header foo has
 value order, then the endpoint is computed as "mock:order".
 
-You can also use other languages than xref:simple-language.adoc[Simple] such
-as xref:components::xpath-language.adoc[XPath] - this requires to prefix with language: as
+You can also use other languages than xref:components:languages:simple-language.adoc[Simple] such
+as xref:components:languages:xpath-language.adoc[XPath] - this requires to prefix with language: as
 shown below (simple language is the default language). If you do not
 specify language: then the endpoint is a component name. And in some
 cases there is both a component and language with the same name such as
@@ -103,7 +102,7 @@ using the plus sign `+` such as shown below:
 ----
 
 In the example above the uri is a combination
-of xref:simple-language.adoc[Simple] language and xref:simple-language.adoc[XPath] where
+of xref:components:languages:simple-language.adoc[Simple] language and xref:components:languages:simple-language.adoc[XPath] where
 the first part is simple (simple is default language). And then the plus
 sign separate to another language, where we specify the language name
 followed by a colon
diff --git a/core/camel-core-engine/src/main/docs/eips/topic-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/topic-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/topic-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/topic-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/transform-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/transform-eip.adoc
similarity index 72%
rename from core/camel-core-engine/src/main/docs/eips/transform-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/transform-eip.adoc
index 687d16c..5d1503f 100644
--- a/core/camel-core-engine/src/main/docs/eips/transform-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/transform-eip.adoc
@@ -3,7 +3,7 @@
 
 See below for details
 
-* xref:message-translator.adoc[Message Translator]
+* xref:ROOT:message-translator.adoc[Message Translator]
 
 == Options
 
diff --git a/core/camel-core-engine/src/main/docs/eips/unmarshal-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/unmarshal-eip.adoc
similarity index 79%
rename from core/camel-core-engine/src/main/docs/eips/unmarshal-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/unmarshal-eip.adoc
index c4e2816..7306998 100644
--- a/core/camel-core-engine/src/main/docs/eips/unmarshal-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/unmarshal-eip.adoc
@@ -1,7 +1,7 @@
 [[unmarshal-eip]]
 = Unmarshal EIP
 
-If you receive a message from one of the Camel xref:components::index.adoc[Components] such as xref:components::file-component.adoc[File], xref:components::http-component.adoc[HTTP] or xref:components::jms-component.adoc[JMS] you often want to unmarshal the payload into some bean so that you can process it using some xref:bean-integration.adoc[Bean Integration] or perform xref:predicate.adoc[Predicate] evaluation and so forth. To do this use the *unmarshal* word in the xref:dsl.adoc[DSL] [...]
+If you receive a message from one of the Camel xref:components::index.adoc[Components] such as xref:components::file-component.adoc[File], xref:components::http-component.adoc[HTTP] or xref:components::jms-component.adoc[JMS] you often want to unmarshal the payload into some bean so that you can process it using some xref:ROOT:bean-integration.adoc[Bean Integration] or perform xref:ROOT:predicate.adoc[Predicate] evaluation and so forth. To do this use the *unmarshal* word in the xref:ROO [...]
 
 == Options
 
@@ -28,7 +28,7 @@ from("activemq:My.Queue").
   to("mqseries:Another.Queue");
 ----
 
-The above uses a named DataFormat of _jaxb_ which is configured with a number of Java package names. You can if you prefer use a named reference to a data format which can then be defined in your xref:registry.adoc[Registry] such as via your xref:components::spring.adoc[Spring] XML file.
+The above uses a named DataFormat of _jaxb_ which is configured with a number of Java package names. You can if you prefer use a named reference to a data format which can then be defined in your xref:ROOT:registry.adoc[Registry] such as via your xref:components::spring.adoc[Spring] XML file.
 
 You can also use the DSL itself to define the data format as you use it.
 For example the following uses Java serialization to unmarshal a binary
diff --git a/core/camel-core-engine/src/main/docs/eips/validate-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/validate-eip.adoc
similarity index 100%
rename from core/camel-core-engine/src/main/docs/eips/validate-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/validate-eip.adoc
diff --git a/core/camel-core-engine/src/main/docs/eips/weighted-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/weighted-eip.adoc
similarity index 94%
rename from core/camel-core-engine/src/main/docs/eips/weighted-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/weighted-eip.adoc
index ced6732..f3cf276 100644
--- a/core/camel-core-engine/src/main/docs/eips/weighted-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/weighted-eip.adoc
@@ -11,7 +11,7 @@ The Weighted EIP supports 3 options which are listed below:
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *roundRobin* | To enable round robin mode. By default the weighted distribution mode is used. The default value is false. | false | Boolean
+| *roundRobin* | To enable round robin mode. By default the weighted distribution mode is used. The default value is false. |  | String
 | *distributionRatio* | *Required* The distribution ratio is a delimited String consisting on integer weights separated by delimiters for example 2,3,5. The distributionRatio must match the number of endpoints and/or processors specified in the load balancer list. |  | String
 | *distributionRatioDelimiter* | Delimiter used to specify the distribution ratio. The default value is , | , | String
 |===
diff --git a/core/camel-core-engine/src/main/docs/eips/when-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/when-eip.adoc
similarity index 90%
rename from core/camel-core-engine/src/main/docs/eips/when-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/when-eip.adoc
index 5070c54..f659281 100644
--- a/core/camel-core-engine/src/main/docs/eips/when-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/when-eip.adoc
@@ -2,7 +2,7 @@
 = When EIP
 
 The When EIP is related to http://www.enterpriseintegrationpatterns.com/ContentBasedRouter.html[Content
-Based Router] from the xref:enterprise-integration-patterns.adoc[EIP
+Based Router] from the xref:ROOT:enterprise-integration-patterns.adoc[EIP
 patterns]
 
 image::eip/ContentBasedRouter.gif[image]
@@ -17,7 +17,7 @@ The When EIP has no options.
 
 The following example shows how to route a request from an input
 *direct:a* endpoint to either *direct:b*, *direct:c* or *direct:d* depending on
-the evaluation of various xref:predicate.adoc[Predicate] expressions
+the evaluation of various xref:ROOT:predicate.adoc[Predicate] expressions
 
 [source,java]
 ----
diff --git a/docs/user-manual/modules/ROOT/pages/wireTap-eip.adoc b/core/camel-core-engine/src/main/docs/modules/eips/pages/wireTap-eip.adoc
similarity index 80%
rename from docs/user-manual/modules/ROOT/pages/wireTap-eip.adoc
rename to core/camel-core-engine/src/main/docs/modules/eips/pages/wireTap-eip.adoc
index b7319ad..e3c6427 100644
--- a/docs/user-manual/modules/ROOT/pages/wireTap-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/wireTap-eip.adoc
@@ -1,9 +1,8 @@
 [[wireTap-eip]]
 = Wire Tap EIP
-:page-source: core/camel-core-engine/src/main/docs/eips/wireTap-eip.adoc
 
 http://www.enterpriseintegrationpatterns.com/WireTap.html[Wire Tap]
-(from the xref:enterprise-integration-patterns.adoc[EIP patterns])
+(from the xref:ROOT:enterprise-integration-patterns.adoc[EIP patterns])
 allows you to route messages to a separate location while they are being
 forwarded to the ultimate destination.
 
@@ -12,9 +11,9 @@ image::eip/WireTap.gif[image]
 == Streams
 
 If you xref:wireTap-eip.adoc[Wire Tap] a stream message body then you
-should consider enabling xref:stream-caching.adoc[Stream caching] to
+should consider enabling xref:ROOT:stream-caching.adoc[Stream caching] to
 ensure the message body can be read at each endpoint. See more details
-at xref:stream-caching.adoc[Stream caching].
+at xref:ROOT:stream-caching.adoc[Stream caching].
 
 TIP: See the `cacheSize` option for more details on _how much cache_ to use depending on how many or few unique endpoints are used.
 
@@ -27,16 +26,16 @@ The Wire Tap EIP supports 11 options which are listed below:
 |===
 | Name | Description | Default | Type
 | *processorRef* | Reference to a Processor to use for creating a new body as the message to use for wire tapping |  | String
-| *body* | Uses the expression for creating a new body as the message to use for wire tapping |  | NamespaceAware Expression
+| *body* | Uses the expression for creating a new body as the message to use for wire tapping |  | ExpressionSubElementDefinition
 | *executorServiceRef* | Uses a custom thread pool |  | String
 | *copy* | Uses a copy of the original exchange | true | Boolean
 | *dynamicUri* | Whether the uri is dynamic or static. If the uri is dynamic then the simple language is used to evaluate a dynamic uri to use as the wire-tap destination, for each incoming message. This works similar to how the toD EIP pattern works. If static then the uri is used as-is as the wire-tap destination. | true | Boolean
 | *onPrepareRef* | Uses the Processor when preparing the org.apache.camel.Exchange to be send. This can be used to deep-clone messages that should be send, or any custom logic needed before the exchange is send. |  | String
 | *uri* | *Required* The uri of the endpoint to send to. The uri can be dynamic computed using the org.apache.camel.language.simple.SimpleLanguage expression. |  | String
 | *pattern* | Sets the optional ExchangePattern used to invoke this endpoint |  | ExchangePattern
-| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this dynamic router, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped an [...]
+| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this recipient list, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped an [...]
 | *ignoreInvalidEndpoint* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint | false | Boolean
-| *allowOptimisedComponents* | Whether to allow components to optimise toD if they are org.apache.camel.spi.SendDynamicAware. | true | Boolean
+| *allowOptimisedComponents* | Whether to allow components to optimise toD if they are org.apache.camel.spi.SendDynamicAware . | true | Boolean
 |===
 // eip options: END
 
@@ -44,7 +43,7 @@ The Wire Tap EIP supports 11 options which are listed below:
 
 The WireTap uses a thread pool to process the
 tapped messages. This thread pool will by default use the settings
-detailed at xref:threading-model.adoc[Threading Model]. In particular,
+detailed at xref:ROOT:threading-model.adoc[Threading Model]. In particular,
 when the pool is exhausted (with all threads utilized), further wiretaps
 will be executed synchronously by the calling thread. To remedy this,
 you can configure an explicit thread pool on the xref:wireTap-eip.adoc[Wire
@@ -54,24 +53,24 @@ or more worker threads.
 == WireTap Node
 
 Camel's Wire Tap node supports two flavors when tapping an
-xref:exchange.adoc[Exchange]:
+xref:ROOT:exchange.adoc[Exchange]:
 
 - With the traditional Wire Tap, Camel will copy the original
-xref:exchange.adoc[Exchange] and set its
-xref:exchange-pattern.adoc[Exchange Pattern] to *`InOnly`*, as we want
-the tapped xref:exchange.adoc[Exchange] to be sent in a fire and forget
-style. The tapped xref:exchange.adoc[Exchange] is then sent in a
+xref:ROOT:exchange.adoc[Exchange] and set its
+xref:ROOT:exchange-pattern.adoc[Exchange Pattern] to *`InOnly`*, as we want
+the tapped xref:ROOT:exchange.adoc[Exchange] to be sent in a fire and forget
+style. The tapped xref:ROOT:exchange.adoc[Exchange] is then sent in a
 separate thread so it can run in parallel with the original. Beware that
 only the Exchange is copied - Wire Tap won't do a deep clone (unless you
 specify a custom processor via *`onPrepareRef`* which does that). So all
 copies could share objects from the original Exchange.
 - Camel also provides an option of sending a new
-xref:exchange.adoc[Exchange] allowing you to populate it with new
+xref:ROOT:exchange.adoc[Exchange] allowing you to populate it with new
 values.
 
 == Sending a Copy (traditional wiretap)
 
-* Using the xref:fluent-builders.adoc[Fluent Builders]
+* Using the xref:ROOT:fluent-builders.adoc[Fluent Builders]
 
 [source,java]
 ----
@@ -96,27 +95,27 @@ values.
     }
 ----
 
-== Sending a New xref:exchange.adoc[Exchange]
+== Sending a New xref:ROOT:exchange.adoc[Exchange]
 
-*Using the xref:fluent-builders.adoc[Fluent Builders]*
+*Using the xref:ROOT:fluent-builders.adoc[Fluent Builders]*
 
 Camel supports either a processor or an
-xref:expression.adoc[Expression] to populate the new
-xref:exchange.adoc[Exchange]. Using a processor gives you full power
-over how the xref:exchange.adoc[Exchange] is populated as you can set
-properties, headers, etc. An xref:expression.adoc[Expression] can only
+xref:ROOT:expression.adoc[Expression] to populate the new
+xref:ROOT:exchange.adoc[Exchange]. Using a processor gives you full power
+over how the xref:ROOT:exchange.adoc[Exchange] is populated as you can set
+properties, headers, etc. An xref:ROOT:expression.adoc[Expression] can only
 be used to set the *`IN`* body.
 
-The xref:expression.adoc[Expression] or
-xref:processor.adoc[Processor] is pre-populated with a copy of the
-original xref:exchange.adoc[Exchange], which allows you to access the
-original message when you prepare a new xref:exchange.adoc[Exchange] to
+The xref:ROOT:expression.adoc[Expression] or
+xref:ROOT:processor.adoc[Processor] is pre-populated with a copy of the
+original xref:ROOT:exchange.adoc[Exchange], which allows you to access the
+original message when you prepare a new xref:ROOT:exchange.adoc[Exchange] to
 be sent. You can use the *`copy`* option (enabled by default) to
 indicate whether you want this.
 
 Below is the processor variation,
 where we disable *`copy`* by passing in *`false`* to create a new, empty
-xref:exchange.adoc[Exchange]
+xref:ROOT:exchange.adoc[Exchange]
 
 [source,java]
 ----
@@ -145,7 +144,7 @@ xref:exchange.adoc[Exchange]
 == Using Dynamic URIs
 
 For example to wire tap to a dynamic URI, then it supports the same
-dynamic URIs as documented in xref:message-endpoint.adoc[Message
+dynamic URIs as documented in xref:ROOT:message-endpoint.adoc[Message
 Endpoint]. For example to wire tap to a JMS queue where the header ID is
 part of the queue name:
 
@@ -159,8 +158,8 @@ part of the queue name:
 
 If you send a new message using xref:wireTap-eip.adoc[Wire Tap], then you
 could only set the message body using an
-xref:expression.adoc[Expression] from the DSL. If you also need to set
-headers, you would have to use a xref:processor.adoc[Processor]. From
+xref:ROOT:expression.adoc[Expression] from the DSL. If you also need to set
+headers, you would have to use a xref:ROOT:processor.adoc[Processor]. From
 It's possible to set headers as well using the DSL.
 
 The following example sends a new message which has
@@ -205,4 +204,4 @@ The following example sends a new message which has
 
 See details at xref:multicast-eip.adoc[Multicast]
 
-xref:using-this-pattern.adoc[Using This Pattern]
+xref:ROOT:using-this-pattern.adoc[Using This Pattern]
diff --git a/docs/components/antora.yml b/core/camel-core-languages/src/main/docs/antora.yml
similarity index 93%
copy from docs/components/antora.yml
copy to core/camel-core-languages/src/main/docs/antora.yml
index b1f6bd8..88b7eba 100644
--- a/docs/components/antora.yml
+++ b/core/camel-core-languages/src/main/docs/antora.yml
@@ -16,7 +16,4 @@
 #
 
 name: components
-title: Component reference
 version: latest
-nav:
-- modules/ROOT/nav.adoc
diff --git a/core/camel-core-languages/src/main/docs/constant-language.adoc b/core/camel-core-languages/src/main/docs/modules/languages/pages/constant-language.adoc
similarity index 100%
rename from core/camel-core-languages/src/main/docs/constant-language.adoc
rename to core/camel-core-languages/src/main/docs/modules/languages/pages/constant-language.adoc
diff --git a/core/camel-core-languages/src/main/docs/exchangeProperty-language.adoc b/core/camel-core-languages/src/main/docs/modules/languages/pages/exchangeProperty-language.adoc
similarity index 100%
rename from core/camel-core-languages/src/main/docs/exchangeProperty-language.adoc
rename to core/camel-core-languages/src/main/docs/modules/languages/pages/exchangeProperty-language.adoc
diff --git a/core/camel-core-languages/src/main/docs/file-language.adoc b/core/camel-core-languages/src/main/docs/modules/languages/pages/file-language.adoc
similarity index 100%
rename from core/camel-core-languages/src/main/docs/file-language.adoc
rename to core/camel-core-languages/src/main/docs/modules/languages/pages/file-language.adoc
diff --git a/core/camel-core-languages/src/main/docs/header-language.adoc b/core/camel-core-languages/src/main/docs/modules/languages/pages/header-language.adoc
similarity index 100%
rename from core/camel-core-languages/src/main/docs/header-language.adoc
rename to core/camel-core-languages/src/main/docs/modules/languages/pages/header-language.adoc
diff --git a/core/camel-core-languages/src/main/docs/ref-language.adoc b/core/camel-core-languages/src/main/docs/modules/languages/pages/ref-language.adoc
similarity index 100%
rename from core/camel-core-languages/src/main/docs/ref-language.adoc
rename to core/camel-core-languages/src/main/docs/modules/languages/pages/ref-language.adoc
diff --git a/core/camel-core-languages/src/main/docs/simple-language.adoc b/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc
similarity index 98%
rename from core/camel-core-languages/src/main/docs/simple-language.adoc
rename to core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc
index c5acb3e..42456b7 100644
--- a/core/camel-core-languages/src/main/docs/simple-language.adoc
+++ b/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc
@@ -8,17 +8,17 @@ created, but has since grown more powerful. It is primarily intended for
 being a really small and simple language for evaluating
 Expressions and Predicates
 without requiring any new dependencies or knowledge of
-xref:components::xpath-language.adoc[XPath]; so it is ideal for testing in camel-core. The
+xref:xpath-language.adoc[XPath]; so it is ideal for testing in camel-core. The
 idea was to cover 95% of the common use cases when you need a little bit
 of expression based script in your Camel routes.
 
 However for much more complex use cases you are generally recommended to
 choose a more expressive and powerful language such as:
 
-* xref:components::groovy-language.adoc[Groovy]
-* xref:components::spel-language.adoc[SpEL]
-* xref:components::mvel-component.adoc[MVEL]
-* xref:components::ognl-language.adoc[OGNL]
+* xref:groovy-language.adoc[Groovy]
+* xref:spel-language.adoc[SpEL]
+* xref:mvel-language.adoc[MVEL]
+* xref:ognl-language.adoc[OGNL]
 
 The simple language uses `${body`} placeholders for complex expressions
 where the expression contains constant literals. The $\{ } placeholders
diff --git a/core/camel-core-languages/src/main/docs/tokenize-language.adoc b/core/camel-core-languages/src/main/docs/modules/languages/pages/tokenize-language.adoc
similarity index 100%
rename from core/camel-core-languages/src/main/docs/tokenize-language.adoc
rename to core/camel-core-languages/src/main/docs/modules/languages/pages/tokenize-language.adoc
diff --git a/docs/components/antora.yml b/core/camel-xml-jaxp/src/main/docs/antora.yml
similarity index 93%
copy from docs/components/antora.yml
copy to core/camel-xml-jaxp/src/main/docs/antora.yml
index b1f6bd8..88b7eba 100644
--- a/docs/components/antora.yml
+++ b/core/camel-xml-jaxp/src/main/docs/antora.yml
@@ -16,7 +16,4 @@
 #
 
 name: components
-title: Component reference
 version: latest
-nav:
-- modules/ROOT/nav.adoc
diff --git a/core/camel-xml-jaxp/src/main/docs/xtokenize-language.adoc b/core/camel-xml-jaxp/src/main/docs/modules/languages/pages/xtokenize-language.adoc
similarity index 100%
rename from core/camel-xml-jaxp/src/main/docs/xtokenize-language.adoc
rename to core/camel-xml-jaxp/src/main/docs/modules/languages/pages/xtokenize-language.adoc
diff --git a/docs/site.yml b/docs/antora-playbook-local-xref-check.yml
similarity index 75%
rename from docs/site.yml
rename to docs/antora-playbook-local-xref-check.yml
index 2d3808d..348c2af 100644
--- a/docs/site.yml
+++ b/docs/antora-playbook-local-xref-check.yml
@@ -20,10 +20,19 @@ site:
 
 content:
   sources:
-    - url: ../
+    - url: ./../
       branches: HEAD
       start_path: docs/user-manual
-    - url: ../
+    - url: ./../
+      branches: HEAD
+      start_path: core/camel-core-engine/src/main/docs
+    - url: ./../
+      branches: HEAD
+      start_path: core/camel-core-languages/src/main/docs
+    - url: ./../
+      branches: HEAD
+      start_path: core/camel-xml-jaxp/src/main/docs
+    - url: ./../
       branches: HEAD
       start_path: docs/components
 
diff --git a/docs/component-nav.adoc.template b/docs/component-dataformats-nav.adoc.template
similarity index 84%
copy from docs/component-nav.adoc.template
copy to docs/component-dataformats-nav.adoc.template
index 169357f..782103b 100644
--- a/docs/component-nav.adoc.template
+++ b/docs/component-dataformats-nav.adoc.template
@@ -1,4 +1,5 @@
 <!-- generated:txt -->
 <!-- endinject -->
+* Data Formats
 <!-- inject:adoc -->
 <!-- endinject -->
diff --git a/docs/component-nav.adoc.template b/docs/component-languages-nav.adoc.template
similarity index 87%
copy from docs/component-nav.adoc.template
copy to docs/component-languages-nav.adoc.template
index 169357f..227dc6c 100644
--- a/docs/component-nav.adoc.template
+++ b/docs/component-languages-nav.adoc.template
@@ -1,4 +1,5 @@
 <!-- generated:txt -->
 <!-- endinject -->
+* Languages
 <!-- inject:adoc -->
 <!-- endinject -->
diff --git a/docs/component-nav.adoc.template b/docs/component-nav.adoc.template
index 169357f..e4afbae 100644
--- a/docs/component-nav.adoc.template
+++ b/docs/component-nav.adoc.template
@@ -1,4 +1,5 @@
 <!-- generated:txt -->
 <!-- endinject -->
+* Components
 <!-- inject:adoc -->
 <!-- endinject -->
diff --git a/docs/components/antora.yml b/docs/components/antora.yml
index b1f6bd8..98806e4 100644
--- a/docs/components/antora.yml
+++ b/docs/components/antora.yml
@@ -19,4 +19,6 @@ name: components
 title: Component reference
 version: latest
 nav:
-- modules/ROOT/nav.adoc
+  - modules/ROOT/nav.adoc
+  - modules/dataformats/nav.adoc
+  - modules/languages/nav.adoc
diff --git a/docs/components/modules/ROOT/nav.adoc b/docs/components/modules/ROOT/nav.adoc
index a076f6a..612564f 100644
--- a/docs/components/modules/ROOT/nav.adoc
+++ b/docs/components/modules/ROOT/nav.adoc
@@ -1,430 +1,379 @@
 // this file is auto generated and changes to it will be overwritten
 // make edits in docs/*nav.adoc.template files instead
 
-* xref:activemq-component.adoc[ActiveMQ Component]
-* xref:ahc-ws-component.adoc[AHC Websocket Component]
-* xref:ahc-component.adoc[AHC Component]
-* xref:amqp-component.adoc[AMQP Component]
-* xref:any23-dataformat.adoc[Any23 DataFormat]
-* xref:apns-component.adoc[APNS Component]
-* xref:as2-component.adoc[AS2 Component]
-* xref:asn1-dataformat.adoc[ASN.1 File DataFormat]
-* xref:asterisk-component.adoc[Asterisk Component]
-* xref:atmos-component.adoc[Atmos Component]
-* xref:atmosphere-websocket-component.adoc[Atmosphere Websocket Component]
-* xref:atom-component.adoc[Atom Component]
-* xref:atomix-map-component.adoc[Atomix Map Component]
-* xref:atomix-messaging-component.adoc[Atomix Messaging Component]
-* xref:atomix-multimap-component.adoc[Atomix MultiMap Component]
-* xref:atomix-queue-component.adoc[Atomix Queue Component]
-* xref:atomix-set-component.adoc[Atomix Set Component]
-* xref:atomix-value-component.adoc[Atomix Value Component]
-* xref:attachments.adoc[Attachments Component]
-* xref:avro-component.adoc[Avro Component]
-* xref:avro-dataformat.adoc[Avro DataFormat]
-* xref:aws-cw-component.adoc[AWS CloudWatch Component]
-* xref:aws-ddb-component.adoc[AWS DynamoDB Component]
-* xref:aws-ddbstream-component.adoc[AWS DynamoDB Streams Component]
-* xref:aws-ec2-component.adoc[AWS EC2 Component]
-* xref:aws-ecs-component.adoc[AWS ECS Component]
-* xref:aws-eks-component.adoc[AWS EKS Component]
-* xref:aws-iam-component.adoc[AWS IAM Component]
-* xref:aws-kinesis-component.adoc[AWS Kinesis Component]
-* xref:aws-kinesis-firehose-component.adoc[AWS Kinesis Firehose Component]
-* xref:aws-kms-component.adoc[AWS KMS Component]
-* xref:aws-lambda-component.adoc[AWS Lambda Component]
-* xref:aws-mq-component.adoc[AWS MQ Component]
-* xref:aws-msk-component.adoc[AWS MSK Component]
-* xref:aws-s3-component.adoc[AWS S3 Storage Service Component]
-* xref:aws-sdb-component.adoc[AWS SimpleDB Component]
-* xref:aws-ses-component.adoc[AWS Simple Email Service Component]
-* xref:aws-sns-component.adoc[AWS Simple Notification System Component]
-* xref:aws-sqs-component.adoc[AWS Simple Queue Service Component]
-* xref:aws-swf-component.adoc[AWS Simple Workflow Component]
-* xref:aws-translate-component.adoc[AWS Translate Component]
-* xref:aws-xray.adoc[AWS XRay Component]
-* xref:aws2-cw-component.adoc[AWS 2 CloudWatch Component]
-* xref:aws2-ddb-component.adoc[AWS 2 DynamoDB Component]
-* xref:aws2-ddbstream-component.adoc[AWS 2 DynamoDB Streams Component]
-* xref:aws2-ec2-component.adoc[AWS 2 EC2 Component]
-* xref:aws2-ecs-component.adoc[AWS 2 ECS Component]
-* xref:aws2-eks-component.adoc[AWS 2 EKS Component]
-* xref:aws2-iam-component.adoc[AWS 2 IAM Component]
-* xref:aws2-kinesis-component.adoc[AWS 2 Kinesis Component]
-* xref:aws2-kinesis-firehose-component.adoc[AWS 2 Kinesis Firehose Component]
-* xref:aws2-kms-component.adoc[AWS 2 KMS Component]
-* xref:aws2-lambda-component.adoc[AWS Lambda Component]
-* xref:aws2-mq-component.adoc[AWS 2 MQ Component]
-* xref:aws2-msk-component.adoc[AWS 2 MSK Component]
-* xref:aws2-s3-component.adoc[AWS2 S3 Storage Service Component]
-* xref:aws2-ses-component.adoc[AWS 2 Simple Email Service Component]
-* xref:aws2-sns-component.adoc[AWS 2 Simple Notification System Component]
-* xref:aws2-sqs-component.adoc[AWS 2 Simple Queue Service Component]
-* xref:aws2-translate-component.adoc[AWS 2 Translate Component]
-* xref:azure-blob-component.adoc[Azure Storage Blob Service Component]
-* xref:azure-queue-component.adoc[Azure Storage Queue Service Component]
-* xref:azure.adoc[Camel Components for Windows Azure Services]
-* xref:barcode-dataformat.adoc[Barcode DataFormat]
-* xref:base64-dataformat.adoc[Base64 DataFormat]
-* xref:bean-validator-component.adoc[Bean Validator Component]
-* xref:bean-component.adoc[Bean Component]
-* xref:bean-language.adoc[Bean method Language]
-* xref:class-component.adoc[Class Component]
-* xref:beanio-dataformat.adoc[BeanIO DataFormat]
-* xref:beanstalk-component.adoc[Beanstalk Component]
-* xref:bindy-dataformat.adoc[Bindy DataFormat]
-* xref:blueprint.adoc[Using OSGi blueprint with Camel]
-* xref:bonita-component.adoc[Bonita Component]
-* xref:box-component.adoc[Box Component]
-* xref:braintree-component.adoc[Braintree Component]
-* xref:browse-component.adoc[Browse Component]
-* xref:caffeine-cache-component.adoc[Caffeine Cache Component]
-* xref:caffeine-loadcache-component.adoc[Caffeine LoadCache Component]
-* xref:cql-component.adoc[Cassandra CQL Component]
-* xref:cbor-dataformat.adoc[CBOR DataFormat]
-* xref:cdi.adoc[Camel CDI]
-* xref:chatscript-component.adoc[ChatScript Component]
-* xref:chunk-component.adoc[Chunk Component]
-* xref:cm-sms-component.adoc[CM SMS Gateway Component]
-* xref:cmis-component.adoc[CMIS Component]
-* xref:coap-component.adoc[CoAP Component]
-* xref:cometd-component.adoc[CometD Component]
-* xref:consul-component.adoc[Consul Component]
-* xref:controlbus-component.adoc[Control Bus Component]
-* xref:corda-component.adoc[Corda Component]
-* xref:couchbase-component.adoc[Couchbase Component]
-* xref:couchdb-component.adoc[CouchDB Component]
-* xref:cron-component.adoc[Cron Component]
-* xref:crypto-cms-component.adoc[Crypto CMS Component (deprecated)]
-* xref:crypto-component.adoc[Crypto (JCE) Component]
-* xref:crypto-dataformat.adoc[Crypto (Java Cryptographic Extension) DataFormat]
-* xref:pgp-dataformat.adoc[PGP DataFormat]
-* xref:csv-dataformat.adoc[CSV DataFormat]
-* xref:cxf-transport.adoc[CXF Transport Component]
-* xref:cxf-component.adoc[CXF Component]
-* xref:cxfrs-component.adoc[CXF-RS Component]
-* xref:dataformat-component.adoc[Data Format Component]
-* xref:dataset-component.adoc[Dataset Component]
-* xref:dataset-test-component.adoc[DataSet Test Component]
-* xref:debezium-mongodb-component.adoc[Debezium MongoDB Connector Component]
-* xref:debezium-mysql-component.adoc[Debezium MySQL Connector Component]
-* xref:debezium-postgres-component.adoc[Debezium PostgresSQL Connector Component]
-* xref:debezium-sqlserver-component.adoc[Debezium SQL Server Connector Component]
-* xref:digitalocean-component.adoc[DigitalOcean Component]
-* xref:direct-component.adoc[Direct Component]
-* xref:direct-vm-component.adoc[Direct VM Component]
-* xref:disruptor-component.adoc[Disruptor Component]
-* xref:dns-component.adoc[DNS Component]
-* xref:docker-component.adoc[Docker Component]
-* xref:dozer-component.adoc[Dozer Component]
-* xref:drill-component.adoc[Drill Component]
-* xref:dropbox-component.adoc[Dropbox Component]
-* xref:ehcache-component.adoc[Ehcache Component]
-* xref:elasticsearch-rest-component.adoc[Elastichsearch Rest Component]
-* xref:elsql-component.adoc[ElSQL Component]
-* xref:elytron-component.adoc[Elytron Component]
-* xref:etcd-keys-component.adoc[Etcd Keys Component]
-* xref:etcd-stats-component.adoc[Etcd Stats Component]
-* xref:etcd-watch-component.adoc[Etcd Watch Component]
-* xref:eventadmin-component.adoc[OSGi EventAdmin Component]
-* xref:exec-component.adoc[Exec Component]
-* xref:facebook-component.adoc[Facebook Component]
-* xref:json-fastjson-dataformat.adoc[JSon Fastjson DataFormat]
-* xref:fhir-component.adoc[FHIR Component]
-* xref:fhirJson-dataformat.adoc[FHIR JSon DataFormat]
-* xref:fhirXml-dataformat.adoc[FHIR XML DataFormat]
-* xref:file-watch-component.adoc[File Watch Component]
-* xref:file-component.adoc[File Component]
-* xref:flatpack-component.adoc[Flatpack Component]
-* xref:flatpack-dataformat.adoc[Flatpack DataFormat]
-* xref:flink-component.adoc[Flink Component]
-* xref:fop-component.adoc[FOP Component]
-* xref:freemarker-component.adoc[Freemarker Component]
-* xref:ftp-component.adoc[FTP Component]
-* xref:ftps-component.adoc[FTPS Component]
-* xref:sftp-component.adoc[SFTP Component]
-* xref:ganglia-component.adoc[Ganglia Component]
-* xref:geocoder-component.adoc[Geocoder Component]
-* xref:git-component.adoc[Git Component]
-* xref:github-component.adoc[GitHub Component]
-* xref:google-bigquery-component.adoc[Google BigQuery Component]
-* xref:google-bigquery-sql-component.adoc[Google BigQuery Standard SQL Component]
-* xref:google-calendar-component.adoc[Google Calendar Component]
-* xref:google-calendar-stream-component.adoc[Google Calendar Stream Component]
-* xref:google-drive-component.adoc[Google Drive Component]
-* xref:google-mail-component.adoc[Google Mail Component]
-* xref:google-mail-stream-component.adoc[Google Mail Stream Component]
-* xref:google-pubsub-component.adoc[Google Pubsub Component]
-* xref:google-sheets-component.adoc[Google Sheets Component]
-* xref:google-sheets-stream-component.adoc[Google Sheets Stream Component]
-* xref:gora-component.adoc[Gora Component]
-* xref:grape-component.adoc[Grape Component]
-* xref:graphql-component.adoc[GraphQL Component]
-* xref:grok-dataformat.adoc[Grok DataFormat]
-* xref:groovy-language.adoc[Groovy Language]
-* xref:grpc-component.adoc[gRPC Component]
-* xref:json-gson-dataformat.adoc[JSon GSon DataFormat]
-* xref:guava-eventbus-component.adoc[Guava EventBus Component]
-* xref:hazelcast-atomicvalue-component.adoc[Hazelcast Atomic Number Component]
-* xref:hazelcast-instance-component.adoc[Hazelcast Instance Component]
-* xref:hazelcast-list-component.adoc[Hazelcast List Component]
-* xref:hazelcast-map-component.adoc[Hazelcast Map Component]
-* xref:hazelcast-multimap-component.adoc[Hazelcast Multimap Component]
-* xref:hazelcast-queue-component.adoc[Hazelcast Queue Component]
-* xref:hazelcast-replicatedmap-component.adoc[Hazelcast Replicated Map Component]
-* xref:hazelcast-ringbuffer-component.adoc[Hazelcast Ringbuffer Component]
-* xref:hazelcast-seda-component.adoc[Hazelcast SEDA Component]
-* xref:hazelcast-set-component.adoc[Hazelcast Set Component]
-* xref:hazelcast-topic-component.adoc[Hazelcast Topic Component]
-* xref:hazelcast.adoc[Hazelcast Component]
-* xref:hbase-component.adoc[HBase Component]
-* xref:hdfs-component.adoc[HDFS Component]
-* xref:hipchat-component.adoc[Hipchat Component]
-* xref:hl7-dataformat.adoc[HL7 DataFormat]
-* xref:hl7terser-language.adoc[HL7 Terser Language]
-* xref:http-component.adoc[HTTP Component]
-* xref:hystrix.adoc[Hystrix Component]
-* xref:ical-dataformat.adoc[iCal DataFormat]
-* xref:iec60870-client-component.adoc[IEC 60870 Client Component]
-* xref:iec60870-server-component.adoc[IEC 60870 Server Component]
-* xref:ignite-cache-component.adoc[Ignite Cache Component]
-* xref:ignite-compute-component.adoc[Ignite Compute Component]
-* xref:ignite-events-component.adoc[Ignite Events Component]
-* xref:ignite-idgen-component.adoc[Ignite ID Generator Component]
-* xref:ignite-messaging-component.adoc[Ignite Messaging Component]
-* xref:ignite-queue-component.adoc[Ignite Queues Component]
-* xref:ignite-set-component.adoc[Ignite Sets Component]
-* xref:ignite.adoc[Ignite endpoints Component]
-* xref:infinispan-component.adoc[Infinispan Component]
-* xref:influxdb-component.adoc[InfluxDB Component]
-* xref:iota-component.adoc[IOTA Component]
-* xref:ipfs-component.adoc[IPFS Component]
-* xref:irc-component.adoc[IRC Component]
-* xref:ironmq-component.adoc[IronMQ Component]
-* xref:json-jackson-dataformat.adoc[JSon Jackson DataFormat]
-* xref:jacksonxml-dataformat.adoc[JacksonXML DataFormat]
-* xref:jasypt.adoc[Jasypt component]
-* xref:jaxb-dataformat.adoc[JAXB DataFormat]
-* xref:jbpm-component.adoc[JBPM Component]
-* xref:jcache-component.adoc[JCache Component]
-* xref:jclouds-component.adoc[JClouds Component]
-* xref:jcr-component.adoc[JCR Component]
-* xref:jdbc-component.adoc[JDBC Component]
-* xref:jetty-component.adoc[Jetty Component]
-* xref:jgroups-raft-component.adoc[JGroups raft Component]
-* xref:jgroups-component.adoc[JGroups Component]
-* xref:jing-component.adoc[Jing Component]
-* xref:jira-component.adoc[Jira Component]
-* xref:jms-component.adoc[JMS Component]
-* xref:jmx-component.adoc[JMX Component]
-* xref:json-johnzon-dataformat.adoc[JSon Johnzon DataFormat]
-* xref:jolt-component.adoc[JOLT Component]
-* xref:jooq-component.adoc[JOOQ Component]
-* xref:jpa-component.adoc[JPA Component]
-* xref:scp-component.adoc[SCP Component]
-* xref:jslt-component.adoc[JSLT Component]
-* xref:json-validator-component.adoc[JSON Schema Validator Component]
-* xref:jsonApi-dataformat.adoc[JSonApi DataFormat]
-* xref:jsonpath-language.adoc[JsonPath Language]
-* xref:jt400-component.adoc[JT400 Component]
-* xref:kafka-component.adoc[Kafka Component]
-* xref:kubernetes-config-maps-component.adoc[Kubernetes ConfigMap Component]
-* xref:kubernetes-deployments-component.adoc[Kubernetes Deployments Component]
-* xref:kubernetes-hpa-component.adoc[Kubernetes HPA Component]
-* xref:kubernetes-job-component.adoc[Kubernetes Job Component]
-* xref:kubernetes-namespaces-component.adoc[Kubernetes Namespaces Component]
-* xref:kubernetes-nodes-component.adoc[Kubernetes Nodes Component]
-* xref:kubernetes-persistent-volumes-claims-component.adoc[Kubernetes Persistent Volume Claim Component]
-* xref:kubernetes-persistent-volumes-component.adoc[Kubernetes Persistent Volume Component]
-* xref:kubernetes-pods-component.adoc[Kubernetes Pods Component]
-* xref:kubernetes-replication-controllers-component.adoc[Kubernetes Replication Controller Component]
-* xref:kubernetes-resources-quota-component.adoc[Kubernetes Resources Quota Component]
-* xref:kubernetes-secrets-component.adoc[Kubernetes Secrets Component]
-* xref:kubernetes-service-accounts-component.adoc[Kubernetes Service Account Component]
-* xref:kubernetes-services-component.adoc[Kubernetes Services Component]
-* xref:kubernetes.adoc[Kubernetes Components]
-* xref:openshift-build-configs-component.adoc[Openshift Build Config Component]
-* xref:openshift-builds-component.adoc[Openshift Builds Component]
-* xref:kudu-component.adoc[Kudu Component]
-* xref:kura.adoc[Eclipse Kura component]
-* xref:language-component.adoc[Language Component]
-* xref:ldap-component.adoc[LDAP Component]
-* xref:ldif-component.adoc[LDIF Component]
-* xref:leveldb.adoc[LevelDB]
-* xref:log-component.adoc[Log Component]
-* xref:lra.adoc[LRA Component]
-* xref:lucene-component.adoc[Lucene Component]
-* xref:lumberjack-component.adoc[Lumberjack Component]
-* xref:lzf-dataformat.adoc[LZF Deflate Compression DataFormat]
-* xref:mail-component.adoc[Mail Component]
-* xref:mime-multipart-dataformat.adoc[MIME Multipart DataFormat]
-* xref:master-component.adoc[Master Component]
-* xref:metrics-component.adoc[Metrics Component]
-* xref:micrometer-component.adoc[Micrometer Component]
-* xref:microprofile-config.adoc[MicroProfile Config]
-* xref:microprofile-health.adoc[MicroProfile Health]
-* xref:microprofile-metrics-component.adoc[MicroProfile Metrics Component]
-* xref:milo-client-component.adoc[OPC UA Client Component]
-* xref:milo-server-component.adoc[OPC UA Server Component]
-* xref:mina-component.adoc[Mina Component]
-* xref:mllp-component.adoc[MLLP Component]
-* xref:mock-component.adoc[Mock Component]
-* xref:mongodb-gridfs-component.adoc[MongoDB GridFS Component]
-* xref:mongodb-component.adoc[MongoDB Component]
-* xref:msv-component.adoc[MSV Component]
-* xref:mustache-component.adoc[Mustache Component]
-* xref:mvel-component.adoc[MVEL Component]
-* xref:mvel-language.adoc[MVEL Language]
-* xref:mybatis-bean-component.adoc[MyBatis Bean Component]
-* xref:mybatis-component.adoc[MyBatis Component]
-* xref:nagios-component.adoc[Nagios Component]
-* xref:nats-component.adoc[Nats Component]
-* xref:netty-http-component.adoc[Netty HTTP Component]
-* xref:netty-component.adoc[Netty Component]
-* xref:nitrite-component.adoc[Nitrite Component]
-* xref:nsq-component.adoc[NSQ Component]
-* xref:ognl-language.adoc[OGNL Language]
-* xref:olingo2-component.adoc[Olingo2 Component]
-* xref:olingo4-component.adoc[Olingo4 Component]
-* xref:openapi-java.adoc[OpenApi Java Component]
-* xref:openstack-cinder-component.adoc[OpenStack Cinder Component]
-* xref:openstack-glance-component.adoc[OpenStack Glance Component]
-* xref:openstack-keystone-component.adoc[OpenStack Keystone Component]
-* xref:openstack-neutron-component.adoc[OpenStack Neutron Component]
-* xref:openstack-nova-component.adoc[OpenStack Nova Component]
-* xref:openstack-swift-component.adoc[OpenStack Swift Component]
-* xref:openstack.adoc[Openstack Component]
-* xref:opentracing.adoc[OpenTracing Component]
-* xref:optaplanner-component.adoc[OptaPlanner Component]
-* xref:osgi-activator.adoc[OSGi Camel Routes Activator]
-* xref:paho-component.adoc[Paho Component]
-* xref:paxlogging-component.adoc[OSGi PAX Logging Component]
-* xref:pdf-component.adoc[PDF Component]
-* xref:pg-replication-slot-component.adoc[PostgresSQL Replication Slot Component]
-* xref:pgevent-component.adoc[PostgresSQL Event Component]
-* xref:platform-http-component.adoc[Platform HTTP Component]
-* xref:lpr-component.adoc[Printer Component]
-* xref:protobuf-dataformat.adoc[Protobuf DataFormat]
-* xref:pubnub-component.adoc[PubNub Component]
-* xref:pulsar-component.adoc[Pulsar Component]
-* xref:quartz-component.adoc[Quartz Component]
-* xref:quickfix-component.adoc[QuickFix Component]
-* xref:rabbitmq-component.adoc[RabbitMQ Component]
-* xref:reactive-executor-vertx.adoc[ReactiveExecutor VertX]
-* xref:reactive-streams-component.adoc[Reactive Streams Component]
-* xref:reactor.adoc[Reactor Component]
-* xref:ref-component.adoc[Ref Component]
-* xref:resilience4j.adoc[Resilience4j Component]
-* xref:rest-openapi-component.adoc[REST OpenApi Component]
-* xref:rest-swagger-component.adoc[REST Swagger Component]
-* xref:rest-api-component.adoc[REST API Component]
-* xref:rest-component.adoc[REST Component]
-* xref:ribbon.adoc[Ribbon Component]
-* xref:robotframework-component.adoc[Robot Framework Component]
-* xref:rss-component.adoc[RSS Component]
-* xref:rss-dataformat.adoc[RSS DataFormat]
-* xref:rxjava.adoc[RxJava Component]
-* xref:saga-component.adoc[Saga Component]
-* xref:salesforce-component.adoc[Salesforce Component]
-* xref:sap-netweaver-component.adoc[SAP NetWeaver Component]
-* xref:xquery-component.adoc[XQuery Component]
-* xref:xquery-language.adoc[XQuery Language]
-* xref:scheduler-component.adoc[Scheduler Component]
-* xref:schematron-component.adoc[Schematron Component]
-* xref:seda-component.adoc[SEDA Component]
-* xref:service-component.adoc[Service Component]
-* xref:servicenow-component.adoc[ServiceNow Component]
-* xref:servlet-component.adoc[Servlet Component]
-* xref:shiro.adoc[Shiro Security Component]
-* xref:sip-component.adoc[SIP Component]
-* xref:sjms-batch-component.adoc[Simple JMS Batch Component]
-* xref:sjms-component.adoc[Simple JMS Component]
-* xref:sjms2-component.adoc[Simple JMS2 Component]
-* xref:slack-component.adoc[Slack Component]
-* xref:smpp-component.adoc[SMPP Component]
-* xref:yaml-snakeyaml-dataformat.adoc[YAML SnakeYAML DataFormat]
-* xref:snmp-component.adoc[SNMP Component]
-* xref:soapjaxb-dataformat.adoc[SOAP DataFormat]
-* xref:solr-component.adoc[Solr Component]
-* xref:soroush-component.adoc[Soroush Component]
-* xref:spark-rest-component.adoc[Spark Rest Component]
-* xref:spark-component.adoc[Spark Component]
-* xref:splunk-component.adoc[Splunk Component]
-* xref:spring-batch-component.adoc[Spring Batch Component]
-* xref:spring-integration-component.adoc[Spring Integration Component]
-* xref:spring-javaconfig.adoc[Spring Java Config]
-* xref:spring-ldap-component.adoc[Spring LDAP Component]
-* xref:spring-redis-component.adoc[Spring Redis Component]
-* xref:spring-security.adoc[Spring Security]
-* xref:spring-ws-component.adoc[Spring WebService Component]
-* xref:spel-language.adoc[SpEL Language]
-* xref:spring-event-component.adoc[Spring Event Component]
-* xref:spring.adoc[Spring Support]
-* xref:sql-component.adoc[SQL Component]
-* xref:sql-stored-component.adoc[SQL Stored Procedure Component]
-* xref:ssh-component.adoc[SSH Component]
-* xref:stax-component.adoc[StAX Component]
-* xref:stomp-component.adoc[Stomp Component]
-* xref:stream-component.adoc[Stream Component]
-* xref:string-template-component.adoc[String Template Component]
-* xref:stub-component.adoc[Stub Component]
-* xref:swagger-java.adoc[Swagger Java Component]
-* xref:syslog-dataformat.adoc[Syslog DataFormat]
-* xref:tidyMarkup-dataformat.adoc[TidyMarkup DataFormat]
-* xref:tarfile-dataformat.adoc[Tar File DataFormat]
-* xref:telegram-component.adoc[Telegram Component]
-* xref:test-blueprint.adoc[Blueprint Testing]
-* xref:test-cdi.adoc[CDI Testing]
-* xref:test-junit5.adoc[Test Module]
-* xref:test-karaf.adoc[Test Karaf]
-* xref:test-spring-junit5.adoc[Camel Test Spring JUnit 5]
-* xref:test-spring.adoc[Test Spring]
-* xref:test.adoc[Test Module]
-* xref:testcontainers-junit5.adoc[Testcontainers]
-* xref:testcontainers-spring-junit5.adoc[Testcontainers Spring]
-* xref:testcontainers-spring.adoc[Testcontainers Spring]
-* xref:testcontainers.adoc[Testcontainers]
-* xref:thrift-component.adoc[Thrift Component]
-* xref:thrift-dataformat.adoc[Thrift DataFormat]
-* xref:tika-component.adoc[Tika Component]
-* xref:timer-component.adoc[Timer Component]
-* xref:twilio-component.adoc[Twilio Component]
-* xref:twitter-directmessage-component.adoc[Twitter Direct Message Component]
-* xref:twitter-search-component.adoc[Twitter Search Component]
-* xref:twitter-timeline-component.adoc[Twitter Timeline Component]
-* xref:undertow-component.adoc[Undertow Component]
-* xref:univocity-csv-dataformat.adoc[uniVocity CSV DataFormat]
-* xref:univocity-fixed-dataformat.adoc[uniVocity Fixed Length DataFormat]
-* xref:univocity-tsv-dataformat.adoc[uniVocity TSV DataFormat]
-* xref:validator-component.adoc[Validator Component]
-* xref:velocity-component.adoc[Velocity Component]
-* xref:vertx-component.adoc[Vert.x Component]
-* xref:vm-component.adoc[VM Component]
-* xref:weather-component.adoc[Weather Component]
-* xref:web3j-component.adoc[Web3j Ethereum Blockchain Component]
-* xref:webhook-component.adoc[Webhook Component]
-* xref:websocket-jsr356-component.adoc[Javax Websocket Component]
-* xref:websocket-component.adoc[Jetty Websocket Component]
-* xref:weka-component.adoc[Weka Component]
-* xref:wordpress-component.adoc[Wordpress Component]
-* xref:workday-component.adoc[Workday Component]
-* xref:xchange-component.adoc[XChange Component]
-* xref:xj-component.adoc[XJ Component]
-* xref:secureXML-dataformat.adoc[XML Security DataFormat]
-* xref:xmlsecurity-sign-component.adoc[XML Security Sign Component]
-* xref:xmlsecurity-verify-component.adoc[XML Security Verify Component]
-* xref:xmpp-component.adoc[XMPP Component]
-* xref:xpath-language.adoc[XPath Language]
-* xref:xslt-saxon-component.adoc[XSLT Saxon Component]
-* xref:xslt-component.adoc[XSLT Component]
-* xref:json-xstream-dataformat.adoc[JSon XStream DataFormat]
-* xref:xstream-dataformat.adoc[XStream DataFormat]
-* xref:yammer-component.adoc[Yammer Component]
-* xref:zendesk-component.adoc[Zendesk Component]
-* xref:gzipdeflater-dataformat.adoc[GZip Deflater DataFormat]
-* xref:zipdeflater-dataformat.adoc[Zip Deflate Compression DataFormat]
-* xref:zipfile-dataformat.adoc[Zip File DataFormat]
-* xref:zipkin.adoc[Zipkin Component]
-* xref:zookeeper-master-component.adoc[ZooKeeper Master Component]
-* xref:zookeeper-component.adoc[ZooKeeper Component]
-* xref:properties-component.adoc[Properties Component]
+* Components
+** xref:activemq-component.adoc[ActiveMQ Component]
+** xref:ahc-component.adoc[AHC Component]
+** xref:ahc-ws-component.adoc[AHC Websocket Component]
+** xref:amqp-component.adoc[AMQP Component]
+** xref:apns-component.adoc[APNS Component]
+** xref:as2-component.adoc[AS2 Component]
+** xref:asterisk-component.adoc[Asterisk Component]
+** xref:atmos-component.adoc[Atmos Component]
+** xref:atmosphere-websocket-component.adoc[Atmosphere Websocket Component]
+** xref:atom-component.adoc[Atom Component]
+** xref:atomix-map-component.adoc[Atomix Map Component]
+** xref:atomix-messaging-component.adoc[Atomix Messaging Component]
+** xref:atomix-multimap-component.adoc[Atomix MultiMap Component]
+** xref:atomix-queue-component.adoc[Atomix Queue Component]
+** xref:atomix-set-component.adoc[Atomix Set Component]
+** xref:atomix-value-component.adoc[Atomix Value Component]
+** xref:attachments.adoc[Attachments Component]
+** xref:avro-component.adoc[Avro Component]
+** xref:aws-cw-component.adoc[AWS CloudWatch Component]
+** xref:aws-ddb-component.adoc[AWS DynamoDB Component]
+** xref:aws-ddbstream-component.adoc[AWS DynamoDB Streams Component]
+** xref:aws-ec2-component.adoc[AWS EC2 Component]
+** xref:aws-ecs-component.adoc[AWS ECS Component]
+** xref:aws-eks-component.adoc[AWS EKS Component]
+** xref:aws-iam-component.adoc[AWS IAM Component]
+** xref:aws-kinesis-component.adoc[AWS Kinesis Component]
+** xref:aws-kinesis-firehose-component.adoc[AWS Kinesis Firehose Component]
+** xref:aws-kms-component.adoc[AWS KMS Component]
+** xref:aws-lambda-component.adoc[AWS Lambda Component]
+** xref:aws-mq-component.adoc[AWS MQ Component]
+** xref:aws-msk-component.adoc[AWS MSK Component]
+** xref:aws-s3-component.adoc[AWS S3 Storage Service Component]
+** xref:aws-sdb-component.adoc[AWS SimpleDB Component]
+** xref:aws-ses-component.adoc[AWS Simple Email Service Component]
+** xref:aws-sns-component.adoc[AWS Simple Notification System Component]
+** xref:aws-sqs-component.adoc[AWS Simple Queue Service Component]
+** xref:aws-swf-component.adoc[AWS Simple Workflow Component]
+** xref:aws-translate-component.adoc[AWS Translate Component]
+** xref:aws-xray.adoc[AWS XRay Component]
+** xref:aws2-cw-component.adoc[AWS 2 CloudWatch Component]
+** xref:aws2-ddb-component.adoc[AWS 2 DynamoDB Component]
+** xref:aws2-ddbstream-component.adoc[AWS 2 DynamoDB Streams Component]
+** xref:aws2-ec2-component.adoc[AWS 2 EC2 Component]
+** xref:aws2-ecs-component.adoc[AWS 2 ECS Component]
+** xref:aws2-eks-component.adoc[AWS 2 EKS Component]
+** xref:aws2-iam-component.adoc[AWS 2 IAM Component]
+** xref:aws2-kinesis-component.adoc[AWS 2 Kinesis Component]
+** xref:aws2-kinesis-firehose-component.adoc[AWS 2 Kinesis Firehose Component]
+** xref:aws2-kms-component.adoc[AWS 2 KMS Component]
+** xref:aws2-lambda-component.adoc[AWS Lambda Component]
+** xref:aws2-mq-component.adoc[AWS 2 MQ Component]
+** xref:aws2-msk-component.adoc[AWS 2 MSK Component]
+** xref:aws2-s3-component.adoc[AWS2 S3 Storage Service Component]
+** xref:aws2-ses-component.adoc[AWS 2 Simple Email Service Component]
+** xref:aws2-sns-component.adoc[AWS 2 Simple Notification System Component]
+** xref:aws2-sqs-component.adoc[AWS 2 Simple Queue Service Component]
+** xref:aws2-translate-component.adoc[AWS 2 Translate Component]
+** xref:azure-blob-component.adoc[Azure Storage Blob Service Component]
+** xref:azure-queue-component.adoc[Azure Storage Queue Service Component]
+** xref:azure.adoc[Camel Components for Windows Azure Services]
+** xref:bean-component.adoc[Bean Component]
+** xref:bean-validator-component.adoc[Bean Validator Component]
+** xref:beanstalk-component.adoc[Beanstalk Component]
+** xref:blueprint.adoc[Using OSGi blueprint with Camel]
+** xref:bonita-component.adoc[Bonita Component]
+** xref:box-component.adoc[Box Component]
+** xref:braintree-component.adoc[Braintree Component]
+** xref:browse-component.adoc[Browse Component]
+** xref:caffeine-cache-component.adoc[Caffeine Cache Component]
+** xref:caffeine-loadcache-component.adoc[Caffeine LoadCache Component]
+** xref:cdi.adoc[Camel CDI]
+** xref:chatscript-component.adoc[ChatScript Component]
+** xref:chunk-component.adoc[Chunk Component]
+** xref:class-component.adoc[Class Component]
+** xref:cm-sms-component.adoc[CM SMS Gateway Component]
+** xref:cmis-component.adoc[CMIS Component]
+** xref:coap-component.adoc[CoAP Component]
+** xref:cometd-component.adoc[CometD Component]
+** xref:consul-component.adoc[Consul Component]
+** xref:controlbus-component.adoc[Control Bus Component]
+** xref:corda-component.adoc[Corda Component]
+** xref:couchbase-component.adoc[Couchbase Component]
+** xref:couchdb-component.adoc[CouchDB Component]
+** xref:cql-component.adoc[Cassandra CQL Component]
+** xref:cron-component.adoc[Cron Component]
+** xref:crypto-cms-component.adoc[Crypto CMS Component (deprecated)]
+** xref:crypto-component.adoc[Crypto (JCE) Component]
+** xref:cxf-component.adoc[CXF Component]
+** xref:cxf-transport.adoc[CXF Transport Component]
+** xref:cxfrs-component.adoc[CXF-RS Component]
+** xref:dataformat-component.adoc[Data Format Component]
+** xref:dataset-component.adoc[Dataset Component]
+** xref:dataset-test-component.adoc[DataSet Test Component]
+** xref:debezium-mongodb-component.adoc[Debezium MongoDB Connector Component]
+** xref:debezium-mysql-component.adoc[Debezium MySQL Connector Component]
+** xref:debezium-postgres-component.adoc[Debezium PostgresSQL Connector Component]
+** xref:debezium-sqlserver-component.adoc[Debezium SQL Server Connector Component]
+** xref:digitalocean-component.adoc[DigitalOcean Component]
+** xref:direct-component.adoc[Direct Component]
+** xref:direct-vm-component.adoc[Direct VM Component]
+** xref:disruptor-component.adoc[Disruptor Component]
+** xref:dns-component.adoc[DNS Component]
+** xref:docker-component.adoc[Docker Component]
+** xref:dozer-component.adoc[Dozer Component]
+** xref:drill-component.adoc[Drill Component]
+** xref:dropbox-component.adoc[Dropbox Component]
+** xref:ehcache-component.adoc[Ehcache Component]
+** xref:elasticsearch-rest-component.adoc[Elastichsearch Rest Component]
+** xref:elsql-component.adoc[ElSQL Component]
+** xref:elytron-component.adoc[Elytron Component]
+** xref:etcd-keys-component.adoc[Etcd Keys Component]
+** xref:etcd-stats-component.adoc[Etcd Stats Component]
+** xref:etcd-watch-component.adoc[Etcd Watch Component]
+** xref:eventadmin-component.adoc[OSGi EventAdmin Component]
+** xref:exec-component.adoc[Exec Component]
+** xref:facebook-component.adoc[Facebook Component]
+** xref:fhir-component.adoc[FHIR Component]
+** xref:file-component.adoc[File Component]
+** xref:file-watch-component.adoc[File Watch Component]
+** xref:flatpack-component.adoc[Flatpack Component]
+** xref:flink-component.adoc[Flink Component]
+** xref:fop-component.adoc[FOP Component]
+** xref:freemarker-component.adoc[Freemarker Component]
+** xref:ftp-component.adoc[FTP Component]
+** xref:ftps-component.adoc[FTPS Component]
+** xref:ganglia-component.adoc[Ganglia Component]
+** xref:geocoder-component.adoc[Geocoder Component]
+** xref:git-component.adoc[Git Component]
+** xref:github-component.adoc[GitHub Component]
+** xref:google-bigquery-component.adoc[Google BigQuery Component]
+** xref:google-bigquery-sql-component.adoc[Google BigQuery Standard SQL Component]
+** xref:google-calendar-component.adoc[Google Calendar Component]
+** xref:google-calendar-stream-component.adoc[Google Calendar Stream Component]
+** xref:google-drive-component.adoc[Google Drive Component]
+** xref:google-mail-component.adoc[Google Mail Component]
+** xref:google-mail-stream-component.adoc[Google Mail Stream Component]
+** xref:google-pubsub-component.adoc[Google Pubsub Component]
+** xref:google-sheets-component.adoc[Google Sheets Component]
+** xref:google-sheets-stream-component.adoc[Google Sheets Stream Component]
+** xref:gora-component.adoc[Gora Component]
+** xref:grape-component.adoc[Grape Component]
+** xref:graphql-component.adoc[GraphQL Component]
+** xref:grpc-component.adoc[gRPC Component]
+** xref:guava-eventbus-component.adoc[Guava EventBus Component]
+** xref:hazelcast-atomicvalue-component.adoc[Hazelcast Atomic Number Component]
+** xref:hazelcast-instance-component.adoc[Hazelcast Instance Component]
+** xref:hazelcast-list-component.adoc[Hazelcast List Component]
+** xref:hazelcast-map-component.adoc[Hazelcast Map Component]
+** xref:hazelcast-multimap-component.adoc[Hazelcast Multimap Component]
+** xref:hazelcast-queue-component.adoc[Hazelcast Queue Component]
+** xref:hazelcast-replicatedmap-component.adoc[Hazelcast Replicated Map Component]
+** xref:hazelcast-ringbuffer-component.adoc[Hazelcast Ringbuffer Component]
+** xref:hazelcast-seda-component.adoc[Hazelcast SEDA Component]
+** xref:hazelcast-set-component.adoc[Hazelcast Set Component]
+** xref:hazelcast-topic-component.adoc[Hazelcast Topic Component]
+** xref:hazelcast.adoc[Hazelcast Component]
+** xref:hbase-component.adoc[HBase Component]
+** xref:hdfs-component.adoc[HDFS Component]
+** xref:hipchat-component.adoc[Hipchat Component]
+** xref:http-component.adoc[HTTP Component]
+** xref:hystrix.adoc[Hystrix Component]
+** xref:iec60870-client-component.adoc[IEC 60870 Client Component]
+** xref:iec60870-server-component.adoc[IEC 60870 Server Component]
+** xref:ignite-cache-component.adoc[Ignite Cache Component]
+** xref:ignite-compute-component.adoc[Ignite Compute Component]
+** xref:ignite-events-component.adoc[Ignite Events Component]
+** xref:ignite-idgen-component.adoc[Ignite ID Generator Component]
+** xref:ignite-messaging-component.adoc[Ignite Messaging Component]
+** xref:ignite-queue-component.adoc[Ignite Queues Component]
+** xref:ignite-set-component.adoc[Ignite Sets Component]
+** xref:ignite.adoc[Ignite endpoints Component]
+** xref:infinispan-component.adoc[Infinispan Component]
+** xref:influxdb-component.adoc[InfluxDB Component]
+** xref:iota-component.adoc[IOTA Component]
+** xref:ipfs-component.adoc[IPFS Component]
+** xref:irc-component.adoc[IRC Component]
+** xref:ironmq-component.adoc[IronMQ Component]
+** xref:jasypt.adoc[Jasypt component]
+** xref:jbpm-component.adoc[JBPM Component]
+** xref:jcache-component.adoc[JCache Component]
+** xref:jclouds-component.adoc[JClouds Component]
+** xref:jcr-component.adoc[JCR Component]
+** xref:jdbc-component.adoc[JDBC Component]
+** xref:jetty-component.adoc[Jetty Component]
+** xref:jgroups-component.adoc[JGroups Component]
+** xref:jgroups-raft-component.adoc[JGroups raft Component]
+** xref:jing-component.adoc[Jing Component]
+** xref:jira-component.adoc[Jira Component]
+** xref:jms-component.adoc[JMS Component]
+** xref:jmx-component.adoc[JMX Component]
+** xref:jolt-component.adoc[JOLT Component]
+** xref:jooq-component.adoc[JOOQ Component]
+** xref:jpa-component.adoc[JPA Component]
+** xref:jslt-component.adoc[JSLT Component]
+** xref:json-validator-component.adoc[JSON Schema Validator Component]
+** xref:jt400-component.adoc[JT400 Component]
+** xref:kafka-component.adoc[Kafka Component]
+** xref:kubernetes-config-maps-component.adoc[Kubernetes ConfigMap Component]
+** xref:kubernetes-deployments-component.adoc[Kubernetes Deployments Component]
+** xref:kubernetes-hpa-component.adoc[Kubernetes HPA Component]
+** xref:kubernetes-job-component.adoc[Kubernetes Job Component]
+** xref:kubernetes-namespaces-component.adoc[Kubernetes Namespaces Component]
+** xref:kubernetes-nodes-component.adoc[Kubernetes Nodes Component]
+** xref:kubernetes-persistent-volumes-claims-component.adoc[Kubernetes Persistent Volume Claim Component]
+** xref:kubernetes-persistent-volumes-component.adoc[Kubernetes Persistent Volume Component]
+** xref:kubernetes-pods-component.adoc[Kubernetes Pods Component]
+** xref:kubernetes-replication-controllers-component.adoc[Kubernetes Replication Controller Component]
+** xref:kubernetes-resources-quota-component.adoc[Kubernetes Resources Quota Component]
+** xref:kubernetes-secrets-component.adoc[Kubernetes Secrets Component]
+** xref:kubernetes-service-accounts-component.adoc[Kubernetes Service Account Component]
+** xref:kubernetes-services-component.adoc[Kubernetes Services Component]
+** xref:kubernetes.adoc[Kubernetes Components]
+** xref:kudu-component.adoc[Kudu Component]
+** xref:kura.adoc[Eclipse Kura component]
+** xref:language-component.adoc[Language Component]
+** xref:ldap-component.adoc[LDAP Component]
+** xref:ldif-component.adoc[LDIF Component]
+** xref:leveldb.adoc[LevelDB]
+** xref:log-component.adoc[Log Component]
+** xref:lpr-component.adoc[Printer Component]
+** xref:lra.adoc[LRA Component]
+** xref:lucene-component.adoc[Lucene Component]
+** xref:lumberjack-component.adoc[Lumberjack Component]
+** xref:mail-component.adoc[Mail Component]
+** xref:master-component.adoc[Master Component]
+** xref:metrics-component.adoc[Metrics Component]
+** xref:micrometer-component.adoc[Micrometer Component]
+** xref:microprofile-config.adoc[MicroProfile Config]
+** xref:microprofile-health.adoc[MicroProfile Health]
+** xref:microprofile-metrics-component.adoc[MicroProfile Metrics Component]
+** xref:milo-client-component.adoc[OPC UA Client Component]
+** xref:milo-server-component.adoc[OPC UA Server Component]
+** xref:mina-component.adoc[Mina Component]
+** xref:mllp-component.adoc[MLLP Component]
+** xref:mock-component.adoc[Mock Component]
+** xref:mongodb-component.adoc[MongoDB Component]
+** xref:mongodb-gridfs-component.adoc[MongoDB GridFS Component]
+** xref:msv-component.adoc[MSV Component]
+** xref:mustache-component.adoc[Mustache Component]
+** xref:mvel-component.adoc[MVEL Component]
+** xref:mybatis-bean-component.adoc[MyBatis Bean Component]
+** xref:mybatis-component.adoc[MyBatis Component]
+** xref:nagios-component.adoc[Nagios Component]
+** xref:nats-component.adoc[Nats Component]
+** xref:netty-component.adoc[Netty Component]
+** xref:netty-http-component.adoc[Netty HTTP Component]
+** xref:nitrite-component.adoc[Nitrite Component]
+** xref:nsq-component.adoc[NSQ Component]
+** xref:olingo2-component.adoc[Olingo2 Component]
+** xref:olingo4-component.adoc[Olingo4 Component]
+** xref:openapi-java.adoc[OpenApi Java Component]
+** xref:openshift-build-configs-component.adoc[Openshift Build Config Component]
+** xref:openshift-builds-component.adoc[Openshift Builds Component]
+** xref:openstack-cinder-component.adoc[OpenStack Cinder Component]
+** xref:openstack-glance-component.adoc[OpenStack Glance Component]
+** xref:openstack-keystone-component.adoc[OpenStack Keystone Component]
+** xref:openstack-neutron-component.adoc[OpenStack Neutron Component]
+** xref:openstack-nova-component.adoc[OpenStack Nova Component]
+** xref:openstack-swift-component.adoc[OpenStack Swift Component]
+** xref:openstack.adoc[Openstack Component]
+** xref:opentracing.adoc[OpenTracing Component]
+** xref:optaplanner-component.adoc[OptaPlanner Component]
+** xref:osgi-activator.adoc[OSGi Camel Routes Activator]
+** xref:paho-component.adoc[Paho Component]
+** xref:paxlogging-component.adoc[OSGi PAX Logging Component]
+** xref:pdf-component.adoc[PDF Component]
+** xref:pg-replication-slot-component.adoc[PostgresSQL Replication Slot Component]
+** xref:pgevent-component.adoc[PostgresSQL Event Component]
+** xref:platform-http-component.adoc[Platform HTTP Component]
+** xref:properties-component.adoc[Properties Component]
+** xref:pubnub-component.adoc[PubNub Component]
+** xref:pulsar-component.adoc[Pulsar Component]
+** xref:quartz-component.adoc[Quartz Component]
+** xref:quickfix-component.adoc[QuickFix Component]
+** xref:rabbitmq-component.adoc[RabbitMQ Component]
+** xref:reactive-executor-vertx.adoc[ReactiveExecutor VertX]
+** xref:reactive-streams-component.adoc[Reactive Streams Component]
+** xref:reactor.adoc[Reactor Component]
+** xref:ref-component.adoc[Ref Component]
+** xref:resilience4j.adoc[Resilience4j Component]
+** xref:rest-api-component.adoc[REST API Component]
+** xref:rest-component.adoc[REST Component]
+** xref:rest-openapi-component.adoc[REST OpenApi Component]
+** xref:rest-swagger-component.adoc[REST Swagger Component]
+** xref:ribbon.adoc[Ribbon Component]
+** xref:robotframework-component.adoc[Robot Framework Component]
+** xref:rss-component.adoc[RSS Component]
+** xref:rxjava.adoc[RxJava Component]
+** xref:saga-component.adoc[Saga Component]
+** xref:salesforce-component.adoc[Salesforce Component]
+** xref:sap-netweaver-component.adoc[SAP NetWeaver Component]
+** xref:scheduler-component.adoc[Scheduler Component]
+** xref:schematron-component.adoc[Schematron Component]
+** xref:scp-component.adoc[SCP Component]
+** xref:seda-component.adoc[SEDA Component]
+** xref:service-component.adoc[Service Component]
+** xref:servicenow-component.adoc[ServiceNow Component]
+** xref:servlet-component.adoc[Servlet Component]
+** xref:sftp-component.adoc[SFTP Component]
+** xref:shiro.adoc[Shiro Security Component]
+** xref:sip-component.adoc[SIP Component]
+** xref:sjms-batch-component.adoc[Simple JMS Batch Component]
+** xref:sjms-component.adoc[Simple JMS Component]
+** xref:sjms2-component.adoc[Simple JMS2 Component]
+** xref:slack-component.adoc[Slack Component]
+** xref:smpp-component.adoc[SMPP Component]
+** xref:snmp-component.adoc[SNMP Component]
+** xref:solr-component.adoc[Solr Component]
+** xref:soroush-component.adoc[Soroush Component]
+** xref:spark-component.adoc[Spark Component]
+** xref:spark-rest-component.adoc[Spark Rest Component]
+** xref:splunk-component.adoc[Splunk Component]
+** xref:spring-batch-component.adoc[Spring Batch Component]
+** xref:spring-event-component.adoc[Spring Event Component]
+** xref:spring-integration-component.adoc[Spring Integration Component]
+** xref:spring-javaconfig.adoc[Spring Java Config]
+** xref:spring-ldap-component.adoc[Spring LDAP Component]
+** xref:spring-redis-component.adoc[Spring Redis Component]
+** xref:spring-security.adoc[Spring Security]
+** xref:spring-ws-component.adoc[Spring WebService Component]
+** xref:spring.adoc[Spring Support]
+** xref:sql-component.adoc[SQL Component]
+** xref:sql-stored-component.adoc[SQL Stored Procedure Component]
+** xref:ssh-component.adoc[SSH Component]
+** xref:stax-component.adoc[StAX Component]
+** xref:stomp-component.adoc[Stomp Component]
+** xref:stream-component.adoc[Stream Component]
+** xref:string-template-component.adoc[String Template Component]
+** xref:stub-component.adoc[Stub Component]
+** xref:swagger-java.adoc[Swagger Java Component]
+** xref:telegram-component.adoc[Telegram Component]
+** xref:test-blueprint.adoc[Blueprint Testing]
+** xref:test-cdi.adoc[CDI Testing]
+** xref:test-junit5.adoc[Test Module]
+** xref:test-karaf.adoc[Test Karaf]
+** xref:test-spring-junit5.adoc[Camel Test Spring JUnit 5]
+** xref:test-spring.adoc[Test Spring]
+** xref:test.adoc[Test Module]
+** xref:testcontainers-junit5.adoc[Testcontainers]
+** xref:testcontainers-spring-junit5.adoc[Testcontainers Spring]
+** xref:testcontainers-spring.adoc[Testcontainers Spring]
+** xref:testcontainers.adoc[Testcontainers]
+** xref:thrift-component.adoc[Thrift Component]
+** xref:tika-component.adoc[Tika Component]
+** xref:timer-component.adoc[Timer Component]
+** xref:twilio-component.adoc[Twilio Component]
+** xref:twitter-directmessage-component.adoc[Twitter Direct Message Component]
+** xref:twitter-search-component.adoc[Twitter Search Component]
+** xref:twitter-timeline-component.adoc[Twitter Timeline Component]
+** xref:undertow-component.adoc[Undertow Component]
+** xref:validator-component.adoc[Validator Component]
+** xref:velocity-component.adoc[Velocity Component]
+** xref:vertx-component.adoc[Vert.x Component]
+** xref:vm-component.adoc[VM Component]
+** xref:weather-component.adoc[Weather Component]
+** xref:web3j-component.adoc[Web3j Ethereum Blockchain Component]
+** xref:webhook-component.adoc[Webhook Component]
+** xref:websocket-component.adoc[Jetty Websocket Component]
+** xref:websocket-jsr356-component.adoc[Javax Websocket Component]
+** xref:weka-component.adoc[Weka Component]
+** xref:wordpress-component.adoc[Wordpress Component]
+** xref:workday-component.adoc[Workday Component]
+** xref:xchange-component.adoc[XChange Component]
+** xref:xj-component.adoc[XJ Component]
+** xref:xmlsecurity-sign-component.adoc[XML Security Sign Component]
+** xref:xmlsecurity-verify-component.adoc[XML Security Verify Component]
+** xref:xmpp-component.adoc[XMPP Component]
+** xref:xquery-component.adoc[XQuery Component]
+** xref:xslt-component.adoc[XSLT Component]
+** xref:xslt-saxon-component.adoc[XSLT Saxon Component]
+** xref:yammer-component.adoc[Yammer Component]
+** xref:zendesk-component.adoc[Zendesk Component]
+** xref:zipkin.adoc[Zipkin Component]
+** xref:zookeeper-component.adoc[ZooKeeper Component]
+** xref:zookeeper-master-component.adoc[ZooKeeper Master Component]
diff --git a/docs/components/modules/ROOT/pages/constant-language.adoc b/docs/components/modules/ROOT/pages/constant-language.adoc
deleted file mode 100644
index a8ef0e0..0000000
--- a/docs/components/modules/ROOT/pages/constant-language.adoc
+++ /dev/null
@@ -1,75 +0,0 @@
-[[constant-language]]
-= Constant Language
-:page-source: core/camel-core-languages/src/main/docs/constant-language.adoc
-
-*Since Camel 1.5*
-
-The Constant Expression Language is really just a way to specify
-constant strings as a type of expression.
-
-[NOTE]
-====
-This is a fixed constant value that is only set once during starting up the route,
-do not use this if you want dynamic values during routing.
-====
-
-== Constant Options
-
-
-// language options: START
-The Constant language supports 1 options, which are listed below.
-
-
-
-[width="100%",cols="2,1m,1m,6",options="header"]
-|===
-| Name | Default | Java Type | Description
-| trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks
-|===
-// language options: END
-
-
-== Example usage
-
-The setHeader element of the Spring DSL can utilize a constant
-expression like:
-
-[source,xml]
-----
-<route>
-  <from uri="seda:a"/>
-  <setHeader name="theHeader">
-    <constant>the value</constant>
-  </setHeader>
-  <to uri="mock:b"/>
-</route>
-----
-
-in this case, the Message coming from the seda:a
-Endpoint will have 'theHeader' header set to the
-constant value 'the value'.
-
-And the same example using Java DSL:
-
-[source,java]
-----
-from("seda:a")
-  .setHeader("theHeader", constant("the value"))
-  .to("mock:b");
-----
-
-== Loading constant from external resource
-
-You can externalize the constant and have Camel load it from a resource
-such as `"classpath:"`, `"file:"`, or `"http:"`. +
- This is done using the following syntax: `"resource:scheme:location"`,
-eg to refer to a file on the classpath you can do:
-
-[source,java]
-----
-.setHeader("myHeader").constant("resource:classpath:constant.txt")
-----
-
-== Dependencies
-
-The Constant language is part of *camel-core*.
diff --git a/docs/components/modules/ROOT/pages/controlbus-component.adoc b/docs/components/modules/ROOT/pages/controlbus-component.adoc
index d951d23..ecdea04 100644
--- a/docs/components/modules/ROOT/pages/controlbus-component.adoc
+++ b/docs/components/modules/ROOT/pages/controlbus-component.adoc
@@ -162,7 +162,7 @@ String xml = template.requestBody("controlbus:route?action=stats", null, String.
 
 == Using Simple language
 
-You can use the xref:manual::simple-language.adoc[Simple] language with the control bus,
+You can use the xref:languages:simple-language.adoc[Simple] language with the control bus,
 for example to stop a specific route, you can send a message to the
 `"controlbus:language:simple"` endpoint containing the following
 message:
@@ -182,8 +182,8 @@ String status = template.requestBody("controlbus:language:simple", "${camelConte
 
 It's easier to use the `route` command to control lifecycle of
 routes. The `language` command allows you to execute a language script
-that has stronger powers such as xref:groovy-language.adoc[Groovy] or to some
-extend the xref:manual::simple-language.adoc[Simple] language.
+that has stronger powers such as xref:languages:groovy-language.adoc[Groovy] or to some
+extend the xref:languages:simple-language.adoc[Simple] language.
 
 For example to shutdown Camel itself you can do:
 
@@ -198,7 +198,7 @@ message we sent to the control bus component.
 
 [TIP]
 ====
-You can also use other languages such as xref:groovy-language.adoc[Groovy], etc.
+You can also use other languages such as xref:languages:groovy-language.adoc[Groovy], etc.
 ====
 
 include::camel-spring-boot::page$controlbus-starter.adoc[]
diff --git a/docs/components/modules/ROOT/pages/dataformat-component.adoc b/docs/components/modules/ROOT/pages/dataformat-component.adoc
index 2312a91..84cb570 100644
--- a/docs/components/modules/ROOT/pages/dataformat-component.adoc
+++ b/docs/components/modules/ROOT/pages/dataformat-component.adoc
@@ -77,7 +77,7 @@ with the following path and query parameters:
 
 == Samples
 
-For example to use the xref:jaxb-dataformat.adoc[JAXB] xref:manual::data-format.adoc[Data
+For example to use the xref:dataformats:jaxb-dataformat.adoc[JAXB] xref:manual::data-format.adoc[Data
 Format] we can do as follows:
 
 [source,java]
diff --git a/docs/components/modules/ROOT/pages/disruptor-component.adoc b/docs/components/modules/ROOT/pages/disruptor-component.adoc
index 88c6ea4..398f433 100644
--- a/docs/components/modules/ROOT/pages/disruptor-component.adoc
+++ b/docs/components/modules/ROOT/pages/disruptor-component.adoc
@@ -197,7 +197,7 @@ without incurring significant latency spikes.
 
 == Use of Request Reply
 
-The Disruptor component supports using xref:manual::requestReply-eip.adoc[Request
+The Disruptor component supports using xref:manual:eips:requestReply-eip.adoc[Request
 Reply], where the caller will wait for the Async route to complete. For
 instance:
 
diff --git a/docs/components/modules/ROOT/pages/elasticsearch-rest-component.adoc b/docs/components/modules/ROOT/pages/elasticsearch-rest-component.adoc
index b670a66..264d9b4 100644
--- a/docs/components/modules/ROOT/pages/elasticsearch-rest-component.adoc
+++ b/docs/components/modules/ROOT/pages/elasticsearch-rest-component.adoc
@@ -276,7 +276,7 @@ try (ElasticsearchScrollRequestIterator response = template.requestBody("direct:
 }
 ----
 
-xref:manual::split-eip.adoc[Split EIP] can also be used.
+xref:manual:eips:split-eip.adoc[Split EIP] can also be used.
 
 [source,java]
 ----
diff --git a/docs/components/modules/ROOT/pages/elsql-component.adoc b/docs/components/modules/ROOT/pages/elsql-component.adoc
index bb44838..9ed119c 100644
--- a/docs/components/modules/ROOT/pages/elsql-component.adoc
+++ b/docs/components/modules/ROOT/pages/elsql-component.adoc
@@ -45,7 +45,7 @@ The parameters to the SQL queries are named parameters in the elsql
 mapping files, and maps to corresponding keys from the Camel message, in
 the given precedence:
 
-1. from message body if xref:manual::simple-language.adoc[Simple]
+1. from message body if xref:components:languages:simple-language.adoc[Simple]
 expression.
 
 2. from message body if its a `java.util.Map`
diff --git a/docs/components/modules/ROOT/pages/exchangeProperty-language.adoc b/docs/components/modules/ROOT/pages/exchangeProperty-language.adoc
deleted file mode 100644
index c6c0a60..0000000
--- a/docs/components/modules/ROOT/pages/exchangeProperty-language.adoc
+++ /dev/null
@@ -1,61 +0,0 @@
-[[exchangeProperty-language]]
-= ExchangeProperty Language
-:page-source: core/camel-core-languages/src/main/docs/exchangeProperty-language.adoc
-
-*Since Camel 2.0*
-
-The ExchangeProperty Expression Language allows you to extract values of
-named exchange properties.
-
-== Exchange Property Options
-
-// language options: START
-The ExchangeProperty language supports 1 options, which are listed below.
-
-
-
-[width="100%",cols="2,1m,1m,6",options="header"]
-|===
-| Name | Default | Java Type | Description
-| trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks
-|===
-// language options: END
-
-== Example usage
-
-The recipientList element of the Spring DSL can utilize a
-exchangeProperty expression like:
-
-In this case, the list of recipients are contained in the property
-'myProperty'.
-
-[source,xml]
-----
-<route>
-  <from uri="direct:a" />
-  <recipientList>
-    <exchangeProperty>myProperty</exchangeProperty>
-  </recipientList>
-</route>
-----
-
-And the same example in Java DSL:
-
-[source,java]
-----
-from("direct:a").recipientList(exchangeProperty("myProperty"));
-----
-
-And with a slightly different syntax where you use the builder to the
-fullest (i.e. avoid using parameters but using stacked operations,
-notice that exchangeProperty is not a parameter but a stacked method
-call)
-
-[source,java]
-----
-from("direct:a").recipientList().exchangeProperty("myProperty");
-----
-
-== Dependencies
-
-The ExchangeProperty language is part of *camel-core*.
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/pages/file-component.adoc b/docs/components/modules/ROOT/pages/file-component.adoc
index 9471d1e..4d516dd 100644
--- a/docs/components/modules/ROOT/pages/file-component.adoc
+++ b/docs/components/modules/ROOT/pages/file-component.adoc
@@ -221,7 +221,7 @@ bean completes, and thus the route is completed, the file consumer will
 perform the move operation and move the file to the `.done` sub-folder.
 
 The *move* and the *preMove* options are considered as a directory name
-(though if you use an expression such as xref:manual::file-language.adoc[File Language], or xref:manual::simple-language.adoc[Simple] then the result of the expression
+(though if you use an expression such as xref:components:languages:file-language.adoc[File Language], or xref:components:languages:simple-language.adoc[Simple] then the result of the expression
 evaluation is the file name to be used - eg if you set
 
 [source]
@@ -229,7 +229,7 @@ evaluation is the file name to be used - eg if you set
 move=../backup/copy-of-${file:name}
 ----
 
-then that's using the xref:manual::file-language.adoc[File Language] which we
+then that's using the xref:components:languages:file-language.adoc[File Language] which we
 use return the file name to be used), which can be either relative or
 absolute. If relative, the directory is created as a sub-folder from
 within the folder where the file was consumed.
@@ -267,10 +267,10 @@ processed and after it's processed, it's moved to the `.done` folder.
 
 The *move* and *preMove* options
 are Expression-based, so we have the full power of
-the xref:manual::file-language.adoc[File Language] to do advanced configuration
+the xref:components:languages:file-language.adoc[File Language] to do advanced configuration
 of the directory and name pattern. +
  Camel will, in fact, internally convert the directory name you enter
-into a xref:manual::file-language.adoc[File Language] expression. So when we
+into a xref:components:languages:file-language.adoc[File Language] expression. So when we
 enter `move=.done` Camel will convert this into:
 `\${file:parent}/.done/${file:onlyname}`. This is only done if
 Camel detects that you have not provided a $\{ } in the option value
@@ -293,7 +293,7 @@ choice. For example to move the files in an error folder with a
 timestamp you can use
 `moveFailed=/error/${``file:name.noext``}-${date:now:yyyyMMddHHmmssSSS}.${``file:ext`}.
 
-See more examples at xref:manual::file-language.adoc[File Language]
+See more examples at xref:components:languages:file-language.adoc[File Language]
 
 == Message Headers
 
@@ -307,7 +307,7 @@ The following headers are supported by this component:
 
 |`CamelFileName` |Specifies the name of the file to write (relative to the endpoint
 directory). This name can be a `String`; a `String` with a
-xref:manual::file-language.adoc[File Language] or xref:manual::simple-language.adoc[Simple]
+xref:components:languages:file-language.adoc[File Language] or xref:components:languages:simple-language.adoc[Simple]
 expression; or an Expression object. If it's
 `null` then Camel will auto-generate a filename based on the message
 unique ID.
@@ -514,8 +514,8 @@ from("direct:report").to("file:target/reports/?fileName=report.txt");
 == Filename Expression
 
 Filename can be set either using the *expression* option or as a
-string-based xref:manual::file-language.adoc[File Language] expression in the
-`CamelFileName` header. See the xref:manual::file-language.adoc[File Language]
+string-based xref:components:languages:file-language.adoc[File Language] expression in the
+`CamelFileName` header. See the xref:components:languages:file-language.adoc[File Language]
 for syntax and samples.
 
 [[File2-Consumingfilesfromfolderswhereothersdropfilesdirectly]]
@@ -798,7 +798,7 @@ today's date as a sub-folder name:
 from("file://inbox?move=backup/${date:now:yyyyMMdd}/${file:name}").to("...");
 ----
 
-See xref:manual::file-language.adoc[File Language] for more samples.
+See xref:components:languages:file-language.adoc[File Language] for more samples.
 
 == Avoiding reading the same file more than once (idempotent consumer)
 
@@ -999,7 +999,7 @@ Registry for a bean with the ID, `mySorter`.
 === Sorting using sortBy
 
 Camel supports pluggable sorting strategies. This strategy it to use the
-xref:manual::file-language.adoc[File Language] to configure the sorting. The
+xref:components:languages:file-language.adoc[File Language] to configure the sorting. The
 `sortBy` option is configured as follows:
 
 [source]
@@ -1023,7 +1023,7 @@ This will sort by file name, you can reverse the order by prefixing
 sortBy=reverse:file:name
 ----
 
-As we have the full power of xref:manual::file-language.adoc[File Language] we
+As we have the full power of xref:components:languages:file-language.adoc[File Language] we
 can use some of the other parameters, so if we want to sort by file size
 we do:
 
@@ -1067,7 +1067,7 @@ sortBy=file:modified;file:name
 Now there is an issue here, can you spot it? Well the modified timestamp
 of the file is too fine as it will be in milliseconds, but what if we
 want to sort by date only and then subgroup by name? +
- Well as we have the true power of xref:manual::file-language.adoc[File Language] we can use its date command that supports patterns. So this
+ Well as we have the true power of xref:components:languages:file-language.adoc[File Language] we can use its date command that supports patterns. So this
 can be solved as:
 
 [source]
diff --git a/docs/components/modules/ROOT/pages/file-language.adoc b/docs/components/modules/ROOT/pages/file-language.adoc
deleted file mode 100644
index 88bfa2c..0000000
--- a/docs/components/modules/ROOT/pages/file-language.adoc
+++ /dev/null
@@ -1,295 +0,0 @@
-[[file-language]]
-= File Language
-:page-source: core/camel-core-languages/src/main/docs/file-language.adoc
-
-*Since Camel 1.1*
-
-The file language is merged with
-xref:simple-language.adoc[Simple] language which means you can use all the file
-syntax directly within the simple language.
-
-The File Expression Language is an extension to the
-xref:simple-language.adoc[Simple] language, adding file related capabilities.
-These capabilities are related to common use cases working with file
-path and names. The goal is to allow expressions to be used with the
-File and FTP components for setting
-dynamic file patterns for both consumer and producer.
-
-== File Language options
-
-// language options: START
-The File language supports 2 options, which are listed below.
-
-
-
-[width="100%",cols="2,1m,1m,6",options="header"]
-|===
-| Name | Default | Java Type | Description
-| resultType |  | String | Sets the class name of the result type (type from output)
-| trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks
-|===
-// language options: END
-
-== Syntax
-
-This language is an *extension* to the xref:simple-language.adoc[Simple] language
-so the xref:simple-language.adoc[Simple] syntax applies also. So the table below
-only lists the additional.  +
- As opposed to xref:simple-language.adoc[Simple] language
-xref:file-language.adoc[File Language] also supports
-xref:constant-language.adoc[Constant] expressions so you can enter a fixed
-filename.
-
-All the file tokens use the same expression name as the method on the
-`java.io.File` object, for instance `file:absolute` refers to the
-`java.io.File.getAbsolute()` method. Notice that not all expressions are
-supported by the current Exchange. For instance the xref:components::ftp-component.adoc[FTP]
-component supports some of the options, where as the
-File component supports all of them.
-
-
-[width="100%",cols="10%,10%,10%,10%,10%,25%,25%",options="header",]
-|===
-|Expression |Type |File Consumer |File Producer |FTP Consumer |FTP Producer |Description
-
-|file:name |String |yes |no |yes |no |refers to the file name (is relative to the starting directory, see note
-below)
-
-|file:name.ext |String |yes |no |yes |no |refers to the file extension only
-
-|file:name.ext.single |String |yes |no |yes |no |refers to the file extension. If the file
-extension has mutiple dots, then this expression strips and only returns
-the last part.
-
-|file:name.noext |String |yes |no |yes |no |refers to the file name with no extension (is relative to the starting
-directory, see note below)
-
-|file:name.noext.single |String |yes |no |yes |no |refers to the file name with no extension (is
-relative to the starting directory, see note below). If the file
-extension has multiple dots, then this expression strips only the last
-part, and keep the others.
-
-|file:onlyname |String |yes |no |yes |no |refers to the file name only with no leading paths.
-
-|file:onlyname.noext |String |yes |no |yes |no |refers to the file name only with no extension and with no leading
-paths.
-
-|file:onlyname.noext.single |String |yes |no |yes |no |refers to the file name only with no extension and
-with no leading paths. If the file extension has multiple dots, then
-this expression strips only the last part, and keep the others.
-
-|file:ext |String |yes |no |yes |no |refers to the file extension only
-
-|file:parent |String |yes |no |yes |no |refers to the file parent
-
-|file:path |String |yes |no |yes |no |refers to the file path
-
-|file:absolute |Boolean |yes |no |no |no |refers to whether the file is regarded as absolute or relative
-
-|file:absolute.path |String |yes |no |no |no |refers to the absolute file path
-
-|file:length |Long |yes |no |yes |no |refers to the file length returned as a Long type
-
-|file:size |Long |yes |no |yes |no |refers to the file length returned as a Long type
-
-|file:modified |Date |yes |no |yes |no |Refers to the file last modified returned as a Date type
-
-|date:_command:pattern_ |String |yes |yes |yes |yes |for date formatting using the `java.text.SimpleDateFormat` patterns. Is
-an *extension* to the xref:simple-language.adoc[Simple] language. Additional
-command is: *file* (consumers only) for the last modified timestamp of
-the file. Notice: all the commands from the xref:simple-language.adoc[Simple]
-language can also be used.
-|===
-
-== File token example
-
-=== Relative paths
-
-We have a `java.io.File` handle for the file `hello.txt` in the
-following *relative* directory: `.\filelanguage\test`. And we configure
-our endpoint to use this starting directory `.\filelanguage`. The file
-tokens will return as:
-
-[width="100%",cols="50%,50%",options="header",]
-|===
-|Expression |Returns
-
-|file:name |test\hello.txt
-
-|file:name.ext |txt
-
-|file:name.noext |test\hello
-
-|file:onlyname |hello.txt
-
-|file:onlyname.noext |hello
-
-|file:ext |txt
-
-|file:parent |filelanguage\test
-
-|file:path |filelanguage\test\hello.txt
-
-|file:absolute |false
-
-|file:absolute.path |\workspace\camel\camel-core\target\filelanguage\test\hello.txt
-|===
-
-=== Absolute paths
-
-We have a `java.io.File` handle for the file `hello.txt` in the
-following *absolute* directory:
-`\workspace\camel\camel-core\target\filelanguage\test`. And we configure
-out endpoint to use the absolute starting directory
-`\workspace\camel\camel-core\target\filelanguage`. The file tokens will
-return as:
-
-[width="100%",cols="50%,50%",options="header",]
-|===
-|Expression |Returns
-
-|file:name |test\hello.txt 
-
-|file:name.ext |txt
-
-|file:name.noext |test\hello
-
-|file:onlyname |hello.txt
-
-|file:onlyname.noext |hello
-
-|file:ext |txt
-
-|file:parent |\workspace\camel\camel-core\target\filelanguage\test
-
-|file:path |\workspace\camel\camel-core\target\filelanguage\test\hello.txt
-
-|file:absolute |true
-
-|file:absolute.path |\workspace\camel\camel-core\target\filelanguage\test\hello.txt
-|===
-
-== Samples
-
-You can enter a fixed xref:constant-language.adoc[Constant] expression such as
-`myfile.txt`:
-
-[source]
-----
-fileName="myfile.txt"
-----
-
-Lets assume we use the file consumer to read files and want to move the
-read files to backup folder with the current date as a sub folder. This
-can be archieved using an expression like:
-
-[source]
-----
-fileName="backup/${date:now:yyyyMMdd}/${file:name.noext}.bak"
-----
-
-relative folder names are also supported so suppose the backup folder
-should be a sibling folder then you can append .. as:
-
-[source]
-----
-fileName="../backup/${date:now:yyyyMMdd}/${file:name.noext}.bak"
-----
-
-As this is an extension to the xref:simple-language.adoc[Simple] language we have
-access to all the goodies from this language also, so in this use case
-we want to use the in.header.type as a parameter in the dynamic
-expression:
-
-[source]
-----
-fileName="../backup/${date:now:yyyyMMdd}/type-${in.header.type}/backup-of-${file:name.noext}.bak"
-----
-
-If you have a custom Date you want to use in the expression then Camel
-supports retrieving dates from the message header.
-
-[source]
-----
-fileName="orders/order-${in.header.customerId}-${date:in.header.orderDate:yyyyMMdd}.xml"
-----
-
-And finally we can also use a bean expression to invoke a POJO class
-that generates some String output (or convertible to String) to be used:
-
-[source]
-----
-fileName="uniquefile-${bean:myguidgenerator.generateid}.txt"
-----
-
-And of course all this can be combined in one expression where you can
-use the xref:file-language.adoc[File Language], xref:file-language.adoc[Simple]
-and the xref:components::bean-component.adoc[Bean] language in one combined expression. This
-is pretty powerful for those common file path patterns.
-
-== Using Spring PropertyPlaceholderConfigurer together with the File component
-
-In Camel you can use the xref:file-language.adoc[File Language] directly
-from the xref:simple-language.adoc[Simple] language which makes a
-Content Based Router easier to do in
-Spring XML, where we can route based on file extensions as shown below:
-
-[source,xml]
-----
-<from uri="file://input/orders"/>
-   <choice>
-     <when>
-         <simple>${file:ext} == 'txt'</simple>
-         <to uri="bean:orderService?method=handleTextFiles"/>
-     </when>
-     <when>
-         <simple>${file:ext} == 'xml'</simple>
-         <to uri="bean:orderService?method=handleXmlFiles"/>
-     </when>
-     <otherwise>
-         <to uri="bean:orderService?method=handleOtherFiles"/>
-     </otherwise>
-  </choice>
-----
-
-If you use the `fileName` option on the File endpoint
-to set a dynamic filename using the xref:file-language.adoc[File Language] then make sure you  +
- use the alternative syntax to avoid
-clashing with Springs `PropertyPlaceholderConfigurer`.
-
-*bundle-context.xml*
-
-[source,xml]
-----
-<bean id="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
-    <property name="location" value="classpath:bundle-context.cfg" />
-</bean>
-
-<bean id="sampleRoute" class="SampleRoute">
-    <property name="fromEndpoint" value="${fromEndpoint}" />
-    <property name="toEndpoint" value="${toEndpoint}" />
-</bean>
-----
-
-*bundle-context.cfg*
-
-[source]
-----
-fromEndpoint=activemq:queue:test
-toEndpoint=file://fileRoute/out?fileName=test-$simple{date:now:yyyyMMdd}.txt
-----
-
-Notice how we use the $simple\{ } syntax in the `toEndpoint` above. +
- If you don't do this, there is a clash and Spring will throw an
-exception like
-
-[source,java]
-----------------------------------------------------------------------------------------------------
-org.springframework.beans.factory.BeanDefinitionStoreException:
-Invalid bean definition with name 'sampleRoute' defined in class path resource [bundle-context.xml]:
-Could not resolve placeholder 'date:now:yyyyMMdd'
-----------------------------------------------------------------------------------------------------
-
-== Dependencies
-
-The File language is part of *camel-core*.
diff --git a/docs/components/modules/ROOT/pages/header-language.adoc b/docs/components/modules/ROOT/pages/header-language.adoc
deleted file mode 100644
index c2134f4..0000000
--- a/docs/components/modules/ROOT/pages/header-language.adoc
+++ /dev/null
@@ -1,45 +0,0 @@
-[[header-language]]
-= Header Language
-:page-source: core/camel-core-languages/src/main/docs/header-language.adoc
-
-*Since Camel 1.5*
-
-The Header Expression Language allows you to extract values of named
-headers.
-
-== Header Options
-
-// language options: START
-The Header language supports 1 options, which are listed below.
-
-
-
-[width="100%",cols="2,1m,1m,6",options="header"]
-|===
-| Name | Default | Java Type | Description
-| trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks
-|===
-// language options: END
-
-== Example usage
-
-The recipientList element of the Spring DSL can utilize a header
-expression like:
-
-In this case, the list of recipients are contained in the header
-'myHeader'.
-
-And the same example in Java DSL:
-
-And with a slightly different syntax where you use the builder to the
-fullest (i.e. avoid using parameters but using stacked operations,
-notice that header is not a parameter but a stacked method call)
-
-[source,java]
-----
-from("direct:a").recipientList().header("myHeader");
-----
-
-== Dependencies
-
-The Header language is part of *camel-core*.
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/pages/index.adoc b/docs/components/modules/ROOT/pages/index.adoc
index 8315afe..f38c5c1 100644
--- a/docs/components/modules/ROOT/pages/index.adoc
+++ b/docs/components/modules/ROOT/pages/index.adoc
@@ -692,95 +692,95 @@ Number of Data Formats: 45 in 37 JAR artifacts (0 deprecated)
 |===
 | Data Format | Since | Description
 
-| xref:any23-dataformat.adoc[Any23] (camel-any23) | 3.0 | Any23 data format is used for parsing data to RDF.
+| xref:dataformats:any23-dataformat.adoc[Any23] (camel-any23) | 3.0 | Any23 data format is used for parsing data to RDF.
 
-| xref:asn1-dataformat.adoc[ASN.1 File] (camel-asn1) | 2.20 | The ASN.1 data format is used for file transfer with telecommunications protocols.
+| xref:dataformats:asn1-dataformat.adoc[ASN.1 File] (camel-asn1) | 2.20 | The ASN.1 data format is used for file transfer with telecommunications protocols.
 
-| xref:avro-dataformat.adoc[Avro] (camel-avro) | 2.14 | The Avro data format is used for serialization and deserialization of messages using Apache Avro binary dataformat.
+| xref:dataformats:avro-dataformat.adoc[Avro] (camel-avro) | 2.14 | The Avro data format is used for serialization and deserialization of messages using Apache Avro binary dataformat.
 
-| xref:barcode-dataformat.adoc[Barcode] (camel-barcode) | 2.14 | The Barcode data format is used for creating barccode images (such as QR-Code)
+| xref:dataformats:barcode-dataformat.adoc[Barcode] (camel-barcode) | 2.14 | The Barcode data format is used for creating barccode images (such as QR-Code)
 
-| xref:base64-dataformat.adoc[Base64] (camel-base64) | 2.11 | The Base64 data format is used for base64 encoding and decoding.
+| xref:dataformats:base64-dataformat.adoc[Base64] (camel-base64) | 2.11 | The Base64 data format is used for base64 encoding and decoding.
 
-| xref:beanio-dataformat.adoc[BeanIO] (camel-beanio) | 2.10 | The BeanIO data format is used for working with flat payloads (such as CSV, delimited, or fixed length formats).
+| xref:dataformats:beanio-dataformat.adoc[BeanIO] (camel-beanio) | 2.10 | The BeanIO data format is used for working with flat payloads (such as CSV, delimited, or fixed length formats).
 
-| xref:bindy-dataformat.adoc[Bindy CSV] (camel-bindy) | 2.0 | The Bindy data format is used for working with flat payloads (such as CSV, delimited, fixed length formats, or FIX messages).
+| xref:dataformats:bindy-dataformat.adoc[Bindy CSV] (camel-bindy) | 2.0 | The Bindy data format is used for working with flat payloads (such as CSV, delimited, fixed length formats, or FIX messages).
 
-| xref:bindy-dataformat.adoc[Bindy Fixed Length] (camel-bindy) | 2.0 | The Bindy data format is used for working with flat payloads (such as CSV, delimited, fixed length formats, or FIX messages).
+| xref:dataformats:bindy-dataformat.adoc[Bindy Fixed Length] (camel-bindy) | 2.0 | The Bindy data format is used for working with flat payloads (such as CSV, delimited, fixed length formats, or FIX messages).
 
-| xref:bindy-dataformat.adoc[Bindy Key Value Pair] (camel-bindy) | 2.0 | The Bindy data format is used for working with flat payloads (such as CSV, delimited, fixed length formats, or FIX messages).
+| xref:dataformats:bindy-dataformat.adoc[Bindy Key Value Pair] (camel-bindy) | 2.0 | The Bindy data format is used for working with flat payloads (such as CSV, delimited, fixed length formats, or FIX messages).
 
-| xref:cbor-dataformat.adoc[CBOR] (camel-cbor) | 3.0 | CBOR data format is used for unmarshal a CBOR payload to POJO or to marshal POJO back to CBOR payload.
+| xref:dataformats:cbor-dataformat.adoc[CBOR] (camel-cbor) | 3.0 | CBOR data format is used for unmarshal a CBOR payload to POJO or to marshal POJO back to CBOR payload.
 
-| xref:crypto-dataformat.adoc[Crypto (Java Cryptographic Extension)] (camel-crypto) | 2.3 | Crypto data format is used for encrypting and decrypting of messages using Java Cryptographic Extension.
+| xref:dataformats:crypto-dataformat.adoc[Crypto (Java Cryptographic Extension)] (camel-crypto) | 2.3 | Crypto data format is used for encrypting and decrypting of messages using Java Cryptographic Extension.
 
-| xref:csv-dataformat.adoc[CSV] (camel-csv) | 1.3 | The CSV data format is used for handling CSV payloads.
+| xref:dataformats:csv-dataformat.adoc[CSV] (camel-csv) | 1.3 | The CSV data format is used for handling CSV payloads.
 
-| xref:fhirJson-dataformat.adoc[FHIR JSon] (camel-fhir) | 2.21 | The FHIR JSon data format is used to marshall/unmarshall to/from FHIR objects to/from JSON.
+| xref:dataformats:fhirJson-dataformat.adoc[FHIR JSon] (camel-fhir) | 2.21 | The FHIR JSon data format is used to marshall/unmarshall to/from FHIR objects to/from JSON.
 
-| xref:fhirXml-dataformat.adoc[FHIR XML] (camel-fhir) | 2.21 | The FHIR XML data format is used to marshall/unmarshall from/to FHIR objects to/from XML.
+| xref:dataformats:fhirXml-dataformat.adoc[FHIR XML] (camel-fhir) | 2.21 | The FHIR XML data format is used to marshall/unmarshall from/to FHIR objects to/from XML.
 
-| xref:flatpack-dataformat.adoc[Flatpack] (camel-flatpack) | 2.1 | The Flatpack data format is used for working with flat payloads (such as CSV, delimited, or fixed length formats).
+| xref:dataformats:flatpack-dataformat.adoc[Flatpack] (camel-flatpack) | 2.1 | The Flatpack data format is used for working with flat payloads (such as CSV, delimited, or fixed length formats).
 
-| xref:grok-dataformat.adoc[Grok] (camel-grok) | 3.0 | The Grok data format is used for unmarshalling unstructured data to objects using Logstash based Grok patterns.
+| xref:dataformats:grok-dataformat.adoc[Grok] (camel-grok) | 3.0 | The Grok data format is used for unmarshalling unstructured data to objects using Logstash based Grok patterns.
 
-| xref:gzipdeflater-dataformat.adoc[GZip Deflater] (camel-zip-deflater) | 2.0 | The GZip data format is a message compression and de-compression format (which works with the popular gzip/gunzip tools).
+| xref:dataformats:gzipdeflater-dataformat.adoc[GZip Deflater] (camel-zip-deflater) | 2.0 | The GZip data format is a message compression and de-compression format (which works with the popular gzip/gunzip tools).
 
-| xref:hl7-dataformat.adoc[HL7] (camel-hl7) | 2.0 | The HL7 data format can be used to marshal or unmarshal HL7 (Health Care) model objects.
+| xref:dataformats:hl7-dataformat.adoc[HL7] (camel-hl7) | 2.0 | The HL7 data format can be used to marshal or unmarshal HL7 (Health Care) model objects.
 
-| xref:ical-dataformat.adoc[iCal] (camel-ical) | 2.12 | The iCal dataformat is used for working with iCalendar messages.
+| xref:dataformats:ical-dataformat.adoc[iCal] (camel-ical) | 2.12 | The iCal dataformat is used for working with iCalendar messages.
 
-| xref:jacksonxml-dataformat.adoc[JacksonXML] (camel-jacksonxml) | 2.16 | JacksonXML data format is used for unmarshal a XML payload to POJO or to marshal POJO back to XML payload.
+| xref:dataformats:jacksonxml-dataformat.adoc[JacksonXML] (camel-jacksonxml) | 2.16 | JacksonXML data format is used for unmarshal a XML payload to POJO or to marshal POJO back to XML payload.
 
-| xref:jaxb-dataformat.adoc[JAXB] (camel-jaxb) | 1.0 | JAXB data format uses the JAXB2 XML marshalling standard to unmarshal an XML payload into Java objects or to marshal Java objects into an XML payload.
+| xref:dataformats:jaxb-dataformat.adoc[JAXB] (camel-jaxb) | 1.0 | JAXB data format uses the JAXB2 XML marshalling standard to unmarshal an XML payload into Java objects or to marshal Java objects into an XML payload.
 
-| xref:json-fastjson-dataformat.adoc[JSon Fastjson] (camel-fastjson) | 2.20 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+| xref:dataformats:json-fastjson-dataformat.adoc[JSon Fastjson] (camel-fastjson) | 2.20 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
 
-| xref:json-gson-dataformat.adoc[JSon GSon] (camel-gson) | 2.10 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+| xref:dataformats:json-gson-dataformat.adoc[JSon GSon] (camel-gson) | 2.10 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
 
-| xref:json-jackson-dataformat.adoc[JSon Jackson] (camel-jackson) | 2.0 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+| xref:dataformats:json-jackson-dataformat.adoc[JSon Jackson] (camel-jackson) | 2.0 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
 
-| xref:json-johnzon-dataformat.adoc[JSon Johnzon] (camel-johnzon) | 2.18 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+| xref:dataformats:json-johnzon-dataformat.adoc[JSon Johnzon] (camel-johnzon) | 2.18 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
 
-| xref:json-xstream-dataformat.adoc[JSon XStream] (camel-xstream) | 2.0 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+| xref:dataformats:json-xstream-dataformat.adoc[JSon XStream] (camel-xstream) | 2.0 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
 
-| xref:jsonApi-dataformat.adoc[JSonApi] (camel-jsonapi) | 3.0 | JSonApi data format is used for marshal and unmarshal Json API object.
+| xref:dataformats:jsonApi-dataformat.adoc[JSonApi] (camel-jsonapi) | 3.0 | JSonApi data format is used for marshal and unmarshal Json API object.
 
-| xref:lzf-dataformat.adoc[LZF Deflate Compression] (camel-lzf) | 2.17 | The LZF data format is a message compression and de-compression format (uses the LZF deflate algorithm).
+| xref:dataformats:lzf-dataformat.adoc[LZF Deflate Compression] (camel-lzf) | 2.17 | The LZF data format is a message compression and de-compression format (uses the LZF deflate algorithm).
 
-| xref:mime-multipart-dataformat.adoc[MIME Multipart] (camel-mail) | 2.17 | The MIME Multipart data format is used for marshalling Camel messages with attachments into MIME-Multipart message, and vise-versa.
+| xref:dataformats:mime-multipart-dataformat.adoc[MIME Multipart] (camel-mail) | 2.17 | The MIME Multipart data format is used for marshalling Camel messages with attachments into MIME-Multipart message, and vise-versa.
 
-| xref:pgp-dataformat.adoc[PGP] (camel-crypto) | 2.9 | PGP data format is used for encrypting and decrypting of messages using Java Cryptographic Extension and PGP.
+| xref:dataformats:pgp-dataformat.adoc[PGP] (camel-crypto) | 2.9 | PGP data format is used for encrypting and decrypting of messages using Java Cryptographic Extension and PGP.
 
-| xref:protobuf-dataformat.adoc[Protobuf] (camel-protobuf) | 2.2 | The Protobuf data format is used for serializing between Java objects and the Google Protobuf protocol.
+| xref:dataformats:protobuf-dataformat.adoc[Protobuf] (camel-protobuf) | 2.2 | The Protobuf data format is used for serializing between Java objects and the Google Protobuf protocol.
 
-| xref:rss-dataformat.adoc[RSS] (camel-rss) | 2.1 | RSS data format is used for working with RSS sync feed Java Objects and transforming to XML and vice-versa.
+| xref:dataformats:rss-dataformat.adoc[RSS] (camel-rss) | 2.1 | RSS data format is used for working with RSS sync feed Java Objects and transforming to XML and vice-versa.
 
-| xref:soapjaxb-dataformat.adoc[SOAP] (camel-soap) | 2.3 | SOAP is a data format which uses JAXB2 and JAX-WS annotations to marshal and unmarshal SOAP payloads.
+| xref:dataformats:soapjaxb-dataformat.adoc[SOAP] (camel-soap) | 2.3 | SOAP is a data format which uses JAXB2 and JAX-WS annotations to marshal and unmarshal SOAP payloads.
 
-| xref:syslog-dataformat.adoc[Syslog] (camel-syslog) | 2.6 | The Syslog dataformat is used for working with RFC3164 and RFC5424 messages (logging and monitoring).
+| xref:dataformats:syslog-dataformat.adoc[Syslog] (camel-syslog) | 2.6 | The Syslog dataformat is used for working with RFC3164 and RFC5424 messages (logging and monitoring).
 
-| xref:tarfile-dataformat.adoc[Tar File] (camel-tarfile) | 2.16 | The Tar File data format is a message compression and de-compression format of tar files.
+| xref:dataformats:tarfile-dataformat.adoc[Tar File] (camel-tarfile) | 2.16 | The Tar File data format is a message compression and de-compression format of tar files.
 
-| xref:thrift-dataformat.adoc[Thrift] (camel-thrift) | 2.20 | The Thrift data format is used for serialization and deserialization of messages using Apache Thrift binary dataformat.
+| xref:dataformats:thrift-dataformat.adoc[Thrift] (camel-thrift) | 2.20 | The Thrift data format is used for serialization and deserialization of messages using Apache Thrift binary dataformat.
 
-| xref:tidyMarkup-dataformat.adoc[TidyMarkup] (camel-tagsoup) | 2.0 | TidyMarkup data format is used for parsing HTML and return it as pretty well-formed HTML.
+| xref:dataformats:tidyMarkup-dataformat.adoc[TidyMarkup] (camel-tagsoup) | 2.0 | TidyMarkup data format is used for parsing HTML and return it as pretty well-formed HTML.
 
-| xref:univocity-csv-dataformat.adoc[uniVocity CSV] (camel-univocity-parsers) | 2.15 | The uniVocity CSV data format is used for working with CSV (Comma Separated Values) flat payloads.
+| xref:dataformats:univocity-csv-dataformat.adoc[uniVocity CSV] (camel-univocity-parsers) | 2.15 | The uniVocity CSV data format is used for working with CSV (Comma Separated Values) flat payloads.
 
-| xref:univocity-fixed-dataformat.adoc[uniVocity Fixed Length] (camel-univocity-parsers) | 2.15 | The uniVocity Fixed Length data format is used for working with fixed length flat payloads.
+| xref:dataformats:univocity-fixed-dataformat.adoc[uniVocity Fixed Length] (camel-univocity-parsers) | 2.15 | The uniVocity Fixed Length data format is used for working with fixed length flat payloads.
 
-| xref:univocity-tsv-dataformat.adoc[uniVocity TSV] (camel-univocity-parsers) | 2.15 | The uniVocity TSV data format is used for working with TSV (Tabular Separated Values) flat payloads.
+| xref:dataformats:univocity-tsv-dataformat.adoc[uniVocity TSV] (camel-univocity-parsers) | 2.15 | The uniVocity TSV data format is used for working with TSV (Tabular Separated Values) flat payloads.
 
-| xref:secureXML-dataformat.adoc[XML Security] (camel-xmlsecurity) | 2.0 | The XML Security data format facilitates encryption and decryption of XML payloads.
+| xref:dataformats:secureXML-dataformat.adoc[XML Security] (camel-xmlsecurity) | 2.0 | The XML Security data format facilitates encryption and decryption of XML payloads.
 
-| xref:xstream-dataformat.adoc[XStream] (camel-xstream) | 1.3 | XStream data format is used for unmarshal a XML payload to POJO or to marshal POJO back to XML payload.
+| xref:dataformats:xstream-dataformat.adoc[XStream] (camel-xstream) | 1.3 | XStream data format is used for unmarshal a XML payload to POJO or to marshal POJO back to XML payload.
 
-| xref:yaml-snakeyaml-dataformat.adoc[YAML SnakeYAML] (camel-snakeyaml) | 2.17 | YAML is a data format to marshal and unmarshal Java objects to and from YAML.
+| xref:dataformats:yaml-snakeyaml-dataformat.adoc[YAML SnakeYAML] (camel-snakeyaml) | 2.17 | YAML is a data format to marshal and unmarshal Java objects to and from YAML.
 
-| xref:zipdeflater-dataformat.adoc[Zip Deflate Compression] (camel-zip-deflater) | 2.12 | Zip Deflate Compression data format is a message compression and de-compression format (not zip files).
+| xref:dataformats:zipdeflater-dataformat.adoc[Zip Deflate Compression] (camel-zip-deflater) | 2.12 | Zip Deflate Compression data format is a message compression and de-compression format (not zip files).
 
-| xref:zipfile-dataformat.adoc[Zip File] (camel-zipfile) | 2.11 | The Zip File data format is a message compression and de-compression format of zip files.
+| xref:dataformats:zipfile-dataformat.adoc[Zip File] (camel-zipfile) | 2.11 | The Zip File data format is a message compression and de-compression format of zip files.
 |===
 // dataformats: END
 
@@ -793,39 +793,39 @@ Number of Languages: 17 in 11 JAR artifacts (0 deprecated)
 |===
 | Language | Since | Description
 
-| xref:bean-language.adoc[Bean method] (camel-bean) | 1.3 | To use a Java bean (aka method call) in Camel expressions or predicates.
+| xref:languages:bean-language.adoc[Bean method] (camel-bean) | 1.3 | To use a Java bean (aka method call) in Camel expressions or predicates.
 
-| xref:constant-language.adoc[Constant] (camel-core-languages) | 1.5 | To use a constant value in Camel expressions or predicates. Important: this is a fixed constant value that is only set once during starting up the route, do not use this if you want dynamic values during routing.
+| xref:languages:constant-language.adoc[Constant] (camel-core-languages) | 1.5 | To use a constant value in Camel expressions or predicates. Important: this is a fixed constant value that is only set once during starting up the route, do not use this if you want dynamic values during routing.
 
-| xref:exchangeProperty-language.adoc[ExchangeProperty] (camel-core-languages) | 2.0 | To use a Camel Exchange property in expressions or predicates.
+| xref:languages:exchangeProperty-language.adoc[ExchangeProperty] (camel-core-languages) | 2.0 | To use a Camel Exchange property in expressions or predicates.
 
-| xref:file-language.adoc[File] (camel-core-languages) | 1.1 | For expressions and predicates using the file/simple language.
+| xref:languages:file-language.adoc[File] (camel-core-languages) | 1.1 | For expressions and predicates using the file/simple language.
 
-| xref:groovy-language.adoc[Groovy] (camel-groovy) | 1.3 | To use Groovy scripts in Camel expressions or predicates.
+| xref:languages:groovy-language.adoc[Groovy] (camel-groovy) | 1.3 | To use Groovy scripts in Camel expressions or predicates.
 
-| xref:header-language.adoc[Header] (camel-core-languages) | 1.5 | To use a Camel Message header in expressions or predicates.
+| xref:languages:header-language.adoc[Header] (camel-core-languages) | 1.5 | To use a Camel Message header in expressions or predicates.
 
-| xref:hl7terser-language.adoc[HL7 Terser] (camel-hl7) | 2.11 | To use HL7 terser scripts in Camel expressions or predicates.
+| xref:languages:hl7terser-language.adoc[HL7 Terser] (camel-hl7) | 2.11 | To use HL7 terser scripts in Camel expressions or predicates.
 
-| xref:jsonpath-language.adoc[JsonPath] (camel-jsonpath) | 2.13 | To use JsonPath in Camel expressions or predicates.
+| xref:languages:jsonpath-language.adoc[JsonPath] (camel-jsonpath) | 2.13 | To use JsonPath in Camel expressions or predicates.
 
-| xref:mvel-language.adoc[MVEL] (camel-mvel) | 2.0 | To use MVEL scripts in Camel expressions or predicates.
+| xref:languages:mvel-language.adoc[MVEL] (camel-mvel) | 2.0 | To use MVEL scripts in Camel expressions or predicates.
 
-| xref:ognl-language.adoc[OGNL] (camel-ognl) | 1.1 | To use OGNL scripts in Camel expressions or predicates.
+| xref:languages:ognl-language.adoc[OGNL] (camel-ognl) | 1.1 | To use OGNL scripts in Camel expressions or predicates.
 
-| xref:ref-language.adoc[Ref] (camel-core-languages) | 2.8 | Reference to an existing Camel expression or predicate, which is looked up from the Camel registry.
+| xref:languages:ref-language.adoc[Ref] (camel-core-languages) | 2.8 | Reference to an existing Camel expression or predicate, which is looked up from the Camel registry.
 
-| xref:simple-language.adoc[Simple] (camel-core-languages) | 1.1 | To use Camels built-in Simple language in Camel expressions or predicates.
+| xref:languages:simple-language.adoc[Simple] (camel-core-languages) | 1.1 | To use Camels built-in Simple language in Camel expressions or predicates.
 
-| xref:spel-language.adoc[SpEL] (camel-spring) | 2.7 | To use Spring Expression Language (SpEL) in Camel expressions or predicates.
+| xref:languages:spel-language.adoc[SpEL] (camel-spring) | 2.7 | To use Spring Expression Language (SpEL) in Camel expressions or predicates.
 
-| xref:tokenize-language.adoc[Tokenize] (camel-core-languages) | 2.0 | To use Camel message body or header with a tokenizer in Camel expressions or predicates.
+| xref:languages:tokenize-language.adoc[Tokenize] (camel-core-languages) | 2.0 | To use Camel message body or header with a tokenizer in Camel expressions or predicates.
 
-| xref:xtokenize-language.adoc[XML Tokenize] (camel-xml-jaxp) | 2.14 | To use Camel message body or header with a XML tokenizer in Camel expressions or predicates.
+| xref:languages:xtokenize-language.adoc[XML Tokenize] (camel-xml-jaxp) | 2.14 | To use Camel message body or header with a XML tokenizer in Camel expressions or predicates.
 
-| xref:xpath-language.adoc[XPath] (camel-xpath) | 1.1 | To use XPath (XML) in Camel expressions or predicates.
+| xref:languages:xpath-language.adoc[XPath] (camel-xpath) | 1.1 | To use XPath (XML) in Camel expressions or predicates.
 
-| xref:xquery-language.adoc[XQuery] (camel-saxon) | 1.0 | To use XQuery (XML) in Camel expressions or predicates.
+| xref:languages:xquery-language.adoc[XQuery] (camel-saxon) | 1.0 | To use XQuery (XML) in Camel expressions or predicates.
 |===
 // languages: END
 
diff --git a/docs/components/modules/ROOT/pages/jetty-component.adoc b/docs/components/modules/ROOT/pages/jetty-component.adoc
index 87f0bb5..b713eaa 100644
--- a/docs/components/modules/ROOT/pages/jetty-component.adoc
+++ b/docs/components/modules/ROOT/pages/jetty-component.adoc
@@ -226,7 +226,7 @@ Jetty component will copy the HTTP request parameter, `one` to the
 exchange's `in.header`. We can then use the `simple` language to route
 exchanges that contain this header to a specific endpoint and all others
 to another. If we used a language more powerful than
-xref:manual::simple-language.adoc[Simple] (such as xref:ognl-language.adoc[OGNL])
+xref:languages:simple-language.adoc[Simple] (such as xref:languages:ognl-language.adoc[OGNL])
 we could also test for the parameter value and do routing based on the
 header value as well.
 
diff --git a/docs/components/modules/ROOT/pages/jms-component.adoc b/docs/components/modules/ROOT/pages/jms-component.adoc
index be597fa..34c7bb1 100644
--- a/docs/components/modules/ROOT/pages/jms-component.adoc
+++ b/docs/components/modules/ROOT/pages/jms-component.adoc
@@ -1210,7 +1210,7 @@ Transactions and [Request Reply] over JMS
 When using Request Reply over JMS you cannot
 use a single transaction; JMS will not send any messages until a commit
 is performed, so the server side won't receive anything at all until the
-transaction commits. Therefore to use xref:manual::requestReply-eip.adoc[Request
+transaction commits. Therefore to use xref:manual:eips:requestReply-eip.adoc[Request
 Reply] you must commit a transaction after sending the request and then
 use a separate transaction for receiving the response.
 
diff --git a/docs/components/modules/ROOT/pages/language-component.adoc b/docs/components/modules/ROOT/pages/language-component.adoc
index 476c9f0..6b0169d 100644
--- a/docs/components/modules/ROOT/pages/language-component.adoc
+++ b/docs/components/modules/ROOT/pages/language-component.adoc
@@ -13,14 +13,14 @@ to an endpoint which executes a script by any of the supported
 Languages in Camel. +
  By having a component to execute language scripts, it allows more
 dynamic routing capabilities. For example by using the
-Routing Slip or xref:manual::dynamic-router.adoc[Dynamic
+Routing Slip or xref:manual:eips:dynamic-router.adoc[Dynamic
 Router] EIPs you can send messages to `language` endpoints where the
 script is dynamic defined as well.
 
 This component is provided out of the box in `camel-core` and hence no
 additional JARs is needed. You only have to include additional Camel
 components if the language of choice mandates it, such as using
-xref:groovy-language.adoc[Groovy] or xref:groovy-language.adoc[JavaScript] languages.
+xref:languages:groovy-language.adoc[Groovy] or xref:languages:groovy-language.adoc[JavaScript] languages.
 
 == URI format
 
@@ -109,17 +109,17 @@ script configured on the endpoint.
 
 == Examples
 
-For example you can use the xref:manual::simple-language.adoc[Simple] language to
+For example you can use the xref:languages:simple-language.adoc[Simple] language to
 Message Translator a message:
 
 In case you want to convert the message body type you can do this as
 well:
 
-You can also use the xref:groovy-language.adoc[Groovy] language, such as this
+You can also use the xref:languages:groovy-language.adoc[Groovy] language, such as this
 example where the input message will by multiplied with 2:
 
 You can also provide the script as a header as shown below. Here we use
-xref:xpath-language.adoc[XPath] language to extract the text from the `<foo>`
+xref:languages:xpath-language.adoc[XPath] language to extract the text from the `<foo>`
 tag.
 
 [source,java]
diff --git a/docs/components/modules/ROOT/pages/mina-component.adoc b/docs/components/modules/ROOT/pages/mina-component.adoc
index 2618ebd..b6d9bd6 100644
--- a/docs/components/modules/ROOT/pages/mina-component.adoc
+++ b/docs/components/modules/ROOT/pages/mina-component.adoc
@@ -186,7 +186,7 @@ See the Mina how to write your own codec. To use your custom codec with
 `camel-mina`, you should register your codec in the
 Registry; for example, by creating a bean in the
 Spring XML file. Then use the `codec` option to specify the bean ID of
-your codec. See xref:hl7-dataformat.adoc[HL7] that has a custom codec.
+your codec. See xref:dataformats:hl7-dataformat.adoc[HL7] that has a custom codec.
 
 === Sample with sync=false
 
diff --git a/docs/components/modules/ROOT/pages/mock-component.adoc b/docs/components/modules/ROOT/pages/mock-component.adoc
index 52e54dc..5dc21c6 100644
--- a/docs/components/modules/ROOT/pages/mock-component.adoc
+++ b/docs/components/modules/ROOT/pages/mock-component.adoc
@@ -33,7 +33,7 @@ Expression to create an order testing function,
 * Messages arrive match some kind of Predicate such
 as that specific headers have certain values, or that parts of the
 messages match some predicate, such as by evaluating an
-xref:xpath-language.adoc[XPath] or xref:xpath-language.adoc[XQuery]
+xref:languages:xpath-language.adoc[XPath] or xref:languages:xpath-language.adoc[XQuery]
 Expression.
 
 [NOTE]
diff --git a/docs/components/modules/ROOT/pages/properties-component.adoc b/docs/components/modules/ROOT/pages/properties-component.adoc
index 3bd3121..0f7024e 100644
--- a/docs/components/modules/ROOT/pages/properties-component.adoc
+++ b/docs/components/modules/ROOT/pages/properties-component.adoc
@@ -288,9 +288,9 @@ ProducerTemplate for example:
 template.sendBody("{{cool.start}}", "Hello World");
 ----
 
-== Example with xref:manual::simple-language.adoc[Simple] language
+== Example with xref:languages:simple-language.adoc[Simple] language
 
-The xref:manual::simple-language.adoc[Simple] language now also support using property
+The xref:languages:simple-language.adoc[Simple] language now also support using property
 placeholders, for example in the route below:
 
 [source,java]
@@ -547,7 +547,7 @@ placeholder notation with `{{` and `}}`.
 == Clashing Spring property placeholders with Camels Simple language
 
 Take notice when using Spring bridging placeholder then the spring `${ }`
-syntax clashes with the xref:manual::simple-language.adoc[Simple] in Camel, and therefore
+syntax clashes with the xref:languages:simple-language.adoc[Simple] in Camel, and therefore
 take care. For example:
 
 [source,xml]
@@ -558,7 +558,7 @@ take care. For example:
 ----
 
 clashes with Spring property placeholders, and you should use `$simple{ }`
-to indicate using the xref:manual::simple-language.adoc[Simple] language in Camel.
+to indicate using the xref:languages:simple-language.adoc[Simple] language in Camel.
 
 [source,xml]
 ----
@@ -805,7 +805,7 @@ To register a custom function from Java code is as shown below:
 PropertiesComponent pc = (org.apache.camel.componennt.properties.PropertiesComponent) context.getPropertiesComponent();
 pc.addFunction(new MyBeerFunction());
 ----
- 
+
 
 == Using 3rd-party properties sources
 
diff --git a/docs/components/modules/ROOT/pages/quickfix-component.adoc b/docs/components/modules/ROOT/pages/quickfix-component.adoc
index 42c698f..2a8ef6a 100644
--- a/docs/components/modules/ROOT/pages/quickfix-component.adoc
+++ b/docs/components/modules/ROOT/pages/quickfix-component.adoc
@@ -555,7 +555,7 @@ initially as a collection of key value pairs data. You can use this
 object or you can use the method 'toString' to retrieve the original FIX
 message.
 
-*Note:* Alternatively, you can use xref:bindy-dataformat.adoc[camel bindy dataformat] to transform the FIX message into your own java POJO
+*Note:* Alternatively, you can use xref:dataformats:bindy-dataformat.adoc[camel bindy dataformat] to transform the FIX message into your own java POJO
 
 When a message must be send to QuickFix, then you must create a
 QuickFix.Message instance.
diff --git a/docs/components/modules/ROOT/pages/ref-language.adoc b/docs/components/modules/ROOT/pages/ref-language.adoc
deleted file mode 100644
index 0b86da1..0000000
--- a/docs/components/modules/ROOT/pages/ref-language.adoc
+++ /dev/null
@@ -1,58 +0,0 @@
-[[ref-language]]
-= Ref Language
-:page-source: core/camel-core-languages/src/main/docs/ref-language.adoc
-
-*Since Camel 2.8*
-
-The Ref Expression Language is really just a way to lookup a custom
-Expression or Predicate from the Registry.
-
-This is particular useable in XML DSLs.
-
-== Ref Language options
-
-// language options: START
-The Ref language supports 1 options, which are listed below.
-
-
-
-[width="100%",cols="2,1m,1m,6",options="header"]
-|===
-| Name | Default | Java Type | Description
-| trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks
-|===
-// language options: END
-
-== Example usage
-
-The Splitter in XML DSL can utilize a custom
-expression using `<ref>` like:
-
-[source,xml]
-----
-<bean id="myExpression" class="com.mycompany.MyCustomExpression"/>
-
-<route>
-  <from uri="seda:a"/>
-  <split>
-    <ref>myExpression</ref>   
-    <to uri="mock:b"/>
-  </split>     
-</route>
-----
-
-in this case, the Message coming from the seda:a
-Endpoint will be splitted using a custom
-Expression which has the id `myExpression` in the
-Registry.
-
-And the same example using Java DSL:
-
-[source,java]
-----
-from("seda:a").split().ref("myExpression").to("seda:b");
-----
-
-== Dependencies
-
-The Ref language is part of *camel-core*.
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/pages/salesforce-component.adoc b/docs/components/modules/ROOT/pages/salesforce-component.adoc
index 367ea11..43b2931 100644
--- a/docs/components/modules/ROOT/pages/salesforce-component.adoc
+++ b/docs/components/modules/ROOT/pages/salesforce-component.adoc
@@ -366,7 +366,7 @@ For instance, consider that you need to limit the API usage of Salesforce so tha
 other routes. The body of output message contains an instance of
 `org.apache.camel.component.salesforce.api.dto.Limits` object that can be used in conjunction with
 Content Based Router and Content Based Router and 
-xref:spel-language.adoc[Spring Expression Language (SpEL)] to choose when to perform queries.
+xref:languages:spel-language.adoc[Spring Expression Language (SpEL)] to choose when to perform queries.
 
 Notice how multiplying `1.0` with the integer value held in `body.dailyApiRequests.remaining` makes the expression
 evaluate as with floating point arithmetic, without it - it would end up making integral division which would result
diff --git a/docs/components/modules/ROOT/pages/simple-language.adoc b/docs/components/modules/ROOT/pages/simple-language.adoc
deleted file mode 100644
index c135562..0000000
--- a/docs/components/modules/ROOT/pages/simple-language.adoc
+++ /dev/null
@@ -1,885 +0,0 @@
-[[simple-language]]
-= Simple Language
-:page-source: core/camel-core-languages/src/main/docs/simple-language.adoc
-
-*Since Camel 1.1*
-
-The Simple Expression Language was a really simple language when it was
-created, but has since grown more powerful. It is primarily intended for
-being a really small and simple language for evaluating
-Expressions and Predicates
-without requiring any new dependencies or knowledge of
-xref:components::xpath-language.adoc[XPath]; so it is ideal for testing in camel-core. The
-idea was to cover 95% of the common use cases when you need a little bit
-of expression based script in your Camel routes.
-
-However for much more complex use cases you are generally recommended to
-choose a more expressive and powerful language such as:
-
-* xref:components::groovy-language.adoc[Groovy]
-* xref:components::spel-language.adoc[SpEL]
-* xref:components::mvel-component.adoc[MVEL]
-* xref:components::ognl-language.adoc[OGNL]
-
-The simple language uses `${body`} placeholders for complex expressions
-where the expression contains constant literals. The $\{ } placeholders
-can be omitted if the expression is only the token itself.
-
-[TIP]
-====
-*Alternative syntax* 
-
-You can also use the alternative syntax which
-uses `$simple{ }` as placeholders. This can be used in situations to avoid clashes when using for example
-Spring property placeholder together with Camel.
-====
-
-== Simple Language options
-
-// language options: START
-The Simple language supports 2 options, which are listed below.
-
-
-
-[width="100%",cols="2,1m,1m,6",options="header"]
-|===
-| Name | Default | Java Type | Description
-| resultType |  | String | Sets the class name of the result type (type from output)
-| trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks
-|===
-// language options: END
-
-== Variables
-
-[width="100%",cols="10%,10%,80%",options="header",]
-|=======================================================================
-|Variable |Type |Description
-
-|camelId |String |the CamelContext name
-
-|camelContext.*OGNL* |Object |the CamelContext invoked using a Camel OGNL expression.
-
-|exchange |Exchange |the Exchange
-
-|exchange.*OGNL* |Object |the Exchange invoked using a Camel
-OGNL expression.
-
-|exchangeId |String |the exchange id
-
-|id |String |the input message id
-
-|body |Object |the input body
-
-|in.body |Object |*deprecated* the input body
-
-|body.*OGNL* |Object |the input body invoked using a Camel OGNL expression.
-
-|in.body.*OGNL* |Object |*deprecated* the input body invoked using a Camel OGNL expression.
-
-|bodyAs(_type_) |Type |Converts the body to the given type determined by its
-classname. The converted body can be null.
-
-|bodyAs(_type_).*OGNL* |Object |Converts the body to the given type determined by its
-classname and then invoke methods using a Camel OGNL expression. The
-converted body can be null.
-
-|bodyOneLine | String | Converts the body to a String and removes all line-breaks so the string is in one line.
-
-|mandatoryBodyAs(_type_) |Type |Converts the body to the given type determined by its
-classname, and expects the body to be not null.
-
-|mandatoryBodyAs(_type_).*OGNL* |Object |Converts the body to the given type determined by its
-classname and then invoke methods using a Camel OGNL expression.
-
-|header.foo |Object |refer to the input foo header
-
-|header:foo |Object |refer to the input foo header
-
-|header[foo] |Object |refer to the input foo header
-
-|headers.foo |Object |refer to the input foo header
-
-|headers:foo |Object |refer to the input foo header
-
-|headers[foo] |Object |refer to the input foo header
-
-|in.header.foo |Object |*deprecated* refer to the input foo header
-
-|in.header:foo |Object |*deprecated* refer to the input foo header
-
-|in.header[foo] |Object |*deprecated* refer to the input foo header
-
-|in.headers.foo |Object |*deprecated* refer to the input foo header
-
-|in.headers:foo |Object |*deprecated* refer to the input foo header
-
-|in.headers[foo] |Object |*deprecated* refer to the input foo header
-
-|header.foo[bar] |Object |regard input foo header as a map and perform lookup on the
-map with bar as key
-
-|in.header.foo[bar] |Object |*deprecated* regard input foo header as a map and perform lookup on the
-map with bar as key
-
-|in.headers.foo[bar] |Object |*deprecated* regard input foo header as a map and perform lookup on the
-map with bar as key
-
-|header.foo.*OGNL* |Object |refer to the input foo header and invoke its value using a
-Camel OGNL expression.
-
-|in.header.foo.*OGNL* |Object |*deprecated* refer to the input foo header and invoke its value using a
-Camel OGNL expression.
-
-|in.headers.foo.*OGNL* |Object |*deprecated* refer to the input foo header and invoke its value using a
-Camel OGNL expression.
-
-|headerAs(_key_,_type_) |Type |converts the header to the given type determined by its
-classname
-
-|headers |Map |refer to the input headers
-
-|in.headers |Map |*deprecated* refer to the input headers
-
-|exchangeProperty.foo |Object |refer to the foo property on the exchange
-
-|exchangeProperty[foo] |Object |refer to the foo property on the exchange
-
-|exchangeProperty.foo.*OGNL* |Object |refer to the foo property on the exchange and invoke its
-value using a Camel OGNL expression.
-
-|sys.foo |String |refer to the JVM system property
-
-|sysenv.foo |String |refer to the system environment variable
-
-|env.foo |String |refer to the system environment variable
-
-|exception |Object |refer to the exception object on the exchange, is *null* if
-no exception set on exchange. Will fallback and grab caught exceptions
-(`Exchange.EXCEPTION_CAUGHT`) if the Exchange has any.
-
-|exception.*OGNL* |Object |refer to the exchange exception invoked using a Camel OGNL
-expression object
-
-|exception.message |String |refer to the exception.message on the exchange, is *null* if no
-exception set on exchange. Will fallback and grab caught exceptions
-(`Exchange.EXCEPTION_CAUGHT`) if the Exchange has any.
-
-|exception.stacktrace |String |refer to the exception.stracktrace on the exchange, is
-*null* if no exception set on exchange. Will fallback and grab caught
-exceptions (`Exchange.EXCEPTION_CAUGHT`) if the Exchange has any.
-
-|date:_command_ |Date |evaluates to a Date object.
-Supported commands are: *now* for current timestamp, *in.header.xxx* or
-*header.xxx* to use the Date object header with the key xxx.
-*exchangeProperty.xxx* to use the Date object in the exchange property with the key xxx.
-*file* for the last modified timestamp of the file (available with a File consumer).
-Command accepts offsets such as: *now-24h* or *in.header.xxx+1h* or even *now+1h30m-100*.
-
-|date:_command:pattern_ |String |Date formatting using `java.text.SimpleDateFormat` patterns.
-
-|date-with-timezone:_command:timezone:pattern_ |String |Date formatting using `java.text.SimpleDateFormat` timezones and patterns.
-
-|bean:_bean expression_ |Object |Invoking a bean expression using the xref:components::bean-component.adoc[Bean] language.
-Specifying a method name you must use dot as separator. We also support
-the ?method=methodname syntax that is used by the xref:components::bean-component.adoc[Bean]
-component. Camel will by default lookup a bean by the given name. However if you need to refer
-to a bean class (such as calling a static method) then you can prefix with type, such as `bean:type:fqnClassName`.
-
-|`properties:key:default` |String |Lookup a property with the given key. If the key does
-not exists or has no value, then an optional default value can be
-specified.
-
-|routeId |String |Returns the id of the current route the
-Exchange is being routed.
-
-|stepId |String |Returns the id of the current step the
-Exchange is being routed.
-
-|threadName |String |Returns the name of the current thread. Can be used for
-logging purpose.
-
-|hostname |String |Returns the local hostname (may be empty if not possible to resolve).
-
-|ref:xxx |Object |To lookup a bean from the Registry with
-the given id.
-
-|type:name.field |Object |To refer to a type or field by its FQN name. To refer to a
-field you can append .FIELD_NAME. For example you can refer to the
-constant field from Exchange as: `org.apache.camel.Exchange.FILE_NAME`
-
-|null |null |represents a *null*
-
-|random_(value)_ |Integer |returns a random Integer between 0 (included) and _value_
-(excluded)
-
-|random_(min,max)_ |Integer |returns a random Integer between _min_ (included) and
-_max_ (excluded)
-
-|collate(group) |List |The collate function iterates the message body and groups
-the data into sub lists of specified size. This can be used with the
-Splitter EIP to split a message body and group/batch
-the splitted sub message into a group of N sub lists. This method works
-similar to the collate method in Groovy.
-
-|skip(number) |Iterator |The skip function iterates the message body and skips
-the first number of items. This can be used with the
-Splitter EIP to split a message body and skip the first N number of items.
-
-|messageHistory |String |The message history of the current exchange how it has
-been routed. This is similar to the route stack-trace message history
-the error handler logs in case of an unhandled exception.
-
-|messageHistory(false) |String |As messageHistory but without the exchange details (only
-includes the route strack-trace). This can be used if you do not want to
-log sensitive data from the message itself.
-|=======================================================================
-
-== OGNL expression support
-
-INFO:Camel's OGNL support is for invoking methods only. You cannot access
-fields. Camel support accessing the length field of Java arrays.
-
-
-The xref:simple-language.adoc[Simple] and xref:simple-language.adoc[Bean] language now
-supports a Camel OGNL notation for invoking beans in a chain like
-fashion. Suppose the Message IN body contains a POJO which has a `getAddress()`
-method.
-
-Then you can use Camel OGNL notation to access the address object:
-
-[source,java]
---------------------------------
-simple("${body.address}")
-simple("${body.address.street}")
-simple("${body.address.zip}")
---------------------------------
-
-Camel understands the shorthand names for getters, but you can invoke
-any method or use the real name such as:
-
-[source,java]
---------------------------------------
-simple("${body.address}")
-simple("${body.getAddress.getStreet}")
-simple("${body.address.getZip}")
-simple("${body.doSomething}")
---------------------------------------
-
-You can also use the null safe operator (`?.`) to avoid NPE if for
-example the body does NOT have an address
-
-[source,java]
-----------------------------------
-simple("${body?.address?.street}")
-----------------------------------
-
-It is also possible to index in `Map` or `List` types, so you can do:
-
-[source,java]
----------------------------
-simple("${body[foo].name}")
----------------------------
-
-To assume the body is `Map` based and lookup the value with `foo` as
-key, and invoke the `getName` method on that value.
-
-If the key has space, then you *must* enclose the key with quotes, for
-example 'foo bar':
-
-[source,java]
----------------------------------
-simple("${body['foo bar'].name}")
----------------------------------
-
-You can access the `Map` or `List` objects directly using their key name
-(with or without dots) :
-
-[source,java]
-------------------------------
-simple("${body[foo]}")
-simple("${body[this.is.foo]}")
-------------------------------
-
-Suppose there was no value with the key `foo` then you can use the null
-safe operator to avoid the NPE as shown:
-
-[source,java]
-----------------------------
-simple("${body[foo]?.name}")
-----------------------------
-
-You can also access `List` types, for example to get lines from the
-address you can do:
-
-[source,java]
-----------------------------------
-simple("${body.address.lines[0]}")
-simple("${body.address.lines[1]}")
-simple("${body.address.lines[2]}")
-----------------------------------
-
-There is a special `last` keyword which can be used to get the last
-value from a list.
-
-[source,java]
--------------------------------------
-simple("${body.address.lines[last]}")
--------------------------------------
-
-And to get the 2nd last you can subtract a number, so we can use
-`last-1` to indicate this:
-
-[source,java]
----------------------------------------
-simple("${body.address.lines[last-1]}")
----------------------------------------
-
-And the 3rd last is of course:
-
-[source,java]
----------------------------------------
-simple("${body.address.lines[last-2]}")
----------------------------------------
-
-And you can call the size method on the list with
-
-[source,java]
-------------------------------------
-simple("${body.address.lines.size}")
-------------------------------------
-
-Camel supports the length field for Java arrays as well, eg:
-
-[source,java]
----------------------------------------------------
-String[] lines = new String[]{"foo", "bar", "cat"};
-exchange.getIn().setBody(lines);
-
-simple("There are ${body.length} lines")
----------------------------------------------------
-
-And yes you can combine this with the operator support as shown below:
-
-[source,java]
-------------------------------------
-simple("${body.address.zip} > 1000")
-------------------------------------
-
-== Operator support
-
-The parser is limited to only support a single operator.
-
-To enable it the left value must be enclosed in $\{ }. The syntax is:
-
-[source]
---------------------------
-${leftValue} OP rightValue
---------------------------
-
-Where the `rightValue` can be a String literal enclosed in `' '`,
-`null`, a constant value or another expression enclosed in $\{ }.
-
-IMPORTANT: There *must* be spaces around the operator.
-
-Camel will automatically type convert the rightValue type to the
-leftValue type, so it is able to eg. convert a string into a numeric so
-you can use > comparison for numeric values.
-
-The following operators are supported:
-
-[width="100%",cols="50%,50%",options="header",]
-|===
-|Operator |Description
-
-|== |equals
-
-|=~ |equals ignore case (will ignore case when comparing String values)
-
-|> |greater than
-
-|>= |greater than or equals
-
-|< |less than
-
-|<= |less than or equals
-
-|!= |not equals
-
-|!=~ |not equals ignore case (will ignore case when comparing String values)
-
-|contains |For testing if contains in a string based value
-
-|!contains |For testing if not contains in a string based value
-
-|~~ |For testing if contains by ignoring case sensitivity in a string based value
-
-|!~~ |For testing if not contains by ignoring case sensitivity in a string based value
-
-|regex |For matching against a given regular expression pattern defined as a
-String value
-
-|!regex |For not matching against a given regular expression pattern defined as a
-String value
-
-|in |For matching if in a set of values, each element must be separated by
-comma. If you want to include an empty value, then it must be defined using double comma, eg ',,bronze,silver,gold', which
-is a set of four values with an empty value and then the three medals.
-
-|!in |For matching if not in a set of values, each element must be separated
-by comma. If you want to include an empty value, then it must be defined using double comma, eg ',,bronze,silver,gold', which
-is a set of four values with an empty value and then the three medals.
-
-|is |For matching if the left hand side type is an instanceof the value.
-
-|!is |For matching if the left hand side type is not an instanceof the value.
-
-|range |For matching if the left hand side is within a range of values defined
-as numbers: `from..to`..
-
-|!range |For matching if the left hand side is not within a range of values
-defined as numbers: `from..to`. .
-
-|startsWith |For testing if the left hand side string starts
-with the right hand string.
-
-|endsWith |For testing if the left hand side string ends with
-the right hand string.
-|===
-
-And the following unary operators can be used:
-
-[width="100%",cols="50%,50%",options="header",]
-|===
-|Operator |Description
-
-|++ |To increment a number by one. The left hand side must be a
-function, otherwise parsed as literal.
-
-|-- |To decrement a number by one. The left hand side must be a
-function, otherwise parsed as literal.
-
-|\ |To escape a value, eg \$, to indicate a $ sign.
-Special: Use \n for new line, \t for tab, and \r for carriage return.
-*Notice:* Escaping is *not* supported using the
-xref:file-language.adoc[File Language]. *Notice:* The escape character is not supported, use the
-following three special escaping instead.
-
-|\n |To use newline character.
-
-|\t |To use tab character.
-
-|\r |To use carriage return character.
-
-|\} |To use the } character as text
-|===
-
-And the following logical operators can be used to group expressions:
-
-[width="100%",cols="50%,50%",options="header",]
-|===
-|Operator |Description
-
-|&& |The logical and operator is used to group two expressions.
-
-| \|\| |The logical or operator is used to group two expressions.
-|===
-
-The syntax for AND is:
-
-[source]
-----------------------------------------------------------
-${leftValue} OP rightValue && ${leftValue} OP rightValue
-----------------------------------------------------------
-
-And the syntax for OR is:
-
-[source]
----------------------------------------------------------
-${leftValue} OP rightValue || ${leftValue} OP rightValue
----------------------------------------------------------
-
-Some examples:
-
-[source,java]
-----
-// exact equals match
-simple("${in.header.foo} == 'foo'")
-
-// ignore case when comparing, so if the header has value FOO this will match
-simple("${in.header.foo} =~ 'foo'")
-
-// here Camel will type convert '100' into the type of in.header.bar and if it is an Integer '100' will also be converter to an Integer
-simple("${in.header.bar} == '100'")
-
-simple("${in.header.bar} == 100")
-
-// 100 will be converter to the type of in.header.bar so we can do > comparison
-simple("${in.header.bar} > 100")
-----
-
-=== Comparing with different types
-
-When you compare with different types such as String and int, then you
-have to take a bit care. Camel will use the type from the left hand side
-as 1st priority. And fallback to the right hand side type if both values
-couldn't be compared based on that type. +
- This means you can flip the values to enforce a specific type. Suppose
-the bar value above is a String. Then you can flip the equation:
-
-[source,java]
-----
-simple("100 < ${in.header.bar}")
-----
-
-which then ensures the int type is used as 1st priority.
-
-This may change in the future if the Camel team improves the binary
-comparison operations to prefer numeric types over String based. It's
-most often the String type which causes problem when comparing with
-numbers.
-
-[source,java]
-----
-// testing for null
-simple("${in.header.baz} == null")
-
-// testing for not null
-simple("${in.header.baz} != null")
-----
-
-And a bit more advanced example where the right value is another
-expression
-
-[source,java]
-----
-simple("${in.header.date} == ${date:now:yyyyMMdd}")
-
-simple("${in.header.type} == ${bean:orderService?method=getOrderType}")
-----
-
-And an example with contains, testing if the title contains the word
-Camel
-
-[source,java]
-----
-simple("${in.header.title} contains 'Camel'")
-----
-
-And an example with regex, testing if the number header is a 4 digit
-value:
-
-[source,java]
-----
-simple("${in.header.number} regex '\\d{4}'")
-----
-
-And finally an example if the header equals any of the values in the
-list. Each element must be separated by comma, and no space around. +
- This also works for numbers etc, as Camel will convert each element
-into the type of the left hand side.
-
-[source,java]
-----
-simple("${in.header.type} in 'gold,silver'")
-----
-
-And for all the last 3 we also support the negate test using not:
-
-[source,java]
-----
-simple("${in.header.type} !in 'gold,silver'")
-----
-
-And you can test if the type is a certain instance, eg for instance a
-String
-
-[source,java]
-----
-simple("${in.header.type} is 'java.lang.String'")
-----
-
-We have added a shorthand for all `java.lang` types so you can write it
-as:
-
-[source,java]
-----
-simple("${in.header.type} is 'String'")
-----
-
-Ranges are also supported. The range interval requires numbers and both
-from and end are inclusive. For instance to test whether a value is
-between 100 and 199:
-
-[source,java]
-----
-simple("${in.header.number} range 100..199")
-----
-
-Notice we use `..` in the range without spaces. It is based on the same
-syntax as Groovy.
-
-From *Camel 2.9* onwards the range value must be in single quotes
-
-[source,java]
-----
-simple("${in.header.number} range '100..199'")
-----
-
-=== Using Spring XML
-
-As the Spring XML does not have all the power as the Java DSL with all
-its various builder methods, you have to resort to use some other
-languages for testing with simple operators. Now you can do this with the simple
-language. In the sample below we want to test if the header is a widget
-order:
-
-[source,xml]
-----
-<from uri="seda:orders">
-   <filter>
-       <simple>${in.header.type} == 'widget'</simple>
-       <to uri="bean:orderService?method=handleWidget"/>
-   </filter>
-</from>
-----
-
-== Using and / or
-
-If you have two expressions you can combine them with the `&&` or `||`
-operator.
-
-For instance:
-
-[source,java]
------
-simple("${in.header.title} contains 'Camel' && ${in.header.type'} == 'gold'")
------
-
-And of course the `||` is also supported. The sample would be:
-
-[source,java]
------
-simple("${in.header.title} contains 'Camel' || ${in.header.type'} == 'gold'")
------
-
-*Notice:* Currently `&&` or `||` can only be used *once* in a simple
-language expression. This might change in the future. +
- So you *cannot* do:
-
-[source,java]
------
-simple("${in.header.title} contains 'Camel' && ${in.header.type'} == 'gold' && ${in.header.number} range 100..200")
------
-
-
-== Samples
-
-In the Spring XML sample below we filter based on a header value:
-
-[source,xml]
---------------------------------------------
-<from uri="seda:orders">
-   <filter>
-       <simple>${in.header.foo}</simple>
-       <to uri="mock:fooOrders"/>
-   </filter>
-</from>
---------------------------------------------
-
-The Simple language can be used for the predicate test above in the
-Message Filter pattern, where we test if the
-in message has a `foo` header (a header with the key `foo` exists). If
-the expression evaluates to *true* then the message is routed to the
-`mock:fooOrders` endpoint, otherwise the message is dropped.
-
-The same example in Java DSL:
-
-[source,java]
-----
-from("seda:orders")
-    .filter().simple("${in.header.foo}")
-        .to("seda:fooOrders");
-----
-
-You can also use the simple language for simple text concatenations such
-as:
-
-[source,java]
-----
-from("direct:hello")
-    .transform().simple("Hello ${in.header.user} how are you?")
-    .to("mock:reply");
-----
-
-Notice that we must use $\{ } placeholders in the expression now to
-allow Camel to parse it correctly.
-
-And this sample uses the date command to output current date.
-
-[source,java]
-----
-from("direct:hello")
-    .transform().simple("The today is ${date:now:yyyyMMdd} and it is a great day.")
-    .to("mock:reply");
-----
-
-And in the sample below we invoke the bean language to invoke a method
-on a bean to be included in the returned string:
-
-[source,java]
-----
-from("direct:order")
-    .transform().simple("OrderId: ${bean:orderIdGenerator}")
-    .to("mock:reply");
-----
-
-Where `orderIdGenerator` is the id of the bean registered in the
-Registry. If using Spring then it is the Spring bean
-id.
-
-If we want to declare which method to invoke on the order id generator
-bean we must prepend `.method name` such as below where we invoke the
-`generateId` method.
-
-[source,java]
-----
-from("direct:order")
-    .transform().simple("OrderId: ${bean:orderIdGenerator.generateId}")
-    .to("mock:reply");
-----
-
-We can use the `?method=methodname` option that we are familiar with the
-xref:components::bean-component.adoc[Bean] component itself:
-
-[source,java]
-----
-from("direct:order")
-    .transform().simple("OrderId: ${bean:orderIdGenerator?method=generateId}")
-    .to("mock:reply");
-----
-
-You can also convert the body to a given
-type, for example to ensure that it is a String you can do:
-
-[source,xml]
-----
-<transform>
-  <simple>Hello ${bodyAs(String)} how are you?</simple>
-</transform>
-----
-
-There are a few types which have a shorthand notation, so we can use
-`String` instead of `java.lang.String`. These are:
-`byte[], String, Integer, Long`. All other types must use their FQN
-name, e.g. `org.w3c.dom.Document`.
-
-It is also possible to lookup a value from a header `Map`:
-
-[source,xml]
-----
-<transform>
-  <simple>The gold value is ${header.type[gold]}</simple>
-</transform>
-----
-
-In the code above we lookup the header with name `type` and regard it as
-a `java.util.Map` and we then lookup with the key `gold` and return the
-value. If the header is not convertible to Map an exception is thrown. If the
-header with name `type` does not exist `null` is returned.
-
-You can nest functions, such as shown below:
-
-[source,xml]
-----
-<setHeader name="myHeader">
-  <simple>${properties:${header.someKey}}</simple>
-</setHeader>
-----
-
-== Referring to constants or enums
-
-Suppose you have an enum for customers
-
-And in a Content Based Router we can use
-the xref:simple-language.adoc[Simple] language to refer to this enum, to check
-the message which enum it matches.
-
-== Using new lines or tabs in XML DSLs
-
-It is easier to specify new lines or tabs in
-XML DSLs as you can escape the value now
-
-[source,xml]
-----
-<transform>
-  <simple>The following text\nis on a new line</simple>
-</transform>
-----
-
-== Leading and trailing whitespace handling
-
-The trim attribute of the expression can be
-used to control whether the leading and trailing whitespace characters
-are removed or preserved. The default value is true, which removes the
-whitespace characters.
-
-[source,xml]
-----
-<setBody>
-  <simple trim="false">You get some trailing whitespace characters.     </simple>
-</setBody>
-----
-
-== Setting result type
-
-You can now provide a result type to the xref:simple-language.adoc[Simple]
-expression, which means the result of the evaluation will be converted
-to the desired type. This is most usable to define types such as
-booleans, integers, etc.
-
-For example to set a header as a boolean type you can do:
-
-[source,java]
-----
-.setHeader("cool", simple("true", Boolean.class))
-----
-
-And in XML DSL
-
-[source,xml]
-----
-<setHeader name="cool">
-  <!-- use resultType to indicate that the type should be a java.lang.Boolean -->
-  <simple resultType="java.lang.Boolean">true</simple>
-</setHeader>
-----
-
-== Loading script from external resource
-
-You can externalize the script and have Camel load it from a resource
-such as `"classpath:"`, `"file:"`, or `"http:"`. +
- This is done using the following syntax: `"resource:scheme:location"`,
-eg to refer to a file on the classpath you can do:
-
-[source,java]
-----
-.setHeader("myHeader").simple("resource:classpath:mysimple.txt")
-----
-
-== Setting Spring beans to Exchange properties
-
-You can set a spring bean into an exchange property as shown below:
-
-[source,xml]
-----
-<bean id="myBeanId" class="my.package.MyCustomClass" />
-...
-<route>
-  ...
-  <setProperty name="monitoring.message">
-    <simple>ref:myBeanId</simple>
-  </setProperty>
-  ...
-</route>
-----
-
diff --git a/docs/components/modules/ROOT/pages/spring-event-component.adoc b/docs/components/modules/ROOT/pages/spring-event-component.adoc
index 774afc7..6e5fead 100644
--- a/docs/components/modules/ROOT/pages/spring-event-component.adoc
+++ b/docs/components/modules/ROOT/pages/spring-event-component.adoc
@@ -13,7 +13,7 @@ The Spring Event component provides access to the Spring
 `ApplicationEvent` objects to a Spring `ApplicationContext` or to
 consume them. You can then use
 xref:manual::enterprise-integration-patterns.adoc[Enterprise Integration
-Patterns] to process them such as xref:manual::filter-eip.adoc[Message
+Patterns] to process them such as xref:manual:eips:filter-eip.adoc[Message
 Filter].
 
 == URI format
diff --git a/docs/components/modules/ROOT/pages/tokenize-language.adoc b/docs/components/modules/ROOT/pages/tokenize-language.adoc
deleted file mode 100644
index bf1f30a..0000000
--- a/docs/components/modules/ROOT/pages/tokenize-language.adoc
+++ /dev/null
@@ -1,40 +0,0 @@
-[[tokenize-language]]
-= Tokenize Language
-:page-source: core/camel-core-languages/src/main/docs/tokenize-language.adoc
-
-*Since Camel 2.0*
-
-The tokenizer language is a built-in language in camel-core, which is
-most often used only with the Splitter EIP to split
-a message using a token-based strategy. +
-The tokenizer language is intended to tokenize text documents using a
-specified delimiter pattern. It can also be used to tokenize XML
-documents with some limited capability. For a truly XML-aware
-tokenization, the use of the XMLTokenizer
-language is recommended as it offers a faster, more efficient
-tokenization specifically for XML documents. For more details
-see Splitter.
-
-== Tokenize Options
-
-// language options: START
-The Tokenize language supports 11 options, which are listed below.
-
-
-
-[width="100%",cols="2,1m,1m,6",options="header"]
-|===
-| Name | Default | Java Type | Description
-| token |  | String | The (start) token to use as tokenizer, for example you can use the new line token. You can use simple language as the token to support dynamic tokens.
-| endToken |  | String | The end token to use as tokenizer if using start/end token pairs. You can use simple language as the token to support dynamic tokens.
-| inheritNamespaceTagName |  | String | To inherit namespaces from a root/parent tag name when using XML You can use simple language as the tag name to support dynamic names.
-| headerName |  | String | Name of header to tokenize instead of using the message body.
-| regex | false | Boolean | If the token is a regular expression pattern. The default value is false
-| xml | false | Boolean | Whether the input is XML messages. This option must be set to true if working with XML payloads.
-| includeTokens | false | Boolean | Whether to include the tokens in the parts when using pairs The default value is false
-| group |  | String | To group N parts together, for example to split big files into chunks of 1000 lines. You can use simple language as the group to support dynamic group sizes.
-| groupDelimiter |  | String | Sets the delimiter to use when grouping. If this has not been set then token will be used as the delimiter.
-| skipFirst | false | Boolean | To skip the very first element
-| trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks
-|===
-// language options: END
diff --git a/docs/components/modules/ROOT/pages/xquery-component.adoc b/docs/components/modules/ROOT/pages/xquery-component.adoc
index 1852106..d1991bd 100644
--- a/docs/components/modules/ROOT/pages/xquery-component.adoc
+++ b/docs/components/modules/ROOT/pages/xquery-component.adoc
@@ -12,7 +12,7 @@ Camel supports http://www.w3.org/TR/xquery/[XQuery] to allow an
 Expression or Predicate to be
 used in the DSL or xref:manual::xml-configuration.adoc[Xml
 Configuration]. For example you could use XQuery to create an
-Predicate in a xref:manual::filter-eip.adoc[Message
+Predicate in a xref:manual:eips:filter-eip.adoc[Message
 Filter] or as an Expression for a Recipient List.
 
 == Options
diff --git a/docs/components/modules/ROOT/pages/xtokenize-language.adoc b/docs/components/modules/ROOT/pages/xtokenize-language.adoc
deleted file mode 100644
index 14b35bf..0000000
--- a/docs/components/modules/ROOT/pages/xtokenize-language.adoc
+++ /dev/null
@@ -1,32 +0,0 @@
-[[xtokenize-language]]
-= XML Tokenize Language
-:page-source: core/camel-xml-jaxp/src/main/docs/xtokenize-language.adoc
-
-*Since Camel 2.14*
-
-The xml tokenizer language is a built-in language in camel-core, which
-is a truly XML-aware tokenizer that can be used with the Splitter as the
-conventional Tokenizer to efficiently and
-effectively tokenize XML documents. XMLTokenizer is capable of not only
-recognizing XML namespaces and hierarchical structures of the document
-but also more efficiently tokenizing XML documents than the conventional
-Tokenizer. 
-
-For more details see Splitter.
-
-== XML Tokenizer Options
-
-// language options: START
-The XML Tokenize language supports 4 options, which are listed below.
-
-
-
-[width="100%",cols="2,1m,1m,6",options="header"]
-|===
-| Name | Default | Java Type | Description
-| headerName |  | String | Name of header to tokenize instead of using the message body.
-| mode |  | String | The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default) w - wrapping the extracted token in its ancestor context u - unwrapping the extracted token to its child content t - extracting the text content of the specified element
-| group |  | Integer | To group N parts together
-| trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks
-|===
-// language options: END
\ No newline at end of file
diff --git a/docs/components/modules/dataformats/nav.adoc b/docs/components/modules/dataformats/nav.adoc
new file mode 100644
index 0000000..fe69b45
--- /dev/null
+++ b/docs/components/modules/dataformats/nav.adoc
@@ -0,0 +1,47 @@
+// this file is auto generated and changes to it will be overwritten
+// make edits in docs/*nav.adoc.template files instead
+
+* Data Formats
+** xref:dataformats:any23-dataformat.adoc[Any23 DataFormat]
+** xref:dataformats:asn1-dataformat.adoc[ASN.1 File DataFormat]
+** xref:dataformats:avro-dataformat.adoc[Avro DataFormat]
+** xref:dataformats:barcode-dataformat.adoc[Barcode DataFormat]
+** xref:dataformats:base64-dataformat.adoc[Base64 DataFormat]
+** xref:dataformats:beanio-dataformat.adoc[BeanIO DataFormat]
+** xref:dataformats:bindy-dataformat.adoc[Bindy DataFormat]
+** xref:dataformats:cbor-dataformat.adoc[CBOR DataFormat]
+** xref:dataformats:crypto-dataformat.adoc[Crypto (Java Cryptographic Extension) DataFormat]
+** xref:dataformats:csv-dataformat.adoc[CSV DataFormat]
+** xref:dataformats:fhirJson-dataformat.adoc[FHIR JSon DataFormat]
+** xref:dataformats:fhirXml-dataformat.adoc[FHIR XML DataFormat]
+** xref:dataformats:flatpack-dataformat.adoc[Flatpack DataFormat]
+** xref:dataformats:grok-dataformat.adoc[Grok DataFormat]
+** xref:dataformats:gzipdeflater-dataformat.adoc[GZip Deflater DataFormat]
+** xref:dataformats:hl7-dataformat.adoc[HL7 DataFormat]
+** xref:dataformats:ical-dataformat.adoc[iCal DataFormat]
+** xref:dataformats:jacksonxml-dataformat.adoc[JacksonXML DataFormat]
+** xref:dataformats:jaxb-dataformat.adoc[JAXB DataFormat]
+** xref:dataformats:json-fastjson-dataformat.adoc[JSon Fastjson DataFormat]
+** xref:dataformats:json-gson-dataformat.adoc[JSon GSon DataFormat]
+** xref:dataformats:json-jackson-dataformat.adoc[JSon Jackson DataFormat]
+** xref:dataformats:json-johnzon-dataformat.adoc[JSon Johnzon DataFormat]
+** xref:dataformats:json-xstream-dataformat.adoc[JSon XStream DataFormat]
+** xref:dataformats:jsonApi-dataformat.adoc[JSonApi DataFormat]
+** xref:dataformats:lzf-dataformat.adoc[LZF Deflate Compression DataFormat]
+** xref:dataformats:mime-multipart-dataformat.adoc[MIME Multipart DataFormat]
+** xref:dataformats:pgp-dataformat.adoc[PGP DataFormat]
+** xref:dataformats:protobuf-dataformat.adoc[Protobuf DataFormat]
+** xref:dataformats:rss-dataformat.adoc[RSS DataFormat]
+** xref:dataformats:secureXML-dataformat.adoc[XML Security DataFormat]
+** xref:dataformats:soapjaxb-dataformat.adoc[SOAP DataFormat]
+** xref:dataformats:syslog-dataformat.adoc[Syslog DataFormat]
+** xref:dataformats:tarfile-dataformat.adoc[Tar File DataFormat]
+** xref:dataformats:thrift-dataformat.adoc[Thrift DataFormat]
+** xref:dataformats:tidyMarkup-dataformat.adoc[TidyMarkup DataFormat]
+** xref:dataformats:univocity-csv-dataformat.adoc[uniVocity CSV DataFormat]
+** xref:dataformats:univocity-fixed-dataformat.adoc[uniVocity Fixed Length DataFormat]
+** xref:dataformats:univocity-tsv-dataformat.adoc[uniVocity TSV DataFormat]
+** xref:dataformats:xstream-dataformat.adoc[XStream DataFormat]
+** xref:dataformats:yaml-snakeyaml-dataformat.adoc[YAML SnakeYAML DataFormat]
+** xref:dataformats:zipdeflater-dataformat.adoc[Zip Deflate Compression DataFormat]
+** xref:dataformats:zipfile-dataformat.adoc[Zip File DataFormat]
diff --git a/docs/components/modules/ROOT/pages/any23-dataformat.adoc b/docs/components/modules/dataformats/pages/any23-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/any23-dataformat.adoc
rename to docs/components/modules/dataformats/pages/any23-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/asn1-dataformat.adoc b/docs/components/modules/dataformats/pages/asn1-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/asn1-dataformat.adoc
rename to docs/components/modules/dataformats/pages/asn1-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/avro-dataformat.adoc b/docs/components/modules/dataformats/pages/avro-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/avro-dataformat.adoc
rename to docs/components/modules/dataformats/pages/avro-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/barcode-dataformat.adoc b/docs/components/modules/dataformats/pages/barcode-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/barcode-dataformat.adoc
rename to docs/components/modules/dataformats/pages/barcode-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/base64-dataformat.adoc b/docs/components/modules/dataformats/pages/base64-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/base64-dataformat.adoc
rename to docs/components/modules/dataformats/pages/base64-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/beanio-dataformat.adoc b/docs/components/modules/dataformats/pages/beanio-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/beanio-dataformat.adoc
rename to docs/components/modules/dataformats/pages/beanio-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/bindy-dataformat.adoc b/docs/components/modules/dataformats/pages/bindy-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/bindy-dataformat.adoc
rename to docs/components/modules/dataformats/pages/bindy-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/cbor-dataformat.adoc b/docs/components/modules/dataformats/pages/cbor-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/cbor-dataformat.adoc
rename to docs/components/modules/dataformats/pages/cbor-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/crypto-dataformat.adoc b/docs/components/modules/dataformats/pages/crypto-dataformat.adoc
similarity index 99%
rename from docs/components/modules/ROOT/pages/crypto-dataformat.adoc
rename to docs/components/modules/dataformats/pages/crypto-dataformat.adoc
index 42734c0..9cc87b0 100644
--- a/docs/components/modules/ROOT/pages/crypto-dataformat.adoc
+++ b/docs/components/modules/dataformats/pages/crypto-dataformat.adoc
@@ -264,7 +264,7 @@ or with spring.
 
 == Dependencies
 
-To use the xref:crypto-component.adoc[Crypto] dataformat in your camel routes you
+To use the xref:ROOT:crypto-component.adoc[Crypto] dataformat in your camel routes you
 need to add the following dependency to your pom.
 
 [source,xml]
diff --git a/docs/components/modules/ROOT/pages/csv-dataformat.adoc b/docs/components/modules/dataformats/pages/csv-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/csv-dataformat.adoc
rename to docs/components/modules/dataformats/pages/csv-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/fhirJson-dataformat.adoc b/docs/components/modules/dataformats/pages/fhirJson-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/fhirJson-dataformat.adoc
rename to docs/components/modules/dataformats/pages/fhirJson-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/fhirXml-dataformat.adoc b/docs/components/modules/dataformats/pages/fhirXml-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/fhirXml-dataformat.adoc
rename to docs/components/modules/dataformats/pages/fhirXml-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/flatpack-dataformat.adoc b/docs/components/modules/dataformats/pages/flatpack-dataformat.adoc
similarity index 98%
rename from docs/components/modules/ROOT/pages/flatpack-dataformat.adoc
rename to docs/components/modules/dataformats/pages/flatpack-dataformat.adoc
index 0f0efea..5a01a94 100644
--- a/docs/components/modules/ROOT/pages/flatpack-dataformat.adoc
+++ b/docs/components/modules/dataformats/pages/flatpack-dataformat.adoc
@@ -4,7 +4,7 @@
 
 *Since Camel 2.1*
 
-The xref:flatpack-component.adoc[Flatpack] component ships with the Flatpack data
+The xref:ROOT:flatpack-component.adoc[Flatpack] component ships with the Flatpack data
 format that can be used to format between fixed width or delimited text
 messages to a `List` of rows as `Map`.
 
diff --git a/docs/components/modules/ROOT/pages/grok-dataformat.adoc b/docs/components/modules/dataformats/pages/grok-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/grok-dataformat.adoc
rename to docs/components/modules/dataformats/pages/grok-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/gzipdeflater-dataformat.adoc b/docs/components/modules/dataformats/pages/gzipdeflater-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/gzipdeflater-dataformat.adoc
rename to docs/components/modules/dataformats/pages/gzipdeflater-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/hl7-dataformat.adoc b/docs/components/modules/dataformats/pages/hl7-dataformat.adoc
similarity index 97%
rename from docs/components/modules/ROOT/pages/hl7-dataformat.adoc
rename to docs/components/modules/dataformats/pages/hl7-dataformat.adoc
index 7af3cba..1d7bdb1 100644
--- a/docs/components/modules/ROOT/pages/hl7-dataformat.adoc
+++ b/docs/components/modules/dataformats/pages/hl7-dataformat.adoc
@@ -10,12 +10,12 @@ v2 messages] using the http://hl7api.sourceforge.net[HAPI library].
 
 This component supports the following:
 
-* HL7 MLLP codec for xref:mina-component.adoc[Mina]
-* HL7 MLLP codec for xref:netty-component.adoc[Netty]
+* HL7 MLLP codec for xref:ROOT:mina-component.adoc[Mina]
+* HL7 MLLP codec for xref:ROOT:netty-component.adoc[Netty]
 * Type Converter from/to HAPI and String
 * HL7 DataFormat using the HAPI library
 * Even more ease-of-use as it's integrated well with the
-xref:mina-component.adoc[camel-mina] component.
+xref:ROOT:mina-component.adoc[camel-mina] component.
 
 Maven users will need to add the following dependency to their `pom.xml`
 for this component:
@@ -36,8 +36,8 @@ HL7 is often used with the HL7 MLLP protocol, which is a text based TCP
 socket based protocol. This component ships with a Mina and Netty Codec
 that conforms to the MLLP protocol so you can easily expose an HL7
 listener accepting HL7 requests over the TCP transport layer. To expose
-a HL7 listener service, the xref:mina-component.adoc[camel-mina] or
-xref:netty-component.adoc[camel-netty] component is used with the
+a HL7 listener service, the xref:ROOT:mina-component.adoc[camel-mina] or
+xref:ROOT:netty-component.adoc[camel-netty] component is used with the
 `HL7MLLPCodec` (mina) or `HL7MLLPNettyDecoder/HL7MLLPNettyEncoder`
 (Netty).
 
diff --git a/docs/components/modules/ROOT/pages/ical-dataformat.adoc b/docs/components/modules/dataformats/pages/ical-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/ical-dataformat.adoc
rename to docs/components/modules/dataformats/pages/ical-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/jacksonxml-dataformat.adoc b/docs/components/modules/dataformats/pages/jacksonxml-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/jacksonxml-dataformat.adoc
rename to docs/components/modules/dataformats/pages/jacksonxml-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/jaxb-dataformat.adoc b/docs/components/modules/dataformats/pages/jaxb-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/jaxb-dataformat.adoc
rename to docs/components/modules/dataformats/pages/jaxb-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/json-fastjson-dataformat.adoc b/docs/components/modules/dataformats/pages/json-fastjson-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/json-fastjson-dataformat.adoc
rename to docs/components/modules/dataformats/pages/json-fastjson-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/json-gson-dataformat.adoc b/docs/components/modules/dataformats/pages/json-gson-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/json-gson-dataformat.adoc
rename to docs/components/modules/dataformats/pages/json-gson-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/json-jackson-dataformat.adoc b/docs/components/modules/dataformats/pages/json-jackson-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/json-jackson-dataformat.adoc
rename to docs/components/modules/dataformats/pages/json-jackson-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/json-johnzon-dataformat.adoc b/docs/components/modules/dataformats/pages/json-johnzon-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/json-johnzon-dataformat.adoc
rename to docs/components/modules/dataformats/pages/json-johnzon-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/json-xstream-dataformat.adoc b/docs/components/modules/dataformats/pages/json-xstream-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/json-xstream-dataformat.adoc
rename to docs/components/modules/dataformats/pages/json-xstream-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/jsonApi-dataformat.adoc b/docs/components/modules/dataformats/pages/jsonApi-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/jsonApi-dataformat.adoc
rename to docs/components/modules/dataformats/pages/jsonApi-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/lzf-dataformat.adoc b/docs/components/modules/dataformats/pages/lzf-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/lzf-dataformat.adoc
rename to docs/components/modules/dataformats/pages/lzf-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/mime-multipart-dataformat.adoc b/docs/components/modules/dataformats/pages/mime-multipart-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/mime-multipart-dataformat.adoc
rename to docs/components/modules/dataformats/pages/mime-multipart-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/pgp-dataformat.adoc b/docs/components/modules/dataformats/pages/pgp-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/pgp-dataformat.adoc
rename to docs/components/modules/dataformats/pages/pgp-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/protobuf-dataformat.adoc b/docs/components/modules/dataformats/pages/protobuf-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/protobuf-dataformat.adoc
rename to docs/components/modules/dataformats/pages/protobuf-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/rss-dataformat.adoc b/docs/components/modules/dataformats/pages/rss-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/rss-dataformat.adoc
rename to docs/components/modules/dataformats/pages/rss-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/secureXML-dataformat.adoc b/docs/components/modules/dataformats/pages/secureXML-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/secureXML-dataformat.adoc
rename to docs/components/modules/dataformats/pages/secureXML-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/soapjaxb-dataformat.adoc b/docs/components/modules/dataformats/pages/soapjaxb-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/soapjaxb-dataformat.adoc
rename to docs/components/modules/dataformats/pages/soapjaxb-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/syslog-dataformat.adoc b/docs/components/modules/dataformats/pages/syslog-dataformat.adoc
similarity index 88%
rename from docs/components/modules/ROOT/pages/syslog-dataformat.adoc
rename to docs/components/modules/dataformats/pages/syslog-dataformat.adoc
index cab0d3e..d9acde3 100644
--- a/docs/components/modules/ROOT/pages/syslog-dataformat.adoc
+++ b/docs/components/modules/dataformats/pages/syslog-dataformat.adoc
@@ -14,10 +14,10 @@ This component supports the following:
 SyslogMessage model objects.
 * Type Converter from/to SyslogMessage and
 String
-* Integration with the xref:mina-component.adoc[camel-mina] component.
-* Integration with the xref:netty-component.adoc[camel-netty] component.
+* Integration with the xref:ROOT:mina-component.adoc[camel-mina] component.
+* Integration with the xref:ROOT:netty-component.adoc[camel-netty] component.
 * Encoder and decoder for
-the xref:netty-component.adoc[Netty Component] component.
+the xref:ROOT:netty-component.adoc[Netty Component] component.
 * Support for RFC5424 also.
 
 Maven users will need to add the following dependency to their `pom.xml`
@@ -40,7 +40,7 @@ as its underlying transport layer mechanism.
 The UDP port that has been assigned to syslog is 514.
 
 To expose a Syslog listener service we reuse the existing
-xref:mina-component.adoc[Mina Component] component or xref:netty-component.adoc[Netty Component]
+xref:ROOT:mina-component.adoc[Mina Component] component or xref:ROOT:netty-component.adoc[Netty Component]
 where we just use the `Rfc3164SyslogDataFormat` to marshal and unmarshal
 messages. Notice that from *Camel 2.14* onwards the syslog dataformat is
 renamed to `SyslogDataFormat`.
@@ -65,8 +65,8 @@ ND
 *Since Camel 2.14*
 
 To expose a Syslog listener service we reuse the
-existing xref:mina-component.adoc[Mina Component] component
-or xref:netty-component.adoc[Netty Component] where we just use
+existing xref:ROOT:mina-component.adoc[Mina Component] component
+or xref:ROOT:netty-component.adoc[Netty Component] where we just use
 the `SyslogDataFormat` to marshal and unmarshal messages
 
 === Exposing a Syslog listener
@@ -94,7 +94,7 @@ as an InputStream:
 </camelContext>
 ------------------------------------------------------------------------------------------
 
-The same route using xref:mina-component.adoc[Mina Component]
+The same route using xref:ROOT:mina-component.adoc[Mina Component]
 
 [source,xml]
 -------------------------------------------------------------------------
diff --git a/docs/components/modules/ROOT/pages/tarfile-dataformat.adoc b/docs/components/modules/dataformats/pages/tarfile-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/tarfile-dataformat.adoc
rename to docs/components/modules/dataformats/pages/tarfile-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/thrift-dataformat.adoc b/docs/components/modules/dataformats/pages/thrift-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/thrift-dataformat.adoc
rename to docs/components/modules/dataformats/pages/thrift-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/tidyMarkup-dataformat.adoc b/docs/components/modules/dataformats/pages/tidyMarkup-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/tidyMarkup-dataformat.adoc
rename to docs/components/modules/dataformats/pages/tidyMarkup-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/univocity-csv-dataformat.adoc b/docs/components/modules/dataformats/pages/univocity-csv-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/univocity-csv-dataformat.adoc
rename to docs/components/modules/dataformats/pages/univocity-csv-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/univocity-fixed-dataformat.adoc b/docs/components/modules/dataformats/pages/univocity-fixed-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/univocity-fixed-dataformat.adoc
rename to docs/components/modules/dataformats/pages/univocity-fixed-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/univocity-tsv-dataformat.adoc b/docs/components/modules/dataformats/pages/univocity-tsv-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/univocity-tsv-dataformat.adoc
rename to docs/components/modules/dataformats/pages/univocity-tsv-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/xstream-dataformat.adoc b/docs/components/modules/dataformats/pages/xstream-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/xstream-dataformat.adoc
rename to docs/components/modules/dataformats/pages/xstream-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/yaml-snakeyaml-dataformat.adoc b/docs/components/modules/dataformats/pages/yaml-snakeyaml-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/yaml-snakeyaml-dataformat.adoc
rename to docs/components/modules/dataformats/pages/yaml-snakeyaml-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/zipdeflater-dataformat.adoc b/docs/components/modules/dataformats/pages/zipdeflater-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/zipdeflater-dataformat.adoc
rename to docs/components/modules/dataformats/pages/zipdeflater-dataformat.adoc
diff --git a/docs/components/modules/ROOT/pages/zipfile-dataformat.adoc b/docs/components/modules/dataformats/pages/zipfile-dataformat.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/zipfile-dataformat.adoc
rename to docs/components/modules/dataformats/pages/zipfile-dataformat.adoc
diff --git a/docs/components/modules/languages/nav.adoc b/docs/components/modules/languages/nav.adoc
new file mode 100644
index 0000000..6a18b2f
--- /dev/null
+++ b/docs/components/modules/languages/nav.adoc
@@ -0,0 +1,20 @@
+// this file is auto generated and changes to it will be overwritten
+// make edits in docs/*nav.adoc.template files instead
+
+* Languages
+** xref:languages:constant-language.adoc[Constant Language]
+** xref:languages:exchangeProperty-language.adoc[ExchangeProperty Language]
+** xref:languages:file-language.adoc[File Language]
+** xref:languages:header-language.adoc[Header Language]
+** xref:languages:ref-language.adoc[Ref Language]
+** xref:languages:simple-language.adoc[Simple Language]
+** xref:languages:tokenize-language.adoc[Tokenize Language]
+** xref:languages:bean-language.adoc[Bean method Language]
+** xref:languages:groovy-language.adoc[Groovy Language]
+** xref:languages:hl7terser-language.adoc[HL7 Terser Language]
+** xref:languages:jsonpath-language.adoc[JsonPath Language]
+** xref:languages:mvel-language.adoc[MVEL Language]
+** xref:languages:ognl-language.adoc[OGNL Language]
+** xref:languages:spel-language.adoc[SpEL Language]
+** xref:languages:xpath-language.adoc[XPath Language]
+** xref:languages:xquery-language.adoc[XQuery Language]
diff --git a/docs/components/modules/ROOT/pages/bean-language.adoc b/docs/components/modules/languages/pages/bean-language.adoc
similarity index 95%
rename from docs/components/modules/ROOT/pages/bean-language.adoc
rename to docs/components/modules/languages/pages/bean-language.adoc
index 5a78c35..f11c064 100644
--- a/docs/components/modules/ROOT/pages/bean-language.adoc
+++ b/docs/components/modules/languages/pages/bean-language.adoc
@@ -17,7 +17,7 @@ methods.
 The xref:manual::bean-binding.adoc[Bean Binding] rules are used to bind the
 xref:manual::message.adoc[Message] Exchange to the method parameters; so you can
 annotate the bean to extract headers or other expressions such as
-xref:components::xpath-language.adoc[XPath] or xref:components::xquery-language.adoc[XQuery] from the message.
+xref:xpath-language.adoc[XPath] or xref:xquery-language.adoc[XQuery] from the message.
 
 == Bean Language options
 
@@ -117,7 +117,7 @@ The xref:bean-language.adoc[Bean Language] also supports invoking beans
 that isn't registered in the xref:manual::registry.adoc[Registry]. This is
 usable for quickly to invoke a bean from Java DSL where you don't need
 to register the bean in the xref:manual::registry.adoc[Registry] such as the
-xref:spring.adoc[Spring] *`ApplicationContext`*. Camel can instantiate
+xref:ROOT:spring.adoc[Spring] *`ApplicationContext`*. Camel can instantiate
 the bean and invoke the method if given a class or invoke an already
 existing instance.
 
@@ -178,7 +178,7 @@ We have some test cases you can look at if it'll help
 is a JUnit test case showing the Java xref:manual::dsl.adoc[DSL] use of the bean
 expression being used in a filter
 * https://github.com/apache/camel/blob/master/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aggregator.xml[aggregator.xml]
-is a Spring XML test case for the xref:manual::aggregate-eip.adoc[Aggregator] which
+is a Spring XML test case for the xref:manual:eips:aggregate-eip.adoc[Aggregator] which
 uses a bean method call to test for the completion of the aggregation.
 
 include::camel-spring-boot::page$bean-starter.adoc[]
diff --git a/docs/components/modules/ROOT/pages/groovy-language.adoc b/docs/components/modules/languages/pages/groovy-language.adoc
similarity index 96%
rename from docs/components/modules/ROOT/pages/groovy-language.adoc
rename to docs/components/modules/languages/pages/groovy-language.adoc
index 11cefac..59cf464 100644
--- a/docs/components/modules/ROOT/pages/groovy-language.adoc
+++ b/docs/components/modules/languages/pages/groovy-language.adoc
@@ -18,7 +18,7 @@ To use a Groovy expression use the following Java code
 ---------------------------------------
 
 For example you could use the *groovy* function to create an
-Predicate in a xref:manual::filter-eip.adoc[Message Filter] or as an Expression for a
+Predicate in a xref:manual:eips:filter-eip.adoc[Message Filter] or as an Expression for a
 Recipient List
 
 == Groovy Options
@@ -108,7 +108,7 @@ following attributes all set at `ENGINE_SCOPE`:
 IN message instead.
 
 |properties |`org.apache.camel.builder.script.PropertiesFunction` |Function with a `resolve` method to make it easier to use
-Camels xref:properties-component.adoc[Properties] component from scripts. See
+Camels xref:ROOT:properties-component.adoc[Properties] component from scripts. See
 further below for example.
 |=======================================================================
 
@@ -127,7 +127,7 @@ header on the Camel message with the key `CamelScriptArguments`. +
 
 *Since Camel 2.9*
 
-If you need to use the xref:properties-component.adoc[Properties] component from a
+If you need to use the xref:ROOT:properties-component.adoc[Properties] component from a
 script to lookup property placeholders, then its a bit cumbersome to do
 so. 
 For example to set a header name myHeader with a value from a property
diff --git a/docs/components/modules/ROOT/pages/hl7terser-language.adoc b/docs/components/modules/languages/pages/hl7terser-language.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/hl7terser-language.adoc
rename to docs/components/modules/languages/pages/hl7terser-language.adoc
diff --git a/docs/components/modules/ROOT/pages/jsonpath-language.adoc b/docs/components/modules/languages/pages/jsonpath-language.adoc
similarity index 100%
rename from docs/components/modules/ROOT/pages/jsonpath-language.adoc
rename to docs/components/modules/languages/pages/jsonpath-language.adoc
diff --git a/docs/components/modules/ROOT/pages/mvel-language.adoc b/docs/components/modules/languages/pages/mvel-language.adoc
similarity index 97%
rename from docs/components/modules/ROOT/pages/mvel-language.adoc
rename to docs/components/modules/languages/pages/mvel-language.adoc
index c635c8f..642668e 100644
--- a/docs/components/modules/ROOT/pages/mvel-language.adoc
+++ b/docs/components/modules/languages/pages/mvel-language.adoc
@@ -68,7 +68,7 @@ The MVEL language supports 1 options, which are listed below.
 
 == Samples
 
-For example you could use Mvel inside a xref:manual::filter-eip.adoc[Message
+For example you could use Mvel inside a xref:manual:eips:filter-eip.adoc[Message
 Filter] in XML
 
 [source,java]
diff --git a/docs/components/modules/ROOT/pages/ognl-language.adoc b/docs/components/modules/languages/pages/ognl-language.adoc
similarity index 97%
rename from docs/components/modules/ROOT/pages/ognl-language.adoc
rename to docs/components/modules/languages/pages/ognl-language.adoc
index b968f84..30d9ba7 100644
--- a/docs/components/modules/ROOT/pages/ognl-language.adoc
+++ b/docs/components/modules/languages/pages/ognl-language.adoc
@@ -72,7 +72,7 @@ The OGNL language supports 1 options, which are listed below.
 
 == Samples
 
-For example you could use OGNL inside a xref:manual::filter-eip.adoc[Message
+For example you could use OGNL inside a xref:manual:eips:filter-eip.adoc[Message
 Filter] in XML
 
 [source,java]
diff --git a/docs/components/modules/ROOT/pages/spel-language.adoc b/docs/components/modules/languages/pages/spel-language.adoc
similarity index 96%
rename from docs/components/modules/ROOT/pages/spel-language.adoc
rename to docs/components/modules/languages/pages/spel-language.adoc
index f6c6268..f677b61 100644
--- a/docs/components/modules/ROOT/pages/spel-language.adoc
+++ b/docs/components/modules/languages/pages/spel-language.adoc
@@ -119,8 +119,8 @@ can invoke the "bar" method on this bean like this:
 
 === SpEL in enterprise integration patterns
 
-You can use SpEL as an expression for xref:manual::recipientList-eip.adoc[Recipient
-List] or as a predicate inside a xref:manual::filter-eip.adoc[Message
+You can use SpEL as an expression for xref:manual:eips:recipientList-eip.adoc[Recipient
+List] or as a predicate inside a xref:manual:eips:filter-eip.adoc[Message
 Filter]:
 
 [source,xml]
diff --git a/docs/components/modules/ROOT/pages/xpath-language.adoc b/docs/components/modules/languages/pages/xpath-language.adoc
similarity index 98%
rename from docs/components/modules/ROOT/pages/xpath-language.adoc
rename to docs/components/modules/languages/pages/xpath-language.adoc
index bc06df8..615c6da 100644
--- a/docs/components/modules/ROOT/pages/xpath-language.adoc
+++ b/docs/components/modules/languages/pages/xpath-language.adoc
@@ -8,7 +8,7 @@ Camel supports http://www.w3.org/TR/xpath[XPath] to allow an
 Expression or Predicate to be
 used in the DSL or xref:manual::xml-configuration.adoc[Xml
 Configuration]. For example you could use XPath to create an
-Predicate in a xref:manual::filter-eip.adoc[Message
+Predicate in a xref:manual:eips:filter-eip.adoc[Message
 Filter] or as an Expression for a
 Recipient List.
 
@@ -127,9 +127,9 @@ exchange:
 |out:header |the header name |Object |Will return the *out* message header.
 
 |function:properties |key for property |String |To lookup a property using the
-xref:properties-component.adoc[Properties] component (property placeholders).
+xref:ROOT:properties-component.adoc[Properties] component (property placeholders).
 
-|function:simple |simple expression |Object |To evaluate a xref:manual::simple-language.adoc[Simple] expression.
+|function:simple |simple expression |Object |To evaluate a xref:simple-language.adoc[Simple] expression.
 |===
 
 CAUTION: `function:properties` and `function:simple` is not supported
diff --git a/docs/components/modules/ROOT/pages/xquery-language.adoc b/docs/components/modules/languages/pages/xquery-language.adoc
similarity index 99%
rename from docs/components/modules/ROOT/pages/xquery-language.adoc
rename to docs/components/modules/languages/pages/xquery-language.adoc
index ee8505b..fd41773 100644
--- a/docs/components/modules/ROOT/pages/xquery-language.adoc
+++ b/docs/components/modules/languages/pages/xquery-language.adoc
@@ -8,7 +8,7 @@ Camel supports http://www.w3.org/TR/xquery/[XQuery] to allow an
 Expression or Predicate to be
 used in the DSL or xref:manual::xml-configuration.adoc[Xml
 Configuration]. For example you could use XQuery to create an
-Predicate in a xref:manual::filter-eip.adoc[Message
+Predicate in a xref:manual:eips:filter-eip.adoc[Message
 Filter] or as an Expression for a
 Recipient List.
 
diff --git a/docs/gulpfile.js b/docs/gulpfile.js
index 9a99f71..46b8350 100644
--- a/docs/gulpfile.js
+++ b/docs/gulpfile.js
@@ -16,6 +16,7 @@
  */
 const { dest, series, parallel, src, symlink } = require('gulp');
 const del = require('del');
+const filter = require('gulp-filter');
 const inject = require('gulp-inject');
 const map = require('map-stream')
 const path = require('path');
@@ -35,7 +36,9 @@ function deleteComponentImageSymlinks() {
 }
 
 function createComponentSymlinks() {
-    return src(['../core/camel-base/src/main/docs/*.adoc', '../core/camel-core-languages/src/main/docs/*.adoc', '../core/camel-xml-jaxp/src/main/docs/*.adoc', '../components/{*,*/*}/src/main/docs/*.adoc'])
+    const f = filter(['**','!**/*-language.adoc', '!**/*-dataformat.adoc'])
+    return src(['../core/camel-base/src/main/docs/*.adoc','../components/{*,*/*}/src/main/docs/*.adoc'])
+        .pipe(f)
         .pipe(map((file, done) => {
             // this flattens the output to just .../pages/....adoc
             // instead of .../pages/camel-.../src/main/docs/....adoc
@@ -55,8 +58,8 @@ function createComponentSymlinks() {
         .pipe(dest('components/modules/ROOT/pages/'));
 }
 
-function createComponentImageSymlinks() {
-    return src('../components/{*,*/*}/src/main/docs/*.png')
+function createComponentDataFormatSymlinks() {
+    return src(['../components/{*,*/*}/src/main/docs/*-dataformat.adoc'])
         .pipe(map((file, done) => {
             // this flattens the output to just .../pages/....adoc
             // instead of .../pages/camel-.../src/main/docs/....adoc
@@ -72,28 +75,72 @@ function createComponentImageSymlinks() {
         // }));
         // uncomment above .pipe() and remove the .pipe() below
         // when antora#188 is resolved
-        .pipe(dest('components/modules/ROOT/assets/images/'));
+        .pipe(insertSourceAttribute())
+        .pipe(dest('components/modules/dataformats/pages/'));
 }
 
-function deleteUserManualSymlinks() {
-    return del(['user-manual/modules/ROOT/pages/*-eip.adoc', 'user-manual/modules/ROOT/pages/*-language.adoc']);
+function createComponentLanguageSymlinks() {
+    return src(['../components/{*,*/*}/src/main/docs/*-language.adoc'])
+        .pipe(map((file, done) => {
+            // this flattens the output to just .../pages/....adoc
+            // instead of .../pages/camel-.../src/main/docs/....adoc
+            file.base = path.dirname(file.path);
+            done(null, file);
+        }))
+        // Antora disabled symlinks, there is an issue open
+        // https://gitlab.com/antora/antora/issues/188
+        // to reinstate symlink support, until that's resolved
+        // we'll simply copy over instead of creating symlinks
+        // .pipe(symlink('components/modules/ROOT/pages/', {
+        //     relativeSymlinks: true
+        // }));
+        // uncomment above .pipe() and remove the .pipe() below
+        // when antora#188 is resolved
+        .pipe(insertSourceAttribute())
+        .pipe(dest('components/modules/languages/pages/'));
 }
 
-function createUserManualSymlinks() {
-    return src(['../core/camel-base/src/main/docs/*.adoc', '../core/camel-core-languages/src/main/docs/*.adoc', '../core/camel-xml-jaxp/src/main/docs/*.adoc', '../core/camel-core-engine/src/main/docs/eips/*.adoc'])
+function createComponentImageSymlinks() {
+    return src('../components/{*,*/*}/src/main/docs/*.png')
+        .pipe(map((file, done) => {
+            // this flattens the output to just .../pages/....adoc
+            // instead of .../pages/camel-.../src/main/docs/....adoc
+            file.base = path.dirname(file.path);
+            done(null, file);
+        }))
         // Antora disabled symlinks, there is an issue open
         // https://gitlab.com/antora/antora/issues/188
         // to reinstate symlink support, until that's resolved
         // we'll simply copy over instead of creating symlinks
-        // .pipe(symlink('user-manual/modules/ROOT/pages/', {
+        // .pipe(symlink('components/modules/ROOT/pages/', {
         //     relativeSymlinks: true
         // }));
         // uncomment above .pipe() and remove the .pipe() below
         // when antora#188 is resolved
-        .pipe(insertSourceAttribute())
-        .pipe(dest('user-manual/modules/ROOT/pages/'));
+        .pipe(dest('components/modules/ROOT/assets/images/'));
 }
 
+// function deleteUserManualSymlinks() {
+//     return del(['user-manual/modules/ROOT/pages/*-eip.adoc', 'user-manual/modules/ROOT/pages/*-language.adoc']);
+// }
+
+// NOTE! the single adoc at ../core/camel-base/src/main/docs/*.adoc doesn't appear to have generated content.  Can it just be moved to the rest of the user manual?
+
+// function createUserManualSymlinks() {
+//     return src(['../core/camel-base/src/main/docs/*.adoc', '../core/camel-core-languages/src/main/docs/*.adoc', '../core/camel-xml-jaxp/src/main/docs/*.adoc', '../core/camel-core-engine/src/main/docs/eips/*.adoc'])
+//         // Antora disabled symlinks, there is an issue open
+//         // https://gitlab.com/antora/antora/issues/188
+//         // to reinstate symlink support, until that's resolved
+//         // we'll simply copy over instead of creating symlinks
+//         // .pipe(symlink('user-manual/modules/ROOT/pages/', {
+//         //     relativeSymlinks: true
+//         // }));
+//         // uncomment above .pipe() and remove the .pipe() below
+//         // when antora#188 is resolved
+//         .pipe(insertSourceAttribute())
+//         .pipe(dest('user-manual/modules/ROOT/pages/'));
+// }
+
 function titleFrom(file) {
     const maybeName = /(?:=|#) (.*)/.exec(file.contents.toString())
     if (maybeName == null) {
@@ -122,37 +169,67 @@ function insertSourceAttribute() {
 function createComponentNav() {
     return src('component-nav.adoc.template')
         .pipe(insertGeneratedNotice())
-        .pipe(inject(src(['../core/camel-base/src/main/docs/*-component.adoc', '../core/camel-core-languages/src/main/docs/*-component.adoc', '../components/{*,*/*}/src/main/docs/*.adoc']).pipe(sort()), {
+        .pipe(inject(src(['components/modules/ROOT/pages/**/*.adoc', '!components/modules/ROOT/pages/index.adoc']).pipe(sort()), {
             removeTags: true,
             transform: (filename, file) => {
                 const filepath = path.basename(filename);
                 const title = titleFrom(file);
-                return `* xref:${filepath}[${title}]`;
+                return `** xref:${filepath}[${title}]`;
             }
         }))
         .pipe(rename('nav.adoc'))
         .pipe(dest('components/modules/ROOT/'))
 }
 
-function createUserManualNav() {
-    return src('user-manual-nav.adoc.template')
+function createComponentDataFormatsNav() {
+    return src('component-dataformats-nav.adoc.template')
+        .pipe(insertGeneratedNotice())
+        .pipe(inject(src(['components/modules/dataformats/pages/**/*.adoc']).pipe(sort()), {
+            removeTags: true,
+            transform: (filename, file) => {
+                const filepath = path.basename(filename);
+                const title = titleFrom(file);
+                return `** xref:dataformats:${filepath}[${title}]`;
+            }
+        }))
+        .pipe(rename('nav.adoc'))
+        .pipe(dest('components/modules/dataformats/'))
+}
+
+function createComponentLanguagesNav() {
+    return src('component-languages-nav.adoc.template')
         .pipe(insertGeneratedNotice())
-        .pipe(inject(src('../core/camel-base/src/main/docs/*.adoc').pipe(sort()), {
+        .pipe(inject(src(['components/modules/languages/pages/**/*.adoc', '../core/camel-core-languages/src/main/docs/modules/languages/pages/*.adoc']).pipe(sort()), {
             removeTags: true,
-            name: 'languages',
             transform: (filename, file) => {
                 const filepath = path.basename(filename);
                 const title = titleFrom(file);
-                return ` ** xref:${filepath}[${title}]`;
+                return `** xref:languages:${filepath}[${title}]`;
             }
         }))
-        .pipe(inject(src('../core/camel-core-engine/src/main/docs/eips/*.adoc').pipe(sort()), {
+        .pipe(rename('nav.adoc'))
+        .pipe(dest('components/modules/languages/'))
+}
+
+function createUserManualNav() {
+    return src('user-manual-nav.adoc.template')
+        .pipe(insertGeneratedNotice())
+        // .pipe(inject(src('../core/camel-core-languages/src/main/docs/modules/languages/pages/*.adoc').pipe(sort()), {
+        //     removeTags: true,
+        //     name: 'languages',
+        //     transform: (filename, file) => {
+        //         const filepath = path.basename(filename);
+        //         const title = titleFrom(file);
+        //         return ` ** xref:languages:${filepath}[${title}]`;
+        //     }
+        // }))
+        .pipe(inject(src('../core/camel-core-engine/src/main/docs/modules/eips/pages/*.adoc').pipe(sort()), {
             removeTags: true,
             name: 'eips',
             transform: (filename, file) => {
                 const filepath = path.basename(filename);
                 const title = titleFrom(file);
-                return ` ** xref:${filepath}[${title}]`;
+                return ` ** xref:eips:${filepath}[${title}]`;
             }
         }))
         .pipe(rename('nav.adoc'))
@@ -188,6 +265,18 @@ function createUserManualExamples() {
         .pipe(dest('user-manual/modules/ROOT/examples/'));
 }
 
+function createUserManualEIPExamples() {
+    return src('../core/camel-core-engine/src/main/docs/user-manual/modules/eips/**/*.adoc')
+        .pipe(through2.obj(extractExamples))
+        .pipe(dest('user-manual/modules/ROOT/examples/'));
+}
+
+function createUserManualLanguageExamples() {
+    return src('../core/camel-core-languages/src/main/docs/user-manual/modules/languages/**/*.adoc')
+        .pipe(through2.obj(extractExamples))
+        .pipe(dest('user-manual/modules/ROOT/examples/'));
+}
+
 function createComponentExamples() {
     return src('../components/{*,*/*}/src/main/docs/*.adoc')
         .pipe(through2.obj(extractExamples))
@@ -195,12 +284,12 @@ function createComponentExamples() {
 }
 
 const symlinks = parallel(
-    series(deleteComponentSymlinks, createComponentSymlinks),
-    series(deleteComponentImageSymlinks, createComponentImageSymlinks),
-    series(deleteUserManualSymlinks, createUserManualSymlinks)
+    series(deleteComponentSymlinks, createComponentSymlinks, createComponentDataFormatSymlinks, createComponentLanguageSymlinks),
+    series(deleteComponentImageSymlinks, createComponentImageSymlinks)
+    // series(deleteUserManualSymlinks, createUserManualSymlinks)
 );
-const nav = parallel(createComponentNav, createUserManualNav);
-const examples = series(deleteExamples, createUserManualExamples, createComponentExamples);
+const nav = parallel(createComponentNav, createComponentDataFormatsNav, createComponentLanguagesNav, createUserManualNav);
+const examples = series(deleteExamples, createUserManualExamples, createUserManualEIPExamples, createUserManualLanguageExamples, createComponentExamples);
 
 exports.symlinks = symlinks;
 exports.nav = nav;
diff --git a/docs/package.json b/docs/package.json
index b28be99..f338d23 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -7,6 +7,7 @@
     "del": "^3.0.0",
     "gulp": "^4.0.0",
     "gulp-cli": "^2.0.1",
+    "gulp-filter": "^6.0.0",
     "gulp-inject": "^5.0.2",
     "gulp-rename": "^1.4.0",
     "gulp-replace": "^1.0.0",
diff --git a/docs/pom.xml b/docs/pom.xml
index f80c458..bf94ca1 100644
--- a/docs/pom.xml
+++ b/docs/pom.xml
@@ -89,18 +89,16 @@
                             <commandlineArgs>${project.basedir}/node/yarn/dist/bin/yarn.js --non-interactive gulp</commandlineArgs>
                         </configuration>
                     </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.camel</groupId>
-                <artifactId>camel-package-maven-plugin</artifactId>
-                <executions>
                     <execution>
-                        <id>xref-check</id>
+                        <id>antora-check-xref</id>
                         <goals>
-                            <goal>xref-check</goal>
+                            <goal>exec</goal>
                         </goals>
-                        <phase>verify</phase>
+                        <phase>generate-resources</phase>
+                        <configuration>
+                            <executable>${project.basedir}/node/node</executable>
+                            <commandlineArgs>${project.basedir}/node_modules/@antora/cli/bin/antora --generator @antora/xref-validator antora-playbook-local-xref-check.yml</commandlineArgs>
+                        </configuration>
                     </execution>
                 </executions>
             </plugin>
diff --git a/docs/user-manual-nav.adoc.template b/docs/user-manual-nav.adoc.template
index eb3a348..fb552b5 100644
--- a/docs/user-manual-nav.adoc.template
+++ b/docs/user-manual-nav.adoc.template
@@ -50,9 +50,7 @@
  ** xref:java-dsl.adoc[Java DSL]
  ** xref:spring.adoc[Spring support]
 * xref:using-osgi-blueprint-with-camel.adoc[Using OSGi blueprint with Camel]
-* Supported expression languages
-<!-- languages:adoc -->
-<!-- endinject -->
+* Supported expression languages -- see Components documentation
 * xref:enterprise-integration-patterns.adoc[Enterprise Integration Patterns]
 <!-- eips:adoc -->
 <!-- endinject -->
diff --git a/docs/user-manual/modules/ROOT/nav.adoc b/docs/user-manual/modules/ROOT/nav.adoc
index 2c6e325..9f58cc0 100644
--- a/docs/user-manual/modules/ROOT/nav.adoc
+++ b/docs/user-manual/modules/ROOT/nav.adoc
@@ -51,80 +51,79 @@
  ** xref:java-dsl.adoc[Java DSL]
  ** xref:spring.adoc[Spring support]
 * xref:using-osgi-blueprint-with-camel.adoc[Using OSGi blueprint with Camel]
-* Supported expression languages
- ** xref:properties-component.adoc[Properties Component]
+* Supported expression languages -- see Components documentation
 * xref:enterprise-integration-patterns.adoc[Enterprise Integration Patterns]
- ** xref:aggregate-eip.adoc[Aggregate EIP]
- ** xref:batch-config-eip.adoc[Batch-config EIP]
- ** xref:bean-eip.adoc[Bean EIP]
- ** xref:choice-eip.adoc[Choice EIP]
- ** xref:circuitBreaker-eip.adoc[CircuitBreaker EIP]
- ** xref:claimCheck-eip.adoc[Claim Check EIP]
- ** xref:content-based-router-eip.adoc[Content Based Router]
- ** xref:content-filter-eip.adoc[Content Filter]
- ** xref:convertBodyTo-eip.adoc[Convert Body To EIP]
- ** xref:customLoadBalancer-eip.adoc[Custom Load Balancer EIP]
- ** xref:delay-eip.adoc[Delay EIP]
- ** xref:dynamic-router.adoc[Dynamic Router]
- ** xref:dynamicRouter-eip.adoc[Dynamic Router EIP]
- ** xref:enrich-eip.adoc[Enrich EIP]
- ** xref:eventDrivenConsumer-eip.adoc[Event Driven Consumer]
- ** xref:failover-eip.adoc[Failover EIP]
- ** xref:filter-eip.adoc[Filter EIP]
- ** xref:from-eip.adoc[From EIP]
- ** xref:hystrix-eip.adoc[Hystrix EIP]
- ** xref:hystrixConfiguration-eip.adoc[Hystrix Configuration EIP]
- ** xref:idempotentConsumer-eip.adoc[Idempotent Consumer EIP]
- ** xref:inOnly-eip.adoc[In Only EIP]
- ** xref:inOut-eip.adoc[In Out EIP]
- ** xref:loadBalance-eip.adoc[Load Balance EIP]
- ** xref:log-eip.adoc[Log EIP]
- ** xref:loop-eip.adoc[Loop EIP]
- ** xref:marshal-eip.adoc[Marshal EIP]
- ** xref:multicast-eip.adoc[Multicast EIP]
- ** xref:onFallback-eip.adoc[On Fallback EIP]
- ** xref:otherwise-eip.adoc[Otherwise EIP]
- ** xref:pipeline-eip.adoc[Pipeline EIP]
- ** xref:pollEnrich-eip.adoc[Poll Enrich EIP]
- ** xref:process-eip.adoc[Process EIP]
- ** xref:random-eip.adoc[Random EIP]
- ** xref:recipientList-eip.adoc[Recipient List EIP]
- ** xref:removeHeader-eip.adoc[Remove Header EIP]
- ** xref:removeHeaders-eip.adoc[Remove Headers EIP]
- ** xref:removeProperties-eip.adoc[Remove Properties EIP]
- ** xref:removeProperty-eip.adoc[Remove Property EIP]
- ** xref:requestReply-eip.adoc[Request Reply]
- ** xref:resequence-eip.adoc[Resequence EIP]
- ** xref:resilience4j-eip.adoc[Resilience4j EIP]
- ** xref:resilience4jConfiguration-eip.adoc[Resilience4j Configuration EIP]
- ** xref:rollback-eip.adoc[Rollback EIP]
- ** xref:roundRobin-eip.adoc[Round Robin EIP]
- ** xref:routingSlip-eip.adoc[Routing Slip EIP]
- ** xref:saga-eip.adoc[Saga EIP]
- ** xref:sample-eip.adoc[Sample EIP]
- ** xref:script-eip.adoc[Script EIP]
- ** xref:serviceCall-eip.adoc[Service Call EIP]
- ** xref:setBody-eip.adoc[Set Body EIP]
- ** xref:setHeader-eip.adoc[Set Header EIP]
- ** xref:setOutHeader-eip.adoc[Set Out Header EIP (deprecated)]
- ** xref:setProperty-eip.adoc[Set Property EIP]
- ** xref:sort-eip.adoc[Sort EIP]
- ** xref:split-eip.adoc[Split EIP]
- ** xref:step-eip.adoc[Step EIP]
- ** xref:sticky-eip.adoc[Sticky EIP]
- ** xref:stop-eip.adoc[Stop EIP]
- ** xref:stream-config-eip.adoc[Stream-config EIP]
- ** xref:threads-eip.adoc[Threads EIP]
- ** xref:throttle-eip.adoc[Throttle EIP]
- ** xref:to-eip.adoc[To EIP]
- ** xref:toD-eip.adoc[To D EIP]
- ** xref:topic-eip.adoc[Topic EIP]
- ** xref:transform-eip.adoc[Transform EIP]
- ** xref:unmarshal-eip.adoc[Unmarshal EIP]
- ** xref:validate-eip.adoc[Validate EIP]
- ** xref:weighted-eip.adoc[Weighted EIP]
- ** xref:when-eip.adoc[When EIP]
- ** xref:wireTap-eip.adoc[Wire Tap EIP]
+ ** xref:eips:aggregate-eip.adoc[Aggregate EIP]
+ ** xref:eips:batch-config-eip.adoc[Batch-config EIP]
+ ** xref:eips:bean-eip.adoc[Bean EIP]
+ ** xref:eips:choice-eip.adoc[Choice EIP]
+ ** xref:eips:circuitBreaker-eip.adoc[Circuit Breaker EIP]
+ ** xref:eips:claimCheck-eip.adoc[Claim Check EIP]
+ ** xref:eips:content-based-router-eip.adoc[Content Based Router]
+ ** xref:eips:content-filter-eip.adoc[Content Filter]
+ ** xref:eips:convertBodyTo-eip.adoc[Convert Body To EIP]
+ ** xref:eips:customLoadBalancer-eip.adoc[Custom Load Balancer EIP]
+ ** xref:eips:delay-eip.adoc[Delay EIP]
+ ** xref:eips:dynamic-router.adoc[Dynamic Router]
+ ** xref:eips:dynamicRouter-eip.adoc[Dynamic Router EIP]
+ ** xref:eips:enrich-eip.adoc[Enrich EIP]
+ ** xref:eips:eventDrivenConsumer-eip.adoc[Event Driven Consumer]
+ ** xref:eips:failover-eip.adoc[Failover EIP]
+ ** xref:eips:filter-eip.adoc[Filter EIP]
+ ** xref:eips:from-eip.adoc[From EIP]
+ ** xref:eips:hystrix-eip.adoc[Hystrix EIP]
+ ** xref:eips:hystrixConfiguration-eip.adoc[Hystrix Configuration EIP]
+ ** xref:eips:idempotentConsumer-eip.adoc[Idempotent Consumer EIP]
+ ** xref:eips:inOnly-eip.adoc[In Only EIP]
+ ** xref:eips:inOut-eip.adoc[In Out EIP]
+ ** xref:eips:loadBalance-eip.adoc[Load Balance EIP]
+ ** xref:eips:log-eip.adoc[Log EIP]
+ ** xref:eips:loop-eip.adoc[Loop EIP]
+ ** xref:eips:marshal-eip.adoc[Marshal EIP]
+ ** xref:eips:multicast-eip.adoc[Multicast EIP]
+ ** xref:eips:onFallback-eip.adoc[On Fallback EIP]
+ ** xref:eips:otherwise-eip.adoc[Otherwise EIP]
+ ** xref:eips:pipeline-eip.adoc[Pipeline EIP]
+ ** xref:eips:pollEnrich-eip.adoc[Poll Enrich EIP]
+ ** xref:eips:process-eip.adoc[Process EIP]
+ ** xref:eips:random-eip.adoc[Random EIP]
+ ** xref:eips:recipientList-eip.adoc[Recipient List EIP]
+ ** xref:eips:removeHeader-eip.adoc[Remove Header EIP]
+ ** xref:eips:removeHeaders-eip.adoc[Remove Headers EIP]
+ ** xref:eips:removeProperties-eip.adoc[Remove Properties EIP]
+ ** xref:eips:removeProperty-eip.adoc[Remove Property EIP]
+ ** xref:eips:requestReply-eip.adoc[Request Reply]
+ ** xref:eips:resequence-eip.adoc[Resequence EIP]
+ ** xref:eips:resilience4j-eip.adoc[Resilience4j EIP]
+ ** xref:eips:resilience4jConfiguration-eip.adoc[Resilience4j Configuration EIP]
+ ** xref:eips:rollback-eip.adoc[Rollback EIP]
+ ** xref:eips:roundRobin-eip.adoc[Round Robin EIP]
+ ** xref:eips:routingSlip-eip.adoc[Routing Slip EIP]
+ ** xref:eips:saga-eip.adoc[Saga EIP]
+ ** xref:eips:sample-eip.adoc[Sample EIP]
+ ** xref:eips:script-eip.adoc[Script EIP]
+ ** xref:eips:serviceCall-eip.adoc[Service Call EIP]
+ ** xref:eips:setBody-eip.adoc[Set Body EIP]
+ ** xref:eips:setHeader-eip.adoc[Set Header EIP]
+ ** xref:eips:setOutHeader-eip.adoc[Set Out Header EIP (deprecated)]
+ ** xref:eips:setProperty-eip.adoc[Set Property EIP]
+ ** xref:eips:sort-eip.adoc[Sort EIP]
+ ** xref:eips:split-eip.adoc[Split EIP]
+ ** xref:eips:step-eip.adoc[Step EIP]
+ ** xref:eips:sticky-eip.adoc[Sticky EIP]
+ ** xref:eips:stop-eip.adoc[Stop EIP]
+ ** xref:eips:stream-config-eip.adoc[Stream-config EIP]
+ ** xref:eips:threads-eip.adoc[Threads EIP]
+ ** xref:eips:throttle-eip.adoc[Throttle EIP]
+ ** xref:eips:to-eip.adoc[To EIP]
+ ** xref:eips:toD-eip.adoc[To D EIP]
+ ** xref:eips:topic-eip.adoc[Topic EIP]
+ ** xref:eips:transform-eip.adoc[Transform EIP]
+ ** xref:eips:unmarshal-eip.adoc[Unmarshal EIP]
+ ** xref:eips:validate-eip.adoc[Validate EIP]
+ ** xref:eips:weighted-eip.adoc[Weighted EIP]
+ ** xref:eips:when-eip.adoc[When EIP]
+ ** xref:eips:wireTap-eip.adoc[Wire Tap EIP]
 * Frequently asked questions
  ** xref:faq/can-i-get-commercial-support.adoc[Can I get commercial support?]
  ** xref:support.adoc[How can I get help?]
diff --git a/docs/user-manual/modules/ROOT/pages/advanced-configuration-of-camelcontext-using-spring.adoc b/docs/user-manual/modules/ROOT/pages/advanced-configuration-of-camelcontext-using-spring.adoc
index cdd76de..9eabc0f 100644
--- a/docs/user-manual/modules/ROOT/pages/advanced-configuration-of-camelcontext-using-spring.adoc
+++ b/docs/user-manual/modules/ROOT/pages/advanced-configuration-of-camelcontext-using-spring.adoc
@@ -53,7 +53,7 @@ configured.
 |HandleFault |0..1 |To use a 3rd part fault handler to handle FAULT
 messages.
 
-|Delayer |0..1 |To use a 3rd part xref:delay-eip.adoc[Delayer].
+|Delayer |0..1 |To use a 3rd part xref:eips:delay-eip.adoc[Delayer].
 
 |ManagementStrategy |0..1 |*Camel 2.1:* To use a 3rd part strategy for
 xref:jmx.adoc[management], for example JMX management.
@@ -101,7 +101,7 @@ xref:stream-caching.adoc[Stream caching] strategy.
 RuntimeEndpointRegistry implementation.
 
 |Logger |0..1 |*Camel 2.12.4/2.13.1:* To use provided org.slf4j.Logger
-for xref:components::log-component.adoc[Log] component and xref:log-eip.adoc[log() EIP].
+for xref:components::log-component.adoc[Log] component and xref:eips:log-eip.adoc[log() EIP].
 
 |AsyncProcessorAwaitManager |0..1 |*Camel 2.15:* To use a 3rd part async
 process await manager.
diff --git a/docs/user-manual/modules/ROOT/pages/aggregate-eip.adoc b/docs/user-manual/modules/ROOT/pages/aggregate-eip.adoc
deleted file mode 100644
index e129a26..0000000
--- a/docs/user-manual/modules/ROOT/pages/aggregate-eip.adoc
+++ /dev/null
@@ -1,673 +0,0 @@
-[[aggregate-eip]]
-= Aggregate EIP
-:page-source: core/camel-core-engine/src/main/docs/eips/aggregate-eip.adoc
-
-The
-http://www.enterpriseintegrationpatterns.com/Aggregator.html[Aggregator]
-from the xref:enterprise-integration-patterns.adoc[EIP patterns] allows
-you to combine a number of messages together into a single message.
-
-image::eip/Aggregator.gif[image]
-
-A correlation xref:expression.adoc[Expression] is used to determine the
-messages which should be aggregated together. If you want to aggregate
-all messages into a single message, just use a constant expression. An
-AggregationStrategy is used to combine all the message exchanges for a
-single correlation key into a single message exchange.
-
-== Aggregator options
-
-// eip options: START
-The Aggregate EIP supports 27 options which are listed below:
-
-[width="100%",cols="2,5,^1,2",options="header"]
-|===
-| Name | Description | Default | Type
-| *correlationExpression* | *Required* The expression used to calculate the correlation key to use for aggregation. The Exchange which has the same correlation key is aggregated together. If the correlation key could not be evaluated an Exception is thrown. You can disable this by using the ignoreBadCorrelationKeys option. |  | NamespaceAware Expression
-| *completionPredicate* | A Predicate to indicate when an aggregated exchange is complete. If this is not specified and the AggregationStrategy object implements Predicate, the aggregationStrategy object will be used as the completionPredicate. |  | NamespaceAware Expression
-| *completionTimeoutExpression* | Time in millis that an aggregated exchange should be inactive before its complete (timeout). This option can be set as either a fixed value or using an Expression which allows you to evaluate a timeout dynamically - will use Long as result. If both are set Camel will fallback to use the fixed value if the Expression result was null or 0. You cannot use this option together with completionInterval, only one of the two can be used. By default the timeout c [...]
-| *completionSizeExpression* | Number of messages aggregated before the aggregation is complete. This option can be set as either a fixed value or using an Expression which allows you to evaluate a size dynamically - will use Integer as result. If both are set Camel will fallback to use the fixed value if the Expression result was null or 0. |  | NamespaceAware Expression
-| *optimisticLockRetryPolicy* | Allows to configure retry settings when using optimistic locking. |  | OptimisticLockRetry PolicyDefinition
-| *parallelProcessing* | When aggregated are completed they are being send out of the aggregator. This option indicates whether or not Camel should use a thread pool with multiple threads for concurrency. If no custom thread pool has been specified then Camel creates a default pool with 10 concurrent threads. | false | Boolean
-| *optimisticLocking* | Turns on using optimistic locking, which requires the aggregationRepository being used, is supporting this by implementing org.apache.camel.spi.OptimisticLockingAggregationRepository. | false | Boolean
-| *executorServiceRef* | If using parallelProcessing you can specify a custom thread pool to be used. In fact also if you are not using parallelProcessing this custom thread pool is used to send out aggregated exchanges as well. |  | String
-| *timeoutCheckerExecutor ServiceRef* | If using either of the completionTimeout, completionTimeoutExpression, or completionInterval options a background thread is created to check for the completion for every aggregator. Set this option to provide a custom thread pool to be used rather than creating a new thread for every aggregator. |  | String
-| *aggregationRepositoryRef* | Sets the custom aggregate repository to use Will by default use org.apache.camel.processor.aggregate.MemoryAggregationRepository |  | String
-| *strategyRef* | A reference to lookup the AggregationStrategy in the Registry. Configuring an AggregationStrategy is required, and is used to merge the incoming Exchange with the existing already merged exchanges. At first call the oldExchange parameter is null. On subsequent invocations the oldExchange contains the merged exchanges and newExchange is of course the new incoming Exchange. |  | String
-| *strategyMethodName* | This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy. |  | String
-| *strategyMethodAllowNull* | If this option is false then the aggregate method is not used for the very first aggregation. If this option is true then null values is used as the oldExchange (at the very first aggregation), when using POJOs as the AggregationStrategy. | false | Boolean
-| *completionSize* | Number of messages aggregated before the aggregation is complete. This option can be set as either a fixed value or using an Expression which allows you to evaluate a size dynamically - will use Integer as result. If both are set Camel will fallback to use the fixed value if the Expression result was null or 0. |  | Integer
-| *completionInterval* | A repeating period in millis by which the aggregator will complete all current aggregated exchanges. Camel has a background task which is triggered every period. You cannot use this option together with completionTimeout, only one of them can be used. |  | Long
-| *completionTimeout* | Time in millis that an aggregated exchange should be inactive before its complete (timeout). This option can be set as either a fixed value or using an Expression which allows you to evaluate a timeout dynamically - will use Long as result. If both are set Camel will fallback to use the fixed value if the Expression result was null or 0. You cannot use this option together with completionInterval, only one of the two can be used. By default the timeout checker run [...]
-| *completionTimeoutChecker Interval* | Interval in millis that is used by the background task that checks for timeouts (org.apache.camel.TimeoutMap). By default the timeout checker runs every second. The timeout is an approximation and there is no guarantee that the a timeout is triggered exactly after the timeout value. It is not recommended to use very low timeout values or checker intervals. | 1000 | Long
-| *completionFromBatchConsumer* | Enables the batch completion mode where we aggregate from a org.apache.camel.BatchConsumer and aggregate the total number of exchanges the org.apache.camel.BatchConsumer has reported as total by checking the exchange property org.apache.camel.Exchange#BATCH_COMPLETE when its complete. This option cannot be used together with discardOnAggregationFailure. | false | Boolean
-| *completionOnNewCorrelation Group* | Enables completion on all previous groups when a new incoming correlation group. This can for example be used to complete groups with same correlation keys when they are in consecutive order. Notice when this is enabled then only 1 correlation group can be in progress as when a new correlation group starts, then the previous groups is forced completed. | false | Boolean
-| *eagerCheckCompletion* | Use eager completion checking which means that the completionPredicate will use the incoming Exchange. As opposed to without eager completion checking the completionPredicate will use the aggregated Exchange. | false | Boolean
-| *ignoreInvalidCorrelation Keys* | If a correlation key cannot be successfully evaluated it will be ignored by logging a DEBUG and then just ignore the incoming Exchange. | false | Boolean
-| *closeCorrelationKeyOn Completion* | Closes a correlation key when its complete. Any late received exchanges which has a correlation key that has been closed, it will be defined and a ClosedCorrelationKeyException is thrown. |  | Integer
-| *discardOnCompletionTimeout* | Discards the aggregated message on completion timeout. This means on timeout the aggregated message is dropped and not sent out of the aggregator. | false | Boolean
-| *discardOnAggregationFailure* | Discards the aggregated message when aggregation failed (an exception was thrown from AggregationStrategy. This means the partly aggregated message is dropped and not sent out of the aggregator. This option cannot be used together with completionFromBatchConsumer. | false | Boolean
-| *forceCompletionOnStop* | Indicates to complete all current aggregated exchanges when the context is stopped | false | Boolean
-| *completeAllOnStop* | Indicates to wait to complete all current and partial (pending) aggregated exchanges when the context is stopped. This also means that we will wait for all pending exchanges which are stored in the aggregation repository to complete so the repository is empty before we can stop. You may want to enable this when using the memory based aggregation repository that is memory based only, and do not store data on disk. When this option is enabled, then the aggregator is [...]
-| *aggregateControllerRef* | To use a org.apache.camel.processor.aggregate.AggregateController to allow external sources to control this aggregator. |  | String
-|===
-// eip options: END
-
-== About AggregationStrategy
-
-The `AggregationStrategy` is used for aggregating the old (lookup by its
-correlation id) and the new exchanges together into a single exchange.
-Possible implementations include performing some kind of combining or
-delta processing, such as adding line items together into an invoice or
-just using the newest exchange and removing old exchanges such as for
-state tracking or market data prices; where old values are of little
-use.
-
-Notice the aggregation strategy is a mandatory option and must be
-provided to the aggregator.
-
-IMPORTANT: In the aggregate method, do not create a new exchange instance to return,
-instead return either the old or new exchange from the input parameters;
-favor returning the old exchange whenever possible.
-
-Here are a few example `AggregationStrategy` implementations that should
-help you create your own custom strategy.
-
-[source,java]
-----
-//simply combines Exchange String body values using '+' as a delimiter
-class StringAggregationStrategy implements AggregationStrategy {
-
-    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
-        if (oldExchange == null) {
-            return newExchange;
-        }
-
-        String oldBody = oldExchange.getIn().getBody(String.class);
-        String newBody = newExchange.getIn().getBody(String.class);
-        oldExchange.getIn().setBody(oldBody + "+" + newBody);
-        return oldExchange;
-    }
-}
-
-//simply combines Exchange body values into an ArrayList<Object>
-class ArrayListAggregationStrategy implements AggregationStrategy {
-
-    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
-        Object newBody = newExchange.getIn().getBody();
-        ArrayList<Object> list = null;
-        if (oldExchange == null) {
-            list = new ArrayList<Object>();
-            list.add(newBody);
-            newExchange.getIn().setBody(list);
-            return newExchange;
-        } else {
-            list = oldExchange.getIn().getBody(ArrayList.class);
-            list.add(newBody);
-            return oldExchange;
-        }
-    }
-}
-----
-
-== About completion
-
-When aggregation xref:exchange.adoc[Exchange]s at some point you need to
-indicate that the aggregated exchanges is complete, so they can be send
-out of the aggregator. Camel allows you to indicate completion in
-various ways as follows:
-
-* completionTimeout - Is an inactivity timeout in which is triggered if
-no new exchanges have been aggregated for that particular correlation
-key within the period.
-* completionInterval - Once every X period all the current aggregated
-exchanges are completed.
-* completionSize - Is a number indicating that after X aggregated
-exchanges it's complete.
-* completionPredicate - Runs a xref:predicate.adoc[Predicate] when a new
-exchange is aggregated to determine if we are complete or not.
-The configured aggregationStrategy can implement the
-Predicate interface and will be used as the completionPredicate if no
-completionPredicate is configured. The configured aggregationStrategy can
-implement `PreCompletionAwareAggregationStrategy` and will be used as
-the completionPredicate in pre-complete check mode. See further below
-for more details.
-* completionFromBatchConsumer - Special option for
-xref:batch-consumer.adoc[Batch Consumer] which allows you to complete
-when all the messages from the batch has been aggregated.
-* forceCompletionOnStop - Indicates to complete all current
-aggregated exchanges when the context is stopped
-* Using a `AggregateController` - which allows to use an
-external source to complete groups or all groups. This can be done using
-Java or JMX API.
-
-Notice that all the completion ways are per correlation key. And you can
-combine them in any way you like. It's basically the first which
-triggers that wins. So you can use a completion size together with a
-completion timeout. Only completionTimeout and completionInterval cannot
-be used at the same time.
-
-Notice the completion is a mandatory option and must be provided to the
-aggregator. If not provided Camel will thrown an Exception on startup.
-
-== Pre-completion mode
-
-There can be use-cases where you want the incoming
-xref:exchange.adoc[Exchange] to determine if the correlation group
-should pre-complete, and then the incoming
-xref:exchange.adoc[Exchange] is starting a new group from scratch. To
-determine this the `AggregationStrategy` can
-implement `PreCompletionAwareAggregationStrategy` which has
-a `preComplete` method:
-
-[source,java]
-----
-    /**
-     * Determines if the aggregation should complete the current group, and start a new group, or the aggregation
-     * should continue using the current group.
-     *
-     * @param oldExchange the oldest exchange (is <tt>null</tt> on first aggregation as we only have the new exchange)
-     * @param newExchange the newest exchange (can be <tt>null</tt> if there was no data possible to acquire)
-     * @return <tt>true</tt> to complete current group and start a new group, or <tt>false</tt> to keep using current
-     */
-    boolean preComplete(Exchange oldExchange, Exchange newExchange);
-----
-
-If the preComplete method returns true, then the existing groups is
-completed (without aggregating the incoming exchange (newExchange). And
-then the newExchange is used to start the correlation group from scratch
-so the group would contain only that new incoming exchange. This is
-known as pre-completion mode. And when the aggregation is in
-pre-completion mode, then only the following completions are in use
-
-* aggregationStrategy must
-implement `PreCompletionAwareAggregationStrategy` xxx
-* completionTimeout or completionInterval can also be used as fallback
-completions
-* any other completion are not used (such as by size, from batch
-consumer etc)
-* eagerCheckCompletion is implied as true, but the option has no effect
-
-== Persistent AggregationRepository
-
-The aggregator provides a pluggable repository which you can implement
-your own `org.apache.camel.spi.AggregationRepository`. +
- If you need persistent repository then you can use either Camel
-xref:components::leveldb.adoc[LevelDB], or xref:components::sql-component.adoc[SQL Component] components.
-
-== Using TimeoutAwareAggregationStrategy
-
-If your aggregation strategy implements
-`TimeoutAwareAggregationStrategy`, then Camel will invoke the `timeout`
-method when the timeout occurs. Notice that the values for index and
-total parameters will be -1, and the timeout parameter will be provided
-only if configured as a fixed value. You must *not* throw any exceptions
-from the `timeout` method.
-
-== Using CompletionAwareAggregationStrategy
-
-If your aggregation strategy implements
-`CompletionAwareAggregationStrategy`, then Camel will invoke the
-`onComplete` method when the aggregated Exchange is completed. This
-allows you to do any last minute custom logic such as to cleanup some
-resources, or additional work on the exchange as it's now completed. +
- You must *not* throw any exceptions from the `onCompletion` method.
-
-== Completing current group decided from the AggregationStrategy
-
-The `AggregationStrategy` can now included a property on the
-returned `Exchange` that contains a boolean to indicate if the current
-group should be completed. This allows to overrule any existing
-completion predicates / sizes / timeouts etc, and complete the group.
-
-For example the following logic (from an unit test) will complete the
-group if the message body size is larger than 5. This is done by setting
-the exchange property `Exchange.AGGREGATION_COMPLETE_CURRENT_GROUP` to `true`.
-
-[source,java]
-----
-    public final class MyCompletionStrategy implements AggregationStrategy {
-        @Override
-        public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
-            if (oldExchange == null) {
-                return newExchange;
-            }
-            String body = oldExchange.getIn().getBody(String.class) + "+" 
-                + newExchange.getIn().getBody(String.class);
-            oldExchange.getIn().setBody(body);
-            if (body.length() >= 5) {
-                oldExchange.setProperty(Exchange.AGGREGATION_COMPLETE_CURRENT_GROUP, true);
-            }
-            return oldExchange;
-        }
-    }
-----
-
-
-== Completing all previous group decided from the AggregationStrategy
-
-The `AggregationStrategy` can now included a property on the
-returned `Exchange` that contains a boolean to indicate if all previous
-groups should be completed. This allows to overrule any existing
-completion predicates / sizes / timeouts etc, and complete all the existing
-previous group.
-
-For example the following logic (from an unit test) will complete all the
-previous group when a new aggregation group is started. This is done by
-setting the property `Exchange.AGGREGATION_COMPLETE_ALL_GROUPS` to `true`.
-
-[source,java]
-----
-    public final class MyCompletionStrategy implements AggregationStrategy {
-        @Override
-        public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
-            if (oldExchange == null) {
-                // we start a new correlation group, so complete all previous groups
-                newExchange.setProperty(Exchange.AGGREGATION_COMPLETE_ALL_GROUPS, true);
-                return newExchange;
-            }
-
-            String body1 = oldExchange.getIn().getBody(String.class);
-            String body2 = newExchange.getIn().getBody(String.class);
-
-            oldExchange.getIn().setBody(body1 + body2);
-            return oldExchange;
-        }
-    }
-----
-
-== Manually Force the Completion of All Aggregated Exchanges Immediately
-
-You can manually trigger completion of all current aggregated exchanges
-by sending an exchange containing the exchange property
-`Exchange.AGGREGATION_COMPLETE_ALL_GROUPS` set to `true`. The message is
-considered a signal message only, the message headers/contents will not
-be processed otherwise.
-
-You can alternatively set the exchange property
-`Exchange.AGGREGATION_COMPLETE_ALL_GROUPS_INCLUSIVE` to `true` to trigger
-completion of all groups after processing the current message.
-
-== Using a List<V> in AggregationStrategy
-
-If you want to aggregate some value from the messages `<V>` into a `List<V>`
-then we have added a
-`org.apache.camel.processor.aggregate.AbstractListAggregationStrategy`
-abstract class that makes this easier. The completed
-Exchange that is sent out of the aggregator will contain the `List<V>` in
-the message body.
-
-For example to aggregate a `List<Integer>` you can extend this class as
-shown below, and implement the `getValue` method:
-
-== Using AggregateController
-
-The `org.apache.camel.processor.aggregate.AggregateController` allows
-you to control the aggregate at runtime using Java or JMX API. This can
-be used to force completing groups of exchanges, or query its current
-runtime statistics.
-
-The aggregator provides a default implementation if no custom have been
-configured, which can be accessed using `getAggregateController()` method.
-Though it may be easier to configure a controller in the route using
-`aggregateController` as shown below:
-
-[source,java]
-----
-private AggregateController controller = new DefaultAggregateController();
-
-from("direct:start")
-   .aggregate(header("id"), new MyAggregationStrategy())
-      .completionSize(10).id("myAggregator")
-      .aggregateController(controller)
-      .to("mock:aggregated");
-----
-
-Then there is API on AggregateController to force completion. For
-example to complete a group with key foo
-
-[source,java]
-----
-int groups = controller.forceCompletionOfGroup("foo");
-----
-
-The number return would be the number of groups completed. In this case
-it would be 1 if the foo group existed and was completed. If foo does
-not exists then 0 is returned.
-
-There is also an api to complete all groups
-
-[source,java]
-----
-int groups = controller.forceCompletionOfAllGroups();
-----
-
-To configure this from XML DSL
-
-[source,xml]
-----
-<bean id="myController" class="org.apache.camel.processor.aggregate.DefaultAggregateController"/>
- 
-  <camelContext xmlns="http://camel.apache.org/schema/spring">
-        <route>
-            <from uri="direct:start"/>
-            <aggregate strategyRef="myAppender" completionSize="10"
-                       aggregateControllerRef="myController">
-                <correlationExpression>
-                    <header>id</header>
-                </correlationExpression>
-                <to uri="mock:result"/>
-            </aggregate>
-        </route>
-    </camelContext>
-----
-
-There is also JMX API on the aggregator which is available under the
-processors node in the Camel JMX tree.
-
-== Using GroupedExchanges
-
-In the route below we group all the exchanges together using
-`groupExchanges()`:
-
-[source,java]
-----
-from("direct:start")
-    // aggregate all using same expression
-    .aggregate(constant(true))
-    // wait for 0.5 seconds to aggregate
-    .completionTimeout(500L)
-    // group the exchanges so we get one single exchange containing all the others
-    .groupExchanges()
-    .to("mock:result");
-----
-
-As a result we have one outgoing `Exchange` being
-routed the `"mock:result"` endpoint. The exchange is a holder
-containing all the incoming Exchanges.
-
-The output of the aggregator will then contain the exchanges grouped
-together in a list as shown below:
-
-[source,java]
-----
-List<Exchange> grouped = exchange.getIn().getBody(List.class);
-----
-
-== Using POJOs as AggregationStrategy
-
-To use the `AggregationStrategy` you had to implement the
-`org.apache.camel.AggregationStrategy` interface,
-which means your logic would be tied to the Camel API.
-You can use a POJO for the logic and let Camel adapt to your
-POJO. To use a POJO a convention must be followed:
-
-* there must be a public method to use
-* the method must not be void
-* the method can be static or non-static
-* the method must have 2 or more parameters
-* the parameters is paired so the first 50% is applied to the
-`oldExchange` and the reminder 50% is for the `newExchange`
-* .. meaning that there must be an equal number of parameters, eg 2, 4,
-6 etc.
-
-The paired methods is expected to be ordered as follows:
-
-* the first parameter is the message body
-* the 2nd parameter is a Map of the headers
-* the 3rd parameter is a Map of the Exchange properties
-
-This convention is best explained with some examples.
-
-In the method below, we have only 2 parameters, so the 1st parameter is
-the body of the `oldExchange`, and the 2nd is paired to the body of the
-`newExchange`:
-
-[source,java]
-----
-public String append(String existing, String next) {
-  return existing + next;
-}
-----
-
-In the method below, we have only 4 parameters, so the 1st parameter is
-the body of the `oldExchange`, and the 2nd is the Map of the
-`oldExchange` headers, and the 3rd is paired to the body of the `newExchange`,
-and the 4th parameter is the Map of the `newExchange` headers:
-
-[source,java]
-----
-public String append(String existing, Map existingHeaders, String next, Map nextHeaders) {
-  return existing + next;
-}
-----
-
-And finally if we have 6 parameters the we also have the properties of
-the Exchanges:
-
-[source,java]
-----
-public String append(String existing, Map existingHeaders, Map existingProperties,
-                     String next, Map nextHeaders, Map nextProperties) {
-  return existing + next;
-}
-----
-
-To use this with the Aggregate EIP we can use a
-POJO with the aggregate logic as follows:
-
-[source,java]
-----
-public class MyBodyAppender {
-
-    public String append(String existing, String next) {
-        return next + existing;
-    }
-
-}
-----
-
-And then in the Camel route we create an instance of our bean, and then
-refer to the bean in the route using `bean` method from
-`org.apache.camel.builder.AggregationStrategies` as shown:
-
-[source,java]
-----
-private MyBodyAppender appender = new MyBodyAppender();
-
-public void configure() throws Exception {
-    from("direct:start")
-        .aggregate(constant(true), AggregationStrategies.bean(appender, "append"))
-            .completionSize(3)
-            .to("mock:result");
-}
-----
-
-We can also provide the bean type directly:
-
-[source,java]
-----
-public void configure() throws Exception {
-    from("direct:start")
-        .aggregate(constant(true), AggregationStrategies.bean(MyBodyAppender.class, "append"))
-            .completionSize(3)
-            .to("mock:result");
-}
-----
-
-And if the bean has only one method we do not need to specify the name
-of the method:
-
-[source,java]
-----
-public void configure() throws Exception {
-    from("direct:start")
-        .aggregate(constant(true), AggregationStrategies.bean(MyBodyAppender.class))
-            .completionSize(3)
-            .to("mock:result");
-}
-----
-
-And the `append` method could be static:
-
-[source,java]
-----
-public class MyBodyAppender {
-
-    public static String append(String existing, String next) {
-        return next + existing;
-    }
-
-}
-----
-
-If you are using XML DSL then we need to declare a <bean> with the POJO:
-
-[source,xml]
-----
-<bean id="myAppender" class="com.foo.MyBodyAppender"/>
-----
-
-And in the Camel route we use `strategyRef` to refer to the bean by its
-id, and the `strategyMethodName` can be used to define the method name
-to call:
-
-[source,xml]
-----
-<camelContext xmlns="http://camel.apache.org/schema/spring">
-    <route>
-        <from uri="direct:start"/>
-        <aggregate strategyRef="myAppender" strategyMethodName="append" completionSize="3">
-            <correlationExpression>
-                <constant>true</constant>
-            </correlationExpression>
-            <to uri="mock:result"/>
-        </aggregate>
-    </route>
-</camelContext>
-----
-
-When using XML DSL you must define the POJO as a <bean>.
-
-== Aggregating when no data
-
-By default when using POJOs as AggregationStrategy, then the method is
-*only* invoked when there is data to be aggregated (by default). You can
-use the option `strategyMethodAllowNull` to configure this. Where as
-without using POJOs then you may have `null` as `oldExchange` or
-`newExchange` parameters. For example the
-Aggregate EIP will invoke the
-`AggregationStrategy` with `oldExchange` as null, for the first
-Exchange incoming to the aggregator. And then for
-subsequent xref:exchange.adoc[Exchange]s then `oldExchange` and
-`newExchange` parameters are both not null.
-
-Example with Content Enricher EIP and no data
-
-Though with POJOs as `AggregationStrategy` we made this simpler and only
-call the method when `oldExchange` and `newExchange` is not null, as
-that would be the most common use-case. If you need to allow
-`oldExchange` or `newExchange` to be null, then you can configure this
-with the POJO using the `AggregationStrategyBeanAdapter` as shown below.
-On the bean adapter we call `setAllowNullNewExchange` to allow the new
-exchange to be `null`.
-
-[source,java]
-----
-public void configure() throws Exception {
-    AggregationStrategyBeanAdapter myStrategy = new AggregationStrategyBeanAdapter(appender, "append");
-    myStrategy.setAllowNullOldExchange(true);
-    myStrategy.setAllowNullNewExchange(true);
-
-    from("direct:start")
-        .pollEnrich("seda:foo", 1000, myStrategy)
-            .to("mock:result");
-}
-----
-
-This can be configured a bit easier using the `beanAllowNull` method
-from `AggregationStrategies` as shown:
-
-[source,java]
-----
-public void configure() throws Exception {
-    from("direct:start")
-        .pollEnrich("seda:foo", 1000, AggregationStrategies.beanAllowNull(appender, "append"))
-            .to("mock:result");
-}
-----
-
-Then the `append` method in the POJO would need to deal with the
-situation that `newExchange` can be null:
-
-[source,java]
-----
-public class MyBodyAppender {
-
-    public String append(String existing, String next) {
-        if (next == null) {
-            return "NewWasNull" + existing;
-        } else {
-            return existing + next;
-        }
-    }
-
-}
-----
-
-In the example above we use the xref:content-enricher.adoc[Content Enricher]
-EIP using `pollEnrich`. The `newExchange` will be null in the
-situation we could not get any data from the "seda:foo" endpoint, and
-therefore the timeout was hit after 1 second. So if we need to do some
-special merge logic we would need to set `setAllowNullNewExchange=true`,
-so the `append` method will be invoked. If we do not do that then when
-the timeout was hit, then the append method would normally not be
-invoked, meaning the xref:content-enricher.adoc[Content Enricher] did
-not merge/change the message.
-
-In XML DSL you would configure the `strategyMethodAllowNull` option and
-set it to true as shown below:
-
-[source,xml]
-----
-<camelContext xmlns="http://camel.apache.org/schema/spring">
-    <route>
-        <from uri="direct:start"/>
-        <aggregate strategyRef="myAppender"
-                   strategyMethodName="append"
-                   strategyMethodAllowNull="true"
-                   completionSize="3">
-            <correlationExpression>
-                <constant>true</constant>
-            </correlationExpression>
-            <to uri="mock:result"/>
-        </aggregate>
-    </route>
-</camelContext>
-----
-
-== Different body types
-
-When for example using `strategyMethodAllowNull` as true, then the
-parameter types of the message bodies does not have to be the same. For
-example suppose we want to aggregate from a `com.foo.User` type to a
-`List<String>` that contains the user name. We could code a POJO doing
-this as follows:
-
-[source,java]
-----
-public static final class MyUserAppender {
-
-    public List addUsers(List names, User user) {
-        if (names == null) {
-            names = new ArrayList();
-        }
-        names.add(user.getName());
-        return names;
-    }
-}
-----
-
-Notice that the return type is a List which we want to contain the user
-names. The 1st parameter is the list of names, and then notice the 2nd
-parameter is the incoming `com.foo.User` type.
diff --git a/docs/user-manual/modules/ROOT/pages/backlog-tracer.adoc b/docs/user-manual/modules/ROOT/pages/backlog-tracer.adoc
index f0bc92c..feab678 100644
--- a/docs/user-manual/modules/ROOT/pages/backlog-tracer.adoc
+++ b/docs/user-manual/modules/ROOT/pages/backlog-tracer.adoc
@@ -26,7 +26,7 @@ xref:tracer.adoc[Tracer] is event based and logs the messages as they
 happen (or route to another Camel destination). Also the
 xref:tracer.adoc[Tracer] has more fine grained events where it dives
 into xref:enterprise-integration-patterns.adoc[EIP]s such as the
-xref:content-based-router-eip.adoc[Content Based Router] and traces the
+xref:eips:content-based-router-eip.adoc[Content Based Router] and traces the
 when/otherwise(s). Though the xref:tracer.adoc[Tracer] has much more
 complicated logic to handle this (there is some edge-cases where this
 may not work). The BacklogTracer allows you to pull the messages from
@@ -56,9 +56,9 @@ do "to*" to match any to. Or use "route-foo*" to match any foo routes.
 
 |traceFilter |`null` |Allow to configure a filter as a xref:predicate.adoc[Predicate] using
 any of the Camel xref:languages.adoc[languages]. But default the
-xref:simple-language.adoc[Simple] language is used. For example to filter on
+xref:components:languages:simple-language.adoc[Simple] language is used. For example to filter on
 messages with a given header, use `${header.foo} != null`. To use
-xref:components::groovy-language.adoc[Groovy] then prefix the value with "groovy:". And
+xref:components:languages:groovy-language.adoc[Groovy] then prefix the value with "groovy:". And
 similar for the other languages.
 
 |removeOnDump |`true` |Whether to remove the traced messages that was returned when invoking
diff --git a/docs/user-manual/modules/ROOT/pages/bam-example.adoc b/docs/user-manual/modules/ROOT/pages/bam-example.adoc
index cbfee93..3389beb 100644
--- a/docs/user-manual/modules/ROOT/pages/bam-example.adoc
+++ b/docs/user-manual/modules/ROOT/pages/bam-example.adoc
@@ -76,7 +76,7 @@ the Camel Components
 correlate together the purchase order and invoice messages which can be
 any Expression via any of the
 Languages Supported. In this case we are
-using xref:components::xpath-language.adoc[XPath].
+using xref:components:languages:xpath-language.adoc[XPath].
 
 Then the final line of code defines the temporal rules to use; namely
 that it is considered to be an error if an invoice is not received
diff --git a/docs/user-manual/modules/ROOT/pages/batch-config-eip.adoc b/docs/user-manual/modules/ROOT/pages/batch-config-eip.adoc
deleted file mode 100644
index 4da0466..0000000
--- a/docs/user-manual/modules/ROOT/pages/batch-config-eip.adoc
+++ /dev/null
@@ -1,19 +0,0 @@
-[[batch-config-eip]]
-= Batch-config EIP
-:page-source: core/camel-core-engine/src/main/docs/eips/batch-config-eip.adoc
-
-Batch-processing resequence EIP
-
-// eip options: START
-The Batch-config EIP supports 5 options which are listed below:
-
-[width="100%",cols="2,5,^1,2",options="header"]
-|===
-| Name | Description | Default | Type
-| *batchSize* | Sets the size of the batch to be re-ordered. The default size is 100. | 100 | Integer
-| *batchTimeout* | Sets the timeout for collecting elements to be re-ordered. The default timeout is 1000 msec. | 1000 | Long
-| *allowDuplicates* | Whether to allow duplicates. | false | Boolean
-| *reverse* | Whether to reverse the ordering. | false | Boolean
-| *ignoreInvalidExchanges* | Whether to ignore invalid exchanges | false | Boolean
-|===
-// eip options: END
diff --git a/docs/user-manual/modules/ROOT/pages/bean-binding.adoc b/docs/user-manual/modules/ROOT/pages/bean-binding.adoc
index 643b856..3db103f 100644
--- a/docs/user-manual/modules/ROOT/pages/bean-binding.adoc
+++ b/docs/user-manual/modules/ROOT/pages/bean-binding.adoc
@@ -174,7 +174,7 @@ the xref:message.adoc[Message]
 [[BeanBinding-Examples]]
 === Examples
 
-For example, a xref:bean-eip.adoc[Bean] such as:
+For example, a xref:eips:bean-eip.adoc[Bean] such as:
 
 [source,syntaxhighlighter-pre]
 ----
@@ -231,15 +231,15 @@ the method option
 * The value is a numeric value such as `123` or `7`
 * The value is a String enclosed with either single or double quotes
 * The value is null which denotes a `null` value
-* It can be evaluated using the xref:simple-language.adoc[Simple] language, which
+* It can be evaluated using the xref:components:languages:simple-language.adoc[Simple] language, which
 means you can use, e.g., body, header.foo and other
-xref:simple-language.adoc[Simple] tokens. Notice the tokens must be enclosed with
+xref:components:languages:simple-language.adoc[Simple] tokens. Notice the tokens must be enclosed with
 $\{ }.
 
 Any other value is consider to be a type declaration instead - see the
 next section about specifying types for overloaded methods.
 
-When invoking a xref:bean-eip.adoc[Bean] you can instruct Camel to invoke a
+When invoking a xref:eips:bean-eip.adoc[Bean] you can instruct Camel to invoke a
 specific method by providing the method name:
 
 [source,syntaxhighlighter-pre]
@@ -276,7 +276,7 @@ body as shown:
 .bean(OrderService.class, "doSomething(${body}, true)") 
 ----
 
-The syntax of the parameters is using the xref:simple-language.adoc[Simple]
+The syntax of the parameters is using the xref:components:languages:simple-language.adoc[Simple]
 expression language so we have to use $\{ } placeholders in the body to
 refer to the message body.
 
@@ -312,7 +312,7 @@ first has the content 'World' (without quotes), and the 2nd has the
 value of 5.
 Camel will automatically convert these values to the parameters' types.
 
-Having the power of the xref:simple-language.adoc[Simple] language allows us to
+Having the power of the xref:components:languages:simple-language.adoc[Simple] language allows us to
 bind to message headers and other values such as:
 
 [source,syntaxhighlighter-pre]
@@ -320,7 +320,7 @@ bind to message headers and other values such as:
 .bean(OrderService.class, "doSomething(${body}, ${header.high})") 
 ----
 
-You can also use the OGNL support of the xref:simple-language.adoc[Simple]
+You can also use the OGNL support of the xref:components:languages:simple-language.adoc[Simple]
 expression language. Now suppose the message body is an object which has
 a method named `asXml`. To invoke the `asXml` method we can do as
 follows:
@@ -343,7 +343,7 @@ use `.to` instead as shown:
 
 *Since Camel 2.8*
 
-If you have a xref:bean-eip.adoc[Bean] with overloaded methods, you can now
+If you have a xref:eips:bean-eip.adoc[Bean] with overloaded methods, you can now
 specify parameter types in the method name so Camel can match the method
 you intend to use.
 
diff --git a/docs/user-manual/modules/ROOT/pages/bean-eip.adoc b/docs/user-manual/modules/ROOT/pages/bean-eip.adoc
deleted file mode 100644
index eaf39c8..0000000
--- a/docs/user-manual/modules/ROOT/pages/bean-eip.adoc
+++ /dev/null
@@ -1,97 +0,0 @@
-[[bean-eip]]
-= Bean EIP
-:page-source: core/camel-core-engine/src/main/docs/eips/bean-eip.adoc
-
-The Bean EIP binds beans to Camel message exchanges.
-
-== URI Format
-
-[source]
-----
-bean:beanID[?options]
-----
-
-Where *beanID* can be any string which is used to look up the bean in
-the xref:registry.adoc[Registry]
-
-== EIP options
-
-// eip options: START
-The Bean EIP supports 5 options which are listed below:
-
-[width="100%",cols="2,5,^1,2",options="header"]
-|===
-| Name | Description | Default | Type
-| *ref* | Sets a reference to a bean to use |  | String
-| *method* | Sets the method name on the bean to use |  | String
-| *beanType* | Sets the Class of the bean |  | String
-| *cache* | *Deprecated* Use scope option instead. |  | Boolean
-| *scope* | Scope of bean. See below for more details. | Singleton | String |
-|===
-// eip options: END
-
-=== Bean scope
-
-When using `singleton` scope (default) the bean is created or looked up only once and reused for the lifetime of the endpoint.
-The bean should be thread-safe in case concurrent threads is calling the bean at the same time.
-When using `request` scope the bean is created or looked up once per request (exchange). This can be used if you want to store state on a bean
-while processing a request and you want to call the same bean instance multiple times while processing the request.
-The bean does not have to be thread-safe as the instance is only called from the same request.
-When using `prototype` scope, then the bean will be looked up or created per call. However in case of lookup then this is delegated
-to the bean registry such as Spring or CDI (if in use), which depends on their configuration can act as either singleton or prototype scope.
-so when using `prototype` then this depends on the delegated registry.
-
-== Bean as endpoint
-
-Camel also supports invoking xref:components::bean-component.adoc[Bean] as an Endpoint. In the
-route below:
-
-What happens is that when the exchange is routed to the `myBean` Camel
-will use the xref:bean-binding.adoc[Bean Binding] to invoke the bean. +
- The source for the bean is just a plain POJO:
-
-Camel will use xref:bean-binding.adoc[Bean Binding] to invoke the
-`sayHello` method, by converting the Exchange's In body to the `String`
-type and storing the output of the method on the Exchange Out body.
-
-== Java DSL bean syntax
-
-Java DSL comes with syntactic sugar for the xref:components::bean-component.adoc[Bean]
-component. Instead of specifying the bean explicitly as the endpoint
-(i.e. `to("bean:beanName")`) you can use the following syntax:
-
-[source,java]
-----
-// Send message to the bean endpoint
-// and invoke method resolved using Bean Binding.
-from("direct:start").beanRef("beanName");
-
-// Send message to the bean endpoint
-// and invoke given method.
-from("direct:start").beanRef("beanName", "methodName");
-----
-
-Instead of passing name of the reference to the bean (so that Camel will
-lookup for it in the registry), you can specify the bean itself:
-
-[source,java]
-----
-// Send message to the given bean instance.
-from("direct:start").bean(new ExampleBean());
-
-// Explicit selection of bean method to be invoked.
-from("direct:start").bean(new ExampleBean(), "methodName");
-
-// Camel will create the instance of bean and cache it for you.
-from("direct:start").bean(ExampleBean.class);
-----
-
-== Bean binding
-
-How bean methods to be invoked are chosen (if they are not specified
-explicitly through the *method* parameter) and how parameter values are
-constructed from the xref:message.adoc[Message] are all defined by the
-xref:bean-binding.adoc[Bean Binding] mechanism which is used throughout
-all of the various xref:bean-integration.adoc[Bean Integration]
-mechanisms in Camel.
-
diff --git a/docs/user-manual/modules/ROOT/pages/bean-integration.adoc b/docs/user-manual/modules/ROOT/pages/bean-integration.adoc
index 1886a97..5762c07 100644
--- a/docs/user-manual/modules/ROOT/pages/bean-integration.adoc
+++ b/docs/user-manual/modules/ROOT/pages/bean-integration.adoc
@@ -32,9 +32,9 @@ See more details at:
 
 * xref:pojo-consuming.adoc[POJO Consuming] to consume and possibly route messages from Camel
 * xref:pojo-producing.adoc[POJO Producing] to make it easy to produce camel messages from your POJOs
-* `@DynamicRouter` Annotation for creating a xref:dynamic-router.adoc[Dynamic Router] from a POJO method
-* `@RecipientList` Annotation for creating a xref:recipientList-eip.adoc[Recipient List] from a POJO method
-* `@RoutingSlip` Annotation for creating a xref:routingSlip-eip.adoc[Routing Slip] for a POJO method
+* `@DynamicRouter` Annotation for creating a xref:eips:dynamic-router.adoc[Dynamic Router] from a POJO method
+* `@RecipientList` Annotation for creating a xref:eips:recipientList-eip.adoc[Recipient List] from a POJO method
+* `@RoutingSlip` Annotation for creating a xref:eips:routingSlip-eip.adoc[Routing Slip] for a POJO method
 * xref:bean-injection.adoc[Bean Injection] to inject Camel related resources into your POJOs
 * xref:using-exchange-pattern-annotations.adoc[Using Exchange Pattern Annotations]
   describes how the pattern annotations can be used to change
diff --git a/docs/user-manual/modules/ROOT/pages/choice-eip.adoc b/docs/user-manual/modules/ROOT/pages/choice-eip.adoc
deleted file mode 100644
index 922fdda..0000000
--- a/docs/user-manual/modules/ROOT/pages/choice-eip.adoc
+++ /dev/null
@@ -1,77 +0,0 @@
-[[choice-eip]]
-= Choice EIP
-:page-source: core/camel-core-engine/src/main/docs/eips/choice-eip.adoc
-
-The
-http://www.enterpriseintegrationpatterns.com/ContentBasedRouter.html[Content
-Based Router] from the xref:enterprise-integration-patterns.adoc[EIP
-patterns] allows you to route messages to the correct destination based
-on the contents of the message exchanges.
-
-image::eip/ContentBasedRouter.gif[image]
-
-== Choice options
-
-// eip options: START
-The Choice EIP supports 2 options which are listed below:
-
-[width="100%",cols="2,5,^1,2",options="header"]
-|===
-| Name | Description | Default | Type
-| *whenClauses* | Sets the when clauses |  | List
-| *otherwise* | Sets the otherwise node |  | OtherwiseDefinition
-|===
-// eip options: END
-
-== Examples
-
-The following example shows how to route a request from an input
-*seda:a* endpoint to either *seda:b*, *seda:c* or *seda:d* depending on
-the evaluation of various xref:predicate.adoc[Predicate] expressions
-
-[source,java]
-----
-RouteBuilder builder = new RouteBuilder() {
-    public void configure() {
-        from("direct:a")
-            .choice()
-                .when(simple("${header.foo} == 'bar'"))
-                    .to("direct:b")
-                .when(simple("${header.foo} == 'cheese'"))
-                    .to("direct:c")
-                .otherwise()
-                    .to("direct:d");
-    }
-};
-----
-
-[TIP]
-====
-See xref:faq/why-can-i-not-use-when-or-otherwise-in-a-java-camel-route.adoc[Why
-can I not use when or otherwise in a Java Camel route] if you have
-problems with the Java DSL, accepting using `when` or `otherwise`.
-====
-
-And the same example using XML:
-
-[source,xml]
-----
-<camelContext xmlns="http://camel.apache.org/schema/spring">
-    <route>
-        <from uri="direct:a"/>
-        <choice>
-            <when>
-                <simple>${header.foo} == 'bar'</simple>
-                <to uri="direct:b"/>
-            </when>
-            <when>
-                <simple>${header.foo} == 'cheese'</simple>
-                <to uri="direct:c"/>
-            </when>
-            <otherwise>
-                <to uri="direct:d"/>
-            </otherwise>
-        </choice>
-    </route>
-</camelContext>
-----
diff --git a/docs/user-manual/modules/ROOT/pages/circuitBreaker-eip.adoc b/docs/user-manual/modules/ROOT/pages/circuitBreaker-eip.adoc
deleted file mode 100644
index b3c13e3..0000000
--- a/docs/user-manual/modules/ROOT/pages/circuitBreaker-eip.adoc
+++ /dev/null
@@ -1,62 +0,0 @@
-[[circuitBreaker-eip]]
-= CircuitBreaker EIP
-:page-source: core/camel-core-engine/src/main/docs/eips/circuitBreaker-eip.adoc
-
-The Circuit Breaker pattern is inspired by the real-world electrical circuit breaker,
-which is used to detect excessive current draw and fail fast to protect electrical equipment.
-The software-based circuit breaker works on the same notion, by encapsulating
-the operation and monitoring it for failures. The Circuit Breaker pattern operates in
-three states, as illustrated in the following figure:
-
-image::eip/CircuitBreaker.png[image]
-
-The states are as follows:
-
-* *Closed* — When operating successfully.
-* *Open* — When failure is detected and the breaker opens to short-circuit and fail
-  fast. In this state, the circuit breaker avoids invoking the protected operation and
-  avoids putting additional load on the struggling service.
-* *Half Open* — After a short period in the open state, an operation is attempted to
-  see whether it can complete successfully, and depending on the outcome, it will
-  transfer to either open or closed state.
-
-== Example
-
-Below is an example route showing a circuit breaker endpoint that protects against slow operation by falling back to the in-lined fallback route. By default the timeout request is just *1000ms* so the HTTP endpoint has to be fairly quick to succeed.
-[source,java]
-----
-from("direct:start")
-    .circuitBreaker()
-        .to("http://fooservice.com/slow")
-    .onFallback()
-        .transform().constant("Fallback message")
-    .end()
-    .to("mock:result");
-----
-
-And in XML DSL:
-[source,xml]
-----
-<camelContext xmlns="http://camel.apache.org/schema/spring">
-  <route>
-    <from uri="direct:start"/>
-    <circuitBreaker>
-      <to uri="http://fooservice.com/slow"/>
-      <onFallback>
-        <transform>
-          <constant>Fallback message</constant>
-        </transform>
-      </onFallback>
-    </circuitBreaker>
-    <to uri="mock:result"/>
-  </route>
-</camelContext>
-----
-
-== CircuitBreaker Implementations
-
-Camel provides two implementations of this pattern:
-
-* xref:hystrix-eip.adoc[Hystrix] - Using the Netflix Hystrix implementation
-* xref:resilience4j-eip.adoc[Resilience4j] - Using the Resilience4j implementation
-
diff --git a/docs/user-manual/modules/ROOT/pages/claimCheck-eip.adoc b/docs/user-manual/modules/ROOT/pages/claimCheck-eip.adoc
deleted file mode 100644
index 6828830..0000000
--- a/docs/user-manual/modules/ROOT/pages/claimCheck-eip.adoc
+++ /dev/null
@@ -1,273 +0,0 @@
-[[claimCheck-eip]]
-= Claim Check EIP
-:page-source: core/camel-core-engine/src/main/docs/eips/claimCheck-eip.adoc
-
-The http://www.enterpriseintegrationpatterns.com/patterns/messaging/StoreInLibrary.html[Claim Check] from the xref:enterprise-integration-patterns.adoc[EIP patterns]
-allows you to replace message content with a claim check (a unique key), which can be used to retrieve the message content at a later time.
-
-image::eip/StoreInLibrary.gif[image]
-
-It can also be useful in situations where you cannot trust the information with an outside party; in this case, you can use the Claim Check to hide the sensitive portions of data.
-
-[NOTE]
-====
-The Camel implementation of this EIP pattern stores the message content temporarily in an internal memory store.
-====
-
-// eip options: START
-The Claim Check EIP supports 5 options which are listed below:
-
-[width="100%",cols="2,5,^1,2",options="header"]
-|===
-| Name | Description | Default | Type
-| *operation* | *Required* The claim check operation to use. The following operations is supported: Get - Gets (does not remove) the claim check by the given key. GetAndRemove - Gets and remove the claim check by the given key. Set - Sets a new (will override if key already exists) claim check with the given key. Push - Sets a new claim check on the stack (does not use key). Pop - Gets the latest claim check from the stack (does not use key). |  | ClaimCheckOperation
-| *key* | To use a specific key for claim check id (for dynamic keys use simple language syntax as the key). |  | String
-| *filter* | Specified a filter to control what data gets merging data back from the claim check repository. The following syntax is supported: body - to aggregate the message body attachments - to aggregate all the message attachments headers - to aggregate all the message headers header:pattern - to aggregate all the message headers that matches the pattern. The pattern uses the following rules are applied in this order: exact match, returns true wildcard match (pattern ends with a and [...]
-| *strategyRef* | To use a custom AggregationStrategy instead of the default implementation. Notice you cannot use both custom aggregation strategy and configure data at the same time. |  | String
-| *strategyMethodName* | This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy. |  | String
-|===
-// eip options: END
-
-
-== Claim Check Operation
-
-When using this EIP you must specify the operation to use which can be of the following:
-
-* Get - Gets (does not remove) the claim check by the given key.
-* GetAndRemove - Gets and remove the claim check by the given key.
-* Set - Sets a new (will override if key already exists) claim check with the given key.
-* Push - Sets a new claim check on the stack (does not use key).
-* Pop - Gets the latest claim check from the stack (does not use key).
-
-When using the `Get`, `GetAndRemove`, or `Set` operation you must specify a key.
-These operations will then store and retrieve the data using this key. You can use this to store multiple data in different keys.
-
-The `Push` and `Pop` operations do *not* use a key but stores the data in a stack structure.
-
-
-== Filter what data to merge back
-
-The `filter` option is used to define what data to merge back when using the `Get` or `Pop` operation. When data is merged back
-then its merged using a `AggregationStrategy`. The default strategy uses the `filter` option to easily specify what data to merge back.
-
-The `filter` option takes a `String` value with the following syntax:
-
-* `body` = to aggregate the message body
-* `attachments` = to aggregate all the message attachments
-* `headers` = to aggregate all the message headers
-* `header:pattern` = to aggregate all the message headers that matches the pattern.
-
-The pattern rule supports wildcard and regular expression:
-
-* wildcard match (pattern ends with a `*` and the name starts with the pattern)
-* regular expression match
-
-You can specify multiple rules separated by comma.
-
-=== Basic filter examples
-
-For example to include the message body and all headers starting with _foo_:
-
-----
-body,header:foo*
-----
-
-To only merge back the message body:
-
-----
-body
-----
-
-To only merge back the message attachments:
-
-----
-attachments
-----
-
-To only merge back headers:
-
-----
-headers
-----
-
-To only merge back a header name foo:
-
-----
-header:foo
-----
-
-If the filter rule is specified as empty or as wildcard then everything is merged.
-
-Notice that when merging back data, then any existing data is overwritten, and any other existing data is preserved.
-
-=== Fine grained filtering with include and exclude pattern
-
-The syntax also supports the following prefixes which can be used to specify include,exclude, or remove
-
-* `+` = to include (which is the default mode)
-* `-` = to exclude (exclude takes precedence over include)
-* `--` = to remove (remove takes precedence)
-
-For example to skip the message body, and merge back everything else
-----
--body
-----
-
-Or to skip the message header foo, and merge back everything else
-----
--header:foo
-----
-
-You can also instruct to remove headers when merging data back, for example to remove all headers starting with _bar_:
-----
---headers:bar*
-----
-
-Note you cannot have both include (`+`) and exclude (`-`) `header:pattern` at the same time.
-
-== Dynamic keys
-
-The claim check key are static, but you can use the `simple` language syntax to define dynamic keys,
-for example to use a header from the message named `myKey`:
-
-[source,java]
-----
-from("direct:start")
-    .to("mock:a")
-    .claimCheck(ClaimCheckOperation.Set, "${header.myKey}")
-    .transform().constant("Bye World")
-    .to("mock:b")
-    .claimCheck(ClaimCheckOperation.Get, "${header.myKey}")
-    .to("mock:c")
-    .transform().constant("Hi World")
-    .to("mock:d")
-    .claimCheck(ClaimCheckOperation.Get, "${header.myKey}")
-    .to("mock:e");
-----
-
-
-== Java Examples
-
-The following example shows the `Push` and `Pop` operations in action;
-
-[source,java]
-----
-from("direct:start")
-    .to("mock:a")
-    .claimCheck(ClaimCheckOperation.Push)
-    .transform().constant("Bye World")
-    .to("mock:b")
-    .claimCheck(ClaimCheckOperation.Pop)
-    .to("mock:c");
-----
-
-For example if the message body from the beginning is `Hello World` then that data is pushed on the stack of the Claim Check EIP.
-And then the message body is transformed to `Bye World`, which is what `mock:b` endpoint receives. When we `Pop` from the Claim Check EIP
-then the original message body is retrieved and merged back so `mock:c` will retrieve the message body with `Hello World`.
-
-Here is an example using `Get` and `Set` operations, which uses the key `foo`:
-
-[source,java]
-----
-from("direct:start")
-    .to("mock:a")
-    .claimCheck(ClaimCheckOperation.Set, "foo")
-    .transform().constant("Bye World")
-    .to("mock:b")
-    .claimCheck(ClaimCheckOperation.Get, "foo")
-    .to("mock:c")
-    .transform().constant("Hi World")
-    .to("mock:d")
-    .claimCheck(ClaimCheckOperation.Get, "foo")
-    .to("mock:e");
-----
-
-Notice how we can `Get` the same data twice using the `Get` operation as it will not remove the data. If you only want
-to get the data once, you can use `GetAndRemove`.
-
-The last example shows how to use the `filter` option where we only want to get back header named `foo` or `bar`:
-
-[source,java]
-----
-from("direct:start")
-    .to("mock:a")
-    .claimCheck(ClaimCheckOperation.Push)
-    .transform().constant("Bye World")
-    .setHeader("foo", constant(456))
-    .removeHeader("bar")
-    .to("mock:b")
-    // only merge in the message headers foo or bar
-    .claimCheck(ClaimCheckOperation.Pop, null, "header:(foo|bar)")
-    .to("mock:c");
-----
-
-== XML examples
-
-The following example shows the `Push` and `Pop` operations in action;
-
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <to uri="mock:a"/>
-  <claimCheck operation="Push"/>
-  <transform>
-    <constant>Bye World</constant>
-  </transform>
-  <to uri="mock:b"/>
-  <claimCheck operation="Pop"/>
-  <to uri="mock:c"/>
-</route>
-----
-
-For example if the message body from the beginning is `Hello World` then that data is pushed on the stack of the Claim Check EIP.
-And then the message body is transformed to `Bye World`, which is what `mock:b` endpoint receives. When we `Pop` from the Claim Check EIP
-then the original message body is retrieved and merged back so `mock:c` will retrieve the message body with `Hello World`.
-
-Here is an example using `Get` and `Set` operations, which uses the key `foo`:
-
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <to uri="mock:a"/>
-  <claimCheck operation="Set" key="foo"/>
-  <transform>
-    <constant>Bye World</constant>
-  </transform>
-  <to uri="mock:b"/>
-  <claimCheck operation="Get" key="foo"/>
-  <to uri="mock:c"/>
-  <transform>
-    <constant>Hi World</constant>
-  </transform>
-  <to uri="mock:d"/>
-  <claimCheck operation="Get" key="foo"/>
-  <to uri="mock:e"/>
-</route>
-----
-
-Notice how we can `Get` the same data twice using the `Get` operation as it will not remove the data. If you only want
-to get the data once, you can use `GetAndRemove`.
-
-The last example shows how to use the `filter` option where we only want to get back header named `foo` or `bar`:
-
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <to uri="mock:a"/>
-  <claimCheck operation="Push"/>
-  <transform>
-    <constant>Bye World</constant>
-  </transform>
-  <setHeader name="foo">
-    <constant>456</constant>
-  </setHeader>
-  <removeHeader headerName="bar"/>
-  <to uri="mock:b"/>
-  <!-- only merge in the message headers foo or bar -->
-  <claimCheck operation="Pop" filter="header:(foo|bar)"/>
-  <to uri="mock:c"/>
-</route>
-----
diff --git a/docs/user-manual/modules/ROOT/pages/competing-consumers.adoc b/docs/user-manual/modules/ROOT/pages/competing-consumers.adoc
index 845b39e..615766a 100644
--- a/docs/user-manual/modules/ROOT/pages/competing-consumers.adoc
+++ b/docs/user-manual/modules/ROOT/pages/competing-consumers.adoc
@@ -73,7 +73,7 @@ And what if we need more, then we need to add a 3rd, a 4th and so on.
 What if the processing of the file itself is the bottleneck? That is the calculateBean is slow.
 So how can we process messages with this bean concurrently?
 
-Yeah we can use the xref:threads-eip.adoc[Threads EIP], so if we insert it in the route we get:
+Yeah we can use the xref:eips:threads-eip.adoc[Threads EIP], so if we insert it in the route we get:
 
 [source,java]
 ----
diff --git a/docs/user-manual/modules/ROOT/pages/composed-message-processor.adoc b/docs/user-manual/modules/ROOT/pages/composed-message-processor.adoc
index 7571b58..01aec49 100644
--- a/docs/user-manual/modules/ROOT/pages/composed-message-processor.adoc
+++ b/docs/user-manual/modules/ROOT/pages/composed-message-processor.adoc
@@ -13,15 +13,15 @@ Use Composed Message Processor to process a composite message.
 The Composed Message Processor splits the message up, routes the sub-messages to the appropriate destinations
 and re-aggregates the responses back into a single message.
 
-With Camel this pattern is implemented by the xref:split-eip.adoc[Splitter]
+With Camel this pattern is implemented by the xref:eips:split-eip.adoc[Splitter]
 which has built-in aggregation to re-aggregate the responses back into a single message.
 
 == Sample
 
-This sample uses the xref:split-eip.adoc[Splitter] as composed message processor to process each splitted message,
+This sample uses the xref:eips:split-eip.adoc[Splitter] as composed message processor to process each splitted message,
 aggregate and return a combined single response.
 
-The route and the code comments below explains how you can use the xref:split-eip.adoc[Splitter] to
+The route and the code comments below explains how you can use the xref:eips:split-eip.adoc[Splitter] to
 split each message to sub-message which are processed individuallay and then combined back into
 a single response message via the custom ``aggregationStrategy` (`MyOrderStategy`), which
 then are the output of the splitter, that are then further processed at the end of the route.
@@ -48,4 +48,4 @@ from("direct:start")
 
 == More details
 
-See the xref:split-eip.adoc[Splitter] EIP.
+See the xref:eips:split-eip.adoc[Splitter] EIP.
diff --git a/docs/user-manual/modules/ROOT/pages/constant-language.adoc b/docs/user-manual/modules/ROOT/pages/constant-language.adoc
deleted file mode 100644
index a8ef0e0..0000000
--- a/docs/user-manual/modules/ROOT/pages/constant-language.adoc
+++ /dev/null
@@ -1,75 +0,0 @@
-[[constant-language]]
-= Constant Language
-:page-source: core/camel-core-languages/src/main/docs/constant-language.adoc
-
-*Since Camel 1.5*
-
-The Constant Expression Language is really just a way to specify
-constant strings as a type of expression.
-
-[NOTE]
-====
-This is a fixed constant value that is only set once during starting up the route,
-do not use this if you want dynamic values during routing.
-====
-
-== Constant Options
-
-
-// language options: START
-The Constant language supports 1 options, which are listed below.
-
-
-
-[width="100%",cols="2,1m,1m,6",options="header"]
-|===
-| Name | Default | Java Type | Description
-| trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks
-|===
-// language options: END
-
-
-== Example usage
-
-The setHeader element of the Spring DSL can utilize a constant
-expression like:
-
-[source,xml]
-----
-<route>
-  <from uri="seda:a"/>
-  <setHeader name="theHeader">
-    <constant>the value</constant>
-  </setHeader>
-  <to uri="mock:b"/>
-</route>
-----
-
-in this case, the Message coming from the seda:a
-Endpoint will have 'theHeader' header set to the
-constant value 'the value'.
-
-And the same example using Java DSL:
-
-[source,java]
-----
-from("seda:a")
-  .setHeader("theHeader", constant("the value"))
-  .to("mock:b");
-----
-
-== Loading constant from external resource
-
-You can externalize the constant and have Camel load it from a resource
-such as `"classpath:"`, `"file:"`, or `"http:"`. +
- This is done using the following syntax: `"resource:scheme:location"`,
-eg to refer to a file on the classpath you can do:
-
-[source,java]
-----
-.setHeader("myHeader").constant("resource:classpath:constant.txt")
-----
-
-== Dependencies
-
-The Constant language is part of *camel-core*.
diff --git a/docs/user-manual/modules/ROOT/pages/content-based-router-eip.adoc b/docs/user-manual/modules/ROOT/pages/content-based-router-eip.adoc
deleted file mode 100644
index 761ac92..0000000
--- a/docs/user-manual/modules/ROOT/pages/content-based-router-eip.adoc
+++ /dev/null
@@ -1,80 +0,0 @@
-[[contentBasedRouter-eip]]
-= Content Based Router
-:page-source: core/camel-core-engine/src/main/docs/eips/content-based-router-eip.adoc
-
-The
-http://www.enterpriseintegrationpatterns.com/ContentBasedRouter.html[Content
-Based Router] from the xref:enterprise-integration-patterns.adoc[EIP
-patterns] allows you to route messages to the correct destination based
-on the contents of the message exchanges.
-
-image::eip/ContentBasedRouter.gif[image]
-
-The following example shows how to route a request from an input
-*seda:a* endpoint to either *seda:b*, *seda:c* or *seda:d* depending on
-the evaluation of various xref:predicate.adoc[Predicate] expressions
-
-== Using the xref:fluent-builders.adoc[Fluent Builders]
-
-[source,java]
-----
-RouteBuilder builder = new RouteBuilder() {
-    public void configure() {
-        errorHandler(deadLetterChannel("mock:error"));
- 
-        from("direct:a")
-            .choice()
-                .when(header("foo").isEqualTo("bar"))
-                    .to("direct:b")
-                .when(header("foo").isEqualTo("cheese"))
-                    .to("direct:c")
-                .otherwise()
-                    .to("direct:d");
-    }
-};
-----
-
-[TIP]
-====
-See
-xref:faq/why-can-i-not-use-when-or-otherwise-in-a-java-camel-route.adoc[Why
-can I not use when or otherwise in a Java Camel route] if you have
-problems with the Java DSL, accepting using `when` or `otherwise`.
-====
-
-== Using the xref:spring-xml-extensions.adoc[Spring XML Extensions]
-
-[source,java]
-----
-<camelContext errorHandlerRef="errorHandler" xmlns="http://camel.apache.org/schema/spring">
-    <route>
-        <from uri="direct:a"/>
-        <choice>
-            <when>
-                <xpath>$foo = 'bar'</xpath>
-                <to uri="direct:b"/>
-            </when>
-            <when>
-                <xpath>$foo = 'cheese'</xpath>
-                <to uri="direct:c"/>
-            </when>
-            <otherwise>
-                <to uri="direct:d"/>
-            </otherwise>
-        </choice>
-    </route>
-</camelContext>
-----
-
-For further examples of this pattern in use you could look at the
-https://github.com/apache/camel/blob/master/core/camel-core/src/test/java/org/apache/camel/processor/ChoiceTest.java[junit test case].
-
-[[ContentBasedRouter-UsingThisPattern]]
-== Using This Pattern
-
-If you would like to use this EIP Pattern then please read the
-xref:getting-started.adoc[Getting Started]. You may also find the
-xref:architecture.adoc[Architecture] useful particularly the description
-of xref:endpoint.adoc[Endpoint] and xref:uris.adoc[URIs]. Then you could
-try out some of the xref:examples.adoc[Examples] first before trying
-this pattern out.
diff --git a/docs/user-manual/modules/ROOT/pages/content-enricher.adoc b/docs/user-manual/modules/ROOT/pages/content-enricher.adoc
index 386d700..05a936c 100644
--- a/docs/user-manual/modules/ROOT/pages/content-enricher.adoc
+++ b/docs/user-manual/modules/ROOT/pages/content-enricher.adoc
@@ -108,9 +108,9 @@ xref:exchange.adoc[Exchange]. For example you cannot set a filename in
 the `Exchange.FILE_NAME` header and use `pollEnrich` to consume only
 that file. For that you *must* set the filename in the endpoint URI.
 
-Instead of using `enrich` you can use xref:recipientList-eip.adoc[Recipient
+Instead of using `enrich` you can use xref:eips:recipientList-eip.adoc[Recipient
 List] and have dynamic endpoints and define an `AggregationStrategy` on
-the xref:recipientList-eip.adoc[Recipient List] which then would work as a
+the xref:eips:recipientList-eip.adoc[Recipient List] which then would work as a
 `enrich` would do.
 
 pollEnrich only accept one message as response. That means that if you
@@ -135,8 +135,8 @@ confluenceTableSmall
 |`uri` |  |The endpoint uri for the external service to enrich from. You
 must use either `uri` or `ref`. *Important:* From Camel 2.16 onwards,
 this option is removed, and you use an xref:expression.adoc[Expression]
-to configure the uri, such as xref:simple-language.adoc[Simple] or
-xref:constant-language.adoc[Constant] or any other dynamic language that can
+to configure the uri, such as xref:components:languages:simple-language.adoc[Simple] or
+xref:components:languages:constant-language.adoc[Constant] or any other dynamic language that can
 compute the uri dynamically using values from the current
 xref:exchange.adoc[Exchange].
 
@@ -144,13 +144,13 @@ xref:exchange.adoc[Exchange].
 from. You must use either `uri` or `ref`.  **Important:** From Camel
 2.16 onwards, this option is removed, and you use an
 xref:expression.adoc[Expression] to configure the uri, such as
-xref:simple-language.adoc[Simple] or xref:constant-language.adoc[Constant] or any other
+xref:components:languages:simple-language.adoc[Simple] or xref:components:languages:constant-language.adoc[Constant] or any other
 dynamic language that can compute the uri dynamically using values from
 the current  xref:exchange.adoc[Exchange].
 
 |expression |  |*Camel 2.16:* Mandatory.
 The xref:expression.adoc[Expression] to configure the uri, such as
-xref:simple-language.adoc[Simple] or xref:constant-language.adoc[Constant] or any other
+xref:components:languages:simple-language.adoc[Simple] or xref:components:languages:constant-language.adoc[Constant] or any other
 dynamic language that can compute the uri dynamically using values from
 the current  xref:exchange.adoc[Exchange].
 
@@ -160,18 +160,18 @@ to be used to merge the reply from the external service, into a single
 outgoing message. By default Camel will use the reply from the external
 service as outgoing message. From *Camel 2.12* onwards you can also use
 a POJO as the `AggregationStrategy`, see the
-xref:aggregate-eip.adoc[Aggregate] page for more details.
+xref:eips:aggregate-eip.adoc[Aggregate] page for more details.
 
 |`strategyMethodName` |  |*Camel 2.12:* This option can be used to
 explicit declare the method name to use, when using POJOs as the
-`AggregationStrategy`. See the xref:aggregate-eip.adoc[Aggregate] page for
+`AggregationStrategy`. See the xref:eips:aggregate-eip.adoc[Aggregate] page for
 more details.
 
 |`strategyMethodAllowNull` |`false` |*Camel 2.12:* If this option is
 `false` then the aggregate method is not used if there was no data to
 enrich. If this option is `true` then `null` values is used as the
 `oldExchange` (when no data to enrich), when using POJOs as the
-`AggregationStrategy`. See the xref:aggregate-eip.adoc[Aggregate] page for
+`AggregationStrategy`. See the xref:eips:aggregate-eip.adoc[Aggregate] page for
 more details.
 
 |`aggregateOnException` |`false` |*Camel 2.14:* If this option is
@@ -185,7 +185,7 @@ to suppress the exception or set a custom message body etc.
 the parent and the resource exchange. Enrich will by default not share
 unit of work between the parent exchange and the resource exchange. This
 means the resource exchange has its own individual unit of work. See
-xref:split-eip.adoc[Splitter] for more information and example.
+xref:eips:split-eip.adoc[Splitter] for more information and example.
 
 |`cacheSize` |  |*Camel 2.16:* Allows to configure the cache size for
 the `ProducerCache` which caches producers for reuse in the enrich. Will
@@ -348,8 +348,8 @@ polling
 |`uri` |  |The endpoint uri for the external service to enrich from. You
 must use either `uri` or `ref`. **Important:** From Camel 2.16 onwards,
 this option is removed, and you use an xref:expression.adoc[Expression]
-to configure the uri, such as xref:simple-language.adoc[Simple] or
-xref:constant-language.adoc[Constant] or any other dynamic language that can
+to configure the uri, such as xref:components:languages:simple-language.adoc[Simple] or
+xref:components:languages:constant-language.adoc[Constant] or any other dynamic language that can
 compute the uri dynamically using values from the current
  xref:exchange.adoc[Exchange].
 
@@ -357,13 +357,13 @@ compute the uri dynamically using values from the current
 from. You must use either `uri` or `ref`. **Important:** From Camel 2.16
 onwards, this option is removed, and you use an
 xref:expression.adoc[Expression] to configure the uri, such as
-xref:simple-language.adoc[Simple] or xref:constant-language.adoc[Constant] or any other
+xref:components:languages:simple-language.adoc[Simple] or xref:components:languages:constant-language.adoc[Constant] or any other
 dynamic language that can compute the uri dynamically using values from
 the current  xref:exchange.adoc[Exchange].
 
 |`expression` |  |**Camel 2.16:** Mandatory.
 The xref:expression.adoc[Expression] to configure the uri, such as
-xref:simple-language.adoc[Simple] or xref:constant-language.adoc[Constant] or any other
+xref:components:languages:simple-language.adoc[Simple] or xref:components:languages:constant-language.adoc[Constant] or any other
 dynamic language that can compute the uri dynamically using values from
 the current xref:exchange.adoc[Exchange].
 
@@ -373,18 +373,18 @@ to be used to merge the reply from the external service, into a single
 outgoing message. By default Camel will use the reply from the external
 service as outgoing message. From *Camel 2.12* onwards you can also use
 a POJO as the `AggregationStrategy`, see the
-xref:aggregate-eip.adoc[Aggregate] page for more details.
+xref:eips:aggregate-eip.adoc[Aggregate] page for more details.
 
 |`strategyMethodName` |  |*Camel 2.12:* This option can be used to
 explicit declare the method name to use, when using POJOs as the
-`AggregationStrategy`. See the xref:aggregate-eip.adoc[Aggregate] page for
+`AggregationStrategy`. See the xref:eips:aggregate-eip.adoc[Aggregate] page for
 more details.
 
 |`strategyMethodAllowNull` |`false` |*Camel 2.12:* If this option is
 `false` then the aggregate method is not used if there was no data to
 enrich. If this option is `true` then `null` values is used as the
 `oldExchange` (when no data to enrich), when using POJOs as the
-`AggregationStrategy`. See the xref:aggregate-eip.adoc[Aggregate] page for
+`AggregationStrategy`. See the xref:eips:aggregate-eip.adoc[Aggregate] page for
 more details.
 
 |`timeout` |`-1` |Timeout in millis when polling from the external
diff --git a/docs/user-manual/modules/ROOT/pages/content-filter-eip.adoc b/docs/user-manual/modules/ROOT/pages/content-filter-eip.adoc
deleted file mode 100644
index 1153984..0000000
--- a/docs/user-manual/modules/ROOT/pages/content-filter-eip.adoc
+++ /dev/null
@@ -1,65 +0,0 @@
-[[ContentFilter-eip]]
-= Content Filter
-:page-source: core/camel-core-engine/src/main/docs/eips/content-filter-eip.adoc
-
-Camel supports the
-http://www.enterpriseintegrationpatterns.com/ContentFilter.html[Content
-Filter] from the
-xref:enterprise-integration-patterns.adoc[EIP patterns]
-using one of the following mechanisms in the routing logic to transform
-content from the inbound message.
-
-* xref:message-translator.adoc[Message Translator]
-* invoking a xref:bean-integration.adoc[Java bean]
-* xref:processor.adoc[Processor] object
-
-image::eip/ContentFilter.gif[image]
-
-A common way to filter messages is to use an
-xref:expression.adoc[Expression] in the xref:dsl.adoc[DSL] like
-xref:components::xquery-language.adoc[XQuery].
-
-== Using the xref:fluent-builders.adoc[Fluent Builders]
-
-Here is a simple example using the xref:dsl.adoc[DSL] directly
-
-In this example we add our own xref:processor.adoc[Processor]
-
-For further examples of this pattern in use you could look at one of the
-JUnit tests
-
-* https://github.com/apache/camel/blob/master/core/camel-core/src/test/java/org/apache/camel/processor/TransformTest.java[TransformTest]
-* https://github.com/apache/camel/blob/master/core/camel-core/src/test/java/org/apache/camel/processor/TransformViaDSLTest.java[TransformViaDSLTest]
-
-== Using Spring XML
-
-[source,xml]
-----
-<route>
-  <from uri="activemq:Input"/>
-  <bean ref="myBeanName" method="doTransform"/>
-  <to uri="activemq:Output"/>
-</route>
-----
-
-You can also use XPath to filter out part of the message you are
-interested in:
-
-[source,xml]
-----
-<route>
-  <from uri="activemq:Input"/>
-  <setBody><xpath resultType="org.w3c.dom.Document">//foo:bar</xpath></setBody>
-  <to uri="activemq:Output"/>
-</route> 
-----
-
-[[ContentFilter-UsingThisPattern]]
-== Using This Pattern
-
-If you would like to use this EIP Pattern then please read the
-xref:getting-started.adoc[Getting Started], you may also find the
-xref:architecture.adoc[Architecture] useful particularly the description
-of xref:endpoint.adoc[Endpoint] and xref:uris.adoc[URIs]. Then you could
-try out some of the xref:examples.adoc[Examples] first before trying
-this pattern out.
diff --git a/docs/user-manual/modules/ROOT/pages/convertBodyTo-eip.adoc b/docs/user-manual/modules/ROOT/pages/convertBodyTo-eip.adoc
deleted file mode 100644
index f075792..0000000
--- a/docs/user-manual/modules/ROOT/pages/convertBodyTo-eip.adoc
+++ /dev/null
@@ -1,16 +0,0 @@
-[[convertBodyTo-eip]]
-= Convert Body To EIP
-:page-source: core/camel-core-engine/src/main/docs/eips/convertBodyTo-eip.adoc
-
-The ConvertBodyTo EIP allows you to transform your body to a different type.
-
-// eip options: START
-The Convert Body To EIP supports 2 options which are listed below:
-
-[width="100%",cols="2,5,^1,2",options="header"]
-|===
-| Name | Description | Default | Type
-| *type* | *Required* The java type to convert to |  | String
-| *charset* | To use a specific charset when converting |  | String
-|===
-// eip options: END
diff --git a/docs/user-manual/modules/ROOT/pages/correlation-identifier.adoc b/docs/user-manual/modules/ROOT/pages/correlation-identifier.adoc
index 5e79bf4..8cfcfaa 100644
--- a/docs/user-manual/modules/ROOT/pages/correlation-identifier.adoc
+++ b/docs/user-manual/modules/ROOT/pages/correlation-identifier.adoc
@@ -25,8 +25,8 @@ those cases, Camel will add a correlation id on the
 xref:exchange.adoc[Exchange] as a property with they key
 `Exchange.CORRELATION_ID`, which links back to the source
 xref:exchange.adoc[Exchange]. For example the
-xref:split-eip.adoc[Splitter], xref:multicast-eip.adoc[Multicast],
-xref:recipientList-eip.adoc[Recipient List], and xref:wireTap-eip.adoc[Wire
+xref:eips:split-eip.adoc[Splitter], xref:eips:multicast-eip.adoc[Multicast],
+xref:eips:recipientList-eip.adoc[Recipient List], and xref:eips:wireTap-eip.adoc[Wire
 Tap] EIP does this.
 
 The following example demonstrates using the Camel JMSMessageID as the
diff --git a/docs/user-manual/modules/ROOT/pages/customLoadBalancer-eip.adoc b/docs/user-manual/modules/ROOT/pages/customLoadBalancer-eip.adoc
deleted file mode 100644
index 50d413e..0000000
--- a/docs/user-manual/modules/ROOT/pages/customLoadBalancer-eip.adoc
+++ /dev/null
@@ -1,82 +0,0 @@
-[[customLoadBalancer-eip]]
-= Custom Load Balancer EIP
-:page-source: core/camel-core-engine/src/main/docs/eips/customLoadBalancer-eip.adoc
-
-This EIP allows you to use your own Load Balancer implementation
-
-// eip options: START
-The Custom Load Balancer EIP supports 1 options which are listed below:
-
-[width="100%",cols="2,5,^1,2",options="header"]
-|===
-| Name | Description | Default | Type
-| *ref* | *Required* Refers to the custom load balancer to lookup from the registry |  | String
-|===
-// eip options: END
-
-
-An example using Java DSL:
-[source,java]
-----
-from("direct:start")
-    // using our custom load balancer
-    .loadBalance(new MyLoadBalancer())
-    .to("mock:x", "mock:y", "mock:z");
-----
-
-And the same example using XML DSL:
-[source,xml]
-----
-<!-- this is the implementation of our custom load balancer -->
-<bean id="myBalancer" class="org.apache.camel.processor.CustomLoadBalanceTest$MyLoadBalancer"/>
-
-<camelContext xmlns="http://camel.apache.org/schema/spring">
-  <route>
-    <from uri="direct:start"/>
-    <loadBalance>
-      <!-- refer to my custom load balancer -->
-      <custom ref="myBalancer"/>
-      <!-- these are the endpoints to balancer -->
-      <to uri="mock:x"/>
-      <to uri="mock:y"/>
-      <to uri="mock:z"/>
-    </loadBalance>
-  </route>
-</camelContext>
-----
-
-Notice in the XML DSL above we use `<custom>` which is only available in *Camel 2.8* onwards. In older releases you would have to do as follows instead:
-[source,xml]
-----
-<loadBalance ref="myBalancer">
-  <!-- these are the endpoints to balancer -->
-  <to uri="mock:x"/>
-  <to uri="mock:y"/>
-  <to uri="mock:z"/>
-</loadBalance>
-----
-
-To implement a custom load balancer you can extend some support classes such as `LoadBalancerSupport` and `SimpleLoadBalancerSupport`.
-The former supports the asynchronous routing engine, and the latter does not. Here is an example of a custom load balancer implementation:
-[source,java]
-----
-public static class MyLoadBalancer extends LoadBalancerSupport {
-
-    public boolean process(Exchange exchange, AsyncCallback callback) {
-        String body = exchange.getIn().getBody(String.class);
-        try {
-            if ("x".equals(body)) {
-                getProcessors().get(0).process(exchange);
-            } else if ("y".equals(body)) {
-                getProcessors().get(1).process(exchange);
-            } else {
-                getProcessors().get(2).process(exchange);
-            }
-        } catch (Throwable e) {
-            exchange.setException(e);
-        }
-        callback.done(true);
-        return true;
-    }
-}
-----
diff --git a/docs/user-manual/modules/ROOT/pages/data-format.adoc b/docs/user-manual/modules/ROOT/pages/data-format.adoc
index b7eadca..bdda33c 100644
--- a/docs/user-manual/modules/ROOT/pages/data-format.adoc
+++ b/docs/user-manual/modules/ROOT/pages/data-format.adoc
@@ -8,42 +8,42 @@ xref:message-translator.adoc[Message Translator].
 The following data formats are currently supported:
 
 * Object marshalling
-** xref:components::avro-dataformat.adoc[Avro]
+** xref:components:dataformats:avro-dataformat.adoc[Avro]
 ** xref:json.adoc[JSON]
-** xref:components::protobuf-dataformat.adoc[Protobuf]
-** xref:components::yaml-snakeyaml-dataformat.adoc[YAML]
+** xref:components:dataformats:protobuf-dataformat.adoc[Protobuf]
+** xref:components:dataformats:yaml-snakeyaml-dataformat.adoc[YAML]
 
 * Object/XML marshalling
-** xref:components::jaxb-dataformat.adoc[JAXB]
-** xref:components::xstream-dataformat.adoc[XStream]
-** xref:components::jacksonxml-dataformat.adoc[Jackson XML]
+** xref:components:dataformats:jaxb-dataformat.adoc[JAXB]
+** xref:components:dataformats:xstream-dataformat.adoc[XStream]
+** xref:components:dataformats:jacksonxml-dataformat.adoc[Jackson XML]
 
 * Flat data structure marshalling
-** xref:components::beanio-dataformat.adoc[BeanIO]
-** xref:components::bindy-dataformat.adoc[Bindy]
-** xref:components::csv-dataformat.adoc[CSV]
-** xref:components::flatpack-dataformat.adoc[Flatpack DataFormat]
-** uniVocity DataFormats xref:components::univocity-csv-dataformat.adoc[CSV] / xref:components::univocity-tsv-dataformat.adoc[TSV] / xref:components::univocity-fixed-dataformat.adoc[Fixed Length]
+** xref:components:dataformats:beanio-dataformat.adoc[BeanIO]
+** xref:components:dataformats:bindy-dataformat.adoc[Bindy]
+** xref:components:dataformats:csv-dataformat.adoc[CSV]
+** xref:components:dataformats:flatpack-dataformat.adoc[Flatpack DataFormat]
+** uniVocity DataFormats xref:components:dataformats:univocity-csv-dataformat.adoc[CSV] / xref:components:dataformats:univocity-tsv-dataformat.adoc[TSV] / xref:components:dataformats:univocity-fixed-dataformat.adoc[Fixed Length]
 
 * Domain specific marshalling
-** xref:components::hl7-dataformat.adoc[HL7 DataFormat]
+** xref:components:dataformats:hl7-dataformat.adoc[HL7 DataFormat]
 
 * Compression
-** xref:components::zipfile-dataformat.adoc[Zip File DataFormat]
-** xref:components::lzf-dataformat.adoc[LZF Data Format]
+** xref:components:dataformats:zipfile-dataformat.adoc[Zip File DataFormat]
+** xref:components:dataformats:lzf-dataformat.adoc[LZF Data Format]
 
 * Security
 ** xref:components::crypto-component.adoc[Crypto]
 ** xref:components::crypto-component.adoc[PGP]
-** xref:components::secureXML-dataformat.adoc[XMLSecurity DataFormat]
+** xref:components:dataformats:secureXML-dataformat.adoc[XMLSecurity DataFormat]
 
 * Misc.
-** xref:components::base64-dataformat.adoc[Base64]
-** xref:components::mime-multipart-dataformat.adoc[MIME-Multipart]
-** xref:components::rss-dataformat.adoc[RSS]
-** xref:components::syslog-dataformat.adoc[Syslog]
-** xref:components::ical-dataformat.adoc[ICal]
-** xref:components::barcode-dataformat.adoc[Barcode] -- to read and generate barcodes
+** xref:components:dataformats:base64-dataformat.adoc[Base64]
+** xref:components:dataformats:mime-multipart-dataformat.adoc[MIME-Multipart]
+** xref:components:dataformats:rss-dataformat.adoc[RSS]
+** xref:components:dataformats:syslog-dataformat.adoc[Syslog]
+** xref:components:dataformats:ical-dataformat.adoc[ICal]
+** xref:components:dataformats:barcode-dataformat.adoc[Barcode] -- to read and generate barcodes
 (QR-Code, PDF417, ...)
 
 And related is the following:
diff --git a/docs/user-manual/modules/ROOT/pages/dead-letter-channel.adoc b/docs/user-manual/modules/ROOT/pages/dead-letter-channel.adoc
index 79af0f5..a2a8863 100644
--- a/docs/user-manual/modules/ROOT/pages/dead-letter-channel.adoc
+++ b/docs/user-manual/modules/ROOT/pages/dead-letter-channel.adoc
@@ -332,7 +332,7 @@ The `Exchange.FAILURE_ENDPOINT` have the constant value
 This allows for example you to fetch this information in your dead
 letter queue and use that for error reporting. +
  This is useable if the Camel route is a bit dynamic such as the dynamic
-xref:recipientList-eip.adoc[Recipient List] so you know which endpoints
+xref:eips:recipientList-eip.adoc[Recipient List] so you know which endpoints
 failed.
 
 These information is kept on the Exchange even if the message
diff --git a/docs/user-manual/modules/ROOT/pages/delay-eip.adoc b/docs/user-manual/modules/ROOT/pages/delay-eip.adoc
deleted file mode 100644
index 20e524e..0000000
--- a/docs/user-manual/modules/ROOT/pages/delay-eip.adoc
+++ /dev/null
@@ -1,173 +0,0 @@
-[[delay-eip]]
-= Delay EIP
-:page-source: core/camel-core-engine/src/main/docs/eips/delay-eip.adoc
-The Delayer Pattern allows you to delay the delivery of messages to some destination.
-
-== Options
-
-// eip options: START
-The Delay EIP supports 3 options which are listed below:
-
-[width="100%",cols="2,5,^1,2",options="header"]
-|===
-| Name | Description | Default | Type
-| *executorServiceRef* | Refers to a custom Thread Pool if asyncDelay has been enabled. |  | String
-| *asyncDelayed* | Enables asynchronous delay which means the thread will not block while delaying. | true | Boolean
-| *callerRunsWhenRejected* | Whether or not the caller should run the task when it was rejected by the thread pool. Is by default true | true | Boolean
-|===
-// eip options: END
-
-[NOTE]
-====
-The expression is a value in millis to wait from the current time, so the expression should just be 3000.
-
-However you can use a long value for a fixed value to indicate the delay in millis.
-
-See the Spring DSL samples for Delayer.
-====
-
-[CAUTION]
-.Using Delayer in Java DSL
-===
-See this ticket: https://issues.apache.org/jira/browse/CAMEL-2654[https://issues.apache.org/jira/browse/CAMEL-2654]
-===
-
-== Samples
-
-The example below will delay all messages received on *seda:b* 1 second before sending them to *mock:result*.
-
-[source,java]
-----
-from("seda:b")
-  .delay(1000)
-  .to("mock:result");
-----
-
-You can just delay things a fixed amount of time from the point at which the delayer receives the message. For example to delay things 2 seconds
-
-[source,java]
-----
-delayer(2000)
-----
-
-The above assume that the delivery order is maintained and that the messages are delivered in delay order. If you want to reorder the messages based on delivery time, you can use the Resequencer with this pattern. For example
-
-[source,java]
-----
-from("activemq:someQueue")
-  .resequencer(header("MyDeliveryTime"))
-  .delay("MyRedeliveryTime")
-  .to("activemq:aDelayedQueue");
-----
-
-You can of course use many different Expression languages such as XPath, XQuery, SQL or various Scripting Languages. For example to delay the message for the time period specified in the header, use the following syntax:
-
-[source,java]
-----
-from("activemq:someQueue")
-  .delay(header("delayValue"))
-  .to("activemq:aDelayedQueue");
-----
-
-And to delay processing using the Simple language you can use the following DSL:
-
-[source,java]
-----
-from("activemq:someQueue")
-  .delay(simple("${body.delayProperty}"))
-  .to("activemq:aDelayedQueue");
-----
-
-=== Spring DSL
-The sample below demonstrates the delay in Spring DSL:
-
-[source,xml]
-----
-<bean id="myDelayBean" class="org.apache.camel.processor.MyDelayCalcBean"/>
-<bean id="exchangeAwareBean" class="org.apache.camel.processor.ExchangeAwareDelayCalcBean"/>
-
-<camelContext xmlns="http://camel.apache.org/schema/spring">
-    <route>
-        <from uri="seda:a"/>
-        <delay>
-            <header>MyDelay</header>
-        </delay>
-        <to uri="mock:result"/>
-    </route>
-    <route>
-        <from uri="seda:b"/>
-        <delay>
-            <constant>1000</constant>
-        </delay>
-        <to uri="mock:result"/>
-    </route>
-    <route>
-        <from uri="seda:c"/>
-        <delay>
-            <method ref="myDelayBean" method="delayMe"/>
-        </delay>
-        <to uri="mock:result"/>
-    </route>
-    <route>
-        <from uri="seda:d"/>
-        <delay>
-            <method ref="exchangeAwareBean" method="delayMe"/>
-        </delay>
-        <to uri="mock:result"/>
-    </route>
-</camelContext>
-----
-
-== Asynchronous delaying
-
-You can let the Delayer use non blocking asynchronous delaying, which means Camel will use a scheduler to schedule a task to be executed in the future. The task will then continue routing. This allows the caller thread to not block and be able to service other messages etc.
-
-=== From Java DSL
-You use the `asyncDelayed()` to enable the async behavior.
-
-[source,java]
-----
-from("activemq:queue:foo")
-  .delay(1000).asyncDelayed()
-  .to("activemq:aDelayedQueue");
-----
-
-=== From Spring XML
-
-You use the `asyncDelayed="true"` attribute to enable the async behavior.
-
-[source,xml]
-----
-<route>
-   <from uri="activemq:queue:foo"/>
-   <delay asyncDelayed="true">
-       <constant>1000</constant>
-   </delay>
-   <to uri="activemq:aDealyedQueue"/>
-</route>
-----
-
-== Creating a custom delay
-
-You can use an expression, such as calling a method on a bean, to determine when to send a message using something like this
-
-[source,java]
-----
-from("activemq:foo").
-  delay().method("someBean", "computeDelay").
-  to("activemq:bar");
-----
-
-then the bean would look like this...
-
-[source,java]
-----
-public class SomeBean {
-  public long computeDelay() {
-     long delay = 0;
-     // use java code to compute a delay value in millis
-     return delay;
- }
-}
-----
-
diff --git a/docs/user-manual/modules/ROOT/pages/dynamic-router.adoc b/docs/user-manual/modules/ROOT/pages/dynamic-router.adoc
deleted file mode 100644
index 12aa022..0000000
--- a/docs/user-manual/modules/ROOT/pages/dynamic-router.adoc
+++ /dev/null
@@ -1,199 +0,0 @@
-[[DynamicRouter-DynamicRouter]]
-= Dynamic Router
-:page-source: core/camel-core-engine/src/main/docs/eips/dynamic-router.adoc
-
-The
-http://www.enterpriseintegrationpatterns.com/DynamicRouter.html[Dynamic
-Router] from the EIP patterns
-allows you to route messages while avoiding the dependency of the router
-on all possible destinations while maintaining its efficiency.
-
-image::eip/DynamicRouter.gif[image]
-
-The `dynamicRouter` in the DSL is similar to
-a dynamic Routing Slip which evaluates the slip
-_on-the-fly_.
-
-WARNING: *Beware*
-You must ensure the expression used for the `dynamicRouter` such as a
-bean, will return `null` to indicate the end. Otherwise the
-`dynamicRouter` will keep repeating endlessly.
-
-[[DynamicRouter-DynamicRouterinCamel2.5onwards]]
-== Dynamic Router in Camel 2.5 onwards
-
-The Dynamic Router will set a
-property (Exchange.SLIP_ENDPOINT) on the Exchange
-which contains the current endpoint as it advanced though the slip. This
-allows you to know how far we have processed in the slip. (It's a slip
-because the Dynamic Router implementation is
-based on top of Routing Slip).
-
-TIP: See the `cacheSize` option for more details on _how much cache_ to use depending on how many or few unique endpoints are used.
-
-== Options
-
-// eip options: START
-The Dynamic Router EIP supports 3 options which are listed below:
-
-[width="100%",cols="2,5,^1,2",options="header"]
-|===
-| Name | Description | Default | Type
-| *uriDelimiter* | Sets the uri delimiter to use | , | String
-| *ignoreInvalidEndpoints* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint | false | Boolean
-| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this routing slip, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped and  [...]
-|===
-// eip options: END
-
-[[DynamicRouter-JavaDSL]]
-== Java DSL
-
-In Java DSL you can use the `dynamicRouter` as shown below:
-
-[source,java]
-----
-from("direct:start")
-    // use a bean as the dynamic router
-    .dynamicRouter(method(DynamicRouterTest.class, "slip"));
-----
-
-Which will leverage a xref:components::bean-component.adoc[Bean] to compute the slip
-_on-the-fly_, which could be implemented as follows:
-
-[source,java]
-----
-/**
- * Use this method to compute dynamic where we should route next.
- *
- * @param body the message body
- * @return endpoints to go, or <tt>null</tt> to indicate the end
- */
-public String slip(String body) {
-    bodies.add(body);
-    invoked++;
- 
-    if (invoked == 1) {
-        return "mock:a";
-    } else if (invoked == 2) {
-        return "mock:b,mock:c";
-    } else if (invoked == 3) {
-        return "direct:foo";
-    } else if (invoked == 4) {
-        return "mock:result";
-    }
- 
-    // no more so return null
-    return null;
-}
-----
-
-Mind that this example is only for show and tell. The current
-implementation is not thread safe. You would have to store the state on
-the Exchange, to ensure thread safety, as shown
-below:
-
-[source,java]
-----
-/**
- * Use this method to compute dynamic where we should route next.
- *
- * @param body the message body
- * @param properties the exchange properties where we can store state between invocations
- * @return endpoints to go, or <tt>null</tt> to indicate the end
- */
-public String slip(String body, @Properties Map<String, Object> properties) {
-    bodies.add(body);
- 
-    // get the state from the exchange properties and keep track how many times
-    // we have been invoked
-    int invoked = 0;
-    Object current = properties.get("invoked");
-    if (current != null) {
-        invoked = Integer.valueOf(current.toString());
-    }
-    invoked++;
-    // and store the state back on the properties
-    properties.put("invoked", invoked);
- 
-    if (invoked == 1) {
-        return "mock:a";
-    } else if (invoked == 2) {
-        return "mock:b,mock:c";
-    } else if (invoked == 3) {
-        return "direct:foo";
-    } else if (invoked == 4) {
-        return "mock:result";
-    }
- 
-    // no more so return null
-    return null;
-}
-----
-
-You could also store state as message headers, but they are not
-guaranteed to be preserved during routing, where as properties on the
-Exchange are. Although there was a bug in the method
-call expression, see the warning below.
-
-[[DynamicRouter-SpringXML]]
-== Spring XML
-
-The same example in Spring XML would be:
-
-[source,xml]
-----
-<bean id="mySlip" class="org.apache.camel.processor.DynamicRouterTest"/>
- 
-<camelContext xmlns="http://camel.apache.org/schema/spring">
-    <route>
-        <from uri="direct:start"/>
-        <dynamicRouter>
-            <!-- use a method call on a bean as dynamic router -->
-            <method ref="mySlip" method="slip"/>
-        </dynamicRouter>
-    </route>
- 
-    <route>
-        <from uri="direct:foo"/>
-        <transform><constant>Bye World</constant></transform>
-    </route>
- 
-</camelContext>
-----
-
-[[DynamicRouter-DynamicRouterannotation]]
-== @DynamicRouter annotation
-
-You can also use the `@DynamicRouter` annotation. The `route` method would
-then be invoked repeatedly as the message is processed dynamically. The
-idea is to return the next endpoint uri where to go. Return `null` to
-indicate the end. You can return multiple endpoints if you like, just as
-the Routing Slip, where each endpoint is
-separated by a delimiter.
-
-[source,java]
-----
-public class MyDynamicRouter {
-
-    @Consume(uri = "activemq:foo")
-    @DynamicRouter
-    public String route(@XPath("/customer/id") String customerId, @Header("Location") String location, Document body) {
-        // query a database to find the best match of the endpoint based on the input parameteres
-        // return the next endpoint uri, where to go. Return null to indicate the end.
-    }
-}
-----
-
-In the above we can use the
-Parameter Binding Annotations
-to bind different parts of the Message to method
-parameters or use an Expression such as using
-xref:components::xpath-language.adoc[XPath] or xref:components::xpath-language.adoc[XQuery].
-
-The method can be invoked in a number of ways as described in the
-Bean Integration such as
-
-* POJO Producing
-* Spring Remoting
-* xref:components::bean-component.adoc[Bean] component
-
diff --git a/docs/user-manual/modules/ROOT/pages/dynamicRouter-eip.adoc b/docs/user-manual/modules/ROOT/pages/dynamicRouter-eip.adoc
deleted file mode 100644
index 6f04383..0000000
--- a/docs/user-manual/modules/ROOT/pages/dynamicRouter-eip.adoc
+++ /dev/null
@@ -1,159 +0,0 @@
-[[dynamicRouter-eip]]
-= Dynamic Router EIP
-:page-source: core/camel-core-engine/src/main/docs/eips/dynamicRouter-eip.adoc
-
-The http://www.enterpriseintegrationpatterns.com/DynamicRouter.html[Dynamic Router] from the xref:enterprise-integration-patterns.adoc[EIP patterns] allows you to route messages while avoiding the dependency of the router on all possible destinations while maintaining its efficiency.
-
-image::eip/DynamicRouter.gif[image]
-
-The `dynamicRouter` in the DSL is similar to
-a dynamic Routing Slip which evaluates the slip
-_on-the-fly_.
-
-[IMPORTANT]
-.Avoid endless looping
-===
-You must ensure the expression used for the `dynamicRouter` such as a bean, will return `null` to indicate the end. Otherwise the `dynamicRouter` will keep repeating endlessly.
-===
-
-TIP: See the `cacheSize` option for more details on _how much cache_ to use depending on how many or few unique endpoints are used.
-
-== Options
-
-// eip options: START
-The Dynamic Router EIP supports 3 options which are listed below:
-
-[width="100%",cols="2,5,^1,2",options="header"]
-|===
-| Name | Description | Default | Type
-| *uriDelimiter* | Sets the uri delimiter to use | , | String
-| *ignoreInvalidEndpoints* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint | false | Boolean
-| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producers when using this dynamic router, when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped an [...]
-|===
-// eip options: END
-
-The Dynamic Router will set the property `Exchange.SLIP_ENDPOINT` on the Exchange which contains the current endpoint as it advanced though the slip. This allows you to know how far we have processed in the slip.
-(It's a slip because the Dynamic Router implementation is based on top of Routing Slip).
-
-== Samples
-
-In Java DSL you can use the `dynamicRouter` as shown below:
-
-[source,java]
-----
-from("direct:start")
-    // use a bean as the dynamic router
-    .dynamicRouter(method(DynamicRouterTest.class, "slip"));
-----
-
-Which will leverage a Bean to compute the slip _on-the-fly_, which could be implemented as follows:
-
-[source,java]
-----
-/**
- * Use this method to compute dynamic where we should route next.
- *
- * @param body the message body
- * @return endpoints to go, or <tt>null</tt> to indicate the end
- */
-public String slip(String body) {
-    bodies.add(body);
-    invoked++;
-
-    if (invoked == 1) {
-        return "mock:a";
-    } else if (invoked == 2) {
-        return "mock:b,mock:c";
-    } else if (invoked == 3) {
-        return "direct:foo";
-    } else if (invoked == 4) {
-        return "mock:result";
-    }
-
-    // no more so return null
-    return null;
-}
-----
-
-Mind that this example is only for show and tell. The current implementation is not thread safe. You would have to store the state on the Exchange, to ensure thread safety, as shown below:
-
-[source,java]
-----
-/**
- * Use this method to compute dynamic where we should route next.
- *
- * @param body the message body
- * @param properties the exchange properties where we can store state between invocations
- * @return endpoints to go, or <tt>null</tt> to indicate the end
- */
-public String slip(String body, @Properties Map<String, Object> properties) {
-    bodies.add(body);
-
-    // get the state from the exchange properties and keep track how many times
-    // we have been invoked
-    int invoked = 0;
-    Object current = properties.get("invoked");
-    if (current != null) {
-        invoked = Integer.valueOf(current.toString());
-    }
-    invoked++;
-    // and store the state back on the properties
-    properties.put("invoked", invoked);
-
-    if (invoked == 1) {
-        return "mock:a";
-    } else if (invoked == 2) {
-        return "mock:b,mock:c";
-    } else if (invoked == 3) {
-        return "direct:foo";
-    } else if (invoked == 4) {
-        return "mock:result";
-    }
-
-    // no more so return null
-    return null;
-}
-----
-
-You could also store state as message headers, but they are not guaranteed to be preserved during routing, where as properties on the Exchange are. Although there was a bug in the method call expression, see the warning below.
-
-=== Spring XML
-The same example in Spring XML would be:
-
-[source,xml]
-----
-<bean id="mySlip" class="org.apache.camel.processor.DynamicRouterTest"/>
-
-<camelContext xmlns="http://camel.apache.org/schema/spring">
-    <route>
-        <from uri="direct:start"/>
-        <dynamicRouter>
-            <!-- use a method call on a bean as dynamic router -->
-            <method ref="mySlip" method="slip"/>
-        </dynamicRouter>
-    </route>
-
-    <route>
-        <from uri="direct:foo"/>
-        <transform><constant>Bye World</constant></transform>
-    </route>
-
-</camelContext>
-----
-
-== @DynamicRouter annotation
-You can also use the `@DynamicRouter` annotation. The `route` method would then be invoked repeatedly as the message is processed dynamically.
-The idea is to return the next endpoint uri where to go. Return `null` to indicate the end. You can return multiple endpoints if you like, just as the Routing Slip, where each endpoint is separated by a delimiter.
-
-[source,java]
-----
-public class MyDynamicRouter {
-
-    @Consume(uri = "activemq:foo")
-    @DynamicRouter
-    public String route(@XPath("/customer/id") String customerId, @Header("Location") String location, Document body) {
-        // query a database to find the best match of the endpoint based on the input parameteres
-        // return the next endpoint uri, where to go. Return null to indicate the end.
-    }
-}
-----
diff --git a/docs/user-manual/modules/ROOT/pages/enrich-eip.adoc b/docs/user-manual/modules/ROOT/pages/enrich-eip.adoc
deleted file mode 100644
index e2a9eb9..0000000
--- a/docs/user-manual/modules/ROOT/pages/enrich-eip.adoc
+++ /dev/null
@@ -1,198 +0,0 @@
-[[enrich-eip]]
-= Enrich EIP
-:page-source: core/camel-core-engine/src/main/docs/eips/enrich-eip.adoc
-
-Camel supports the Content Enricher from the EIP patterns using a Message Translator, an arbitrary Processor in the routing logic, or using the enrich DSL element to enrich the message.
-
-image::eip/DataEnricher.gif[image]
-
-TIP: See the `cacheSize` option for more details on _how much cache_ to use depending on how many or few unique endpoints are used.
-
-// eip options: START
-The Enrich EIP supports 7 options which are listed below:
-
-[width="100%",cols="2,5,^1,2",options="header"]
-|===
-| Name | Description | Default | Type
-| *strategyRef* | Refers to an AggregationStrategy to be used to merge the reply from the external service, into a single outgoing message. By default Camel will use the reply from the external service as outgoing message. |  | String
-| *strategyMethodName* | This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy. |  | String
-| *strategyMethodAllowNull* | If this option is false then the aggregate method is not used if there was no data to enrich. If this option is true then null values is used as the oldExchange (when no data to enrich), when using POJOs as the AggregationStrategy. | false | Boolean
-| *aggregateOnException* | If this option is false then the aggregate method is not used if there was an exception thrown while trying to retrieve the data to enrich from the resource. Setting this option to true allows end users to control what to do if there was an exception in the aggregate method. For example to suppress the exception or set a custom message body etc. | false | Boolean
-| *shareUnitOfWork* | Shares the org.apache.camel.spi.UnitOfWork with the parent and the resource exchange. Enrich will by default not share unit of work between the parent exchange and the resource exchange. This means the resource exchange has its own individual unit of work. | false | Boolean
-| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is used to cache and reuse producer when uris are reused. Beware that when using dynamic endpoints then it affects how well the cache can be utilized. If each dynamic endpoint is unique then its best to turn of caching by setting this to -1, which allows Camel to not cache both the producers and endpoints; they are regarded as prototype scoped and will be stopped and discarded after use. This reduc [...]
-| *ignoreInvalidEndpoint* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint | false | Boolean
-|===
-// eip options: END
-
-== Content enrichment using a Message Translator or a Processor
-
-You can use Templating to consume a message from one destination, transform it with something like Velocity or XQuery, and then send it on to another destination. For example using InOnly (one way messaging)
-
-== Samples
-
-[source,java]
-----
-from("activemq:My.Queue").
-  to("velocity:com/acme/MyResponse.vm").
-  to("activemq:Another.Queue");
-----
-
-If you want to use InOut (request-reply) semantics to process requests on the *My.Queue* queue on ActiveMQ with a template generated response, then sending responses back to the JMSReplyTo Destination you could use this:
-
-[source,java]
-----
-from("activemq:My.Queue").
-  to("velocity:com/acme/MyResponse.vm");
-----
-
-Here is a simple example using the DSL directly to transform the message body
-
-[source,java]
-----
-from("direct:start").setBody(body().append(" World!")).to("mock:result");
-----
-
-In this example we add our own Processor using explicit Java code
-
-[source,java]
-----
-from("direct:start").process(new Processor() {
-    public void process(Exchange exchange) {
-        Message in = exchange.getIn();
-        in.setBody(in.getBody(String.class) + " World!");
-    }
-}).to("mock:result");
-----
-
-Finally we can use Bean Integration to use any Java method on any bean to act as the transformer
-
-[source,java]
-----
-from("activemq:My.Queue").
-  beanRef("myBeanName", "myMethodName").
-  to("activemq:Another.Queue");
-----
-
-=== Using Spring XML
-
-[source,xml]
-----
-<route>
-  <from uri="activemq:Input"/>
-  <bean ref="myBeanName" method="doTransform"/>
-  <to uri="activemq:Output"/>
-</route>
-----
-
-== Content enrichment using the enrich DSL element
-
-Camel comes with flavor `enrich` as a choice of content enricher in the DSL.
-The other one is `pollEnrich`
-
-`enrich` uses a Producer to obtain the additional data. It is usually used for Request Reply messaging, for instance to invoke an external web service.
-
-Both `enrich` and `pollEnrich` supports dynamic endpoints that uses an Expression to compute the uri, which allows to use data from the current Exchange.
-
-=== Enrich example using Java
-
-[source,java]
-----
-AggregationStrategy aggregationStrategy = ...
-
-from("direct:start")
-  .enrich("direct:resource", aggregationStrategy)
-  .to("direct:result");
-
-from("direct:resource")
-...
-----
-
-The content enricher (`enrich`) retrieves additional data from a _resource endpoint_ in order to enrich an incoming message (contained in the _original exchange_).
-An aggregation strategy is used to combine the original exchange and the _resource exchange_. The first parameter of the `AggregationStrategy.aggregate(Exchange, Exchange)` method corresponds to the original exchange, the second parameter the resource exchange.
-The results from the resource endpoint are stored in the resource exchange's out-message. Here's an example template for implementing an aggregation strategy:
-
-[source,java]
-----
-public class ExampleAggregationStrategy implements AggregationStrategy {
-
-    public Exchange aggregate(Exchange original, Exchange resource) {
-        Object originalBody = original.getIn().getBody();
-        Object resourceResponse = resource.getIn().getBody();
-        Object mergeResult = ... // combine original body and resource response
-        if (original.getPattern().isOutCapable()) {
-            original.getOut().setBody(mergeResult);
-        } else {
-            original.getIn().setBody(mergeResult);
-        }
-        return original;
-    }
-
-}
-----
-
-Using this template the original exchange can be of any pattern. The resource exchange created by the enricher is always an in-out exchange.
-
-=== Enrich example using XML
-
-[source,xml]
-----
-<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
-  <route>
-    <from uri="direct:start"/>
-    <enrich strategyRef="aggregationStrategy">
-      <constant>direct:resource</constant>
-    </enrich>
-    <to uri="direct:result"/>
-  </route>
-  <route>
-    <from uri="direct:resource"/>
-    ...
-  </route>
-</camelContext>
-
-<bean id="aggregationStrategy" class="..." />
-----
-
-== Aggregation strategy is optional
-The aggregation strategy is optional. If you do not provide it Camel will by default just use the body obtained from the resource.
-[source,java]
-----
-from("direct:start")
-  .enrich("direct:resource")
-  .to("direct:result");
-----
-
-In the route above the message sent to the direct:result endpoint will contain the output from the direct:resource as we do not use any custom aggregation.
-
-[source,xml]
-----
-<route>
-  <from uri="direct:start"/>
-  <enrich>
-    <constant>direct:resource</constant>
-  </enrich>
-  <to uri="direct:result"/>
... 10455 lines suppressed ...