You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2022/04/06 17:36:51 UTC

[camel] branch main updated: CAMEL-17792: Add documentation about the message headers (T-Z) (#7379)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 6ea23fb25e4 CAMEL-17792: Add documentation about the message headers (T-Z) (#7379)
6ea23fb25e4 is described below

commit 6ea23fb25e434356dc4210b651bab769591660ce
Author: Nicolas Filotto <es...@users.noreply.github.com>
AuthorDate: Wed Apr 6 19:36:45 2022 +0200

    CAMEL-17792: Add documentation about the message headers (T-Z) (#7379)
    
    ## Motivation
    
    It is now possible to document a message header using annotations, let's leverage it to document the headers of the components.
    
     ## Modifications
    
    For all the components whose name starts with a letter between T and Z included
    
    * Document the messages headers using the annotations
    * Migrate the existing documentation of message headers to use the annotations instead
    * Re-define shared constants like those in `Exchange` in the local constants class to be able to document it within the context of current component.
    * In case of common headers class for several endpoint, replace the scheme of each endpoint with a constant to facilitate usage of the element `applicableFor`
    
    * CAMEL-17792: Add doc about the message headers of camel-telegram
    * CAMEL-17792: Add doc about the message headers of camel-thrift
    * CAMEL-17792: Add doc about the message headers of camel-timer
    * CAMEL-17792: Add doc about the message headers of camel-twitter
    * CAMEL-17792: Add doc about the message headers of camel-undertow
    * CAMEL-17792: Add doc about the message headers of camel-velocity
    * CAMEL-17792: Add doc about the message headers of camel-vertx-http
    * CAMEL-17792: Add doc about the message headers of camel-vertx-kafka-component
    * CAMEL-17792: Add doc about the message headers of camel-vertx-websocket
    * CAMEL-17792: Add doc about the message headers of camel-weather
    * CAMEL-17792: Add doc about the message headers of camel-web3j
    * CAMEL-17792: Add doc about the message headers of camel-websocket
    * CAMEL-17792: Add doc about the message headers of camel-websocket-jsr356
    * CAMEL-17792: Add doc about the message headers of camel-workday
    * CAMEL-17792: Add doc about the message headers of camel-xchange
    * CAMEL-17792: Add doc about the message headers of camel-xmlsecurity
    * CAMEL-17792: Add doc about the message headers of camel-xmpp
    * CAMEL-17792: Add doc about the message headers of camel-zookeeper
    * CAMEL-17792: Add doc about the message headers of camel-xj
    * CAMEL-17792: Add doc about the message headers of camel-xslt
---
 .../apache/camel/component/telegram/telegram.json  |  8 +++
 .../src/main/docs/telegram-component.adoc          | 26 +-------
 .../component/telegram/TelegramConstants.java      | 28 +++++++--
 .../camel/component/telegram/TelegramEndpoint.java |  2 +-
 .../telegram/util/TelegramMessageHelper.java       |  4 +-
 .../org/apache/camel/component/thrift/thrift.json  |  3 +
 .../src/main/docs/thrift-component.adoc            | 14 +----
 .../camel/component/thrift/ThriftConstants.java    |  5 +-
 .../camel/component/thrift/ThriftEndpoint.java     |  2 +-
 .../org/apache/camel/component/timer/timer.json    |  4 ++
 .../camel-timer/src/main/docs/timer-component.adoc |  6 +-
 .../camel/component/timer/TimerConstants.java}     | 20 +++---
 .../camel/component/timer/TimerConsumer.java       |  4 +-
 .../camel/component/timer/TimerEndpoint.java       |  2 +-
 .../directmessage/twitter-directmessage.json       |  4 ++
 .../component/twitter/search/twitter-search.json   |  9 +++
 .../twitter/timeline/twitter-timeline.json         |  3 +
 .../main/docs/twitter-directmessage-component.adoc |  4 +-
 .../src/main/docs/twitter-search-component.adoc    |  4 +-
 .../src/main/docs/twitter-timeline-component.adoc  |  4 +-
 .../camel/component/twitter/TwitterConstants.java  | 25 ++++++++
 .../TwitterDirectMessageEndpoint.java              |  7 ++-
 .../twitter/search/TwitterSearchEndpoint.java      |  8 ++-
 .../twitter/timeline/TwitterTimelineEndpoint.java  |  6 +-
 .../apache/camel/component/undertow/undertow.json  | 17 +++++
 .../src/main/docs/undertow-component.adoc          |  4 +-
 .../undertow/DefaultUndertowHttpBinding.java       | 18 +++---
 .../component/undertow/UndertowConstants.java      | 41 ++++++++++++
 .../camel/component/undertow/UndertowConsumer.java |  4 +-
 .../camel/component/undertow/UndertowEndpoint.java |  2 +-
 .../camel/component/undertow/UndertowHelper.java   | 10 +--
 .../camel/component/undertow/UndertowProducer.java |  2 +-
 .../apache/camel/component/velocity/velocity.json  |  6 ++
 .../src/main/docs/velocity-component.adoc          | 22 ++-----
 .../component/velocity/VelocityConstants.java      | 14 ++++-
 .../camel/component/velocity/VelocityEndpoint.java |  2 +-
 .../camel/component/vertx/http/vertx-http.json     | 10 +++
 .../src/main/docs/vertx-http-component.adoc        | 31 +---------
 .../vertx/http/DefaultVertxHttpBinding.java        | 12 ++--
 .../component/vertx/http/VertxHttpConstants.java   | 32 ++++++++++
 .../component/vertx/http/VertxHttpEndpoint.java    |  3 +-
 .../component/vertx/http/VertxHttpHelper.java      | 10 +--
 .../camel/component/vertx/kafka/vertx-kafka.json   | 11 ++++
 .../src/main/docs/vertx-kafka-component.adoc       | 44 ++-----------
 .../component/vertx/kafka/VertxKafkaConstants.java | 24 ++++++++
 .../component/vertx/kafka/VertxKafkaEndpoint.java  |  2 +-
 .../component/vertx/websocket/vertx-websocket.json |  5 ++
 .../src/main/docs/vertx-websocket-component.adoc   | 20 ++----
 .../vertx/websocket/VertxWebsocketConstants.java   |  8 +++
 .../vertx/websocket/VertxWebsocketEndpoint.java    |  3 +-
 .../apache/camel/component/weather/weather.json    |  4 ++
 .../src/main/docs/weather-component.adoc           | 17 ++---
 .../camel/component/weather/WeatherConstants.java  |  6 ++
 .../camel/component/weather/WeatherEndpoint.java   |  2 +-
 .../org/apache/camel/component/web3j/web3j.json    | 39 ++++++++++++
 .../camel-web3j/src/main/docs/web3j-component.adoc | 13 ++--
 .../camel/component/web3j/Web3jConstants.java      | 72 ++++++++++++++++++++++
 .../camel/component/web3j/Web3jConsumer.java       |  4 +-
 .../camel/component/web3j/Web3jEndpoint.java       |  2 +-
 .../camel/websocket/jsr356/websocket-jsr356.json   |  4 ++
 .../src/main/docs/websocket-jsr356-component.adoc  |  5 +-
 .../camel/websocket/jsr356/JSR356Constants.java    |  4 ++
 .../camel/websocket/jsr356/JSR356Endpoint.java     |  2 +-
 .../camel/component/websocket/websocket.json       |  7 +++
 .../src/main/docs/websocket-component.adoc         | 36 +----------
 .../component/websocket/WebsocketConstants.java    | 28 +++++++++
 .../component/websocket/WebsocketEndpoint.java     |  3 +-
 .../apache/camel/component/workday/workday.json    |  3 +
 .../src/main/docs/workday-component.adoc           |  4 +-
 .../camel/component/workday/WorkdayEndpoint.java   |  3 +-
 .../workday/producer/WorkdayDefaultProducer.java   |  2 +
 .../apache/camel/component/xchange/xchange.json    |  4 ++
 .../src/main/docs/xchange-component.adoc           |  4 +-
 .../component/xchange/XChangeConfiguration.java    |  2 +
 .../camel/component/xchange/XChangeEndpoint.java   |  2 +-
 .../org/apache/camel/component/xj/xj.json          |  3 +
 .../camel-xj/src/main/docs/xj-component.adoc       |  4 +-
 .../component/xj/JsonFileResultHandlerFactory.java |  2 +-
 .../org/apache/camel/component/xj/XJConstants.java |  4 ++
 .../org/apache/camel/component/xj/XJEndpoint.java  |  2 +-
 .../component/xmlsecurity/xmlsecurity-sign.json    | 17 +++++
 .../component/xmlsecurity/xmlsecurity-verify.json  | 12 ++++
 .../src/main/docs/xmlsecurity-sign-component.adoc  | 27 +-------
 .../main/docs/xmlsecurity-verify-component.adoc    | 27 +-------
 .../component/xmlsecurity/XmlSignerEndpoint.java   |  8 ++-
 .../component/xmlsecurity/XmlVerifierEndpoint.java |  8 ++-
 .../api/DefaultXmlSignature2Message.java           |  3 +-
 .../xmlsecurity/api/XmlSignatureConstants.java     | 27 ++++++--
 .../xmlsecurity/processor/XmlSignerProcessor.java  |  2 +-
 .../org/apache/camel/component/xmpp/xmpp.json      |  3 +
 .../camel-xmpp/src/main/docs/xmpp-component.adoc   |  4 +-
 .../apache/camel/component/xmpp/XmppConstants.java |  3 +
 .../apache/camel/component/xmpp/XmppEndpoint.java  |  2 +-
 .../org/apache/camel/component/xslt/xslt.json      |  5 +-
 .../camel-xslt/src/main/docs/xslt-component.adoc   |  4 +-
 .../component/xslt/FileResultHandlerFactory.java   |  2 +-
 .../apache/camel/component/xslt/XsltBuilder.java   |  2 +-
 .../camel/component/xslt/XsltConstants.java}       | 18 +++---
 .../apache/camel/component/xslt/XsltEndpoint.java  |  4 +-
 .../camel/component/zookeeper/zookeeper.json       |  9 +++
 .../src/main/docs/zookeeper-component.adoc         |  4 +-
 .../component/zookeeper/ZooKeeperEndpoint.java     |  2 +-
 .../component/zookeeper/ZooKeeperMessage.java      | 14 +++--
 103 files changed, 692 insertions(+), 361 deletions(-)

diff --git a/components/camel-telegram/src/generated/resources/org/apache/camel/component/telegram/telegram.json b/components/camel-telegram/src/generated/resources/org/apache/camel/component/telegram/telegram.json
index c2e24d72b7d..ab289765a82 100644
--- a/components/camel-telegram/src/generated/resources/org/apache/camel/component/telegram/telegram.json
+++ b/components/camel-telegram/src/generated/resources/org/apache/camel/component/telegram/telegram.json
@@ -30,6 +30,14 @@
     "clientConfig": { "kind": "property", "displayName": "Client Config", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.asynchttpclient.AsyncHttpClientConfig", "deprecated": false, "autowired": false, "secret": false, "description": "To configure the AsyncHttpClient to use a custom com.ning.http.client.AsyncHttpClientConfig instance." },
     "authorizationToken": { "kind": "property", "displayName": "Authorization Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The default Telegram authorization token to be used when the information is not provided in the endpoints." }
   },
+  "headers": {
+    "CamelTelegramChatId": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Object", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "This header is used by the producer endpoint in order to resolve the chat id that will receive the message. The recipient chat id can be placed (in order of priority) in message body, in the CamelTelegramChatId header or in the endpoint configura [...]
+    "CamelTelegramMediaType": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "org.apache.camel.component.telegram.TelegramMediaType or String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "This header is used to identify the media type when the outgoing message is composed of pure binary data. Possible values are strings or enum values belonging to the org.apache.camel.component.tel [...]
+    "CamelTelegramMediaTitleCaption": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "This header is used to provide a caption or title for outgoing binary messages." },
+    "CamelTelegramMediaMarkup": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "org.apache.camel.component.telegram.model.ReplyMarkup", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The reply markup." },
+    "CamelTelegramParseMode": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "org.apache.camel.component.telegram.TelegramParseMode", "enum": [ "HTML", "MARKDOWN" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "This header is used to format text messages using HTML or Markdown" },
+    "CamelMessageTimestamp": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The message timestamp." }
+  },
   "properties": {
     "type": { "kind": "path", "displayName": "Type", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "enum": [ "bots" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.telegram.TelegramConfiguration", "configurationField": "configuration", "description": "The endpoint type. Currently, only the 'bots' type is supported." },
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
diff --git a/components/camel-telegram/src/main/docs/telegram-component.adoc b/components/camel-telegram/src/main/docs/telegram-component.adoc
index 3f942474d78..a7e5d3db9b6 100644
--- a/components/camel-telegram/src/main/docs/telegram-component.adoc
+++ b/components/camel-telegram/src/main/docs/telegram-component.adoc
@@ -64,29 +64,9 @@ include::partial$component-endpoint-options.adoc[]
 // endpoint options: START
 
 // endpoint options: END
-
-
-== Message Headers
-
-[width="100%",cols="20%,80%",options="header",]
-|=======================================================================
-|Name |Description
-|`CamelTelegramChatId` |This header is used by the producer endpoint in order to
-resolve the chat id that will receive the message. The recipient chat id can be
-placed (in order of priority) in message body, in the `CamelTelegramChatId` header
-or in the endpoint configuration (`chatId` option).
-This header is also present in all incoming messages.
-
-|`CamelTelegramMediaType` |This header is used to identify the media type when
-the outgoing message is composed of pure binary data. Possible values are strings or enum values
-belonging to the `org.apache.camel.component.telegram.TelegramMediaType` enumeration.
-
-|`CamelTelegramMediaTitleCaption` |This header is used to provide a caption or title
-for outgoing binary messages.
-
-|`CamelTelegramParseMode` |This header is used to format text messages using HTML or Markdown (see `org.apache.camel.component.telegram.TelegramParseMode`).
-
-|=======================================================================
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 == Usage
 
diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramConstants.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramConstants.java
index 2c6a6471e70..6861dbe4456 100644
--- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramConstants.java
+++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramConstants.java
@@ -16,20 +16,40 @@
  */
 package org.apache.camel.component.telegram;
 
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.Metadata;
+
 /**
  * Useful constants for the Telegram component.
  */
 public final class TelegramConstants {
 
+    @Metadata(label = "producer", description = "This header is used by the producer endpoint in order to\n" +
+                                                "resolve the chat id that will receive the message. The recipient chat id can be\n"
+                                                +
+                                                "placed (in order of priority) in message body, in the `CamelTelegramChatId` header\n"
+                                                +
+                                                "or in the endpoint configuration (`chatId` option).\n" +
+                                                "This header is also present in all incoming messages.",
+              javaType = "Object")
     public static final String TELEGRAM_CHAT_ID = "CamelTelegramChatId";
-
+    @Metadata(description = "This header is used to identify the media type when\n" +
+                            "the outgoing message is composed of pure binary data. Possible values are strings or enum values\n"
+                            +
+                            "belonging to the `org.apache.camel.component.telegram.TelegramMediaType` enumeration.",
+              javaType = "org.apache.camel.component.telegram.TelegramMediaType or String")
     public static final String TELEGRAM_MEDIA_TYPE = "CamelTelegramMediaType";
-
+    @Metadata(description = "This header is used to provide a caption or title\n" +
+                            "for outgoing binary messages.",
+              javaType = "String")
     public static final String TELEGRAM_MEDIA_TITLE_CAPTION = "CamelTelegramMediaTitleCaption";
-
+    @Metadata(description = "The reply markup.", javaType = "org.apache.camel.component.telegram.model.ReplyMarkup")
     public static final String TELEGRAM_MEDIA_MARKUP = "CamelTelegramMediaMarkup";
-
+    @Metadata(description = "This header is used to format text messages using HTML or Markdown",
+              javaType = "org.apache.camel.component.telegram.TelegramParseMode")
     public static final String TELEGRAM_PARSE_MODE = "CamelTelegramParseMode";
+    @Metadata(description = "The message timestamp.", javaType = "long")
+    public static final String MESSAGE_TIMESTAMP = Exchange.MESSAGE_TIMESTAMP;
 
     private TelegramConstants() {
     }
diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramEndpoint.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramEndpoint.java
index 535b20f0be0..3c049efe52b 100644
--- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramEndpoint.java
+++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/TelegramEndpoint.java
@@ -45,7 +45,7 @@ import org.slf4j.LoggerFactory;
  * Send and receive messages acting as a Telegram Bot <a href="https://core.telegram.org/bots/api">Telegram Bot API</a>.
  */
 @UriEndpoint(firstVersion = "2.18.0", scheme = "telegram", title = "Telegram", syntax = "telegram:type",
-             category = { Category.CLOUD, Category.API, Category.CHAT })
+             category = { Category.CLOUD, Category.API, Category.CHAT }, headersClass = TelegramConstants.class)
 public class TelegramEndpoint extends ScheduledPollEndpoint implements WebhookCapableEndpoint {
     private static final Logger LOG = LoggerFactory.getLogger(TelegramEndpoint.class);
 
diff --git a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/util/TelegramMessageHelper.java b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/util/TelegramMessageHelper.java
index a3066face74..7e72a7b81dd 100644
--- a/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/util/TelegramMessageHelper.java
+++ b/components/camel-telegram/src/main/java/org/apache/camel/component/telegram/util/TelegramMessageHelper.java
@@ -34,7 +34,7 @@ public final class TelegramMessageHelper {
             }
             if (update.getMessage().getDate() != null) {
                 // convert seconds to millis
-                exchange.getMessage().setHeader(Exchange.MESSAGE_TIMESTAMP,
+                exchange.getMessage().setHeader(TelegramConstants.MESSAGE_TIMESTAMP,
                         update.getMessage().getDate().getEpochSecond() * 1000);
             }
         } else if (update.getChannelPost() != null) {
@@ -45,7 +45,7 @@ public final class TelegramMessageHelper {
             }
             if (update.getChannelPost().getDate() != null) {
                 // convert seconds to millis
-                exchange.getMessage().setHeader(Exchange.MESSAGE_TIMESTAMP,
+                exchange.getMessage().setHeader(TelegramConstants.MESSAGE_TIMESTAMP,
                         update.getChannelPost().getDate().getEpochSecond() * 1000);
             }
         } else if (update.getCallbackQuery() != null) {
diff --git a/components/camel-thrift/src/generated/resources/org/apache/camel/component/thrift/thrift.json b/components/camel-thrift/src/generated/resources/org/apache/camel/component/thrift/thrift.json
index de2669d2bf1..8037f2bca62 100644
--- a/components/camel-thrift/src/generated/resources/org/apache/camel/component/thrift/thrift.json
+++ b/components/camel-thrift/src/generated/resources/org/apache/camel/component/thrift/thrift.json
@@ -27,6 +27,9 @@
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
     "useGlobalSslContextParameters": { "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Determine if the thrift component is using global SSL context parameters" }
   },
+  "headers": {
+    "CamelThriftMethodName": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Method name handled by the consumer service" }
+  },
   "properties": {
     "host": { "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.thrift.ThriftConfiguration", "configurationField": "configuration", "description": "The Thrift server host name. This is localhost or 0.0.0.0 (if not defined) when being a consumer or remote server host name when using producer." },
     "port": { "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": true, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.thrift.ThriftConfiguration", "configurationField": "configuration", "description": "The Thrift server port" },
diff --git a/components/camel-thrift/src/main/docs/thrift-component.adoc b/components/camel-thrift/src/main/docs/thrift-component.adoc
index 16835098636..a1835c1b45e 100644
--- a/components/camel-thrift/src/main/docs/thrift-component.adoc
+++ b/components/camel-thrift/src/main/docs/thrift-component.adoc
@@ -50,6 +50,9 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 == Thrift method parameters mapping
 
@@ -78,17 +81,6 @@ Object responseBody = template.requestBody("direct:thrift-alltypes", requestBody
 
 Incoming parameters in the service consumer will also be passed to the message body as a list of objects.
 
-
-== Thrift consumer headers (will be installed after the consumer invocation)
-
-[width="100%",cols="25%,50,25%",options="header",]
-|=======================================================================
-|Header name |Description|Possible values
-
-|*CamelThriftMethodName*|Method name handled by the consumer service|
-
-|=======================================================================
-
 == Examples
 
 Below is a simple synchronous method invoke with host and port parameters
diff --git a/components/camel-thrift/src/main/java/org/apache/camel/component/thrift/ThriftConstants.java b/components/camel-thrift/src/main/java/org/apache/camel/component/thrift/ThriftConstants.java
index 2a0bbc8aa1b..4d7a9d62080 100644
--- a/components/camel-thrift/src/main/java/org/apache/camel/component/thrift/ThriftConstants.java
+++ b/components/camel-thrift/src/main/java/org/apache/camel/component/thrift/ThriftConstants.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.thrift;
 
+import org.apache.camel.spi.Metadata;
+
 /**
  * Thrift component constants
  */
@@ -36,7 +38,8 @@ public interface ThriftConstants {
     int THRIFT_CONSUMER_POOL_SIZE = 1;
     int THRIFT_CONSUMER_MAX_POOL_SIZE = 10;
     /*
-     * This headers will be set after Thrift consumer method is invoked
+     * This header will be set after Thrift consumer method is invoked
      */
+    @Metadata(label = "consumer", description = "Method name handled by the consumer service", javaType = "String")
     String THRIFT_METHOD_NAME_HEADER = "CamelThriftMethodName";
 }
diff --git a/components/camel-thrift/src/main/java/org/apache/camel/component/thrift/ThriftEndpoint.java b/components/camel-thrift/src/main/java/org/apache/camel/component/thrift/ThriftEndpoint.java
index 330273945e6..a0d23f35b98 100644
--- a/components/camel-thrift/src/main/java/org/apache/camel/component/thrift/ThriftEndpoint.java
+++ b/components/camel-thrift/src/main/java/org/apache/camel/component/thrift/ThriftEndpoint.java
@@ -29,7 +29,7 @@ import org.apache.camel.support.SynchronousDelegateProducer;
  * Call and expose remote procedures (RPC) with Apache Thrift data format and serialization mechanism.
  */
 @UriEndpoint(firstVersion = "2.20.0", scheme = "thrift", title = "Thrift", syntax = "thrift:host:port/service",
-             category = { Category.RPC, Category.TRANSFORMATION })
+             category = { Category.RPC, Category.TRANSFORMATION }, headersClass = ThriftConstants.class)
 public class ThriftEndpoint extends DefaultEndpoint {
     @UriParam
     private ThriftConfiguration configuration;
diff --git a/components/camel-timer/src/generated/resources/org/apache/camel/component/timer/timer.json b/components/camel-timer/src/generated/resources/org/apache/camel/component/timer/timer.json
index 0979f5d03cc..e8f3c630442 100644
--- a/components/camel-timer/src/generated/resources/org/apache/camel/component/timer/timer.json
+++ b/components/camel-timer/src/generated/resources/org/apache/camel/component/timer/timer.json
@@ -25,6 +25,10 @@
     "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a me [...]
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
   },
+  "headers": {
+    "firedTime": { "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "Date", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The fired time" },
+    "CamelMessageTimestamp": { "kind": "header", "displayName": "", "group": "consumer", "label": "", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The timestamp of the message" }
+  },
   "properties": {
     "timerName": { "kind": "path", "displayName": "Timer Name", "group": "consumer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the timer" },
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
diff --git a/components/camel-timer/src/main/docs/timer-component.adoc b/components/camel-timer/src/main/docs/timer-component.adoc
index 458406340be..b163789c8f1 100644
--- a/components/camel-timer/src/main/docs/timer-component.adoc
+++ b/components/camel-timer/src/main/docs/timer-component.adoc
@@ -38,8 +38,6 @@ See also the xref:quartz-component.adoc[Quartz] component that supports much mor
 advanced scheduling.
 ====
 
-
-
 // component-configure options: START
 
 // component-configure options: END
@@ -52,7 +50,9 @@ include::partial$component-endpoint-options.adoc[]
 // endpoint options: START
 
 // endpoint options: END
-
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 == Exchange Properties
 
diff --git a/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConstants.java b/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerConstants.java
similarity index 63%
copy from components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConstants.java
copy to components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerConstants.java
index 70f391ca569..92e81026ec0 100644
--- a/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConstants.java
+++ b/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerConstants.java
@@ -14,17 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.weather;
+package org.apache.camel.component.timer;
 
-/**
- * The Weather constants
- */
-public final class WeatherConstants {
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.Metadata;
 
-    public static final String WEATHER_LOCATION = "CamelWeatherLocation";
-    public static final String WEATHER_QUERY = "CamelWeatherQuery";
+public final class TimerConstants {
 
-    private WeatherConstants() {
-    }
+    @Metadata(description = "The fired time", javaType = "Date")
+    public static final String HEADER_FIRED_TIME = "firedTime";
+    @Metadata(description = "The timestamp of the message", javaType = "long")
+    public static final String HEADER_MESSAGE_TIMESTAMP = Exchange.MESSAGE_TIMESTAMP;
 
+    private TimerConstants() {
+
+    }
 }
diff --git a/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerConsumer.java b/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerConsumer.java
index 815103a7bb6..4576fd23896 100644
--- a/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerConsumer.java
+++ b/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerConsumer.java
@@ -196,8 +196,8 @@ public class TimerConsumer extends DefaultConsumer implements StartupListener, S
             Date now = new Date();
             exchange.setProperty(Exchange.TIMER_FIRED_TIME, now);
             // also set now on in header with same key as quartz to be consistent
-            exchange.getIn().setHeader("firedTime", now);
-            exchange.getIn().setHeader(Exchange.MESSAGE_TIMESTAMP, now.getTime());
+            exchange.getIn().setHeader(TimerConstants.HEADER_FIRED_TIME, now);
+            exchange.getIn().setHeader(TimerConstants.HEADER_MESSAGE_TIMESTAMP, now.getTime());
         }
 
         if (LOG.isTraceEnabled()) {
diff --git a/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerEndpoint.java b/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerEndpoint.java
index b54346c960a..23415099603 100644
--- a/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerEndpoint.java
+++ b/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerEndpoint.java
@@ -41,7 +41,7 @@ import org.apache.camel.support.DefaultEndpoint;
  */
 @ManagedResource(description = "Managed TimerEndpoint")
 @UriEndpoint(firstVersion = "1.0.0", scheme = "timer", title = "Timer", syntax = "timer:timerName", consumerOnly = true,
-             category = { Category.CORE, Category.SCHEDULING })
+             category = { Category.CORE, Category.SCHEDULING }, headersClass = TimerConstants.class)
 public class TimerEndpoint extends DefaultEndpoint implements MultipleConsumersSupport {
     @UriPath
     @Metadata(required = true)
diff --git a/components/camel-twitter/src/generated/resources/org/apache/camel/component/twitter/directmessage/twitter-directmessage.json b/components/camel-twitter/src/generated/resources/org/apache/camel/component/twitter/directmessage/twitter-directmessage.json
index a8810fb1769..2ffe4ede779 100644
--- a/components/camel-twitter/src/generated/resources/org/apache/camel/component/twitter/directmessage/twitter-directmessage.json
+++ b/components/camel-twitter/src/generated/resources/org/apache/camel/component/twitter/directmessage/twitter-directmessage.json
@@ -35,6 +35,10 @@
     "consumerKey": { "kind": "property", "displayName": "Consumer Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The consumer key" },
     "consumerSecret": { "kind": "property", "displayName": "Consumer Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The consumer secret" }
   },
+  "headers": {
+    "CamelTwitterUser": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The user" },
+    "CamelTwitterEventType": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The type of event. The supported values are the values of the enum org.apache.camel.component.twitter.consumer.TwitterEventType" }
+  },
   "properties": {
     "user": { "kind": "path", "displayName": "User", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The user name to send a direct message. This will be ignored for consumer." },
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
diff --git a/components/camel-twitter/src/generated/resources/org/apache/camel/component/twitter/search/twitter-search.json b/components/camel-twitter/src/generated/resources/org/apache/camel/component/twitter/search/twitter-search.json
index a53d3268905..de7de1d79c3 100644
--- a/components/camel-twitter/src/generated/resources/org/apache/camel/component/twitter/search/twitter-search.json
+++ b/components/camel-twitter/src/generated/resources/org/apache/camel/component/twitter/search/twitter-search.json
@@ -35,6 +35,15 @@
     "consumerKey": { "kind": "property", "displayName": "Consumer Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The consumer key" },
     "consumerSecret": { "kind": "property", "displayName": "Consumer Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The consumer secret" }
   },
+  "headers": {
+    "CamelTwitterKeywords": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The keywords to search" },
+    "CamelTwitterSearchLanguage": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The lang string ISO_639-1 which will be used for searching" },
+    "CamelTwitterCount": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Limiting number of results per page." },
+    "CamelTwitterNumberOfPages": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The number of pages result which you want camel-twitter to consume." },
+    "CamelTwitterSinceId": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The last tweet id which will be used for pulling the tweets. It is useful when the camel route is restarted after a long-running." },
+    "CamelTwitterMaxId": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "If specified, returns tweets with status ids less than the given id." },
+    "CamelTwitterEventType": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The type of event. The supported values are the values of the enum org.apache.camel.component.twitter.consumer.TwitterEventType" }
+  },
   "properties": {
     "keywords": { "kind": "path", "displayName": "Keywords", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The search query, use the keywords AND, OR, - and () to narrow the search results." },
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
diff --git a/components/camel-twitter/src/generated/resources/org/apache/camel/component/twitter/timeline/twitter-timeline.json b/components/camel-twitter/src/generated/resources/org/apache/camel/component/twitter/timeline/twitter-timeline.json
index 554a239c3a8..916bfff1eaf 100644
--- a/components/camel-twitter/src/generated/resources/org/apache/camel/component/twitter/timeline/twitter-timeline.json
+++ b/components/camel-twitter/src/generated/resources/org/apache/camel/component/twitter/timeline/twitter-timeline.json
@@ -35,6 +35,9 @@
     "consumerKey": { "kind": "property", "displayName": "Consumer Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The consumer key" },
     "consumerSecret": { "kind": "property", "displayName": "Consumer Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The consumer secret" }
   },
+  "headers": {
+    "CamelTwitterEventType": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The type of event. The supported values are the values of the enum org.apache.camel.component.twitter.consumer.TwitterEventType" }
+  },
   "properties": {
     "timelineType": { "kind": "path", "displayName": "Timeline Type", "group": "common", "label": "", "required": true, "type": "object", "javaType": "org.apache.camel.component.twitter.data.TimelineType", "enum": [ "PUBLIC", "HOME", "USER", "MENTIONS", "RETWEETSOFME", "LIST", "UNKNOWN" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The timeline type to produce\/consume." },
     "list": { "kind": "parameter", "displayName": "List", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The list name when using timelineType=list" },
diff --git a/components/camel-twitter/src/main/docs/twitter-directmessage-component.adoc b/components/camel-twitter/src/main/docs/twitter-directmessage-component.adoc
index db33c431e1d..a5c8d1694c2 100644
--- a/components/camel-twitter/src/main/docs/twitter-directmessage-component.adoc
+++ b/components/camel-twitter/src/main/docs/twitter-directmessage-component.adoc
@@ -35,7 +35,9 @@ include::partial$component-endpoint-options.adoc[]
 // endpoint options: START
 
 // endpoint options: END
-
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 
 
diff --git a/components/camel-twitter/src/main/docs/twitter-search-component.adoc b/components/camel-twitter/src/main/docs/twitter-search-component.adoc
index 36083192a5c..aafadff14b5 100644
--- a/components/camel-twitter/src/main/docs/twitter-search-component.adoc
+++ b/components/camel-twitter/src/main/docs/twitter-search-component.adoc
@@ -27,7 +27,9 @@ include::partial$component-endpoint-options.adoc[]
 // endpoint options: START
 
 // endpoint options: END
-
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 
 
diff --git a/components/camel-twitter/src/main/docs/twitter-timeline-component.adoc b/components/camel-twitter/src/main/docs/twitter-timeline-component.adoc
index 3500bc7e567..9d2bfee6e3f 100644
--- a/components/camel-twitter/src/main/docs/twitter-timeline-component.adoc
+++ b/components/camel-twitter/src/main/docs/twitter-timeline-component.adoc
@@ -28,7 +28,9 @@ include::partial$component-endpoint-options.adoc[]
 // endpoint options: START
 
 // endpoint options: END
-
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 
 include::spring-boot:partial$starter.adoc[]
diff --git a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/TwitterConstants.java b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/TwitterConstants.java
index 3f06b2683da..0c7ca2cd1bd 100644
--- a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/TwitterConstants.java
+++ b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/TwitterConstants.java
@@ -16,17 +16,42 @@
  */
 package org.apache.camel.component.twitter;
 
+import org.apache.camel.spi.Metadata;
+
 /**
  * Defines common constants
  */
 public interface TwitterConstants {
+
+    // The schemes
+    String SCHEME_TIMELINE = "twitter-timeline";
+    String SCHEME_SEARCH = "twitter-search";
+    String SCHEME_DIRECT_MESSAGE = "twitter-directmessage";
+
+    @Metadata(description = "The keywords to search", javaType = "String", applicableFor = SCHEME_SEARCH)
     String TWITTER_KEYWORDS = "CamelTwitterKeywords";
+    @Metadata(description = "The lang string ISO_639-1 which will be used for searching", javaType = "String",
+              applicableFor = SCHEME_SEARCH)
     String TWITTER_SEARCH_LANGUAGE = "CamelTwitterSearchLanguage";
+    @Metadata(description = "Limiting number of results per page.", javaType = "Integer", applicableFor = SCHEME_SEARCH)
     String TWITTER_COUNT = "CamelTwitterCount";
+    @Metadata(description = "The number of pages result which you want camel-twitter to consume.", javaType = "Integer",
+              applicableFor = SCHEME_SEARCH)
     String TWITTER_NUMBER_OF_PAGES = "CamelTwitterNumberOfPages";
+    /**
+     * The last tweet id which will be used for pulling the tweets. It is useful when the camel route is restarted after
+     * a long-running.
+     */
+    @Metadata(javaType = "Long", applicableFor = SCHEME_SEARCH)
     String TWITTER_SINCEID = "CamelTwitterSinceId";
+    @Metadata(description = "If specified, returns tweets with status ids less than the given id.", javaType = "Long",
+              applicableFor = SCHEME_SEARCH)
     String TWITTER_MAXID = "CamelTwitterMaxId";
+    @Metadata(description = "The user", javaType = "String", applicableFor = SCHEME_DIRECT_MESSAGE)
     String TWITTER_USER = "CamelTwitterUser";
     String TWITTER_USER_ROLE = "CamelTwitterUserRole";
+    @Metadata(description = "The type of event. The supported values are the values of the enum " +
+                            "org.apache.camel.component.twitter.consumer.TwitterEventType",
+              javaType = "String")
     String TWITTER_EVENT_TYPE = "CamelTwitterEventType";
 }
diff --git a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/directmessage/TwitterDirectMessageEndpoint.java b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/directmessage/TwitterDirectMessageEndpoint.java
index ac8bdb24a9e..ddb382f77c9 100644
--- a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/directmessage/TwitterDirectMessageEndpoint.java
+++ b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/directmessage/TwitterDirectMessageEndpoint.java
@@ -22,17 +22,20 @@ import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.twitter.AbstractTwitterEndpoint;
 import org.apache.camel.component.twitter.TwitterConfiguration;
+import org.apache.camel.component.twitter.TwitterConstants;
 import org.apache.camel.component.twitter.TwitterHelper;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriPath;
 
+import static org.apache.camel.component.twitter.TwitterConstants.SCHEME_DIRECT_MESSAGE;
+
 /**
  * Send and receive Twitter direct messages.
  */
-@UriEndpoint(firstVersion = "2.10.0", scheme = "twitter-directmessage", title = "Twitter Direct Message",
+@UriEndpoint(firstVersion = "2.10.0", scheme = SCHEME_DIRECT_MESSAGE, title = "Twitter Direct Message",
              syntax = "twitter-directmessage:user",
-             category = { Category.CLOUD, Category.API, Category.SOCIAL, Category.CHAT })
+             category = { Category.CLOUD, Category.API, Category.SOCIAL, Category.CHAT }, headersClass = TwitterConstants.class)
 public class TwitterDirectMessageEndpoint extends AbstractTwitterEndpoint {
 
     @UriPath(description = "The user name to send a direct message. This will be ignored for consumer.")
diff --git a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/search/TwitterSearchEndpoint.java b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/search/TwitterSearchEndpoint.java
index a438c94ad57..42b2883c420 100644
--- a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/search/TwitterSearchEndpoint.java
+++ b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/search/TwitterSearchEndpoint.java
@@ -22,16 +22,20 @@ import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.twitter.AbstractTwitterEndpoint;
 import org.apache.camel.component.twitter.TwitterConfiguration;
+import org.apache.camel.component.twitter.TwitterConstants;
 import org.apache.camel.component.twitter.TwitterHelper;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriPath;
 
+import static org.apache.camel.component.twitter.TwitterConstants.SCHEME_SEARCH;
+
 /**
  * Access Twitter Search.
  */
-@UriEndpoint(firstVersion = "2.10.0", scheme = "twitter-search", title = "Twitter Search", syntax = "twitter-search:keywords",
-             category = { Category.CLOUD, Category.API, Category.SEARCH, Category.SOCIAL })
+@UriEndpoint(firstVersion = "2.10.0", scheme = SCHEME_SEARCH, title = "Twitter Search", syntax = "twitter-search:keywords",
+             category = { Category.CLOUD, Category.API, Category.SEARCH, Category.SOCIAL },
+             headersClass = TwitterConstants.class)
 public class TwitterSearchEndpoint extends AbstractTwitterEndpoint {
 
     @UriPath(description = "The search query, use the keywords AND, OR, - and () to narrow the search results.")
diff --git a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/timeline/TwitterTimelineEndpoint.java b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/timeline/TwitterTimelineEndpoint.java
index ac59f21253f..0b19032b80e 100644
--- a/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/timeline/TwitterTimelineEndpoint.java
+++ b/components/camel-twitter/src/main/java/org/apache/camel/component/twitter/timeline/TwitterTimelineEndpoint.java
@@ -22,6 +22,7 @@ import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.twitter.AbstractTwitterEndpoint;
 import org.apache.camel.component.twitter.TwitterConfiguration;
+import org.apache.camel.component.twitter.TwitterConstants;
 import org.apache.camel.component.twitter.TwitterHelper;
 import org.apache.camel.component.twitter.consumer.AbstractTwitterConsumerHandler;
 import org.apache.camel.component.twitter.data.TimelineType;
@@ -30,14 +31,15 @@ import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
 
+import static org.apache.camel.component.twitter.TwitterConstants.SCHEME_TIMELINE;
 import static org.apache.camel.component.twitter.data.TimelineType.USER;
 
 /**
  * Send tweets and receive tweets from user's timeline.
  */
-@UriEndpoint(firstVersion = "2.10.0", scheme = "twitter-timeline", title = "Twitter Timeline",
+@UriEndpoint(firstVersion = "2.10.0", scheme = SCHEME_TIMELINE, title = "Twitter Timeline",
              syntax = "twitter-timeline:timelineType",
-             category = { Category.API, Category.CLOUD, Category.SOCIAL })
+             category = { Category.API, Category.CLOUD, Category.SOCIAL }, headersClass = TwitterConstants.class)
 public class TwitterTimelineEndpoint extends AbstractTwitterEndpoint {
 
     @UriPath(description = "The timeline type to produce/consume.")
diff --git a/components/camel-undertow/src/generated/resources/org/apache/camel/component/undertow/undertow.json b/components/camel-undertow/src/generated/resources/org/apache/camel/component/undertow/undertow.json
index 845f6159601..c0e9d0c608b 100644
--- a/components/camel-undertow/src/generated/resources/org/apache/camel/component/undertow/undertow.json
+++ b/components/camel-undertow/src/generated/resources/org/apache/camel/component/undertow/undertow.json
@@ -35,6 +35,23 @@
     "sslContextParameters": { "kind": "property", "displayName": "Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "autowired": false, "secret": false, "description": "To configure security using SSLContextParameters" },
     "useGlobalSslContextParameters": { "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable usage of global SSL context parameters." }
   },
+  "headers": {
+    "websocket.connectionKey": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "An identifier of WebSocketChannel through which the message was received or should be sent." },
+    "websocket.connectionKey.list": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "List<String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The list of websocket connection keys" },
+    "websocket.sendToAll": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "To send to all websocket subscribers. Can be used to configure on endpoint level, instead of having to use the UndertowConstants.SEND_TO_ALL header on the message." },
+    "websocket.eventType": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The numeric identifier of the type of websocket event" },
+    "websocket.eventTypeEnum": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "org.apache.camel.component.undertow.UndertowConstants.EventType", "enum": [ "ONOPEN", "ONCLOSE", "ONERROR" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The type of websocket event" },
+    "websocket.channel": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "io.undertow.websockets.core.WebSocketChannel", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The WebSocketChannel through which the message was received" },
+    "websocket.exchange": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "io.undertow.websockets.spi.WebSocketHttpExchange", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The exchange for the websocket transport, only available for ON_OPEN events" },
+    "CamelHttpResponseCode": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The http response code" },
+    "Content-Type": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The content type" },
+    "CamelHttpCharacterEncoding": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The http character encoding" },
+    "CamelHttpPath": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The http path" },
+    "CamelHttpQuery": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The http query" },
+    "CamelHttpUri": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The http URI" },
+    "CamelHttpMethod": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The http method" },
+    "Host": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The host http header" }
+  },
   "properties": {
     "httpURI": { "kind": "path", "displayName": "Http URI", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.net.URI", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The url of the HTTP endpoint to use." },
     "useStreaming": { "kind": "parameter", "displayName": "Use Streaming", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "For HTTP endpoint: if true, text and binary messages will be wrapped as java.io.InputStream before they are passed to an Exchange; otherwise they will be passed as byte. For WebSocket endpoint: if true, text and binary me [...]
diff --git a/components/camel-undertow/src/main/docs/undertow-component.adoc b/components/camel-undertow/src/main/docs/undertow-component.adoc
index 52347352063..db78238dbd3 100644
--- a/components/camel-undertow/src/main/docs/undertow-component.adoc
+++ b/components/camel-undertow/src/main/docs/undertow-component.adoc
@@ -60,7 +60,9 @@ include::partial$component-endpoint-options.adoc[]
 // endpoint options: START
 
 // endpoint options: END
-
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 == Message Headers
 
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
index 3cfe0acc044..193ad6849c7 100644
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
@@ -208,7 +208,7 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding {
                 path = path.substring(endpointPath.length());
             }
         }
-        headersMap.put(Exchange.HTTP_PATH, path);
+        headersMap.put(UndertowConstants.HTTP_PATH, path);
 
         if (LOG.isTraceEnabled()) {
             LOG.trace("HTTP-Method {}", httpExchange.getRequestMethod());
@@ -280,12 +280,12 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding {
         }
 
         // NOTE: these headers is applied using the same logic as camel-http/camel-jetty to be consistent
-        headersMap.put(Exchange.HTTP_METHOD, httpExchange.getRequestMethod().toString());
+        headersMap.put(UndertowConstants.HTTP_METHOD, httpExchange.getRequestMethod().toString());
         // strip query parameters from the uri
         headersMap.put(Exchange.HTTP_URL, httpExchange.getRequestURL());
         // uri is without the host and port
-        headersMap.put(Exchange.HTTP_URI, httpExchange.getRequestURI());
-        headersMap.put(Exchange.HTTP_QUERY, httpExchange.getQueryString());
+        headersMap.put(UndertowConstants.HTTP_URI, httpExchange.getRequestURI());
+        headersMap.put(UndertowConstants.HTTP_QUERY, httpExchange.getQueryString());
         headersMap.put(Exchange.HTTP_RAW_QUERY, httpExchange.getQueryString());
     }
 
@@ -293,7 +293,7 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding {
     public void populateCamelHeaders(ClientResponse response, Map<String, Object> headersMap, Exchange exchange) {
         LOG.trace("populateCamelHeaders: {}", exchange.getMessage().getHeaders());
 
-        headersMap.put(Exchange.HTTP_RESPONSE_CODE, response.getResponseCode());
+        headersMap.put(UndertowConstants.HTTP_RESPONSE_CODE, response.getResponseCode());
 
         for (HttpString name : response.getResponseHeaders().getHeaderNames()) {
             // mapping the content-type
@@ -331,7 +331,7 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding {
         Exception exception = camelExchange.getException();
 
         int code = determineResponseCode(camelExchange, body);
-        message.getHeaders().put(Exchange.HTTP_RESPONSE_CODE, code);
+        message.getHeaders().put(UndertowConstants.HTTP_RESPONSE_CODE, code);
         httpExchange.setStatusCode(code);
 
         //copy headers from Message to Response
@@ -363,7 +363,7 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding {
                 // the body should be the serialized java object of the exception
                 body = ByteBuffer.wrap(bos.toByteArray());
                 // force content type to be serialized java object
-                message.setHeader(Exchange.CONTENT_TYPE, "application/x-java-serialized-object");
+                message.setHeader(UndertowConstants.CONTENT_TYPE, "application/x-java-serialized-object");
             } else {
                 // we failed due an exception so print it as plain text
                 StringWriter sw = new StringWriter();
@@ -373,7 +373,7 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding {
                 // the body should then be the stacktrace
                 body = ByteBuffer.wrap(sw.toString().getBytes());
                 // force content type to be text/plain as that is what the stacktrace is
-                message.setHeader(Exchange.CONTENT_TYPE, "text/plain");
+                message.setHeader(UndertowConstants.CONTENT_TYPE, "text/plain");
             }
 
             // and mark the exception as failure handled, as we handled it by returning it as the response
@@ -401,7 +401,7 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding {
         int defaultCode = failed ? 500 : 200;
 
         Message message = camelExchange.getMessage();
-        Integer currentCode = message.getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class);
+        Integer currentCode = message.getHeader(UndertowConstants.HTTP_RESPONSE_CODE, Integer.class);
         int codeToUse = currentCode == null ? defaultCode : currentCode;
 
         if (codeToUse != 500) {
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowConstants.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowConstants.java
index 300066050aa..fc9f76c956b 100644
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowConstants.java
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowConstants.java
@@ -16,16 +16,57 @@
  */
 package org.apache.camel.component.undertow;
 
+import io.undertow.util.Headers;
+import io.undertow.websockets.core.WebSocketChannel;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.Metadata;
+
 public final class UndertowConstants {
 
+    /**
+     * An identifier of {@link WebSocketChannel} through which the {@code message} was received or should be sent.
+     */
+    @Metadata(javaType = "String")
     public static final String CONNECTION_KEY = "websocket.connectionKey";
+    @Metadata(label = "producer", description = "The list of websocket connection keys", javaType = "List<String>")
     public static final String CONNECTION_KEY_LIST = "websocket.connectionKey.list";
+    /**
+     * To send to all websocket subscribers. Can be used to configure on endpoint level, instead of having to use the
+     * {@code UndertowConstants.SEND_TO_ALL} header on the message.
+     */
+    @Metadata(javaType = "Boolean")
     public static final String SEND_TO_ALL = "websocket.sendToAll";
+    @Metadata(label = "consumer", description = "The numeric identifier of the type of websocket event", javaType = "Integer")
     public static final String EVENT_TYPE = "websocket.eventType";
+    @Metadata(label = "consumer", description = "The type of websocket event",
+              javaType = "org.apache.camel.component.undertow.UndertowConstants.EventType")
     public static final String EVENT_TYPE_ENUM = "websocket.eventTypeEnum";
+    /**
+     * The {@link WebSocketChannel} through which the {@code message} was received
+     */
+    @Metadata(label = "consumer", javaType = "io.undertow.websockets.core.WebSocketChannel")
     public static final String CHANNEL = "websocket.channel";
+    @Metadata(label = "consumer", description = "The exchange for the websocket transport, only available for ON_OPEN events",
+              javaType = "io.undertow.websockets.spi.WebSocketHttpExchange")
     public static final String EXCHANGE = "websocket.exchange";
 
+    @Metadata(description = "The http response code", javaType = "Integer")
+    public static final String HTTP_RESPONSE_CODE = Exchange.HTTP_RESPONSE_CODE;
+    @Metadata(description = "The content type", javaType = "String")
+    public static final String CONTENT_TYPE = Exchange.CONTENT_TYPE;
+    @Metadata(label = "consumer", description = "The http character encoding", javaType = "String")
+    public static final String HTTP_CHARACTER_ENCODING = Exchange.HTTP_CHARACTER_ENCODING;
+    @Metadata(description = "The http path", javaType = "String")
+    public static final String HTTP_PATH = Exchange.HTTP_PATH;
+    @Metadata(description = "The http query", javaType = "String")
+    public static final String HTTP_QUERY = Exchange.HTTP_QUERY;
+    @Metadata(description = "The http URI", javaType = "String")
+    public static final String HTTP_URI = Exchange.HTTP_URI;
+    @Metadata(label = "producer", description = "The http method", javaType = "String")
+    public static final String HTTP_METHOD = Exchange.HTTP_METHOD;
+    @Metadata(label = "producer", description = "The host http header", javaType = "String")
+    public static final String HOST_STRING = Headers.HOST_STRING;
+
     /**
      * WebSocket peers related events the {@link UndertowConsumer} sends to the Camel route.
      */
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowConsumer.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowConsumer.java
index 87a82432aa4..d3041cb5783 100644
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowConsumer.java
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowConsumer.java
@@ -251,7 +251,7 @@ public class UndertowConsumer extends DefaultConsumer implements HttpHandler, Su
         if (body == null) {
             LOG.trace("No payload to send as reply for exchange: {}", camelExchange);
             // respect Content-Type assigned from HttpBinding if any
-            String contentType = camelExchange.getIn().getHeader(Exchange.CONTENT_TYPE,
+            String contentType = camelExchange.getIn().getHeader(UndertowConstants.CONTENT_TYPE,
                     MimeMappings.DEFAULT_MIME_MAPPINGS.get("txt"), String.class);
             httpExchange.getResponseHeaders().put(ExchangeHeaders.CONTENT_TYPE, contentType);
             httpExchange.getResponseSender().send(""); // empty body
@@ -355,7 +355,7 @@ public class UndertowConsumer extends DefaultConsumer implements HttpHandler, Su
         }
 
         exchange.setProperty(ExchangePropertyKey.CHARSET_NAME, httpExchange.getRequestCharset());
-        in.setHeader(Exchange.HTTP_CHARACTER_ENCODING, httpExchange.getRequestCharset());
+        in.setHeader(UndertowConstants.HTTP_CHARACTER_ENCODING, httpExchange.getRequestCharset());
 
         exchange.setIn(in);
         return exchange;
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowEndpoint.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowEndpoint.java
index acd15e357c3..bdd70e83b39 100644
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowEndpoint.java
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowEndpoint.java
@@ -59,7 +59,7 @@ import org.xnio.Options;
  * Expose HTTP and WebSocket endpoints and access external HTTP/WebSocket servers.
  */
 @UriEndpoint(firstVersion = "2.16.0", scheme = "undertow", title = "Undertow", syntax = "undertow:httpURI",
-             category = { Category.HTTP, Category.WEBSOCKET }, lenientProperties = true)
+             category = { Category.HTTP, Category.WEBSOCKET }, lenientProperties = true, headersClass = UndertowConstants.class)
 public class UndertowEndpoint extends DefaultEndpoint implements AsyncEndpoint, HeaderFilterStrategyAware, DiscoverableService {
 
     private static final Logger LOG = LoggerFactory.getLogger(UndertowEndpoint.class);
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java
index 45fbbfc0548..c07e41d87ca 100644
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java
@@ -60,7 +60,7 @@ public final class UndertowHelper {
         }
 
         // append HTTP_PATH to HTTP_URI if it is provided in the header
-        String path = exchange.getIn().getHeader(Exchange.HTTP_PATH, String.class);
+        String path = exchange.getIn().getHeader(UndertowConstants.HTTP_PATH, String.class);
         // NOW the HTTP_PATH is just related path, we don't need to trim it
         if (path != null) {
             if (path.startsWith("/")) {
@@ -96,7 +96,7 @@ public final class UndertowHelper {
         String queryString = (String) exchange.getIn().removeHeader(Exchange.REST_HTTP_QUERY);
         // is a query string provided in the endpoint URI or in a header (header overrules endpoint)
         if (queryString == null) {
-            queryString = exchange.getIn().getHeader(Exchange.HTTP_QUERY, String.class);
+            queryString = exchange.getIn().getHeader(UndertowConstants.HTTP_QUERY, String.class);
         }
         if (queryString == null) {
             queryString = endpoint.getHttpURI().getRawQuery();
@@ -137,9 +137,9 @@ public final class UndertowHelper {
             throws URISyntaxException {
         // is a query string provided in the endpoint URI or in a header (header
         // overrules endpoint)
-        String queryString = exchange.getIn().getHeader(Exchange.HTTP_QUERY, String.class);
+        String queryString = exchange.getIn().getHeader(UndertowConstants.HTTP_QUERY, String.class);
         // We need also check the HTTP_URI header query part
-        String uriString = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class);
+        String uriString = exchange.getIn().getHeader(UndertowConstants.HTTP_URI, String.class);
         // resolve placeholders in uriString
         try {
             uriString = exchange.getContext().resolvePropertyPlaceholders(uriString);
@@ -156,7 +156,7 @@ public final class UndertowHelper {
 
         // compute what method to use either GET or POST
         HttpString answer;
-        String m = exchange.getIn().getHeader(Exchange.HTTP_METHOD, String.class);
+        String m = exchange.getIn().getHeader(UndertowConstants.HTTP_METHOD, String.class);
         if (m != null) {
             // always use what end-user provides in a header
             // must be in upper case
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java
index b0b4be167db..d60b0034ece 100644
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java
@@ -132,7 +132,7 @@ public class UndertowProducer extends DefaultAsyncProducer {
 
         // Set the Host header
         final Message message = camelExchange.getIn();
-        final String host = message.getHeader(Headers.HOST_STRING, String.class);
+        final String host = message.getHeader(UndertowConstants.HOST_STRING, String.class);
         if (endpoint.isPreserveHostHeader()) {
             requestHeaders.put(Headers.HOST, Optional.ofNullable(host).orElseGet(uri::getAuthority));
         } else {
diff --git a/components/camel-velocity/src/generated/resources/org/apache/camel/component/velocity/velocity.json b/components/camel-velocity/src/generated/resources/org/apache/camel/component/velocity/velocity.json
index 4994a2acc1e..bd31f0e191f 100644
--- a/components/camel-velocity/src/generated/resources/org/apache/camel/component/velocity/velocity.json
+++ b/components/camel-velocity/src/generated/resources/org/apache/camel/component/velocity/velocity.json
@@ -28,6 +28,12 @@
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
     "velocityEngine": { "kind": "property", "displayName": "Velocity Engine", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.velocity.app.VelocityEngine", "deprecated": false, "autowired": false, "secret": false, "description": "To use the VelocityEngine otherwise a new engine is created" }
   },
+  "headers": {
+    "CamelVelocityResourceUri": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the velocity template." },
+    "CamelVelocityTemplate": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The content of the velocity template." },
+    "CamelVelocityContext": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "org.apache.velocity.context.Context", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The velocity context to use." },
+    "CamelVelocitySupplementalContext": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, Object>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "To add additional information to the used VelocityContext. The value of this header should be a Map with key\/values that will added (override any existing key with the same name). This can be used to pre setup some common key\/ [...]
+  },
   "properties": {
     "resourceUri": { "kind": "path", "displayName": "Resource Uri", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Path to the resource. You can prefix with: classpath, file, http, ref, or bean. classpath, file and http loads the resource using these protocols (classpath is default). ref will lookup the resource in the registry. bean will [...]
     "allowContextMapAll": { "kind": "parameter", "displayName": "Allow Context Map All", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether the context map should allow access to all details. By default only the message body and headers can be accessed. This option can be enabled for full access to the current Exchange and CamelContext. [...]
diff --git a/components/camel-velocity/src/main/docs/velocity-component.adoc b/components/camel-velocity/src/main/docs/velocity-component.adoc
index 12ff8d2d95c..ef51863c8c8 100644
--- a/components/camel-velocity/src/main/docs/velocity-component.adoc
+++ b/components/camel-velocity/src/main/docs/velocity-component.adoc
@@ -57,26 +57,12 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
-
-== Message Headers
-
-You can use the following headers on the message:
-
-[width="100%",cols="10%,90%",options="header",]
-|=======================================================================
-|Header |Description
-
-|`CamelVelocityResourceUri` |The *templateName* as a `String` object.
-
-|`CamelVelocitySupplementalContext` |To add additional information to the used VelocityContext.
-The value of this header should be a `Map` with key/values that will
-added (override any existing key with the same name). +
-This can be used to pre setup some common key/values you want to reuse
-in your velocity endpoints.
-|=======================================================================
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 Headers set during the Velocity evaluation are returned to the message
-and added as headers. Then its kinda possible to return values from
+and added as headers. Then it is possible to return values from
 Velocity to the Message.
 
 For example, to set the header value of `fruit` in the Velocity template
diff --git a/components/camel-velocity/src/main/java/org/apache/camel/component/velocity/VelocityConstants.java b/components/camel-velocity/src/main/java/org/apache/camel/component/velocity/VelocityConstants.java
index 6befbe88ad0..6dbded2f0a3 100644
--- a/components/camel-velocity/src/main/java/org/apache/camel/component/velocity/VelocityConstants.java
+++ b/components/camel-velocity/src/main/java/org/apache/camel/component/velocity/VelocityConstants.java
@@ -16,17 +16,25 @@
  */
 package org.apache.camel.component.velocity;
 
+import org.apache.camel.spi.Metadata;
+
 /**
  * Velocity Constants.
  */
 public final class VelocityConstants {
 
+    @Metadata(description = "The name of the velocity template.", javaType = "String")
     public static final String VELOCITY_RESOURCE_URI = "CamelVelocityResourceUri";
-
+    @Metadata(description = "The content of the velocity template.", javaType = "String")
     public static final String VELOCITY_TEMPLATE = "CamelVelocityTemplate";
-
+    @Metadata(description = "The velocity context to use.", javaType = "org.apache.velocity.context.Context")
     public static final String VELOCITY_CONTEXT = "CamelVelocityContext";
-
+    @Metadata(description = "To add additional information to the used VelocityContext.\n" +
+                            "The value of this header should be a `Map` with key/values that will\n" +
+                            "added (override any existing key with the same name). \n" +
+                            "This can be used to pre setup some common key/values you want to reuse\n" +
+                            "in your velocity endpoints.",
+              javaType = "Map<String, Object>")
     public static final String VELOCITY_SUPPLEMENTAL_CONTEXT = "CamelVelocitySupplementalContext";
 
     private VelocityConstants() {
diff --git a/components/camel-velocity/src/main/java/org/apache/camel/component/velocity/VelocityEndpoint.java b/components/camel-velocity/src/main/java/org/apache/camel/component/velocity/VelocityEndpoint.java
index 897873bfc72..46aa55c4ad2 100644
--- a/components/camel-velocity/src/main/java/org/apache/camel/component/velocity/VelocityEndpoint.java
+++ b/components/camel-velocity/src/main/java/org/apache/camel/component/velocity/VelocityEndpoint.java
@@ -46,7 +46,7 @@ import org.slf4j.LoggerFactory;
  * Transform messages using a Velocity template.
  */
 @UriEndpoint(firstVersion = "1.2.0", scheme = "velocity", title = "Velocity", syntax = "velocity:resourceUri",
-             producerOnly = true, category = { Category.TRANSFORMATION })
+             producerOnly = true, category = { Category.TRANSFORMATION }, headersClass = VelocityConstants.class)
 public class VelocityEndpoint extends ResourceEndpoint {
 
     private VelocityEngine velocityEngine;
diff --git a/components/camel-vertx/camel-vertx-http/src/generated/resources/org/apache/camel/component/vertx/http/vertx-http.json b/components/camel-vertx/camel-vertx-http/src/generated/resources/org/apache/camel/component/vertx/http/vertx-http.json
index 166bf34ff93..3d5fed86a6b 100644
--- a/components/camel-vertx/camel-vertx-http/src/generated/resources/org/apache/camel/component/vertx/http/vertx-http.json
+++ b/components/camel-vertx/camel-vertx-http/src/generated/resources/org/apache/camel/component/vertx/http/vertx-http.json
@@ -41,6 +41,16 @@
     "sslContextParameters": { "kind": "property", "displayName": "Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "autowired": false, "secret": false, "description": "To configure security using SSLContextParameters" },
     "useGlobalSslContextParameters": { "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable usage of global SSL context parameters" }
   },
+  "headers": {
+    "CamelHttpMethod": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "io.vertx.core.http.HttpMethod", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The http method" },
+    "CamelHttpResponseCode": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The HTTP response code from the external server." },
+    "CamelHttpResponseText": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The HTTP response text from the external server." },
+    "Content-Type": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The HTTP content type. Is set on both the IN and OUT message to provide a content type, such as text\/html." },
+    "CamelHttpQuery": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "URI parameters. Will override existing URI parameters set directly on the endpoint." },
+    "CamelHttpUri": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "URI to call. Will override the existing URI set directly on the endpoint. This URI is the URI of the http server to call. Its not the same as the Camel endpoint URI, where you can configure endpoint options such as security etc. This header does not support tha [...]
+    "CamelHttpPath": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Request URI's path, the header will be used to build the request URI with the HTTP_URI." },
+    "Content-Encoding": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The HTTP content encoding. Is set to provide a content encoding, such as gzip." }
+  },
   "properties": {
     "httpUri": { "kind": "path", "displayName": "Http Uri", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.net.URI", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.vertx.http.VertxHttpConfiguration", "configurationField": "configuration", "description": "The HTTP URI to connect to" },
     "connectTimeout": { "kind": "parameter", "displayName": "Connect Timeout", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 60000, "configurationClass": "org.apache.camel.component.vertx.http.VertxHttpConfiguration", "configurationField": "configuration", "description": "The amount of time in milliseconds until a connection is established. A timeout value of zer [...]
diff --git a/components/camel-vertx/camel-vertx-http/src/main/docs/vertx-http-component.adoc b/components/camel-vertx/camel-vertx-http/src/main/docs/vertx-http-component.adoc
index 24ff70a1e00..5a9ba99ea9a 100644
--- a/components/camel-vertx/camel-vertx-http/src/main/docs/vertx-http-component.adoc
+++ b/components/camel-vertx/camel-vertx-http/src/main/docs/vertx-http-component.adoc
@@ -49,34 +49,9 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
-
-== Message Headers
-
-[width="100%",cols="10%,20%,70%",options="header",]
-|=======================================================================
-|Name |Type |Description
-
-|`Exchange.HTTP_URI` |`String` |URI to call. Will override the existing URI set directly on the endpoint.
-This URI is the URI of the http server to call. Its not the same as the
-Camel endpoint URI, where you can configure endpoint options such as
-security etc. This header does not support that, its only the URI of the
-http server.
-
-|`Exchange.HTTP_PATH` |`String` |Request URI's path, the header will be used to build the request URI
-with the HTTP_URI.
-
-|`Exchange.HTTP_QUERY` |`String` |URI parameters. Will override existing URI parameters set directly on
-the endpoint.
-
-|`Exchange.HTTP_RESPONSE_CODE` |`int` |The HTTP response code from the external server.
-
-|`Exchange.HTTP_RESPONSE_TEXT` | `String` |The HTTP response text from the external server.
-
-|`Exchange.CONTENT_TYPE` |`String` |The HTTP content type. Is set on both the IN and OUT message to provide
-a content type, such as `text/html`.
-
-|`Exchange.CONTENT_ENCODING` |`String` |The HTTP content encoding. Is set to provide a content encoding, such as `gzip`.
-|=======================================================================
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 == Usage
 The following example shows how to send a request to an HTTP endpoint.
diff --git a/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/DefaultVertxHttpBinding.java b/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/DefaultVertxHttpBinding.java
index 1f5660fa6d4..54490a9f810 100644
--- a/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/DefaultVertxHttpBinding.java
+++ b/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/DefaultVertxHttpBinding.java
@@ -66,7 +66,7 @@ public class DefaultVertxHttpBinding implements VertxHttpBinding {
         }
 
         // Determine the HTTP method to use if not specified in the HTTP_METHOD header
-        HttpMethod method = message.getHeader(Exchange.HTTP_METHOD, configuration.getHttpMethod(), HttpMethod.class);
+        HttpMethod method = message.getHeader(VertxHttpConstants.HTTP_METHOD, configuration.getHttpMethod(), HttpMethod.class);
         if (method == null) {
             if (ObjectHelper.isNotEmpty(queryString)) {
                 method = HttpMethod.GET;
@@ -126,7 +126,7 @@ public class DefaultVertxHttpBinding implements VertxHttpBinding {
         // Ensure the Content-Type header is always added if the corresponding exchange header is present
         String contentType = ExchangeHelper.getContentType(exchange);
         if (ObjectHelper.isNotEmpty(contentType)) {
-            headers.add(Exchange.CONTENT_TYPE, contentType);
+            headers.add(VertxHttpConstants.CONTENT_TYPE, contentType);
         }
 
         // Transfer exchange headers to the HTTP request while applying the filter strategy
@@ -165,8 +165,8 @@ public class DefaultVertxHttpBinding implements VertxHttpBinding {
     @Override
     public void populateResponseHeaders(Exchange exchange, HttpResponse<Buffer> response, HeaderFilterStrategy strategy) {
         Message message = exchange.getMessage();
-        message.setHeader(Exchange.HTTP_RESPONSE_CODE, response.statusCode());
-        message.setHeader(Exchange.HTTP_RESPONSE_TEXT, response.statusMessage());
+        message.setHeader(VertxHttpConstants.HTTP_RESPONSE_CODE, response.statusCode());
+        message.setHeader(VertxHttpConstants.HTTP_RESPONSE_TEXT, response.statusMessage());
 
         MultiMap headers = response.headers();
         headers.forEach(new Consumer<Map.Entry<String, String>>() {
@@ -178,7 +178,7 @@ public class DefaultVertxHttpBinding implements VertxHttpBinding {
                 String value = entry.getValue();
                 if (!found && name.equalsIgnoreCase("content-type")) {
                     found = true;
-                    name = Exchange.CONTENT_TYPE;
+                    name = VertxHttpConstants.CONTENT_TYPE;
                     exchange.setProperty(ExchangePropertyKey.CHARSET_NAME, IOHelper.getCharsetNameFromContentType(value));
                 }
                 Object extracted = HttpHelper.extractHttpParameterValue(value);
@@ -195,7 +195,7 @@ public class DefaultVertxHttpBinding implements VertxHttpBinding {
             throws Exception {
         Buffer responseBody = result.body();
         if (responseBody != null) {
-            String contentType = result.getHeader(Exchange.CONTENT_TYPE);
+            String contentType = result.getHeader(VertxHttpConstants.CONTENT_TYPE);
             if (CONTENT_TYPE_JAVA_SERIALIZED_OBJECT.equals(contentType)) {
                 boolean transferException = endpoint.getConfiguration().isTransferException();
                 boolean allowJavaSerializedObject = endpoint.getComponent().isAllowJavaSerializedObject();
diff --git a/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpConstants.java b/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpConstants.java
index e451a485139..d6421bb0291 100644
--- a/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpConstants.java
+++ b/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpConstants.java
@@ -16,11 +16,43 @@
  */
 package org.apache.camel.component.vertx.http;
 
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.Metadata;
+
 public final class VertxHttpConstants {
 
     public static final String CONTENT_TYPE_JAVA_SERIALIZED_OBJECT = "application/x-java-serialized-object";
     public static final String CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded";
 
+    @Metadata(description = "The http method", javaType = "io.vertx.core.http.HttpMethod")
+    public static final String HTTP_METHOD = Exchange.HTTP_METHOD;
+    @Metadata(description = "The HTTP response code from the external server.", javaType = "Integer")
+    public static final String HTTP_RESPONSE_CODE = Exchange.HTTP_RESPONSE_CODE;
+    @Metadata(description = "The HTTP response text from the external server.", javaType = "String")
+    public static final String HTTP_RESPONSE_TEXT = Exchange.HTTP_RESPONSE_TEXT;
+    @Metadata(description = "The HTTP content type. Is set on both the IN and OUT message to provide\n" +
+                            "a content type, such as `text/html`.",
+              javaType = "String")
+    public static final String CONTENT_TYPE = Exchange.CONTENT_TYPE;
+    @Metadata(description = "URI parameters. Will override existing URI parameters set directly on\n" +
+                            "the endpoint.",
+              javaType = "String")
+    public static final String HTTP_QUERY = Exchange.HTTP_QUERY;
+    @Metadata(description = "URI to call. Will override the existing URI set directly on the endpoint.\n" +
+                            "This URI is the URI of the http server to call. Its not the same as the\n" +
+                            "Camel endpoint URI, where you can configure endpoint options such as\n" +
+                            "security etc. This header does not support that, its only the URI of the\n" +
+                            "http server.",
+              javaType = "String")
+    public static final String HTTP_URI = Exchange.HTTP_URI;
+    @Metadata(description = "Request URI's path, the header will be used to build the request URI\n" +
+                            "with the HTTP_URI.",
+              javaType = "String")
+    public static final String HTTP_PATH = Exchange.HTTP_PATH;
+    @Metadata(description = "The HTTP content encoding. Is set to provide a content encoding, such as `gzip`.",
+              javaType = "String")
+    public static final String CONTENT_ENCODING = Exchange.CONTENT_ENCODING;
+
     private VertxHttpConstants() {
     }
 }
diff --git a/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpEndpoint.java b/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpEndpoint.java
index f6f02eacbda..5fa4f738435 100644
--- a/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpEndpoint.java
+++ b/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpEndpoint.java
@@ -36,7 +36,8 @@ import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.StringHelper;
 
 @UriEndpoint(firstVersion = "3.5.0", scheme = "vertx-http", title = "Vert.x HTTP Client", syntax = "vertx-http:httpUri",
-             category = { Category.HTTP }, producerOnly = true, lenientProperties = true)
+             category = { Category.HTTP }, producerOnly = true, lenientProperties = true,
+             headersClass = VertxHttpConstants.class)
 public class VertxHttpEndpoint extends DefaultEndpoint {
 
     @UriParam
diff --git a/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpHelper.java b/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpHelper.java
index dec6cc13fac..842ca79ddf4 100644
--- a/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpHelper.java
+++ b/components/camel-vertx/camel-vertx-http/src/main/java/org/apache/camel/component/vertx/http/VertxHttpHelper.java
@@ -45,10 +45,10 @@ public final class VertxHttpHelper {
         Message message = exchange.getMessage();
         String queryString = (String) message.removeHeader(Exchange.REST_HTTP_QUERY);
         if (ObjectHelper.isEmpty(queryString)) {
-            queryString = message.getHeader(Exchange.HTTP_QUERY, String.class);
+            queryString = message.getHeader(VertxHttpConstants.HTTP_QUERY, String.class);
         }
 
-        String uriString = message.getHeader(Exchange.HTTP_URI, String.class);
+        String uriString = message.getHeader(VertxHttpConstants.HTTP_URI, String.class);
         uriString = exchange.getContext().resolvePropertyPlaceholders(uriString);
 
         if (uriString != null) {
@@ -68,7 +68,7 @@ public final class VertxHttpHelper {
         String uri = (String) message.removeHeader(Exchange.REST_HTTP_URI);
 
         if (ObjectHelper.isEmpty(uri)) {
-            uri = message.getHeader(Exchange.HTTP_URI, String.class);
+            uri = message.getHeader(VertxHttpConstants.HTTP_URI, String.class);
         }
 
         if (uri == null) {
@@ -79,7 +79,7 @@ public final class VertxHttpHelper {
         uri = exchange.getContext().resolvePropertyPlaceholders(uri);
 
         // Append HTTP_PATH header value if is present
-        String path = message.getHeader(Exchange.HTTP_PATH, String.class);
+        String path = message.getHeader(VertxHttpConstants.HTTP_PATH, String.class);
         if (ObjectHelper.isNotEmpty(path)) {
             if (path.startsWith("/")) {
                 path = path.substring(1);
@@ -138,7 +138,7 @@ public final class VertxHttpHelper {
     public static String getCharsetFromExchange(Exchange exchange) {
         String charset = null;
         if (exchange != null) {
-            String contentType = exchange.getMessage().getHeader(Exchange.CONTENT_TYPE, String.class);
+            String contentType = exchange.getMessage().getHeader(VertxHttpConstants.CONTENT_TYPE, String.class);
             charset = HttpHelper.getCharsetFromContentType(contentType);
             if (ObjectHelper.isEmpty(charset)) {
                 charset = exchange.getProperty(ExchangePropertyKey.CHARSET_NAME, String.class);
diff --git a/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/generated/resources/org/apache/camel/component/vertx/kafka/vertx-kafka.json b/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/generated/resources/org/apache/camel/component/vertx/kafka/vertx-kafka.json
index d08839a2769..c090329ca26 100644
--- a/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/generated/resources/org/apache/camel/component/vertx/kafka/vertx-kafka.json
+++ b/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/generated/resources/org/apache/camel/component/vertx/kafka/vertx-kafka.json
@@ -129,6 +129,17 @@
     "sslTruststorePassword": { "kind": "property", "displayName": "Ssl Truststore Password", "group": "security", "label": "common,security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.vertx.kafka.configuration.VertxKafkaConfiguration", "configurationField": "configuration", "description": "The password for the trust store file. If a password is not set, t [...]
     "sslTruststoreType": { "kind": "property", "displayName": "Ssl Truststore Type", "group": "security", "label": "common,security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "JKS", "configurationClass": "org.apache.camel.component.vertx.kafka.configuration.VertxKafkaConfiguration", "configurationField": "configuration", "description": "The file format of the trust store file." }
   },
+  "headers": {
+    "CamelVertxKafkaPartitionId": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: Explicitly specify the partition identifier, for example partition 0. This will trigger the component to produce all the massages to the specified partition. Consumer: The partition identifier where the message were consumed from." },
+    "CamelVertxKafkaMessageKey": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: Explicitly specify the message key, if partition ID is not specified, this will trigger the messages to go into the same partition. Consumer: The message key." },
+    "CamelVertxKafkaTopic": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: Explicitly specify the topic to where produce the messages, this will be preserved in case of header aggregation. Consumer: The topic from where the message originated." },
+    "CamelVertxKafkaRecordMetadata": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "List<RecordMetadata>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Produced record metadata." },
+    "CamelVertxKafkaOffset": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The offset of the message in Kafka topic." },
+    "CamelVertxKafkaHeaders": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "List<KafkaHeader>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The record Kafka headers." },
+    "CamelVertxKafkaTimestamp": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The timestamp of this record." },
+    "CamelVertxKafkaOverrideTimestamp": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ProducerRecord also has an associated timestamp. If the user did provide a timestamp, the producer will stamp the record with the provided timestamp and the header is not preserved." },
+    "CamelVertxKafkaOverrideTopic": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Explicitly specify the topic to where produce the messages, this will not be preserved in case of header aggregation and it will take precedence over CamelVertxKafkaTopic." }
+  },
   "properties": {
     "topic": { "kind": "path", "displayName": "Topic", "group": "common", "label": "common", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.vertx.kafka.configuration.VertxKafkaConfiguration", "configurationField": "configuration", "description": "Name of the topic to use. On the consumer you can use comma to separate multiple topics. A pr [...]
     "additionalProperties": { "kind": "parameter", "displayName": "Additional Properties", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "additionalProperties.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.vertx.kafka.configuration.VertxKafkaConfiguration", "configurationField": "configuration", "descri [...]
diff --git a/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/main/docs/vertx-kafka-component.adoc b/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/main/docs/vertx-kafka-component.adoc
index 7c3518df2e3..c9f9cbc96d8 100644
--- a/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/main/docs/vertx-kafka-component.adoc
+++ b/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/main/docs/vertx-kafka-component.adoc
@@ -71,7 +71,6 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
-
 For more information about Producer/Consumer configuration:
 
 http://kafka.apache.org/documentation.html#newconsumerconfigs[http://kafka.apache.org/documentation.html#newconsumerconfigs]
@@ -85,47 +84,12 @@ This allows camel route to consume and produce events asynchronously without blo
 
 == Usage
 
-=== Message headers set by the component consumer
-The following headers are available when consuming messages from Kafka.
-
-[width="100%",cols="10%,10%,10%,70%",options="header",]
-|=======================================================================
-|Header |Variable Name |Type |Description
-
-|`CamelVertxKafkaPartitionId`| `VertxKafkaConstants.PARTITION_ID`|`Integer`| The partition identifier where the message were consumed from.
-|`CamelVertxKafkaMessageKey`| `VertxKafkaConstants.MESSAGE_KEY`|`String`| The message key.
-|`CamelVertxKafkaTopic`| `VertxKafkaConstants.TOPIC`|`String`| The topic from where the message originated.
-|`CamelVertxKafkaOffset`| `VertxKafkaConstants.OFFSET`|`Long`| The offset of the message in Kafka topic.
-|`CamelVertxKafkaHeaders`| `VertxKafkaConstants.HEADERS`|`List<io.vertx.kafka.client.producer.KafkaHeader>`| The record Kafka headers.
-|`CamelVertxKafkaTimestamp`| `VertxKafkaConstants.TIMESTAMP`|`Long`| The timestamp of this record.
-|=======================================================================
-
-=== Message headers evaluated by the component producer
-Before sending a message to Kafka you can configure the following headers.
-
-[width="100%",cols="10%,10%,10%,70%",options="header",]
-|=======================================================================
-|Header |Variable Name |Type |Description
-
-|`CamelVertxKafkaPartitionId`| `VertxKafkaConstants.PARTITION_ID`|`Integer`| Explicitly specify the partition identifier, for example partition `0`. This will trigger the component to produce all the massages to the specified partition.
-|`CamelVertxKafkaMessageKey`| `VertxKafkaConstants.MESSAGE_KEY`|`String`| Explicitly specify the message key, if partition ID is not specified, this will trigger the messages to go into the same partition.
-|`CamelVertxKafkaTopic`| `VertxKafkaConstants.TOPIC`|`String`| Explicitly specify the topic to where produce the messages, this will be *preserved* in case of header aggregation.
-|`CamelVertxKafkaOverrideTopic`| `VertxKafkaConstants.OVERRIDE_TOPIC`|`String`| Explicitly specify the topic to where produce the messages, this will *not be preserved* in case of header aggregation and it will take *precedence* over `CamelVertxKafkaTopic`.
-| `CamelVertxKafkaOverrideTimestamp` | `VertxKafkaConstants.OVERRIDE_TIMESTAMP` | Long | The ProducerRecord also has an associated timestamp. If the user did provide a timestamp, the producer will stamp the  record with the provided timestamp and the header is not preserved. 
-|=======================================================================
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 If you want to send a message to a dynamic topic then use `VertxKafkaConstants.OVERRIDE_TOPIC` as its used as a one-time header
-that are not send along the message, as its removed in the producer.
-
-=== Message headers set by the component producer
-After the message is sent to Kafka, the following headers are available
-
-[width="100%",cols="10%,10%,10%,70%",options="header",]
-|=======================================================================
-|Header |Variable Name |Type |Description
-
-|`CamelVertxKafkaRecordMetadata`| `VertxKafkaConstants.RECORD_METADATA`|`List<io.vertx.kafka.client.producer.RecordMetadata>`| Produced record metadata.
-|=======================================================================
+that are not send along the message, as it's removed in the producer.
 
 === Message body type
 Currently, the component supports the following value serializers for the body message on the producer side:
diff --git a/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/main/java/org/apache/camel/component/vertx/kafka/VertxKafkaConstants.java b/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/main/java/org/apache/camel/component/vertx/kafka/VertxKafkaConstants.java
index 30a3da08f80..689baa828b1 100644
--- a/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/main/java/org/apache/camel/component/vertx/kafka/VertxKafkaConstants.java
+++ b/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/main/java/org/apache/camel/component/vertx/kafka/VertxKafkaConstants.java
@@ -16,21 +16,45 @@
  */
 package org.apache.camel.component.vertx.kafka;
 
+import org.apache.camel.spi.Metadata;
+
 public final class VertxKafkaConstants {
     private static final String HEADER_PREFIX = "CamelVertxKafka";
     // common headers, set by the consumer and evaluated by the producer
+    @Metadata(description = "*Producer:* Explicitly specify the partition identifier, for example partition `0`. " +
+                            "This will trigger the component to produce all the massages to the specified partition.\n" +
+                            "*Consumer:* The partition identifier where the message were consumed from.",
+              javaType = "Integer")
     public static final String PARTITION_ID = HEADER_PREFIX + "PartitionId";
+    @Metadata(description = "*Producer:* Explicitly specify the message key, if partition ID is not specified, " +
+                            "this will trigger the messages to go into the same partition.\n" +
+                            "*Consumer:* The message key.",
+              javaType = "String")
     public static final String MESSAGE_KEY = HEADER_PREFIX + "MessageKey";
+    @Metadata(description = "*Producer:* Explicitly specify the topic to where produce the messages, this will be *preserved* in case of header aggregation.\n"
+                            +
+                            "*Consumer:* The topic from where the message originated.",
+              javaType = "String")
     public static final String TOPIC = HEADER_PREFIX + "Topic";
     // headers set by the producer only
+    @Metadata(label = "producer", description = "Produced record metadata.", javaType = "List<RecordMetadata>")
     public static final String RECORD_METADATA = HEADER_PREFIX + "RecordMetadata";
     // headers set by the consumer only
+    @Metadata(label = "consumer", description = "The offset of the message in Kafka topic.", javaType = "Long")
     public static final String OFFSET = HEADER_PREFIX + "Offset";
+    @Metadata(label = "consumer", description = "The record Kafka headers.", javaType = "List<KafkaHeader>")
     public static final String HEADERS = HEADER_PREFIX + "Headers";
+    @Metadata(label = "consumer", description = "The timestamp of this record.", javaType = "Long")
     public static final String TIMESTAMP = HEADER_PREFIX + "Timestamp";
+    @Metadata(label = "producer", description = "The ProducerRecord also has an associated timestamp. " +
+                                                "If the user did provide a timestamp, the producer will stamp the  record with the provided timestamp and the header is not preserved.",
+              javaType = "Long")
     public static final String OVERRIDE_TIMESTAMP = HEADER_PREFIX + "OverrideTimestamp";
     public static final String MANUAL_COMMIT = HEADER_PREFIX + "ManualCommit";
     // headers evaluated by the producer only
+    @Metadata(label = "producer", description = "Explicitly specify the topic to where produce the messages," +
+                                                " this will *not be preserved* in case of header aggregation and it will take *precedence* over `CamelVertxKafkaTopic`.",
+              javaType = "String")
     public static final String OVERRIDE_TOPIC = HEADER_PREFIX + "OverrideTopic";
 
     private VertxKafkaConstants() {
diff --git a/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/main/java/org/apache/camel/component/vertx/kafka/VertxKafkaEndpoint.java b/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/main/java/org/apache/camel/component/vertx/kafka/VertxKafkaEndpoint.java
index 8b909a87d0c..de279dd9d71 100644
--- a/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/main/java/org/apache/camel/component/vertx/kafka/VertxKafkaEndpoint.java
+++ b/components/camel-vertx/camel-vertx-kafka/camel-vertx-kafka-component/src/main/java/org/apache/camel/component/vertx/kafka/VertxKafkaEndpoint.java
@@ -31,7 +31,7 @@ import org.apache.camel.support.DefaultEndpoint;
  * Sent and receive messages to/from an Apache Kafka broker using vert.x Kafka client
  */
 @UriEndpoint(firstVersion = "3.7.0", scheme = "vertx-kafka", title = "Vert.x Kafka", syntax = "vertx-kafka:topic",
-             category = { Category.MESSAGING })
+             category = { Category.MESSAGING }, headersClass = VertxKafkaConstants.class)
 public class VertxKafkaEndpoint extends DefaultEndpoint {
 
     @UriParam
diff --git a/components/camel-vertx/camel-vertx-websocket/src/generated/resources/org/apache/camel/component/vertx/websocket/vertx-websocket.json b/components/camel-vertx/camel-vertx-websocket/src/generated/resources/org/apache/camel/component/vertx/websocket/vertx-websocket.json
index b4e1e1a2584..c27a696c4ab 100644
--- a/components/camel-vertx/camel-vertx-websocket/src/generated/resources/org/apache/camel/component/vertx/websocket/vertx-websocket.json
+++ b/components/camel-vertx/camel-vertx-websocket/src/generated/resources/org/apache/camel/component/vertx/websocket/vertx-websocket.json
@@ -30,6 +30,11 @@
     "vertxOptions": { "kind": "property", "displayName": "Vertx Options", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "io.vertx.core.VertxOptions", "deprecated": false, "autowired": false, "secret": false, "description": "To provide a custom set of vertx options for configuring vertx" },
     "useGlobalSslContextParameters": { "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable usage of global SSL context parameters." }
   },
+  "headers": {
+    "CamelVertxWebsocket.connectionKey": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Sends the message to the client with the given connection key. You can use a comma separated list of keys to send a message to multiple clients" },
+    "CamelVertxWebsocket.sendToAll": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Sends the message to all clients which are currently connected. You can use the sendToAll option on the endpoint instead of using this header." },
+    "CamelVertxWebsocket.remoteAddress": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "io.vertx.core.net.SocketAddress", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The remote address." }
+  },
   "properties": {
     "host": { "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "0.0.0.0", "configurationClass": "org.apache.camel.component.vertx.websocket.VertxWebsocketConfiguration", "configurationField": "configuration", "description": "The host that the consumer should bind to or the host of the remote websocket destination that the pro [...]
     "port": { "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "configurationClass": "org.apache.camel.component.vertx.websocket.VertxWebsocketConfiguration", "configurationField": "configuration", "description": "The port that the consumer should bind to or port of the remote websocket destination that the producer should connect to" },
diff --git a/components/camel-vertx/camel-vertx-websocket/src/main/docs/vertx-websocket-component.adoc b/components/camel-vertx/camel-vertx-websocket/src/main/docs/vertx-websocket-component.adoc
index 94f2ea72278..4044eefb293 100644
--- a/components/camel-vertx/camel-vertx-websocket/src/main/docs/vertx-websocket-component.adoc
+++ b/components/camel-vertx/camel-vertx-websocket/src/main/docs/vertx-websocket-component.adoc
@@ -49,21 +49,9 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
-
-
-== Message Headers
-
-The WebSocket component uses 2 headers to indicate to either send
-messages back to a single/current client, or to all clients.
-
-[width="100%",cols="10%,90%",options="header",]
-|=======================================================================
-| Name | Description
-|`VertxWebsocketConstants.SEND_TO_ALL` |Sends the message to all clients which are currently connected. You can
-use the `sendToAll` option on the endpoint instead of using this header.
-|`VertxWebsocketConstants.CONNECTION_KEY` |Sends the message to the client with the given connection key. You can
-use a comma separated list of keys to send a message to multiple clients
-|=======================================================================
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 == Usage
 The following example shows how to expose a WebSocket on http://localhost:8080/echo and returns an 'echo' response back to the same channel:
@@ -77,7 +65,7 @@ from("vertx-websocket:localhost:8080/echo")
 
 == SSL
 
-By default the `ws://` protocol is used, but secure connections with `wss://` are supported by configuring the consumer or producer
+By default, the `ws://` protocol is used, but secure connections with `wss://` are supported by configuring the consumer or producer
 via the `sslContextParameters` URI parameter and the xref:manual::camel-configuration-utilities.adoc[Camel JSSE Configuration Utility]
 
 
diff --git a/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketConstants.java b/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketConstants.java
index 5f3c92865d8..1df5ba129a2 100644
--- a/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketConstants.java
+++ b/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketConstants.java
@@ -17,6 +17,7 @@
 package org.apache.camel.component.vertx.websocket;
 
 import io.vertx.core.net.NetServerOptions;
+import org.apache.camel.spi.Metadata;
 
 public final class VertxWebsocketConstants {
 
@@ -24,8 +25,15 @@ public final class VertxWebsocketConstants {
     public static final int DEFAULT_VERTX_SERVER_PORT = NetServerOptions.DEFAULT_PORT;
     public static final String DEFAULT_VERTX_SERVER_PATH = "/";
 
+    @Metadata(description = "Sends the message to the client with the given connection key. You can\n" +
+                            "use a comma separated list of keys to send a message to multiple clients",
+              javaType = "String")
     public static final String CONNECTION_KEY = "CamelVertxWebsocket.connectionKey";
+    @Metadata(label = "producer", description = "Sends the message to all clients which are currently connected. You can\n" +
+                                                "use the `sendToAll` option on the endpoint instead of using this header.",
+              javaType = "boolean")
     public static final String SEND_TO_ALL = "CamelVertxWebsocket.sendToAll";
+    @Metadata(label = "consumer", description = "The remote address.", javaType = "io.vertx.core.net.SocketAddress")
     public static final String REMOTE_ADDRESS = "CamelVertxWebsocket.remoteAddress";
 
     private VertxWebsocketConstants() {
diff --git a/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketEndpoint.java b/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketEndpoint.java
index e84237d510a..750c81dbf1d 100644
--- a/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketEndpoint.java
+++ b/components/camel-vertx/camel-vertx-websocket/src/main/java/org/apache/camel/component/vertx/websocket/VertxWebsocketEndpoint.java
@@ -43,7 +43,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @UriEndpoint(firstVersion = "3.5.0", scheme = "vertx-websocket", title = "Vert.x WebSocket",
-             syntax = "vertx-websocket:host:port/path", category = { Category.WEBSOCKET })
+             syntax = "vertx-websocket:host:port/path", category = { Category.WEBSOCKET },
+             headersClass = VertxWebsocketConstants.class)
 public class VertxWebsocketEndpoint extends DefaultEndpoint {
 
     private static final Logger LOG = LoggerFactory.getLogger(VertxWebsocketEndpoint.class);
diff --git a/components/camel-weather/src/generated/resources/org/apache/camel/component/weather/weather.json b/components/camel-weather/src/generated/resources/org/apache/camel/component/weather/weather.json
index f5c79e95b07..71c32ec4650 100644
--- a/components/camel-weather/src/generated/resources/org/apache/camel/component/weather/weather.json
+++ b/components/camel-weather/src/generated/resources/org/apache/camel/component/weather/weather.json
@@ -26,6 +26,10 @@
     "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during star [...]
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
   },
+  "headers": {
+    "CamelWeatherLocation": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Used by the producer to override the endpoint location and use the location from this header instead." },
+    "CamelWeatherQuery": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The original query URL sent to the Open Weather Map site" }
+  },
   "properties": {
     "name": { "kind": "path", "displayName": "Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.weather.WeatherConfiguration", "configurationField": "configuration", "description": "The name value is not used." },
     "appid": { "kind": "parameter", "displayName": "Appid", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.weather.WeatherConfiguration", "configurationField": "configuration", "description": "APPID ID used to authenticate the user connected to the API Server" },
diff --git a/components/camel-weather/src/main/docs/weather-component.adoc b/components/camel-weather/src/main/docs/weather-component.adoc
index 3edd3e1226d..8f3bf14f3d9 100644
--- a/components/camel-weather/src/main/docs/weather-component.adoc
+++ b/components/camel-weather/src/main/docs/weather-component.adoc
@@ -56,27 +56,18 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 == Exchange data format
 
 Camel will deliver the body as a json formatted java.lang.String (see
 the `mode` option above).
 
-== Message Headers
-
-[width="100%",cols="10%,90%",options="header",]
-|=======================================================================
-|Header |Description
-
-|`CamelWeatherQuery` |The original query URL sent to the Open Weather Map site
-
-|`CamelWeatherLocation` |Used by the producer to override the endpoint location and use the
-location from this header instead.
-|=======================================================================
-
 == Samples
 
-In this sample we find the 7 day weather forecast for Madrid, Spain:
+In this sample we find the 7-day weather forecast for Madrid, Spain:
 
 [source,java]
 ---------------------------------------------------------------------------------------------
diff --git a/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConstants.java b/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConstants.java
index 70f391ca569..bd3b7b9f00c 100644
--- a/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConstants.java
+++ b/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConstants.java
@@ -16,12 +16,18 @@
  */
 package org.apache.camel.component.weather;
 
+import org.apache.camel.spi.Metadata;
+
 /**
  * The Weather constants
  */
 public final class WeatherConstants {
 
+    @Metadata(label = "producer", description = "Used by the producer to override the endpoint location and use the\n" +
+                                                "location from this header instead.",
+              javaType = "String")
     public static final String WEATHER_LOCATION = "CamelWeatherLocation";
+    @Metadata(description = "The original query URL sent to the Open Weather Map site", javaType = "String")
     public static final String WEATHER_QUERY = "CamelWeatherQuery";
 
     private WeatherConstants() {
diff --git a/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherEndpoint.java b/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherEndpoint.java
index 70cf52dbc81..bf8ed254633 100644
--- a/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherEndpoint.java
+++ b/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherEndpoint.java
@@ -29,7 +29,7 @@ import org.apache.http.client.utils.HttpClientUtils;
  * Poll the weather information from Open Weather Map.
  */
 @UriEndpoint(firstVersion = "2.12.0", scheme = "weather", title = "Weather", syntax = "weather:name",
-             category = { Category.API })
+             category = { Category.API }, headersClass = WeatherConstants.class)
 public class WeatherEndpoint extends DefaultPollingEndpoint {
 
     @UriParam
diff --git a/components/camel-web3j/src/generated/resources/org/apache/camel/component/web3j/web3j.json b/components/camel-web3j/src/generated/resources/org/apache/camel/component/web3j/web3j.json
index b5ac0346b18..bbf383320f5 100644
--- a/components/camel-web3j/src/generated/resources/org/apache/camel/component/web3j/web3j.json
+++ b/components/camel-web3j/src/generated/resources/org/apache/camel/component/web3j/web3j.json
@@ -61,6 +61,45 @@
     "value": { "kind": "property", "displayName": "Value", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "java.math.BigInteger", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.web3j.Web3jConfiguration", "configurationField": "configuration", "description": "The value sent within a transaction." },
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
   },
+  "headers": {
+    "ETH_HASHRATE": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A hexadecimal string representation (32 bytes) of the hash rate." },
+    "ID": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The id" },
+    "AT_BLOCK": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The block number, or the string latest for the last mined block or pending, earliest for not yet mined transactions." },
+    "ADDRESS": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Contract address." },
+    "ADDRESSES": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "List<String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Contract address or a list of addresses." },
+    "FROM_ADDRESS": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The address the transaction is send from" },
+    "TO_ADDRESS": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The address the transaction is directed to" },
+    "POSITION": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The transaction index position withing a block." },
+    "BLOCK_HASH": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Hash of the block where this transaction was in." },
+    "TRANSACTION_HASH": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The information about a transaction requested by transaction hash." },
+    "SHA3_HASH_OF_DATA_TO_SIGN": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Message to sign by calculating an Ethereum specific signature." },
+    "SIGNED_TRANSACTION_DATA": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The signed transaction data for a new message call transaction or a contract creation for signed transactions." },
+    "FULL_TRANSACTION_OBJECTS": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "If true it returns the full transaction objects, if false only the hashes of the transactions." },
+    "INDEX": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The transactions\/uncle index position in the block." },
+    "SOURCE_CODE": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The source code to compile." },
+    "FILTER_ID": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.math.BigInteger", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The filter id to use." },
+    "DATABASE_NAME": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The local database name." },
+    "KEY_NAME": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The key name in the database." },
+    "NONCE": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.math.BigInteger", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The nonce found (64 bits) used for submitting a proof-of-work solution." },
+    "HEADER_POW_HASH": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The header's pow-hash (256 bits) used for submitting a proof-of-work solution." },
+    "MIX_DIGEST": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The mix digest (256 bits) used for submitting a proof-of-work solution." },
+    "CLIENT_ID": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A random hexadecimal(32 bytes) ID identifying the client." },
+    "GAS_PRICE": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.math.BigInteger", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Gas price used for each paid gas." },
+    "GAS_LIMIT": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.math.BigInteger", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The maximum gas allowed in this block." },
+    "VALUE": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.math.BigInteger", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The value sent within a transaction." },
+    "DATA": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The compiled code of a contract OR the hash of the invoked method signature and encoded parameters." },
+    "FROM_BLOCK": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The block number, or the string latest for the last mined block or pending, earliest for not yet mined transactions." },
+    "TO_BLOCK": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The block number, or the string latest for the last mined block or pending, earliest for not yet mined transactions." },
+    "TOPICS": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "List<String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Topics are order-dependent. Each topic can also be a list of topics. Specify multiple topics separated by comma." },
+    "PRIORITY": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.math.BigInteger", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The priority of a whisper message." },
+    "TTL": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.math.BigInteger", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The time to live in seconds of a whisper message." },
+    "PRIVATE_FOR": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "List<String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A transaction privateFor nodes with public keys in a Quorum network" },
+    "ERROR_CODE": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The error code" },
+    "ERROR_DATA": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The error data" },
+    "ERROR_MESSAGE": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The error message" },
+    "status": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The status of the operation" },
+    "operation": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation" }
+  },
   "properties": {
     "nodeAddress": { "kind": "path", "displayName": "Node Address", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Sets the node address used to communicate" },
     "addresses": { "kind": "parameter", "displayName": "Addresses", "group": "common", "label": "common", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.web3j.Web3jConfiguration", "configurationField": "configuration", "description": "Contract address or a list of addresses." },
diff --git a/components/camel-web3j/src/main/docs/web3j-component.adoc b/components/camel-web3j/src/main/docs/web3j-component.adoc
index 148a41f868c..fa1a81a51b7 100644
--- a/components/camel-web3j/src/main/docs/web3j-component.adoc
+++ b/components/camel-web3j/src/main/docs/web3j-component.adoc
@@ -51,16 +51,11 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
-== Message Headers
-
-[width="100%",cols="10%,90%",options="header",]
-|=======================================================================
-|Header |Description
-
-|`All URI options` |All URI options can also be set as exchange headers.
-
-|=======================================================================
+All URI options can also be set as exchange headers.
 
 == Samples
 
diff --git a/components/camel-web3j/src/main/java/org/apache/camel/component/web3j/Web3jConstants.java b/components/camel-web3j/src/main/java/org/apache/camel/component/web3j/Web3jConstants.java
index c770556ec59..1385f9ad3ca 100644
--- a/components/camel-web3j/src/main/java/org/apache/camel/component/web3j/Web3jConstants.java
+++ b/components/camel-web3j/src/main/java/org/apache/camel/component/web3j/Web3jConstants.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.web3j;
 
+import org.apache.camel.spi.Metadata;
+
 public interface Web3jConstants {
     String WEB3_CLIENT_VERSION = "WEB3_CLIENT_VERSION";
     String WEB3_SHA3 = "WEB3_SHA3";
@@ -26,6 +28,8 @@ public interface Web3jConstants {
     String ETH_COINBASE = "ETH_COINBASE";
     String ETH_SYNCING = "ETH_SYNCING";
     String ETH_MINING = "ETH_MINING";
+    @Metadata(label = "producer", description = "A hexadecimal string representation (32 bytes) of the hash rate.",
+              javaType = "String")
     String ETH_HASHRATE = "ETH_HASHRATE";
     String ETH_GAS_PRICE = "ETH_GAS_PRICE";
     String ETH_ACCOUNTS = "ETH_ACCOUNTS";
@@ -106,41 +110,109 @@ public interface Web3jConstants {
     String CATCH_UP_TO_LATEST_AND_SUBSCRIBE_TO_NEW_TRANSACTIONS_OBSERVABLE
             = "CATCH_UP_TO_LATEST_AND_SUBSCRIBE_TO_NEW_TRANSACTIONS_OBSERVABLE";
 
+    @Metadata(label = "producer", description = "The id", javaType = "Long")
     String ID = "ID";
     String OPERATION = "OPERATION";
     String TRANSACTION = "TRANSACTION";
+    /**
+     * The block number, or the string "latest" for the last mined block or "pending", "earliest" for not yet mined
+     * transactions.
+     */
+    @Metadata(label = "producer", javaType = "String")
     String AT_BLOCK = "AT_BLOCK";
+    @Metadata(label = "producer", description = "Contract address.", javaType = "String")
     String ADDRESS = "ADDRESS";
+    @Metadata(label = "producer", description = "Contract address or a list of addresses.", javaType = "List<String>")
     String ADDRESSES = "ADDRESSES";
+    @Metadata(label = "producer", description = "The address the transaction is send from", javaType = "String")
     String FROM_ADDRESS = "FROM_ADDRESS";
+    @Metadata(label = "producer", description = "The address the transaction is directed to", javaType = "String")
     String TO_ADDRESS = "TO_ADDRESS";
+    @Metadata(label = "producer", description = "The transaction index position withing a block.", javaType = "String")
     String POSITION = "POSITION";
+    @Metadata(label = "producer", description = "Hash of the block where this transaction was in.", javaType = "String")
     String BLOCK_HASH = "BLOCK_HASH";
+    @Metadata(label = "producer", description = "The information about a transaction requested by transaction hash.",
+              javaType = "String")
     String TRANSACTION_HASH = "TRANSACTION_HASH";
+    @Metadata(label = "producer", description = "Message to sign by calculating an Ethereum specific signature.",
+              javaType = "String")
     String SHA3_HASH_OF_DATA_TO_SIGN = "SHA3_HASH_OF_DATA_TO_SIGN";
+    @Metadata(label = "producer",
+              description = "The signed transaction data for a new message call transaction or a contract creation for signed transactions.",
+              javaType = "String")
     String SIGNED_TRANSACTION_DATA = "SIGNED_TRANSACTION_DATA";
+    @Metadata(label = "producer",
+              description = "If true it returns the full transaction objects, if false only the hashes of the transactions.",
+              javaType = "Boolean")
     String FULL_TRANSACTION_OBJECTS = "FULL_TRANSACTION_OBJECTS";
+    @Metadata(label = "producer", description = "The transactions/uncle index position in the block.", javaType = "String")
     String INDEX = "INDEX";
+    @Metadata(label = "producer", description = "The source code to compile.", javaType = "String")
     String SOURCE_CODE = "SOURCE_CODE";
+    @Metadata(label = "producer", description = "The filter id to use.", javaType = "java.math.BigInteger")
     String FILTER_ID = "FILTER_ID";
+    @Metadata(label = "producer", description = "The local database name.", javaType = "String")
     String DATABASE_NAME = "DATABASE_NAME";
+    @Metadata(label = "producer", description = "The key name in the database.", javaType = "String")
     String KEY_NAME = "KEY_NAME";
+    @Metadata(label = "producer", description = "The nonce found (64 bits) used for submitting a proof-of-work solution.",
+              javaType = "java.math.BigInteger")
     String NONCE = "NONCE";
+    @Metadata(label = "producer",
+              description = "The header's pow-hash (256 bits) used for submitting a proof-of-work solution.",
+              javaType = "String")
     String HEADER_POW_HASH = "HEADER_POW_HASH";
+    @Metadata(label = "producer", description = "The mix digest (256 bits) used for submitting a proof-of-work solution.",
+              javaType = "String")
     String MIX_DIGEST = "MIX_DIGEST";
+    @Metadata(label = "producer", description = "A random hexadecimal(32 bytes) ID identifying the client.",
+              javaType = "String")
     String CLIENT_ID = "CLIENT_ID";
+    @Metadata(label = "producer", description = "Gas price used for each paid gas.", javaType = "java.math.BigInteger")
     String GAS_PRICE = "GAS_PRICE";
+    @Metadata(label = "producer", description = "The maximum gas allowed in this block.", javaType = "java.math.BigInteger")
     String GAS_LIMIT = "GAS_LIMIT";
+    @Metadata(label = "producer", description = "The value sent within a transaction.", javaType = "java.math.BigInteger")
     String VALUE = "VALUE";
+    @Metadata(label = "producer",
+              description = "The compiled code of a contract OR the hash of the invoked method signature and encoded parameters.",
+              javaType = "String")
     String DATA = "DATA";
+    /**
+     * The block number, or the string "latest" for the last mined block or "pending", "earliest" for not yet mined
+     * transactions.
+     */
+    @Metadata(label = "producer", javaType = "String")
     String FROM_BLOCK = "FROM_BLOCK";
+    /**
+     * The block number, or the string "latest" for the last mined block or "pending", "earliest" for not yet mined
+     * transactions.
+     */
+    @Metadata(label = "producer", javaType = "String")
     String TO_BLOCK = "TO_BLOCK";
+    @Metadata(label = "producer", description = "Topics are order-dependent. Each topic can also be a list of topics. " +
+                                                "Specify multiple topics separated by comma.",
+              javaType = "List<String>")
     String TOPICS = "TOPICS";
+    @Metadata(label = "producer", description = "The priority of a whisper message.", javaType = "java.math.BigInteger")
     String PRIORITY = "PRIORITY";
+    @Metadata(label = "producer", description = "The time to live in seconds of a whisper message.",
+              javaType = "java.math.BigInteger")
     String TTL = "TTL";
+    @Metadata(label = "producer", description = "A transaction privateFor nodes with public keys in a Quorum network",
+              javaType = "List<String>")
     String PRIVATE_FOR = "PRIVATE_FOR";
 
+    @Metadata(label = "producer", description = "The error code", javaType = "int")
     String ERROR_CODE = "ERROR_CODE";
+    @Metadata(label = "producer", description = "The error data", javaType = "String")
     String ERROR_DATA = "ERROR_DATA";
+    @Metadata(label = "producer", description = "The error message", javaType = "String")
     String ERROR_MESSAGE = "ERROR_MESSAGE";
+
+    @Metadata(label = "consumer", description = "The status of the operation", javaType = "String")
+    String HEADER_STATUS = "status";
+    @Metadata(label = "consumer", description = "The operation", javaType = "String")
+    String HEADER_OPERATION = "operation";
 }
diff --git a/components/camel-web3j/src/main/java/org/apache/camel/component/web3j/Web3jConsumer.java b/components/camel-web3j/src/main/java/org/apache/camel/component/web3j/Web3jConsumer.java
index b88a7b488d5..ca4ae170ea3 100644
--- a/components/camel-web3j/src/main/java/org/apache/camel/component/web3j/Web3jConsumer.java
+++ b/components/camel-web3j/src/main/java/org/apache/camel/component/web3j/Web3jConsumer.java
@@ -213,8 +213,8 @@ public class Web3jConsumer extends DefaultConsumer {
     private void processDone(String operation) {
         LOG.debug("processDone for operation: {}", operation);
         Exchange exchange = this.getEndpoint().createExchange();
-        exchange.getIn().setHeader("status", "done");
-        exchange.getIn().setHeader("operation", operation);
+        exchange.getIn().setHeader(Web3jConstants.HEADER_STATUS, "done");
+        exchange.getIn().setHeader(Web3jConstants.HEADER_OPERATION, operation);
         processEvent(exchange);
     }
 
diff --git a/components/camel-web3j/src/main/java/org/apache/camel/component/web3j/Web3jEndpoint.java b/components/camel-web3j/src/main/java/org/apache/camel/component/web3j/Web3jEndpoint.java
index 0fc98e4e173..5b4a8c51592 100644
--- a/components/camel-web3j/src/main/java/org/apache/camel/component/web3j/Web3jEndpoint.java
+++ b/components/camel-web3j/src/main/java/org/apache/camel/component/web3j/Web3jEndpoint.java
@@ -44,7 +44,7 @@ import org.web3j.quorum.Quorum;
  * Interact with Ethereum nodes using web3j client API.
  */
 @UriEndpoint(firstVersion = "2.22.0", scheme = "web3j", title = "Web3j Ethereum Blockchain", syntax = "web3j:nodeAddress",
-             category = { Category.BITCOIN, Category.BLOCKCHAIN, Category.API })
+             category = { Category.BITCOIN, Category.BLOCKCHAIN, Category.API }, headersClass = Web3jConstants.class)
 public class Web3jEndpoint extends DefaultEndpoint {
     private static final Logger LOG = LoggerFactory.getLogger(Web3jEndpoint.class);
 
diff --git a/components/camel-websocket-jsr356/src/generated/resources/org/apache/camel/websocket/jsr356/websocket-jsr356.json b/components/camel-websocket-jsr356/src/generated/resources/org/apache/camel/websocket/jsr356/websocket-jsr356.json
index 30f56ad55e9..bec63ca44e7 100644
--- a/components/camel-websocket-jsr356/src/generated/resources/org/apache/camel/websocket/jsr356/websocket-jsr356.json
+++ b/components/camel-websocket-jsr356/src/generated/resources/org/apache/camel/websocket/jsr356/websocket-jsr356.json
@@ -27,6 +27,10 @@
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
     "serverEndpointDeploymentStrategy": { "kind": "property", "displayName": "Server Endpoint Deployment Strategy", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.websocket.jsr356.ServerEndpointDeploymentStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To enable customization of how a WebSocket ServerEndpoint is configured and deployed. By default DefaultServerEndpointDeploymentStrategy is used." }
   },
+  "headers": {
+    "jsr356.session": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "javax.websocket.Session", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The session." },
+    "jsr356.producer.session.incoming.use": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Use incoming session" }
+  },
   "properties": {
     "uri": { "kind": "path", "displayName": "Uri", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.net.URI", "deprecated": false, "autowired": false, "secret": false, "description": "If a schemeless URI path is provided, a ServerEndpoint is deployed under that path. Else if the URI is prefixed with the 'ws:\/\/' scheme, then a connection is established to the corresponding server" },
     "sessionCount": { "kind": "parameter", "displayName": "Session Count", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1, "description": "Used when the endpoint is in client mode to populate a pool of sessions" },
diff --git a/components/camel-websocket-jsr356/src/main/docs/websocket-jsr356-component.adoc b/components/camel-websocket-jsr356/src/main/docs/websocket-jsr356-component.adoc
index b8cf248d0ee..a402892c67b 100644
--- a/components/camel-websocket-jsr356/src/main/docs/websocket-jsr356-component.adoc
+++ b/components/camel-websocket-jsr356/src/main/docs/websocket-jsr356-component.adoc
@@ -46,7 +46,8 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
-
-
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 include::spring-boot:partial$starter.adoc[]
diff --git a/components/camel-websocket-jsr356/src/main/java/org/apache/camel/websocket/jsr356/JSR356Constants.java b/components/camel-websocket-jsr356/src/main/java/org/apache/camel/websocket/jsr356/JSR356Constants.java
index 8680a80fff2..f97bc7476f7 100644
--- a/components/camel-websocket-jsr356/src/main/java/org/apache/camel/websocket/jsr356/JSR356Constants.java
+++ b/components/camel-websocket-jsr356/src/main/java/org/apache/camel/websocket/jsr356/JSR356Constants.java
@@ -16,7 +16,11 @@
  */
 package org.apache.camel.websocket.jsr356;
 
+import org.apache.camel.spi.Metadata;
+
 public interface JSR356Constants {
+    @Metadata(description = "The session.", javaType = "javax.websocket.Session")
     String SESSION = "jsr356.session";
+    @Metadata(label = "producer", description = "Use incoming session", javaType = "Boolean")
     String USE_INCOMING_SESSION = "jsr356.producer.session.incoming.use";
 }
diff --git a/components/camel-websocket-jsr356/src/main/java/org/apache/camel/websocket/jsr356/JSR356Endpoint.java b/components/camel-websocket-jsr356/src/main/java/org/apache/camel/websocket/jsr356/JSR356Endpoint.java
index 9b2df351b2a..6e9927903b2 100644
--- a/components/camel-websocket-jsr356/src/main/java/org/apache/camel/websocket/jsr356/JSR356Endpoint.java
+++ b/components/camel-websocket-jsr356/src/main/java/org/apache/camel/websocket/jsr356/JSR356Endpoint.java
@@ -31,7 +31,7 @@ import org.apache.camel.support.DefaultEndpoint;
  * Expose websocket endpoints using JSR356.
  */
 @UriEndpoint(firstVersion = "2.23.0", scheme = "websocket-jsr356", title = "Javax Websocket", syntax = "websocket-jsr356:uri",
-             category = { Category.HTTP })
+             category = { Category.HTTP }, headersClass = JSR356Constants.class)
 public class JSR356Endpoint extends DefaultEndpoint {
     @UriPath(description = "If a schemeless URI path is provided, a ServerEndpoint is deployed under that path. "
                            + "Else if the URI is prefixed with the 'ws://' scheme, then a connection is established to the corresponding server")
diff --git a/components/camel-websocket/src/generated/resources/org/apache/camel/component/websocket/websocket.json b/components/camel-websocket/src/generated/resources/org/apache/camel/component/websocket/websocket.json
index 7e90559255d..397732ea3cd 100644
--- a/components/camel-websocket/src/generated/resources/org/apache/camel/component/websocket/websocket.json
+++ b/components/camel-websocket/src/generated/resources/org/apache/camel/component/websocket/websocket.json
@@ -39,6 +39,13 @@
     "sslPassword": { "kind": "property", "displayName": "Ssl Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The password when using SSL." },
     "useGlobalSslContextParameters": { "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable usage of global SSL context parameters." }
   },
+  "headers": {
+    "websocket.connectionKey": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Producer: Sends the message to all clients which are currently connected. You can use the sendToAll option on the endpoint instead of using this header. Consumer: Connection key identifying an individual client connection. You can save this and specify [...]
+    "websocket.sendToAll": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Sends the message to all clients which are currently connected. You can use the sendToAll option on the endpoint instead of using this header." },
+    "websocket.remoteAddress": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "java.net.InetSocketAddress", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Remote address of the websocket session." },
+    "websocket.subprotocol": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "If a specific subprotocol was negotiated, it will be specfied in this header. Note that if you specify the any subprotocol to be supported, and a client requests a specific subprotocol, the connection will be accepted without a specific subprot [...]
+    "websocket.relativePath": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "If you specify a wildcard URI path for an endpoint, and a websocket client connects to that websocket endpoing, the relative path that the client specified will be provided in this header. For example, if you specified websocket:\/\/0.0.0.0:80 [...]
+  },
   "properties": {
     "host": { "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "0.0.0.0", "description": "The hostname. The default value is 0.0.0.0. Setting this option on the component will use the component configured value as default." },
     "port": { "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "9292", "description": "The port number. The default value is 9292. Setting this option on the component will use the component configured value as default." },
diff --git a/components/camel-websocket/src/main/docs/websocket-component.adoc b/components/camel-websocket/src/main/docs/websocket-component.adoc
index 72c1b3526a6..ed2c3c9e5df 100644
--- a/components/camel-websocket/src/main/docs/websocket-component.adoc
+++ b/components/camel-websocket/src/main/docs/websocket-component.adoc
@@ -53,41 +53,11 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 
-== Message Headers
-
-The WebSocket component uses headers to provide information about incoming messages from consumer endpoints, or as processing instructions for producer endpoints sending outgoing messages.
-
-=== Headers from Consumers
-[width="100%",cols="10%,90%",options="header",]
-|=======================================================================
-|Header Name |Description
-
-|`WebsocketConstants.CONNECTION_KEY` |Connection key identifying an individual client connection.  You can save this and specify it again when routing to a producer endpoing in order to direct messages to a specific connected client.
-
-|`WebsocketConstants.REMOTE_ADDRESS` |Remote address of the websocket session.
-
-|`WebsocketConstants.SUBPROTOCOL` |If a specific subprotocol was negotiated, it will be specfied in this header.  Note that if you specify the "any" subprotocol to be supported, and a client requests a specific subprotocol, the connection will be accepted without a specific subprotocol being used.  You need to specifically support a given protocol by name if you want it returned to the client and to show up in the message header.
-
-|`WebsocketConstants.RELATIVE_PATH` |If you specify a wildcard URI path for an endpoint, and a websocket client connects to that websocket endpoing, the relative path that the client specified will be provided in this header.
-
-For example, if you specified `websocket://0.0.0.0:80/api/*` as your endpoint URI, and a client connects to the server at `ws://host.com/api/specialized/apipath` then `specialized/apipath` is provided in the relative path header of all messages from that client.
-
-|=======================================================================
-
-=== Headers for Producers
-[width="100%",cols="10%,90%",options="header",]
-|=======================================================================
-|Header Name |Description
-
-|`WebsocketConstants.SEND_TO_ALL` |Sends the message to all clients which are currently connected. You can
-use the `sendToAll` option on the endpoint instead of using this header.
-
-|`WebsocketConstants.CONNECTION_KEY` |Sends the message to the client with the given connection key.
-
-|=======================================================================
-
 == Usage
 
 In this example we let Camel exposes a websocket server which clients
diff --git a/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketConstants.java b/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketConstants.java
index 08473ddb232..3036b0b4725 100644
--- a/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketConstants.java
+++ b/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketConstants.java
@@ -16,15 +16,43 @@
  */
 package org.apache.camel.component.websocket;
 
+import org.apache.camel.spi.Metadata;
+
 public final class WebsocketConstants {
 
     public static final int DEFAULT_PORT = 9292;
     public static final String DEFAULT_HOST = "0.0.0.0";
 
+    @Metadata(description = "*Producer:* Sends the message to all clients which are currently connected. You can\n" +
+                            "use the `sendToAll` option on the endpoint instead of using this header.\n" +
+                            "*Consumer:* Connection key identifying an individual client connection. " +
+                            "You can save this and specify it again when routing to a producer endpoing in order to direct messages to a specific connected client.",
+              javaType = "String")
     public static final String CONNECTION_KEY = "websocket.connectionKey";
+    @Metadata(label = "producer", description = "Sends the message to all clients which are currently connected. " +
+                                                "You can use the sendToAll option on the endpoint instead of using this header.",
+              javaType = "Boolean")
     public static final String SEND_TO_ALL = "websocket.sendToAll";
+    @Metadata(label = "consumer", description = "Remote address of the websocket session.",
+              javaType = "java.net.InetSocketAddress")
     public static final String REMOTE_ADDRESS = "websocket.remoteAddress";
+    @Metadata(label = "consumer",
+              description = "If a specific subprotocol was negotiated, it will be specfied in this header. " +
+                            "Note that if you specify the \"any\" subprotocol to be supported, and a client requests a specific subprotocol, "
+                            +
+                            "the connection will be accepted without a specific subprotocol being used. " +
+                            "You need to specifically support a given protocol by name if you want it returned to the client and to show up in the message header.",
+              javaType = "String")
     public static final String SUBPROTOCOL = "websocket.subprotocol";
+    @Metadata(label = "consumer",
+              description = "If you specify a wildcard URI path for an endpoint, and a websocket client connects to that websocket endpoing, "
+                            +
+                            "the relative path that the client specified will be provided in this header.\n" +
+                            "\n" +
+                            "For example, if you specified `websocket://0.0.0.0:80/api/*` as your endpoint URI, and a client connects to the server at `ws://host.com/api/specialized/apipath` "
+                            +
+                            "then `specialized/apipath` is provided in the relative path header of all messages from that client.",
+              javaType = "String")
     public static final String RELATIVE_PATH = "websocket.relativePath";
 
     public static final String WS_PROTOCOL = "ws";
diff --git a/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketEndpoint.java b/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketEndpoint.java
index 441eb7673f3..16c2e13ebd9 100644
--- a/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketEndpoint.java
+++ b/components/camel-websocket/src/main/java/org/apache/camel/component/websocket/WebsocketEndpoint.java
@@ -38,7 +38,8 @@ import org.eclipse.jetty.server.Handler;
  * Expose websocket endpoints using Jetty.
  */
 @UriEndpoint(firstVersion = "2.10.0", scheme = "websocket", title = "Jetty Websocket",
-             syntax = "websocket:host:port/resourceUri", category = { Category.WEBSOCKET })
+             syntax = "websocket:host:port/resourceUri", category = { Category.WEBSOCKET },
+             headersClass = WebsocketConstants.class)
 public class WebsocketEndpoint extends DefaultEndpoint {
 
     private WebsocketComponent component;
diff --git a/components/camel-workday/src/generated/resources/org/apache/camel/component/workday/workday.json b/components/camel-workday/src/generated/resources/org/apache/camel/component/workday/workday.json
index d48119c1570..4fbfe757c90 100644
--- a/components/camel-workday/src/generated/resources/org/apache/camel/component/workday/workday.json
+++ b/components/camel-workday/src/generated/resources/org/apache/camel/component/workday/workday.json
@@ -25,6 +25,9 @@
     "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during star [...]
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
   },
+  "headers": {
+    "CamelWorkdayURL": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The workday URL" }
+  },
   "properties": {
     "entity": { "kind": "path", "displayName": "Entity", "group": "producer", "label": "", "required": true, "type": "object", "javaType": "org.apache.camel.component.workday.WorkdayConfiguration.Entity", "enum": [ "report", "commonAPI" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.workday.WorkdayConfiguration", "configurationField": "workdayConfiguration", "description": "The entity to be requested o [...]
     "path": { "kind": "path", "displayName": "Path", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.workday.WorkdayConfiguration", "configurationField": "workdayConfiguration", "description": "The API path to access an entity structure." },
diff --git a/components/camel-workday/src/main/docs/workday-component.adoc b/components/camel-workday/src/main/docs/workday-component.adoc
index b1cf9931979..c727c1bf377 100644
--- a/components/camel-workday/src/main/docs/workday-component.adoc
+++ b/components/camel-workday/src/main/docs/workday-component.adoc
@@ -44,7 +44,9 @@ include::partial$component-endpoint-options.adoc[]
 // endpoint options: START
 
 // endpoint options: END
-
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 
 include::spring-boot:partial$starter.adoc[]
diff --git a/components/camel-workday/src/main/java/org/apache/camel/component/workday/WorkdayEndpoint.java b/components/camel-workday/src/main/java/org/apache/camel/component/workday/WorkdayEndpoint.java
index a03641b12e1..6907685b53b 100644
--- a/components/camel-workday/src/main/java/org/apache/camel/component/workday/WorkdayEndpoint.java
+++ b/components/camel-workday/src/main/java/org/apache/camel/component/workday/WorkdayEndpoint.java
@@ -21,6 +21,7 @@ import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.component.workday.producer.WorkdayCommonAPIProducer;
+import org.apache.camel.component.workday.producer.WorkdayDefaultProducer;
 import org.apache.camel.component.workday.producer.WorkdayReportProducer;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
@@ -30,7 +31,7 @@ import org.apache.camel.support.DefaultEndpoint;
  * Detect and parse documents using Workday.
  */
 @UriEndpoint(firstVersion = "3.1.0", scheme = "workday", title = "Workday", syntax = "workday:entity:path", producerOnly = true,
-             category = { Category.CLOUD, Category.API, Category.HCM })
+             category = { Category.CLOUD, Category.API, Category.HCM }, headersClass = WorkdayDefaultProducer.class)
 public class WorkdayEndpoint extends DefaultEndpoint {
 
     @UriParam
diff --git a/components/camel-workday/src/main/java/org/apache/camel/component/workday/producer/WorkdayDefaultProducer.java b/components/camel-workday/src/main/java/org/apache/camel/component/workday/producer/WorkdayDefaultProducer.java
index 85f640c1251..b5545bdfeed 100644
--- a/components/camel-workday/src/main/java/org/apache/camel/component/workday/producer/WorkdayDefaultProducer.java
+++ b/components/camel-workday/src/main/java/org/apache/camel/component/workday/producer/WorkdayDefaultProducer.java
@@ -21,6 +21,7 @@ import org.apache.camel.component.workday.WorkdayConfiguration;
 import org.apache.camel.component.workday.WorkdayEndpoint;
 import org.apache.camel.component.workday.auth.AuthClientForIntegration;
 import org.apache.camel.component.workday.auth.AutheticationClient;
+import org.apache.camel.spi.Metadata;
 import org.apache.camel.support.DefaultProducer;
 import org.apache.http.HttpStatus;
 import org.apache.http.client.methods.CloseableHttpResponse;
@@ -36,6 +37,7 @@ import org.slf4j.LoggerFactory;
  */
 public abstract class WorkdayDefaultProducer extends DefaultProducer {
 
+    @Metadata(description = "The workday URL", javaType = "String")
     public static final String WORKDAY_URL_HEADER = "CamelWorkdayURL";
 
     private static final Logger LOG = LoggerFactory.getLogger(WorkdayReportProducer.class);
diff --git a/components/camel-xchange/src/generated/resources/org/apache/camel/component/xchange/xchange.json b/components/camel-xchange/src/generated/resources/org/apache/camel/component/xchange/xchange.json
index 353e6624cbe..042adb0d8c2 100644
--- a/components/camel-xchange/src/generated/resources/org/apache/camel/component/xchange/xchange.json
+++ b/components/camel-xchange/src/generated/resources/org/apache/camel/component/xchange/xchange.json
@@ -25,6 +25,10 @@
     "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during star [...]
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
   },
+  "headers": {
+    "Currency": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "org.knowm.xchange.currency.Currency", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The target currency" },
+    "CurrencyPair": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "org.knowm.xchange.currency.CurrencyPair", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The target currency pair" }
+  },
   "properties": {
     "name": { "kind": "path", "displayName": "Name", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.xchange.XChangeConfiguration", "configurationField": "configuration", "description": "The exchange to connect to" },
     "currency": { "kind": "parameter", "displayName": "Currency", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.knowm.xchange.currency.Currency", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.xchange.XChangeConfiguration", "configurationField": "configuration", "description": "The currency" },
diff --git a/components/camel-xchange/src/main/docs/xchange-component.adoc b/components/camel-xchange/src/main/docs/xchange-component.adoc
index a57262c7bf5..69935df6569 100644
--- a/components/camel-xchange/src/main/docs/xchange-component.adoc
+++ b/components/camel-xchange/src/main/docs/xchange-component.adoc
@@ -52,7 +52,9 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
-
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 == Authentication
 
diff --git a/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeConfiguration.java b/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeConfiguration.java
index b783d29ba80..d8a0c41b357 100644
--- a/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeConfiguration.java
+++ b/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeConfiguration.java
@@ -48,7 +48,9 @@ public class XChangeConfiguration {
         ticker
     }
 
+    @Metadata(description = "The target currency", javaType = "org.knowm.xchange.currency.Currency")
     public static final String HEADER_CURRENCY = "Currency";
+    @Metadata(description = "The target currency pair", javaType = "org.knowm.xchange.currency.CurrencyPair")
     public static final String HEADER_CURRENCY_PAIR = "CurrencyPair";
 
     @UriPath(description = "The exchange to connect to")
diff --git a/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeEndpoint.java b/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeEndpoint.java
index 180c7e86147..866d79ec5ad 100644
--- a/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeEndpoint.java
+++ b/components/camel-xchange/src/main/java/org/apache/camel/component/xchange/XChangeEndpoint.java
@@ -49,7 +49,7 @@ import org.knowm.xchange.utils.Assert;
  * Access market data and trade on Bitcoin and Altcoin exchanges.
  */
 @UriEndpoint(firstVersion = "2.21.0", scheme = "xchange", title = "XChange", syntax = "xchange:name", producerOnly = true,
-             category = { Category.BITCOIN, Category.BLOCKCHAIN })
+             category = { Category.BITCOIN, Category.BLOCKCHAIN }, headersClass = XChangeConfiguration.class)
 public class XChangeEndpoint extends DefaultEndpoint {
 
     @UriParam
diff --git a/components/camel-xj/src/generated/resources/org/apache/camel/component/xj/xj.json b/components/camel-xj/src/generated/resources/org/apache/camel/component/xj/xj.json
index d40c46898a2..787dabb006e 100644
--- a/components/camel-xj/src/generated/resources/org/apache/camel/component/xj/xj.json
+++ b/components/camel-xj/src/generated/resources/org/apache/camel/component/xj/xj.json
@@ -33,6 +33,9 @@
     "uriResolver": { "kind": "property", "displayName": "Uri Resolver", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom UriResolver. Should not be used together with the option 'uriResolverFactory'." },
     "uriResolverFactory": { "kind": "property", "displayName": "Uri Resolver Factory", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltUriResolverFactory", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom UriResolver which depends on a dynamic endpoint resource URI. Should not be used together with the option 'uriResolver'." }
   },
+  "headers": {
+    "CamelXsltFileName": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The XSLT file name" }
+  },
   "properties": {
     "resourceUri": { "kind": "path", "displayName": "Resource Uri", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Path to the template. The following is supported by the default URIResolver. You can prefix with: classpath, file, http, ref, or bean. classpath, file and http loads the resource using these protocols (classpath is default).  [...]
     "allowStAX": { "kind": "parameter", "displayName": "Allow StAX", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to allow using StAX as the javax.xml.transform.Source. You can enable this if the XSLT library supports StAX such as the Saxon library (camel-saxon). The Xalan library (default in JVM) does not support StAXSource." },
diff --git a/components/camel-xj/src/main/docs/xj-component.adoc b/components/camel-xj/src/main/docs/xj-component.adoc
index eec65ba2855..73a883a00ff 100644
--- a/components/camel-xj/src/main/docs/xj-component.adoc
+++ b/components/camel-xj/src/main/docs/xj-component.adoc
@@ -63,7 +63,9 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
-
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 == Using XJ endpoints
 
diff --git a/components/camel-xj/src/main/java/org/apache/camel/component/xj/JsonFileResultHandlerFactory.java b/components/camel-xj/src/main/java/org/apache/camel/component/xj/JsonFileResultHandlerFactory.java
index 59ce3a23438..07cf5219707 100644
--- a/components/camel-xj/src/main/java/org/apache/camel/component/xj/JsonFileResultHandlerFactory.java
+++ b/components/camel-xj/src/main/java/org/apache/camel/component/xj/JsonFileResultHandlerFactory.java
@@ -44,7 +44,7 @@ public class JsonFileResultHandlerFactory implements ResultHandlerFactory {
      */
     @Override
     public ResultHandler createResult(Exchange exchange) throws Exception {
-        final String fileName = ExchangeHelper.getMandatoryHeader(exchange, Exchange.XSLT_FILE_NAME, String.class);
+        final String fileName = ExchangeHelper.getMandatoryHeader(exchange, XJConstants.XSLT_FILE_NAME, String.class);
         return new JsonFileResultHandler(jsonFactory, new File(fileName));
     }
 }
diff --git a/components/camel-xj/src/main/java/org/apache/camel/component/xj/XJConstants.java b/components/camel-xj/src/main/java/org/apache/camel/component/xj/XJConstants.java
index 3270de21232..6ae3ceab51d 100644
--- a/components/camel-xj/src/main/java/org/apache/camel/component/xj/XJConstants.java
+++ b/components/camel-xj/src/main/java/org/apache/camel/component/xj/XJConstants.java
@@ -22,6 +22,8 @@ import java.util.HashMap;
 import java.util.Map;
 
 import com.fasterxml.jackson.core.JsonToken;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.Metadata;
 
 public final class XJConstants {
 
@@ -46,6 +48,8 @@ public final class XJConstants {
      * converting to xml the attribute holds the type that was in the original json document.
      */
     public static final String TYPE_HINT_TYPE = "type";
+    @Metadata(description = "The XSLT file name", javaType = "String")
+    public static final String XSLT_FILE_NAME = Exchange.XSLT_FILE_NAME;
 
     /**
      * Mapping from json-types to typehint names
diff --git a/components/camel-xj/src/main/java/org/apache/camel/component/xj/XJEndpoint.java b/components/camel-xj/src/main/java/org/apache/camel/component/xj/XJEndpoint.java
index e0aab49c689..e0716eee50e 100644
--- a/components/camel-xj/src/main/java/org/apache/camel/component/xj/XJEndpoint.java
+++ b/components/camel-xj/src/main/java/org/apache/camel/component/xj/XJEndpoint.java
@@ -32,7 +32,7 @@ import org.apache.camel.spi.UriParam;
  */
 @ManagedResource(description = "Managed XJEndpoint")
 @UriEndpoint(firstVersion = "3.0.0", scheme = "xj", title = "XJ", syntax = "xj:resourceUri", producerOnly = true,
-             label = "transformation")
+             label = "transformation", headersClass = XJConstants.class)
 public class XJEndpoint extends XsltSaxonEndpoint {
 
     private final JsonFactory jsonFactory = new JsonFactory();
diff --git a/components/camel-xmlsecurity/src/generated/resources/org/apache/camel/component/xmlsecurity/xmlsecurity-sign.json b/components/camel-xmlsecurity/src/generated/resources/org/apache/camel/component/xmlsecurity/xmlsecurity-sign.json
index a1247433769..07cd385cd25 100644
--- a/components/camel-xmlsecurity/src/generated/resources/org/apache/camel/component/xmlsecurity/xmlsecurity-sign.json
+++ b/components/camel-xmlsecurity/src/generated/resources/org/apache/camel/component/xmlsecurity/xmlsecurity-sign.json
@@ -52,6 +52,23 @@
     "signerConfiguration": { "kind": "property", "displayName": "Signer Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xmlsecurity.processor.XmlSignerConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "To use a shared XmlSignerConfiguration configuration to use as base for configuring endpoints." },
     "uriDereferencer": { "kind": "property", "displayName": "Uri Dereferencer", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "javax.xml.crypto.URIDereferencer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.xmlsecurity.processor.XmlSignerConfiguration", "configurationField": "signerConfiguration", "description": "If you want to restrict the remote access via reference URIs, you can [...]
   },
+  "headers": {
+    "CamelXmlSignatureMessageIsPlainText": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Header for indicating that the message body contains non-xml plain text. This header is used in the XML signature generator. If the value is set to Boolean#TRUE then the message body is treated as plain text Overwrites the configuration  [...]
+    "CamelXmlSignaturePlainTextEncoding": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Header indicating the encoding of the plain text message body. Used in the XML signature generator if the header HEADER_MESSAGE_IS_PLAIN_TEXT is set to Boolean#TRUE. Overwrites the configuration parameter XmlSignerConfiguration#setPlainTex [...]
+    "CamelXmlSignatureOmitXmlDeclaration": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Header which indicates that either the resulting signature document in the signature generation case or the resulting output of the verifier should not contain an XML declaration. If the header is not specified then a XML declaration is  [...]
+    "CamelXmlSignatureContentReferenceUri": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The content reference URI" },
+    "CamelXmlSignatureContentReferenceType": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The content reference type" },
+    "CamelXmlSignatureSchemaResourceUri": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The schema resource URI" },
+    "CamelXmlSignatureXpathsToIdAttributes": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "XPaths to id attributes" },
+    "CamelXmlSignatureTransformMethods": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Header for dynamic specifying the transform methods of the reference to the signed data. The value of the header must be a comma separated list with the transform algorithms, for example: http:\/\/www.w3.org\/2000\/09\/xmldsig#enveloped-sig [...]
+    "CamelXmlSignatureXAdESQualifyingPropertiesId": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "for the 'Id' attribute value of QualifyingProperties element" },
+    "CamelXmlSignatureXAdESSignedDataObjectPropertiesId": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "for the 'Id' attribute value of SignedDataObjectProperties element" },
+    "CamelXmlSignatureXAdESSignedSignaturePropertiesId": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "for the 'Id' attribute value of SignedSignatureProperties element" },
+    "CamelXmlSignatureXAdESDataObjectFormatEncoding": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "for the value of the Encoding element of the DataObjectFormat element" },
+    "CamelXmlSignatureXAdESNamespace": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "overwrites the XAdES namespace parameter value" },
+    "CamelXmlSignatureXAdESPrefix": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "overwrites the XAdES prefix parameter value" },
+    "CamelCharsetName": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the charset" }
+  },
   "properties": {
     "name": { "kind": "path", "displayName": "Name", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name part in the URI can be chosen by the user to distinguish between different signer endpoints within the camel context." },
     "addKeyInfoReference": { "kind": "parameter", "displayName": "Add Key Info Reference", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.xmlsecurity.processor.XmlSignerConfiguration", "configurationField": "configuration", "description": "In order to protect the KeyInfo element from tampering you can [...]
diff --git a/components/camel-xmlsecurity/src/generated/resources/org/apache/camel/component/xmlsecurity/xmlsecurity-verify.json b/components/camel-xmlsecurity/src/generated/resources/org/apache/camel/component/xmlsecurity/xmlsecurity-verify.json
index c0d878c5541..a3cf2adc6de 100644
--- a/components/camel-xmlsecurity/src/generated/resources/org/apache/camel/component/xmlsecurity/xmlsecurity-verify.json
+++ b/components/camel-xmlsecurity/src/generated/resources/org/apache/camel/component/xmlsecurity/xmlsecurity-verify.json
@@ -42,6 +42,18 @@
     "uriDereferencer": { "kind": "property", "displayName": "Uri Dereferencer", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "javax.xml.crypto.URIDereferencer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.xmlsecurity.processor.XmlVerifierConfiguration", "configurationField": "verifierConfiguration", "description": "If you want to restrict the remote access via reference URIs, you [...]
     "verifierConfiguration": { "kind": "property", "displayName": "Verifier Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xmlsecurity.processor.XmlVerifierConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "To use a shared XmlVerifierConfiguration configuration to use as base for configuring endpoints." }
   },
+  "headers": {
+    "CamelXmlSignatureOmitXmlDeclaration": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Header which indicates that either the resulting signature document in the signature generation case or the resulting output of the verifier should not contain an XML declaration. If the header is not specified then a XML declaration is  [...]
+    "CamelXmlSignatureSchemaResourceUri": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The schema resource URI" },
+    "CamelXmlSignatureXpathsToIdAttributes": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "XPaths to id attributes" },
+    "CamelXmlSignatureXAdESQualifyingPropertiesId": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "for the 'Id' attribute value of QualifyingProperties element" },
+    "CamelXmlSignatureXAdESSignedDataObjectPropertiesId": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "for the 'Id' attribute value of SignedDataObjectProperties element" },
+    "CamelXmlSignatureXAdESSignedSignaturePropertiesId": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "for the 'Id' attribute value of SignedSignatureProperties element" },
+    "CamelXmlSignatureXAdESDataObjectFormatEncoding": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "for the value of the Encoding element of the DataObjectFormat element" },
+    "CamelXmlSignatureXAdESNamespace": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "overwrites the XAdES namespace parameter value" },
+    "CamelXmlSignatureXAdESPrefix": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "overwrites the XAdES prefix parameter value" },
+    "CamelCharsetName": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the charset" }
+  },
   "properties": {
     "name": { "kind": "path", "displayName": "Name", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name part in the URI can be chosen by the user to distinguish between different verify endpoints within the camel context." },
     "baseUri": { "kind": "parameter", "displayName": "Base Uri", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.xmlsecurity.processor.XmlVerifierConfiguration", "configurationField": "configuration", "description": "You can set a base URI which is used in the URI dereferencing. Relative URIs are then concatenated with  [...]
diff --git a/components/camel-xmlsecurity/src/main/docs/xmlsecurity-sign-component.adoc b/components/camel-xmlsecurity/src/main/docs/xmlsecurity-sign-component.adoc
index 40b00e0d0b0..63b0a15ff59 100644
--- a/components/camel-xmlsecurity/src/main/docs/xmlsecurity-sign-component.adoc
+++ b/components/camel-xmlsecurity/src/main/docs/xmlsecurity-sign-component.adoc
@@ -64,6 +64,9 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 == XML Signature Wrapping Modes
 
@@ -589,30 +592,6 @@ from("direct:xades").to("xmlsecurity-sign://xades?keyAccessor=#keyAccessorDefaul
 </bean>
 ----
 
-=== Headers
-
-[width="100%",cols="1m,1m,4",options="header",]
-|=======================================================================
-|Header |Type |Description
-|CamelXmlSignatureXAdESQualifyingPropertiesId |String |for the 'Id'
-attribute value of `QualifyingProperties` element
-
-|CamelXmlSignatureXAdESSignedDataObjectPropertiesId |String |for the
-'Id' attribute value of `SignedDataObjectProperties` element
-
-|CamelXmlSignatureXAdESSignedSignaturePropertiesId |String |for the
-'Id' attribute value of `SignedSignatureProperties` element
-
-|CamelXmlSignatureXAdESDataObjectFormatEncoding |String |for the value
-of the Encoding element of the `DataObjectFormat` element
-
-|CamelXmlSignatureXAdESNamespace |String | overwrites the XAdES
-namespace parameter value
-
-|CamelXmlSignatureXAdESPrefix |String |overwrites the XAdES prefix
-parameter value
-|=======================================================================
-
 === Limitations with regard to XAdES version 1.4.2
 
 * No support for signature form XAdES-T and XAdES-C
diff --git a/components/camel-xmlsecurity/src/main/docs/xmlsecurity-verify-component.adoc b/components/camel-xmlsecurity/src/main/docs/xmlsecurity-verify-component.adoc
index 45f29e15726..375952c1f7d 100644
--- a/components/camel-xmlsecurity/src/main/docs/xmlsecurity-verify-component.adoc
+++ b/components/camel-xmlsecurity/src/main/docs/xmlsecurity-verify-component.adoc
@@ -88,6 +88,9 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 == XML Signature Wrapping Modes
 
@@ -520,30 +523,6 @@ from("direct:xades").to("xmlsecurity-sign://xades?keyAccessor=#keyAccessorDefaul
 </bean>
 ----
 
-=== Headers
-
-[width="100%",cols="1m,1m,4",options="header",]
-|=======================================================================
-|Header |Type |Description
-|CamelXmlSignatureXAdESQualifyingPropertiesId |String |for the 'Id'
-attribute value of `QualifyingProperties` element
-
-|CamelXmlSignatureXAdESSignedDataObjectPropertiesId |String |for the
-'Id' attribute value of `SignedDataObjectProperties` element
-
-|CamelXmlSignatureXAdESSignedSignaturePropertiesId |String |for the
-'Id' attribute value of `SignedSignatureProperties` element
-
-|CamelXmlSignatureXAdESDataObjectFormatEncoding |String |for the value
-of the Encoding element of the `DataObjectFormat` element
-
-|CamelXmlSignatureXAdESNamespace |String | overwrites the XAdES
-namespace parameter value
-
-|CamelXmlSignatureXAdESPrefix |String |overwrites the XAdES prefix
-parameter value
-|=======================================================================
-
 === Limitations with regard to XAdES version 1.4.2
 
 * No support for signature form XAdES-T and XAdES-C
diff --git a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/XmlSignerEndpoint.java b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/XmlSignerEndpoint.java
index 6192160e53a..cbbd266a58b 100644
--- a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/XmlSignerEndpoint.java
+++ b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/XmlSignerEndpoint.java
@@ -20,6 +20,7 @@ import org.apache.camel.Category;
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
+import org.apache.camel.component.xmlsecurity.api.XmlSignatureConstants;
 import org.apache.camel.component.xmlsecurity.processor.XmlSignerConfiguration;
 import org.apache.camel.component.xmlsecurity.processor.XmlSignerProcessor;
 import org.apache.camel.spi.Metadata;
@@ -28,11 +29,14 @@ import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
 import org.apache.camel.support.DefaultEndpoint;
 
+import static org.apache.camel.component.xmlsecurity.api.XmlSignatureConstants.SCHEME_SIGN;
+
 /**
  * Sign XML payloads using the XML signature specification.
  */
-@UriEndpoint(firstVersion = "2.12.0", scheme = "xmlsecurity-sign", title = "XML Security Sign",
-             syntax = "xmlsecurity-sign:name", producerOnly = true, category = { Category.SECURITY, Category.TRANSFORMATION })
+@UriEndpoint(firstVersion = "2.12.0", scheme = SCHEME_SIGN, title = "XML Security Sign",
+             syntax = "xmlsecurity-sign:name", producerOnly = true, category = { Category.SECURITY, Category.TRANSFORMATION },
+             headersClass = XmlSignatureConstants.class)
 public class XmlSignerEndpoint extends DefaultEndpoint {
 
     @UriPath
diff --git a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/XmlVerifierEndpoint.java b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/XmlVerifierEndpoint.java
index 9e958e380e7..b906cb6af57 100644
--- a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/XmlVerifierEndpoint.java
+++ b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/XmlVerifierEndpoint.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.xmlsecurity;
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
+import org.apache.camel.component.xmlsecurity.api.XmlSignatureConstants;
 import org.apache.camel.component.xmlsecurity.processor.XmlVerifierConfiguration;
 import org.apache.camel.component.xmlsecurity.processor.XmlVerifierProcessor;
 import org.apache.camel.spi.Metadata;
@@ -27,11 +28,14 @@ import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
 import org.apache.camel.support.DefaultEndpoint;
 
+import static org.apache.camel.component.xmlsecurity.api.XmlSignatureConstants.SCHEME_VERIFIER;
+
 /**
  * Verify XML payloads using the XML signature specification.
  */
-@UriEndpoint(firstVersion = "2.12.0", scheme = "xmlsecurity-verify", title = "XML Security Verify",
-             syntax = "xmlsecurity-verify:name", producerOnly = true, label = "security,transformation")
+@UriEndpoint(firstVersion = "2.12.0", scheme = SCHEME_VERIFIER, title = "XML Security Verify",
+             syntax = "xmlsecurity-verify:name", producerOnly = true, label = "security,transformation",
+             headersClass = XmlSignatureConstants.class)
 public class XmlVerifierEndpoint extends DefaultEndpoint {
 
     @UriPath
diff --git a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/DefaultXmlSignature2Message.java b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/DefaultXmlSignature2Message.java
index ccf87d99822..4a0500a7e70 100644
--- a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/DefaultXmlSignature2Message.java
+++ b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/DefaultXmlSignature2Message.java
@@ -36,7 +36,6 @@ import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -189,7 +188,7 @@ public class DefaultXmlSignature2Message implements XmlSignature2Message {
         XmlSignatureHelper.transformToOutputStream(node, os, omitXmlDeclaration(output, input), input.getOutputXmlEncoding());
         output.setBody(os.toByteArray());
         if (input.getOutputXmlEncoding() != null) {
-            output.setHeader(Exchange.CHARSET_NAME, input.getOutputXmlEncoding());
+            output.setHeader(XmlSignatureConstants.CHARSET_NAME, input.getOutputXmlEncoding());
         }
     }
 
diff --git a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/XmlSignatureConstants.java b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/XmlSignatureConstants.java
index f091c04a3ff..30c51f2d8d6 100644
--- a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/XmlSignatureConstants.java
+++ b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/XmlSignatureConstants.java
@@ -16,13 +16,19 @@
  */
 package org.apache.camel.component.xmlsecurity.api;
 
-public final class XmlSignatureConstants {
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.Metadata;
 
+public final class XmlSignatureConstants {
+    // The schemes
+    public static final String SCHEME_VERIFIER = "xmlsecurity-verify";
+    public static final String SCHEME_SIGN = "xmlsecurity-sign";
     /**
      * Header for indicating that the message body contains non-xml plain text. This header is used in the XML signature
      * generator. If the value is set to {@link Boolean#TRUE} then the message body is treated as plain text Overwrites
      * the configuration parameter XmlSignerConfiguration#setPlainText(Boolean)
      */
+    @Metadata(javaType = "Boolean", applicableFor = SCHEME_SIGN)
     public static final String HEADER_MESSAGE_IS_PLAIN_TEXT = "CamelXmlSignatureMessageIsPlainText";
 
     /**
@@ -30,6 +36,7 @@ public final class XmlSignatureConstants {
      * {@link #HEADER_MESSAGE_IS_PLAIN_TEXT} is set to {@link Boolean#TRUE}. Overwrites the configuration parameter
      * XmlSignerConfiguration#setPlainTextEncoding(String).
      */
+    @Metadata(javaType = "String", applicableFor = SCHEME_SIGN)
     public static final String HEADER_PLAIN_TEXT_ENCODING = "CamelXmlSignaturePlainTextEncoding";
 
     /**
@@ -44,14 +51,15 @@ public final class XmlSignatureConstants {
      * Overwrites the configuration parameter XmlSignatureConfiguration#setOmitXmlDeclaration(Boolean).
      * 
      */
+    @Metadata(javaType = "Boolean")
     public static final String HEADER_OMIT_XML_DECLARATION = "CamelXmlSignatureOmitXmlDeclaration";
-
+    @Metadata(description = "The content reference URI", javaType = "String", applicableFor = SCHEME_SIGN)
     public static final String HEADER_CONTENT_REFERENCE_URI = "CamelXmlSignatureContentReferenceUri";
-
+    @Metadata(description = "The content reference type", javaType = "String", applicableFor = SCHEME_SIGN)
     public static final String HEADER_CONTENT_REFERENCE_TYPE = "CamelXmlSignatureContentReferenceType";
-
+    @Metadata(description = "The schema resource URI", javaType = "String")
     public static final String HEADER_SCHEMA_RESOURCE_URI = "CamelXmlSignatureSchemaResourceUri";
-
+    @Metadata(description = "XPaths to id attributes", javaType = "String")
     public static final String HEADER_XPATHS_TO_ID_ATTRIBUTES = "CamelXmlSignatureXpathsToIdAttributes";
 
     /**
@@ -63,6 +71,7 @@ public final class XmlSignatureConstants {
      * transform algorithms, which need parameters like http://www.w3.org/TR/1999/REC-xslt-19991116,
      * http://www.w3.org/2002/06/xmldsig-filter2, or http://www.w3.org/TR/1999/REC-xpath-19991116.
      */
+    @Metadata(javaType = "String", applicableFor = SCHEME_SIGN)
     public static final String HEADER_TRANSFORM_METHODS = "CamelXmlSignatureTransformMethods";
 
     /*------------------------- headers for XAdES signer ----------------------------------------------------------*/
@@ -70,12 +79,14 @@ public final class XmlSignatureConstants {
      * Header for the 'Id' attribute value of the XAdES element 'QualifyingProperties'
      * 
      */
+    @Metadata(description = "for the 'Id' attribute value of `QualifyingProperties` element", javaType = "String")
     public static final String HEADER_XADES_QUALIFYING_PROPERTIES_ID = "CamelXmlSignatureXAdESQualifyingPropertiesId";
 
     /**
      * Header for the 'Id' attribute value of the XAdES element 'SignedDataObjectProperties'
      * 
      */
+    @Metadata(description = "for the 'Id' attribute value of `SignedDataObjectProperties` element", javaType = "String")
     public static final String HEADER_XADES_SIGNED_DATA_OBJECT_PROPERTIES_ID
             = "CamelXmlSignatureXAdESSignedDataObjectPropertiesId";
 
@@ -83,12 +94,14 @@ public final class XmlSignatureConstants {
      * Header for the 'Id' attribute value of the XAdES element 'SignedSignatureProperties'
      * 
      */
+    @Metadata(description = "for the 'Id' attribute value of `SignedSignatureProperties` element", javaType = "String")
     public static final String HEADER_XADES_SIGNED_SIGNATURE_PROPERTIES_ID
             = "CamelXmlSignatureXAdESSignedSignaturePropertiesId";
 
     /**
      * Header for the "Encoding" element contained in the "DataObjectFormat" XAdES element.
      */
+    @Metadata(description = "for the value of the Encoding element of the `DataObjectFormat` element", javaType = "String")
     public static final String HEADER_XADES_DATA_OBJECT_FORMAT_ENCODING = "CamelXmlSignatureXAdESDataObjectFormatEncoding";
 
     /**
@@ -102,6 +115,7 @@ public final class XmlSignatureConstants {
      * http://uri.etsi.org/01903/v1.3.2#.
      * 
      */
+    @Metadata(description = "overwrites the XAdES namespace parameter value", javaType = "String")
     public static final String HEADER_XADES_NAMESPACE = "CamelXmlSignatureXAdESNamespace";
 
     /**
@@ -109,7 +123,10 @@ public final class XmlSignatureConstants {
      * header value will have no effect.
      * 
      */
+    @Metadata(description = "overwrites the XAdES prefix parameter value", javaType = "String")
     public static final String HEADER_XADES_PREFIX = "CamelXmlSignatureXAdESPrefix";
+    @Metadata(description = "The name of the charset", javaType = "String")
+    public static final String CHARSET_NAME = Exchange.CHARSET_NAME;
 
     private XmlSignatureConstants() {
         // no instance
diff --git a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerProcessor.java b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerProcessor.java
index 6bc79a7e0ad..1c83a20d345 100644
--- a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerProcessor.java
+++ b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerProcessor.java
@@ -894,7 +894,7 @@ public class XmlSignerProcessor extends XmlSignatureProcessor {
 
     protected void setOutputEncodingToMessageHeader(Message message) {
         if (getConfiguration().getOutputXmlEncoding() != null) {
-            message.setHeader(Exchange.CHARSET_NAME, getConfiguration().getOutputXmlEncoding());
+            message.setHeader(XmlSignatureConstants.CHARSET_NAME, getConfiguration().getOutputXmlEncoding());
         }
     }
 
diff --git a/components/camel-xmpp/src/generated/resources/org/apache/camel/component/xmpp/xmpp.json b/components/camel-xmpp/src/generated/resources/org/apache/camel/component/xmpp/xmpp.json
index d00b5bbaa85..f86e8abdad3 100644
--- a/components/camel-xmpp/src/generated/resources/org/apache/camel/component/xmpp/xmpp.json
+++ b/components/camel-xmpp/src/generated/resources/org/apache/camel/component/xmpp/xmpp.json
@@ -27,6 +27,9 @@
     "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during star [...]
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
   },
+  "headers": {
+    "CamelXmppDoc": { "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "org.jivesoftware.smack.packet.Message", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The XMPP message" }
+  },
   "properties": {
     "host": { "kind": "path", "displayName": "Host", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Hostname for the chat server" },
     "port": { "kind": "path", "displayName": "Port", "group": "common", "label": "", "required": true, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Port number for the chat server" },
diff --git a/components/camel-xmpp/src/main/docs/xmpp-component.adoc b/components/camel-xmpp/src/main/docs/xmpp-component.adoc
index a531fc4a328..9a0f03df26a 100644
--- a/components/camel-xmpp/src/main/docs/xmpp-component.adoc
+++ b/components/camel-xmpp/src/main/docs/xmpp-component.adoc
@@ -55,7 +55,9 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
-
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 
 == Headers and setting Subject or Language
diff --git a/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppConstants.java b/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppConstants.java
index 28e365751fe..99e86f515a5 100644
--- a/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppConstants.java
+++ b/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppConstants.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.xmpp;
 
+import org.apache.camel.spi.Metadata;
+
 /**
  * Constants used in Camel XMPP module
  */
@@ -33,5 +35,6 @@ public interface XmppConstants {
 
     String STANZA_ID = "CamelXmppStanzaID";
     String TO = "CamelXmppTo";
+    @Metadata(label = "consumer", description = "The XMPP message", javaType = "org.jivesoftware.smack.packet.Message")
     String DOC_HEADER = "CamelXmppDoc";
 }
diff --git a/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppEndpoint.java b/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppEndpoint.java
index ab189feac90..2acb8b8f387 100644
--- a/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppEndpoint.java
+++ b/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppEndpoint.java
@@ -58,7 +58,7 @@ import org.slf4j.LoggerFactory;
  */
 @UriEndpoint(firstVersion = "1.0", scheme = "xmpp", title = "XMPP", syntax = "xmpp:host:port/participant",
              alternativeSyntax = "xmpp:user:password@host:port/participant",
-             category = { Category.CHAT, Category.MESSAGING })
+             category = { Category.CHAT, Category.MESSAGING }, headersClass = XmppConstants.class)
 public class XmppEndpoint extends DefaultEndpoint implements HeaderFilterStrategyAware {
 
     private static final Logger LOG = LoggerFactory.getLogger(XmppEndpoint.class);
diff --git a/components/camel-xslt/src/generated/resources/org/apache/camel/component/xslt/xslt.json b/components/camel-xslt/src/generated/resources/org/apache/camel/component/xslt/xslt.json
index 8911b0eefa6..de59a3faa72 100644
--- a/components/camel-xslt/src/generated/resources/org/apache/camel/component/xslt/xslt.json
+++ b/components/camel-xslt/src/generated/resources/org/apache/camel/component/xslt/xslt.json
@@ -30,13 +30,16 @@
     "uriResolver": { "kind": "property", "displayName": "Uri Resolver", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom UriResolver. Should not be used together with the option 'uriResolverFactory'." },
     "uriResolverFactory": { "kind": "property", "displayName": "Uri Resolver Factory", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltUriResolverFactory", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom UriResolver which depends on a dynamic endpoint resource URI. Should not be used together with the option 'uriResolver'." }
   },
+  "headers": {
+    "CamelXsltFileName": { "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The XSLT file name" }
+  },
   "properties": {
     "resourceUri": { "kind": "path", "displayName": "Resource Uri", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Path to the template. The following is supported by the default URIResolver. You can prefix with: classpath, file, http, ref, or bean. classpath, file and http loads the resource using these protocols (classpath is default).  [...]
     "contentCache": { "kind": "parameter", "displayName": "Content Cache", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Cache for the resource content (the stylesheet file) when it is loaded. If set to false Camel will reload the stylesheet file on each message processing. This is good for development. A cached stylesheet can be forced to reloa [...]
     "deleteOutputFile": { "kind": "parameter", "displayName": "Delete Output File", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If you have output=file then this option dictates whether or not the output file should be deleted when the Exchange is done processing. For example suppose the output file is a temporary file, then it can be a good  [...]
     "failOnNullBody": { "kind": "parameter", "displayName": "Fail On Null Body", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether or not to throw an exception if the input body is null." },
     "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during sta [...]
-    "output": { "kind": "parameter", "displayName": "Output", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltOutput", "enum": [ "string", "bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "string", "description": "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three options are all in memory based, where as file i [...]
+    "output": { "kind": "parameter", "displayName": "Output", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.xslt.XsltOutput", "enum": [ "string", "bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "string", "description": "Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three options are all in memory based, where as file i [...]
     "transformerCacheSize": { "kind": "parameter", "displayName": "Transformer Cache Size", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "The number of javax.xml.transform.Transformer object that are cached for reuse to avoid calls to Template.newTransformer()." },
     "entityResolver": { "kind": "parameter", "displayName": "Entity Resolver", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.xml.sax.EntityResolver", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom org.xml.sax.EntityResolver with javax.xml.transform.sax.SAXSource." },
     "errorListener": { "kind": "parameter", "displayName": "Error Listener", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "javax.xml.transform.ErrorListener", "deprecated": false, "autowired": false, "secret": false, "description": "Allows to configure to use a custom javax.xml.transform.ErrorListener. Beware when doing this then the default error listener which captures any errors or fatal errors and store information on the Exchange as prop [...]
diff --git a/components/camel-xslt/src/main/docs/xslt-component.adoc b/components/camel-xslt/src/main/docs/xslt-component.adoc
index 87d4e112ccb..5e2e270aac8 100644
--- a/components/camel-xslt/src/main/docs/xslt-component.adoc
+++ b/components/camel-xslt/src/main/docs/xslt-component.adoc
@@ -57,7 +57,9 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
-
+/ component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 == Using XSLT endpoints
 
diff --git a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/FileResultHandlerFactory.java b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/FileResultHandlerFactory.java
index 08e92c5e95e..bf71b6278cb 100644
--- a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/FileResultHandlerFactory.java
+++ b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/FileResultHandlerFactory.java
@@ -28,7 +28,7 @@ public class FileResultHandlerFactory implements ResultHandlerFactory {
 
     @Override
     public ResultHandler createResult(Exchange exchange) throws Exception {
-        String fileName = ExchangeHelper.getMandatoryHeader(exchange, Exchange.XSLT_FILE_NAME, String.class);
+        String fileName = ExchangeHelper.getMandatoryHeader(exchange, XsltConstants.XSLT_FILE_NAME, String.class);
         return new FileResultHandler(new File(fileName));
     }
 }
diff --git a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltBuilder.java b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltBuilder.java
index af7556e78ac..0fc6904e955 100644
--- a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltBuilder.java
+++ b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltBuilder.java
@@ -95,7 +95,7 @@ public class XsltBuilder implements Processor {
 
         if (isDeleteOutputFile()) {
             // add on completion so we can delete the file when the Exchange is done
-            String fileName = ExchangeHelper.getMandatoryHeader(exchange, Exchange.XSLT_FILE_NAME, String.class);
+            String fileName = ExchangeHelper.getMandatoryHeader(exchange, XsltConstants.XSLT_FILE_NAME, String.class);
             exchange.adapt(ExtendedExchange.class).addOnCompletion(new XsltBuilderOnCompletion(fileName));
         }
 
diff --git a/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConstants.java b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltConstants.java
similarity index 71%
copy from components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConstants.java
copy to components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltConstants.java
index 70f391ca569..9d92ad6db83 100644
--- a/components/camel-weather/src/main/java/org/apache/camel/component/weather/WeatherConstants.java
+++ b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltConstants.java
@@ -14,17 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.weather;
+package org.apache.camel.component.xslt;
 
-/**
- * The Weather constants
- */
-public final class WeatherConstants {
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.Metadata;
 
-    public static final String WEATHER_LOCATION = "CamelWeatherLocation";
-    public static final String WEATHER_QUERY = "CamelWeatherQuery";
+public final class XsltConstants {
 
-    private WeatherConstants() {
-    }
+    @Metadata(description = "The XSLT file name", javaType = "String")
+    public static final String XSLT_FILE_NAME = Exchange.XSLT_FILE_NAME;
 
+    private XsltConstants() {
+
+    }
 }
diff --git a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltEndpoint.java b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltEndpoint.java
index 9d3b8971a38..2285fcf2a4e 100644
--- a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltEndpoint.java
+++ b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltEndpoint.java
@@ -52,7 +52,7 @@ import org.slf4j.LoggerFactory;
  */
 @ManagedResource(description = "Managed XsltEndpoint")
 @UriEndpoint(firstVersion = "1.3.0", scheme = "xslt", title = "XSLT", syntax = "xslt:resourceUri", producerOnly = true,
-             label = "core,transformation")
+             label = "core,transformation", headersClass = XsltConstants.class)
 public class XsltEndpoint extends ProcessorEndpoint {
 
     private static final Logger LOG = LoggerFactory.getLogger(XsltEndpoint.class);
@@ -206,7 +206,7 @@ public class XsltEndpoint extends ProcessorEndpoint {
     /**
      * Option to specify which output type to use. Possible values are: string, bytes, DOM, file. The first three
      * options are all in memory based, where as file is streamed directly to a java.io.File. For file you must specify
-     * the filename in the IN header with the key Exchange.XSLT_FILE_NAME which is also CamelXsltFileName. Also any
+     * the filename in the IN header with the key XsltConstants.XSLT_FILE_NAME which is also CamelXsltFileName. Also any
      * paths leading to the filename must be created beforehand, otherwise an exception is thrown at runtime.
      */
     public void setOutput(XsltOutput output) {
diff --git a/components/camel-zookeeper/src/generated/resources/org/apache/camel/component/zookeeper/zookeeper.json b/components/camel-zookeeper/src/generated/resources/org/apache/camel/component/zookeeper/zookeeper.json
index 152df552d80..3bbad81d80d 100644
--- a/components/camel-zookeeper/src/generated/resources/org/apache/camel/component/zookeeper/zookeeper.json
+++ b/components/camel-zookeeper/src/generated/resources/org/apache/camel/component/zookeeper/zookeeper.json
@@ -34,6 +34,15 @@
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
     "configuration": { "kind": "property", "displayName": "Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.zookeeper.ZooKeeperConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "To use a shared ZooKeeperConfiguration" }
   },
+  "headers": {
+    "CamelZooKeeperNode": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The node" },
+    "CamelZooKeeperVersion": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "-1", "description": "The node version" },
+    "CamelZookeeperAcl": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "List<ACL>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "Ids.OPEN_ACL_UNSAFE", "description": "The ACL" },
+    "CamelZookeeperCreateMode": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "org.apache.zookeeper.CreateMode or String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The create mode" },
+    "CamelZookeeperStatistics": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "org.apache.zookeeper.data.Stat", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The statistics" },
+    "CamelZookeeperEventType": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "org.apache.zookeeper.Watcher.Event.EventType", "enum": [ "None", "NodeCreated", "NodeDeleted", "NodeDataChanged", "NodeChildrenChanged", "DataWatchRemoved", "ChildWatchRemoved" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The event type" },
+    "CamelZookeeperOperation": { "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform" }
+  },
   "properties": {
     "serverUrls": { "kind": "path", "displayName": "Server Urls", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.zookeeper.ZooKeeperConfiguration", "configurationField": "configuration", "description": "The zookeeper server hosts (multiple servers can be separated by comma)" },
     "path": { "kind": "path", "displayName": "Path", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.zookeeper.ZooKeeperConfiguration", "configurationField": "configuration", "description": "The node in the ZooKeeper server (aka znode)" },
diff --git a/components/camel-zookeeper/src/main/docs/zookeeper-component.adoc b/components/camel-zookeeper/src/main/docs/zookeeper-component.adoc
index b82d6c330b8..6bbc479e989 100644
--- a/components/camel-zookeeper/src/main/docs/zookeeper-component.adoc
+++ b/components/camel-zookeeper/src/main/docs/zookeeper-component.adoc
@@ -60,7 +60,9 @@ include::partial$component-endpoint-options.adoc[]
 
 // endpoint options: END
 
-
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
 
 == Use cases
 
diff --git a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/ZooKeeperEndpoint.java b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/ZooKeeperEndpoint.java
index 03d13fdeee8..cd34caeb36d 100644
--- a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/ZooKeeperEndpoint.java
+++ b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/ZooKeeperEndpoint.java
@@ -34,7 +34,7 @@ import org.apache.camel.support.DefaultEndpoint;
  */
 @ManagedResource(description = "ZooKeeper Endpoint")
 @UriEndpoint(firstVersion = "2.9.0", scheme = "zookeeper", title = "ZooKeeper", syntax = "zookeeper:serverUrls/path",
-             category = { Category.CLUSTERING, Category.MANAGEMENT, Category.BIGDATA })
+             category = { Category.CLUSTERING, Category.MANAGEMENT, Category.BIGDATA }, headersClass = ZooKeeperMessage.class)
 public class ZooKeeperEndpoint extends DefaultEndpoint {
     @UriParam
     private ZooKeeperConfiguration configuration;
diff --git a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/ZooKeeperMessage.java b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/ZooKeeperMessage.java
index b443a7841a2..3c9e89dc854 100644
--- a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/ZooKeeperMessage.java
+++ b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/ZooKeeperMessage.java
@@ -21,6 +21,7 @@ import java.util.Map;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Message;
+import org.apache.camel.spi.Metadata;
 import org.apache.camel.support.DefaultMessage;
 import org.apache.zookeeper.WatchedEvent;
 import org.apache.zookeeper.data.Stat;
@@ -32,20 +33,21 @@ import org.apache.zookeeper.data.Stat;
  */
 public class ZooKeeperMessage extends DefaultMessage {
 
+    @Metadata(description = "The node", javaType = "String")
     public static final String ZOOKEEPER_NODE = "CamelZooKeeperNode";
-
+    @Metadata(description = "The node version", javaType = "Integer", defaultValue = "-1")
     public static final String ZOOKEEPER_NODE_VERSION = "CamelZooKeeperVersion";
 
     public static final String ZOOKEEPER_ERROR_CODE = "CamelZooKeeperErrorCode";
-
+    @Metadata(description = "The ACL", javaType = "List<ACL>", defaultValue = "Ids.OPEN_ACL_UNSAFE")
     public static final String ZOOKEEPER_ACL = "CamelZookeeperAcl";
-
+    @Metadata(description = "The create mode", javaType = "org.apache.zookeeper.CreateMode or String")
     public static final String ZOOKEEPER_CREATE_MODE = "CamelZookeeperCreateMode";
-
+    @Metadata(description = "The statistics", javaType = "org.apache.zookeeper.data.Stat")
     public static final String ZOOKEEPER_STATISTICS = "CamelZookeeperStatistics";
-
+    @Metadata(description = "The event type", javaType = "org.apache.zookeeper.Watcher.Event.EventType")
     public static final String ZOOKEEPER_EVENT_TYPE = "CamelZookeeperEventType";
-
+    @Metadata(label = "producer", description = "The operation to perform", javaType = "String")
     public static final String ZOOKEEPER_OPERATION = "CamelZookeeperOperation";
 
     public ZooKeeperMessage(CamelContext camelContext) {