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

[camel] branch master updated: CAMEL-14492: Separete etcd into 3 different endpoints as they are different. This also causes problems with generated configurer classes.

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

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


The following commit(s) were added to refs/heads/master by this push:
     new e703d7f  CAMEL-14492: Separete etcd into 3 different endpoints as they are different. This also causes problems with generated configurer classes.
e703d7f is described below

commit e703d7f3ef988b5619fba731d92dc7ddd6047a36
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Feb 12 11:14:59 2020 +0100

    CAMEL-14492: Separete etcd into 3 different endpoints as they are different. This also causes problems with generated configurer classes.
---
 components/camel-etcd/pom.xml                      |   3 -
 ...gurer.java => EtcdKeysComponentConfigurer.java} |  10 +-
 .../component/etcd/EtcdKeysEndpointConfigurer.java |  40 ++++
 ...urer.java => EtcdStatsComponentConfigurer.java} |   4 +-
 ...gurer.java => EtcdStatsEndpointConfigurer.java} |   4 +-
 ...urer.java => EtcdWatchComponentConfigurer.java} |  10 +-
 .../etcd/EtcdWatchEndpointConfigurer.java          |  46 +++++
 .../services/org/apache/camel/component.properties |   2 +-
 .../org/apache/camel/component/{etcd => etcd-keys} |   2 +-
 .../apache/camel/component/{etcd => etcd-stats}    |   2 +-
 .../apache/camel/component/{etcd => etcd-watch}    |   2 +-
 .../org/apache/camel/configurer/etcd-component     |   2 -
 .../org/apache/camel/configurer/etcd-endpoint      |   2 -
 .../apache/camel/configurer/etcd-keys-component    |   2 +
 .../org/apache/camel/configurer/etcd-keys-endpoint |   2 +
 .../apache/camel/configurer/etcd-stats-component   |   2 +
 .../apache/camel/configurer/etcd-stats-endpoint    |   2 +
 .../apache/camel/configurer/etcd-watch-component   |   2 +
 .../apache/camel/configurer/etcd-watch-endpoint    |   2 +
 .../org/apache/camel/component/etcd/etcd-keys.json |  45 +++++
 .../component/etcd/{etcd.json => etcd-stats.json}  |  11 +-
 .../apache/camel/component/etcd/etcd-watch.json    |  48 +++++
 .../src/main/docs/etcd-keys-component.adoc         |  80 ++++++++
 ...cd-component.adoc => etcd-stats-component.adoc} |  17 +-
 .../src/main/docs/etcd-watch-component.adoc        |  83 ++++++++
 ...cdComponent.java => AbstractEtcdComponent.java} |  50 +----
 .../camel/component/etcd/AbstractEtcdConsumer.java |   8 +-
 .../camel/component/etcd/AbstractEtcdEndpoint.java |  16 +-
 .../etcd/AbstractEtcdPollingEndpoint.java          |  18 +-
 .../camel/component/etcd/AbstractEtcdProducer.java |   8 +-
 .../apache/camel/component/etcd/EtcdEndpoint.java  |   2 -
 .../camel/component/etcd/EtcdKeysComponent.java    |  50 +++++
 .../camel/component/etcd/EtcdKeysEndpoint.java     |   9 +-
 .../camel/component/etcd/EtcdKeysProducer.java     |  10 +-
 .../apache/camel/component/etcd/EtcdNamespace.java |  22 ---
 ...dStatsProducer.java => EtcdStatsComponent.java} |  37 ++--
 .../camel/component/etcd/EtcdStatsConsumer.java    |   2 +-
 .../camel/component/etcd/EtcdStatsEndpoint.java    |  12 +-
 .../camel/component/etcd/EtcdStatsProducer.java    |   6 +-
 ...dStatsProducer.java => EtcdWatchComponent.java} |  37 ++--
 .../camel/component/etcd/EtcdWatchConsumer.java    |   8 +-
 .../camel/component/etcd/EtcdWatchEndpoint.java    |  12 +-
 .../apache/camel/component/etcd/EtcdKeysTest.java  |  12 +-
 .../apache/camel/component/etcd/EtcdStatsTest.java |  14 +-
 .../apache/camel/component/etcd/EtcdWatchTest.java |  14 +-
 .../component/ComponentsBuilderFactory.java        |  35 ++++
 .../dsl/EtcdKeysComponentBuilderFactory.java       | 187 ++++++++++++++++++
 .../dsl/EtcdStatsComponentBuilderFactory.java      | 209 +++++++++++++++++++++
 .../dsl/EtcdWatchComponentBuilderFactory.java      | 187 ++++++++++++++++++
 .../src/generated/resources/metadata.json          |  60 ++++++
 50 files changed, 1223 insertions(+), 227 deletions(-)

diff --git a/components/camel-etcd/pom.xml b/components/camel-etcd/pom.xml
index 684a99b..7979a35 100644
--- a/components/camel-etcd/pom.xml
+++ b/components/camel-etcd/pom.xml
@@ -32,9 +32,6 @@
     <name>Camel :: Etcd</name>
     <description>Camel Etcd support</description>
 
-    <properties>
-    </properties>
-
     <dependencies>
 
         <dependency>
diff --git a/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdComponentConfigurer.java b/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdKeysComponentConfigurer.java
similarity index 85%
copy from components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdComponentConfigurer.java
copy to components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdKeysComponentConfigurer.java
index bc0fc55..488b719 100644
--- a/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdComponentConfigurer.java
+++ b/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdKeysComponentConfigurer.java
@@ -9,22 +9,20 @@ import org.apache.camel.support.component.PropertyConfigurerSupport;
  * Generated by camel build tools - do NOT edit this file!
  */
 @SuppressWarnings("unchecked")
-public class EtcdComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
+public class EtcdKeysComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
 
     @Override
     public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
-        EtcdComponent target = (EtcdComponent) obj;
+        EtcdKeysComponent target = (EtcdKeysComponent) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
         case "password": target.setPassword(property(camelContext, java.lang.String.class, value)); return true;
         case "sslcontextparameters":
         case "sslContextParameters": target.setSslContextParameters(property(camelContext, org.apache.camel.support.jsse.SSLContextParameters.class, value)); return true;
         case "uris": target.setUris(property(camelContext, java.lang.String.class, value)); return true;
         case "username":
         case "userName": target.setUserName(property(camelContext, java.lang.String.class, value)); return true;
-        case "bridgeerrorhandler":
-        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
-        case "lazystartproducer":
-        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
         case "basicpropertybinding":
         case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
         case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.etcd.EtcdConfiguration.class, value)); return true;
diff --git a/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdKeysEndpointConfigurer.java b/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdKeysEndpointConfigurer.java
new file mode 100644
index 0000000..054d272
--- /dev/null
+++ b/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdKeysEndpointConfigurer.java
@@ -0,0 +1,40 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.etcd;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class EtcdKeysEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        EtcdKeysEndpoint target = (EtcdKeysEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "recursive": target.getConfiguration().setRecursive(property(camelContext, boolean.class, value)); return true;
+        case "servicepath":
+        case "servicePath": target.getConfiguration().setServicePath(property(camelContext, java.lang.String.class, value)); return true;
+        case "timeout": target.getConfiguration().setTimeout(property(camelContext, java.lang.Long.class, value)); return true;
+        case "timetolive":
+        case "timeToLive": target.getConfiguration().setTimeToLive(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "uris": target.getConfiguration().setUris(property(camelContext, java.lang.String.class, value)); return true;
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "synchronous": target.setSynchronous(property(camelContext, boolean.class, value)); return true;
+        case "password": target.getConfiguration().setPassword(property(camelContext, java.lang.String.class, value)); return true;
+        case "sslcontextparameters":
+        case "sslContextParameters": target.getConfiguration().setSslContextParameters(property(camelContext, org.apache.camel.support.jsse.SSLContextParameters.class, value)); return true;
+        case "username":
+        case "userName": target.getConfiguration().setUserName(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+}
+
diff --git a/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdComponentConfigurer.java b/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdStatsComponentConfigurer.java
similarity index 91%
copy from components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdComponentConfigurer.java
copy to components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdStatsComponentConfigurer.java
index bc0fc55..8dbe18d 100644
--- a/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdComponentConfigurer.java
+++ b/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdStatsComponentConfigurer.java
@@ -9,11 +9,11 @@ import org.apache.camel.support.component.PropertyConfigurerSupport;
  * Generated by camel build tools - do NOT edit this file!
  */
 @SuppressWarnings("unchecked")
-public class EtcdComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
+public class EtcdStatsComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
 
     @Override
     public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
-        EtcdComponent target = (EtcdComponent) obj;
+        EtcdStatsComponent target = (EtcdStatsComponent) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "password": target.setPassword(property(camelContext, java.lang.String.class, value)); return true;
         case "sslcontextparameters":
diff --git a/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/AbstractEtcdPollingEndpointConfigurer.java b/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdStatsEndpointConfigurer.java
similarity index 96%
rename from components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/AbstractEtcdPollingEndpointConfigurer.java
rename to components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdStatsEndpointConfigurer.java
index 37bfa1a..21e7cd9 100644
--- a/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/AbstractEtcdPollingEndpointConfigurer.java
+++ b/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdStatsEndpointConfigurer.java
@@ -9,11 +9,11 @@ import org.apache.camel.support.component.PropertyConfigurerSupport;
  * Generated by camel build tools - do NOT edit this file!
  */
 @SuppressWarnings("unchecked")
-public class AbstractEtcdPollingEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
+public class EtcdStatsEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
 
     @Override
     public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
-        AbstractEtcdPollingEndpoint target = (AbstractEtcdPollingEndpoint) obj;
+        EtcdStatsEndpoint target = (EtcdStatsEndpoint) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "recursive": target.getConfiguration().setRecursive(property(camelContext, boolean.class, value)); return true;
         case "servicepath":
diff --git a/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdComponentConfigurer.java b/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdWatchComponentConfigurer.java
similarity index 85%
rename from components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdComponentConfigurer.java
rename to components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdWatchComponentConfigurer.java
index bc0fc55..90cb9b6 100644
--- a/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdComponentConfigurer.java
+++ b/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdWatchComponentConfigurer.java
@@ -9,22 +9,20 @@ import org.apache.camel.support.component.PropertyConfigurerSupport;
  * Generated by camel build tools - do NOT edit this file!
  */
 @SuppressWarnings("unchecked")
-public class EtcdComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
+public class EtcdWatchComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
 
     @Override
     public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
-        EtcdComponent target = (EtcdComponent) obj;
+        EtcdWatchComponent target = (EtcdWatchComponent) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
         case "password": target.setPassword(property(camelContext, java.lang.String.class, value)); return true;
         case "sslcontextparameters":
         case "sslContextParameters": target.setSslContextParameters(property(camelContext, org.apache.camel.support.jsse.SSLContextParameters.class, value)); return true;
         case "uris": target.setUris(property(camelContext, java.lang.String.class, value)); return true;
         case "username":
         case "userName": target.setUserName(property(camelContext, java.lang.String.class, value)); return true;
-        case "bridgeerrorhandler":
-        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
-        case "lazystartproducer":
-        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
         case "basicpropertybinding":
         case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
         case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.etcd.EtcdConfiguration.class, value)); return true;
diff --git a/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdWatchEndpointConfigurer.java b/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdWatchEndpointConfigurer.java
new file mode 100644
index 0000000..c01937f
--- /dev/null
+++ b/components/camel-etcd/src/generated/java/org/apache/camel/component/etcd/EtcdWatchEndpointConfigurer.java
@@ -0,0 +1,46 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.etcd;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class EtcdWatchEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        EtcdWatchEndpoint target = (EtcdWatchEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "recursive": target.getConfiguration().setRecursive(property(camelContext, boolean.class, value)); return true;
+        case "sendemptyexchangeontimeout":
+        case "sendEmptyExchangeOnTimeout": target.getConfiguration().setSendEmptyExchangeOnTimeout(property(camelContext, boolean.class, value)); return true;
+        case "servicepath":
+        case "servicePath": target.getConfiguration().setServicePath(property(camelContext, java.lang.String.class, value)); return true;
+        case "timeout": target.getConfiguration().setTimeout(property(camelContext, java.lang.Long.class, value)); return true;
+        case "uris": target.getConfiguration().setUris(property(camelContext, java.lang.String.class, value)); return true;
+        case "exceptionhandler":
+        case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
+        case "exchangepattern":
+        case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true;
+        case "fromindex":
+        case "fromIndex": target.getConfiguration().setFromIndex(property(camelContext, java.lang.Long.class, value)); return true;
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "synchronous": target.setSynchronous(property(camelContext, boolean.class, value)); return true;
+        case "password": target.getConfiguration().setPassword(property(camelContext, java.lang.String.class, value)); return true;
+        case "sslcontextparameters":
+        case "sslContextParameters": target.getConfiguration().setSslContextParameters(property(camelContext, org.apache.camel.support.jsse.SSLContextParameters.class, value)); return true;
+        case "username":
+        case "userName": target.getConfiguration().setUserName(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+}
+
diff --git a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component.properties
index d7d9294..95b0197 100644
--- a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component.properties
+++ b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -1,5 +1,5 @@
 # Generated by camel build tools - do NOT edit this file!
-components=etcd
+components=etcd-keys etcd-stats etcd-watch
 groupId=org.apache.camel
 artifactId=camel-etcd
 version=3.1.0-SNAPSHOT
diff --git a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd-keys
similarity index 50%
copy from components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd
copy to components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd-keys
index bdf03f3..af8896b 100644
--- a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd
+++ b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd-keys
@@ -1,2 +1,2 @@
 # Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.component.etcd.EtcdComponent
+class=org.apache.camel.component.etcd.EtcdKeysComponent
diff --git a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd-stats
similarity index 50%
copy from components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd
copy to components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd-stats
index bdf03f3..05e1ca7 100644
--- a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd
+++ b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd-stats
@@ -1,2 +1,2 @@
 # Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.component.etcd.EtcdComponent
+class=org.apache.camel.component.etcd.EtcdStatsComponent
diff --git a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd-watch
similarity index 50%
rename from components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd
rename to components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd-watch
index bdf03f3..d817925 100644
--- a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd
+++ b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/component/etcd-watch
@@ -1,2 +1,2 @@
 # Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.component.etcd.EtcdComponent
+class=org.apache.camel.component.etcd.EtcdWatchComponent
diff --git a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-component b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-component
deleted file mode 100644
index 2ae4794..0000000
--- a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-component
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.component.etcd.EtcdComponentConfigurer
diff --git a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-endpoint b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-endpoint
deleted file mode 100644
index 4901ea1..0000000
--- a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-endpoint
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.component.etcd.AbstractEtcdPollingEndpointConfigurer
diff --git a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-keys-component b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-keys-component
new file mode 100644
index 0000000..91f815b
--- /dev/null
+++ b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-keys-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.etcd.EtcdKeysComponentConfigurer
diff --git a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-keys-endpoint b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-keys-endpoint
new file mode 100644
index 0000000..195cbfb
--- /dev/null
+++ b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-keys-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.etcd.EtcdKeysEndpointConfigurer
diff --git a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-stats-component b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-stats-component
new file mode 100644
index 0000000..d5d3d91
--- /dev/null
+++ b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-stats-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.etcd.EtcdStatsComponentConfigurer
diff --git a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-stats-endpoint b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-stats-endpoint
new file mode 100644
index 0000000..b5357f3
--- /dev/null
+++ b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-stats-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.etcd.EtcdStatsEndpointConfigurer
diff --git a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-watch-component b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-watch-component
new file mode 100644
index 0000000..0f2a28e
--- /dev/null
+++ b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-watch-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.etcd.EtcdWatchComponentConfigurer
diff --git a/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-watch-endpoint b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-watch-endpoint
new file mode 100644
index 0000000..748906c
--- /dev/null
+++ b/components/camel-etcd/src/generated/resources/META-INF/services/org/apache/camel/configurer/etcd-watch-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.etcd.EtcdWatchEndpointConfigurer
diff --git a/components/camel-etcd/src/generated/resources/org/apache/camel/component/etcd/etcd-keys.json b/components/camel-etcd/src/generated/resources/org/apache/camel/component/etcd/etcd-keys.json
new file mode 100644
index 0000000..7bd54b0
--- /dev/null
+++ b/components/camel-etcd/src/generated/resources/org/apache/camel/component/etcd/etcd-keys.json
@@ -0,0 +1,45 @@
+{
+  "component": {
+    "kind": "component",
+    "scheme": "etcd-keys",
+    "extendsScheme": "",
+    "syntax": "etcd-keys:path",
+    "title": "Etcd Keys",
+    "description": "Camel Etcd support",
+    "label": "clustering,database",
+    "deprecated": false,
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false,
+    "javaType": "org.apache.camel.component.etcd.EtcdKeysComponent",
+    "firstVersion": "2.18.0",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-etcd",
+    "version": "3.1.0-SNAPSHOT"
+  },
+  "componentProperties": {
+    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": 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 starting and cause the r [...]
+    "password": { "kind": "property", "displayName": "Password", "group": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The password to use for basic authentication." },
+    "sslContextParameters": { "kind": "property", "displayName": "Ssl Context Parameters", "group": "producer", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "secret": false, "description": "To configure security using SSLContextParameters." },
+    "uris": { "kind": "property", "displayName": "Uris", "group": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "To set the URIs the client connects." },
+    "userName": { "kind": "property", "displayName": "User Name", "group": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The user name to use for basic authentication." },
+    "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "configuration": { "kind": "property", "displayName": "Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd.EtcdConfiguration", "deprecated": false, "secret": false, "description": "Sets the common configuration shared among endpoints" },
+    "useGlobalSslContextParameters": { "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Enable usage of global SSL context parameters." }
+  },
+  "properties": {
+    "path": { "kind": "path", "displayName": "Path", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The path the endpoint refers to" },
+    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": 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 starting and cause the  [...]
+    "recursive": { "kind": "parameter", "displayName": "Recursive", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "To apply an action recursively." },
+    "servicePath": { "kind": "parameter", "displayName": "Service Path", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "defaultValue": "\/services\/", "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "The path to look for for service discovery" },
+    "timeout": { "kind": "parameter", "displayName": "Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Long", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "To set the maximum time an action could take to complete." },
+    "timeToLive": { "kind": "parameter", "displayName": "Time To Live", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "To set the lifespan of a key in milliseconds." },
+    "uris": { "kind": "parameter", "displayName": "Uris", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "defaultValue": "http:\/\/localhost:2379,http:\/\/localhost:4001", "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "To set the URIs the client connects." },
+    "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." },
+    "password": { "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "The password to use for basic authentication." },
+    "sslContextParameters": { "kind": "parameter", "displayName": "Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "To configure security using SSLContextParameters." },
+    "userName": { "kind": "parameter", "displayName": "User Name", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "The user name to use for basic authentication." }
+  }
+}
diff --git a/components/camel-etcd/src/generated/resources/org/apache/camel/component/etcd/etcd.json b/components/camel-etcd/src/generated/resources/org/apache/camel/component/etcd/etcd-stats.json
similarity index 96%
rename from components/camel-etcd/src/generated/resources/org/apache/camel/component/etcd/etcd.json
rename to components/camel-etcd/src/generated/resources/org/apache/camel/component/etcd/etcd-stats.json
index d8a2f39..086d20b 100644
--- a/components/camel-etcd/src/generated/resources/org/apache/camel/component/etcd/etcd.json
+++ b/components/camel-etcd/src/generated/resources/org/apache/camel/component/etcd/etcd-stats.json
@@ -1,10 +1,10 @@
 {
   "component": {
     "kind": "component",
-    "scheme": "etcd",
+    "scheme": "etcd-stats",
     "extendsScheme": "",
-    "syntax": "etcd:namespace\/path",
-    "title": "Etcd",
+    "syntax": "etcd-stats:path",
+    "title": "Etcd Stats",
     "description": "The camel etcd component allows you to work with Etcd, a distributed reliable key-value store.",
     "label": "clustering,database",
     "deprecated": false,
@@ -12,7 +12,7 @@
     "consumerOnly": false,
     "producerOnly": false,
     "lenientProperties": false,
-    "javaType": "org.apache.camel.component.etcd.EtcdComponent",
+    "javaType": "org.apache.camel.component.etcd.EtcdStatsComponent",
     "firstVersion": "2.18.0",
     "groupId": "org.apache.camel",
     "artifactId": "camel-etcd",
@@ -30,8 +30,7 @@
     "useGlobalSslContextParameters": { "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Enable usage of global SSL context parameters." }
   },
   "properties": {
-    "namespace": { "kind": "path", "displayName": "Namespace", "group": "common", "label": "", "required": true, "type": "object", "javaType": "org.apache.camel.component.etcd.EtcdNamespace", "enum": [ "keys", "stats", "watch" ], "deprecated": false, "deprecationNote": "", "secret": false, "description": "The API namespace to use" },
-    "path": { "kind": "path", "displayName": "Path", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "secret": false, "description": "The path the endpoint refers to" },
+    "path": { "kind": "path", "displayName": "Path", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The path the endpoint refers to" },
     "recursive": { "kind": "parameter", "displayName": "Recursive", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "To apply an action recursively." },
     "servicePath": { "kind": "parameter", "displayName": "Service Path", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "defaultValue": "\/services\/", "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "The path to look for for service discovery" },
     "timeout": { "kind": "parameter", "displayName": "Timeout", "group": "common", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Long", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "To set the maximum time an action could take to complete." },
diff --git a/components/camel-etcd/src/generated/resources/org/apache/camel/component/etcd/etcd-watch.json b/components/camel-etcd/src/generated/resources/org/apache/camel/component/etcd/etcd-watch.json
new file mode 100644
index 0000000..b5d2d0a
--- /dev/null
+++ b/components/camel-etcd/src/generated/resources/org/apache/camel/component/etcd/etcd-watch.json
@@ -0,0 +1,48 @@
+{
+  "component": {
+    "kind": "component",
+    "scheme": "etcd-watch",
+    "extendsScheme": "",
+    "syntax": "etcd-watch:path",
+    "title": "Etcd Watch",
+    "description": "The camel etcd component allows you to work with Etcd, a distributed reliable key-value store.",
+    "label": "clustering,database",
+    "deprecated": false,
+    "async": false,
+    "consumerOnly": true,
+    "producerOnly": false,
+    "lenientProperties": false,
+    "javaType": "org.apache.camel.component.etcd.EtcdWatchComponent",
+    "firstVersion": "2.18.0",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-etcd",
+    "version": "3.1.0-SNAPSHOT"
+  },
+  "componentProperties": {
+    "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": 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 message and handled by [...]
+    "password": { "kind": "property", "displayName": "Password", "group": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The password to use for basic authentication." },
+    "sslContextParameters": { "kind": "property", "displayName": "Ssl Context Parameters", "group": "consumer", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "secret": false, "description": "To configure security using SSLContextParameters." },
+    "uris": { "kind": "property", "displayName": "Uris", "group": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "To set the URIs the client connects." },
+    "userName": { "kind": "property", "displayName": "User Name", "group": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The user name to use for basic authentication." },
+    "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "configuration": { "kind": "property", "displayName": "Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.etcd.EtcdConfiguration", "deprecated": false, "secret": false, "description": "Sets the common configuration shared among endpoints" },
+    "useGlobalSslContextParameters": { "kind": "property", "displayName": "Use Global Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Enable usage of global SSL context parameters." }
+  },
+  "properties": {
+    "path": { "kind": "path", "displayName": "Path", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The path the endpoint refers to" },
+    "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": 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 message and handled b [...]
+    "recursive": { "kind": "parameter", "displayName": "Recursive", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "To apply an action recursively." },
+    "sendEmptyExchangeOnTimeout": { "kind": "parameter", "displayName": "Send Empty Exchange On Timeout", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "To send an empty message in case of timeout watching for a key." },
+    "servicePath": { "kind": "parameter", "displayName": "Service Path", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "defaultValue": "\/services\/", "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "The path to look for for service discovery" },
+    "timeout": { "kind": "parameter", "displayName": "Timeout", "group": "consumer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Long", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "To set the maximum time an action could take to complete." },
+    "uris": { "kind": "parameter", "displayName": "Uris", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "defaultValue": "http:\/\/localhost:2379,http:\/\/localhost:4001", "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "To set the URIs the client connects." },
+    "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with [...]
+    "exchangePattern": { "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut", "InOptionalOut" ], "deprecated": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
+    "fromIndex": { "kind": "parameter", "displayName": "From Index", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "integer", "javaType": "java.lang.Long", "deprecated": false, "secret": false, "defaultValue": "0", "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "The index to watch from" },
+    "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." },
+    "password": { "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "The password to use for basic authentication." },
+    "sslContextParameters": { "kind": "parameter", "displayName": "Ssl Context Parameters", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "To configure security using SSLContextParameters." },
+    "userName": { "kind": "parameter", "displayName": "User Name", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.etcd.EtcdConfiguration", "configurationField": "configuration", "description": "The user name to use for basic authentication." }
+  }
+}
diff --git a/components/camel-etcd/src/main/docs/etcd-keys-component.adoc b/components/camel-etcd/src/main/docs/etcd-keys-component.adoc
new file mode 100644
index 0000000..84af14b
--- /dev/null
+++ b/components/camel-etcd/src/main/docs/etcd-keys-component.adoc
@@ -0,0 +1,80 @@
+[[etcd-keys-component]]
+= Etcd Keys Component
+
+*Since Camel 2.18*
+
+// HEADER START
+*Only producer is supported*
+// HEADER END
+
+*Since Camel 2.18*
+
+
+The camel Etcd component allows you to work with Etcd, a distributed reliable key-value store.
+
+== URI Format
+
+[source,java]
+----------------------------
+etcd-keys:path[?options]
+----------------------------
+
+== URI Options
+
+// component options: START
+The Etcd Keys component supports 8 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
+| *password* (producer) | The password to use for basic authentication. |  | String
+| *sslContextParameters* (producer) | To configure security using SSLContextParameters. |  | SSLContextParameters
+| *uris* (producer) | To set the URIs the client connects. |  | String
+| *userName* (producer) | The user name to use for basic authentication. |  | String
+| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *configuration* (advanced) | Sets the common configuration shared among endpoints |  | EtcdConfiguration
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+|===
+// component options: END
+
+// endpoint options: START
+The Etcd Keys endpoint is configured using URI syntax:
+
+----
+etcd-keys:path
+----
+
+with the following path and query parameters:
+
+=== Path Parameters (1 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *path* | The path the endpoint refers to |  | String
+|===
+
+
+=== Query Parameters (11 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
+| *recursive* (producer) | To apply an action recursively. | false | boolean
+| *servicePath* (producer) | The path to look for for service discovery | /services/ | String
+| *timeout* (producer) | To set the maximum time an action could take to complete. |  | Long
+| *timeToLive* (producer) | To set the lifespan of a key in milliseconds. |  | Integer
+| *uris* (producer) | To set the URIs the client connects. | http://localhost:2379,http://localhost:4001 | String
+| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+| *password* (security) | The password to use for basic authentication. |  | String
+| *sslContextParameters* (security) | To configure security using SSLContextParameters. |  | SSLContextParameters
+| *userName* (security) | The user name to use for basic authentication. |  | String
+|===
+// endpoint options: END
\ No newline at end of file
diff --git a/components/camel-etcd/src/main/docs/etcd-component.adoc b/components/camel-etcd/src/main/docs/etcd-stats-component.adoc
similarity index 95%
rename from components/camel-etcd/src/main/docs/etcd-component.adoc
rename to components/camel-etcd/src/main/docs/etcd-stats-component.adoc
index c64fc9d..c97de6f 100644
--- a/components/camel-etcd/src/main/docs/etcd-component.adoc
+++ b/components/camel-etcd/src/main/docs/etcd-stats-component.adoc
@@ -1,5 +1,5 @@
-[[etcd-component]]
-= Etcd Component
+[[etcd-stats-component]]
+= Etcd Stats Component
 
 *Since Camel 2.18*
 
@@ -16,13 +16,13 @@ The camel Etcd component allows you to work with Etcd, a distributed reliable ke
 
 [source,java]
 ----------------------------
-etcd:namespace/path[?options]
+etcd-stats:path[?options]
 ----------------------------
 
 == URI Options
 
 // component options: START
-The Etcd component supports 9 options, which are listed below.
+The Etcd Stats component supports 9 options, which are listed below.
 
 
 
@@ -42,21 +42,20 @@ The Etcd component supports 9 options, which are listed below.
 // component options: END
 
 // endpoint options: START
-The Etcd endpoint is configured using URI syntax:
+The Etcd Stats endpoint is configured using URI syntax:
 
 ----
-etcd:namespace/path
+etcd-stats:path
 ----
 
 with the following path and query parameters:
 
-=== Path Parameters (2 parameters):
+=== Path Parameters (1 parameters):
 
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *namespace* | *Required* The API namespace to use. The value can be one of: keys, stats, watch |  | EtcdNamespace
 | *path* | The path the endpoint refers to |  | String
 |===
 
@@ -100,4 +99,4 @@ with the following path and query parameters:
 | *sslContextParameters* (security) | To configure security using SSLContextParameters. |  | SSLContextParameters
 | *userName* (security) | The user name to use for basic authentication. |  | String
 |===
-// endpoint options: END
+// endpoint options: END
\ No newline at end of file
diff --git a/components/camel-etcd/src/main/docs/etcd-watch-component.adoc b/components/camel-etcd/src/main/docs/etcd-watch-component.adoc
new file mode 100644
index 0000000..58f2e3e
--- /dev/null
+++ b/components/camel-etcd/src/main/docs/etcd-watch-component.adoc
@@ -0,0 +1,83 @@
+[[etcd-watch-component]]
+= Etcd Watch Component
+
+*Since Camel 2.18*
+
+// HEADER START
+*Only consumer is supported*
+// HEADER END
+
+*Since Camel 2.18*
+
+
+The camel Etcd component allows you to work with Etcd, a distributed reliable key-value store.
+
+== URI Format
+
+[source,java]
+----------------------------
+etcd-watch:path[?options]
+----------------------------
+
+== URI Options
+
+// component options: START
+The Etcd Watch component supports 8 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
+| *password* (consumer) | The password to use for basic authentication. |  | String
+| *sslContextParameters* (consumer) | To configure security using SSLContextParameters. |  | SSLContextParameters
+| *uris* (consumer) | To set the URIs the client connects. |  | String
+| *userName* (consumer) | The user name to use for basic authentication. |  | String
+| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *configuration* (advanced) | Sets the common configuration shared among endpoints |  | EtcdConfiguration
+| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
+|===
+// component options: END
+
+// endpoint options: START
+The Etcd Watch endpoint is configured using URI syntax:
+
+----
+etcd-watch:path
+----
+
+with the following path and query parameters:
+
+=== Path Parameters (1 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *path* | The path the endpoint refers to |  | String
+|===
+
+
+=== Query Parameters (14 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
+| *recursive* (consumer) | To apply an action recursively. | false | boolean
+| *sendEmptyExchangeOnTimeout* (consumer) | To send an empty message in case of timeout watching for a key. | false | boolean
+| *servicePath* (consumer) | The path to look for for service discovery | /services/ | String
+| *timeout* (consumer) | To set the maximum time an action could take to complete. |  | Long
+| *uris* (consumer) | To set the URIs the client connects. | http://localhost:2379,http://localhost:4001 | String
+| *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
+| *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. The value can be one of: InOnly, InOut, InOptionalOut |  | ExchangePattern
+| *fromIndex* (consumer) | The index to watch from | 0 | Long
+| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+| *password* (security) | The password to use for basic authentication. |  | String
+| *sslContextParameters* (security) | To configure security using SSLContextParameters. |  | SSLContextParameters
+| *userName* (security) | The user name to use for basic authentication. |  | String
+|===
+// endpoint options: END
\ No newline at end of file
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdComponent.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdComponent.java
similarity index 67%
rename from components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdComponent.java
rename to components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdComponent.java
index 032e6c8..98f8ce8 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdComponent.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdComponent.java
@@ -23,26 +23,21 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.SSLContextParametersAware;
 import org.apache.camel.spi.Metadata;
-import org.apache.camel.spi.annotations.Component;
 import org.apache.camel.support.DefaultComponent;
 import org.apache.camel.support.jsse.SSLContextParameters;
 import org.apache.camel.util.StringHelper;
 
-/**
- * Represents the component that manages {@link AbstractEtcdEndpoint}.
- */
-@Component("etcd")
-public class EtcdComponent extends DefaultComponent implements SSLContextParametersAware {
+public abstract class AbstractEtcdComponent extends DefaultComponent implements SSLContextParametersAware {
 
     @Metadata(label = "advanced")
     private EtcdConfiguration configuration = new EtcdConfiguration();
     @Metadata(label = "security", defaultValue = "false")
     private boolean useGlobalSslContextParameters;
 
-    public EtcdComponent() {
+    public AbstractEtcdComponent() {
     }
 
-    public EtcdComponent(CamelContext context) {
+    public AbstractEtcdComponent(CamelContext context) {
         super(context);
     }
 
@@ -118,45 +113,6 @@ public class EtcdComponent extends DefaultComponent implements SSLContextParamet
         this.useGlobalSslContextParameters = useGlobalSslContextParameters;
     }
 
-    @Override
-    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
-        String ns = StringHelper.before(remaining, "/");
-        String path = StringHelper.after(remaining, "/");
-
-        if (ns == null) {
-            ns = remaining;
-        }
-        if (path == null) {
-            path = remaining;
-        }
-
-        EtcdNamespace namespace = getCamelContext().getTypeConverter().mandatoryConvertTo(EtcdNamespace.class, ns);
-        EtcdConfiguration configuration = loadConfiguration(parameters);
-
-        if (namespace != null) {
-            // path must start with leading slash
-            if (!path.startsWith("/")) {
-                path = "/" + path;
-            }
-
-            Endpoint endpoint;
-            if (namespace == EtcdNamespace.stats) {
-                endpoint = new EtcdStatsEndpoint(uri, this, configuration, namespace, path);
-            } else if (namespace == EtcdNamespace.watch) {
-                endpoint = new EtcdWatchEndpoint(uri, this, configuration, namespace, path);
-            } else if (namespace == EtcdNamespace.keys) {
-                endpoint = new EtcdKeysEndpoint(uri, this, configuration, namespace, path);
-            } else {
-                throw new IllegalStateException("No endpoint for " + remaining);
-            }
-
-            setProperties(endpoint, parameters);
-            return endpoint;
-        }
-
-        throw new IllegalStateException("No endpoint for " + remaining);
-    }
-
     protected EtcdConfiguration loadConfiguration(Map<String, Object> parameters) throws Exception {
         EtcdConfiguration configuration = Optional.ofNullable(this.configuration).orElseGet(EtcdConfiguration::new).copy();
         configuration.setCamelContext(getCamelContext());
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdConsumer.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdConsumer.java
index 611f46b..12d67af 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdConsumer.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdConsumer.java
@@ -25,16 +25,14 @@ import org.apache.camel.support.DefaultConsumer;
  */
 public abstract class AbstractEtcdConsumer extends DefaultConsumer {
     private final EtcdConfiguration configuration;
-    private final EtcdNamespace namespace;
     private final String path;
 
     private EtcdClient client;
 
-    protected AbstractEtcdConsumer(AbstractEtcdEndpoint endpoint, Processor processor, EtcdConfiguration configuration, EtcdNamespace namespace, String path) {
+    protected AbstractEtcdConsumer(AbstractEtcdEndpoint endpoint, Processor processor, EtcdConfiguration configuration, String path) {
         super(endpoint, processor);
 
         this.configuration = configuration;
-        this.namespace = namespace;
         this.path = path;
         this.client = null;
     }
@@ -60,10 +58,6 @@ public abstract class AbstractEtcdConsumer extends DefaultConsumer {
         return configuration;
     }
 
-    public EtcdNamespace getNamespace() {
-        return namespace;
-    }
-
     public String getPath() {
         return path;
     }
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdEndpoint.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdEndpoint.java
index 72f11c7..7893488 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdEndpoint.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdEndpoint.java
@@ -17,22 +17,21 @@
 package org.apache.camel.component.etcd;
 
 import mousio.etcd4j.EtcdClient;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriPath;
 import org.apache.camel.support.DefaultEndpoint;
 
-/**
- * The camel etcd component allows you to work with <a href="https://coreos.com/etcd">Etcd</a>, a distributed reliable key-value store.
- */
 public abstract class AbstractEtcdEndpoint extends DefaultEndpoint implements EtcdEndpoint {
 
-    private final EtcdNamespace namespace;
+    @UriPath(description = "The path the endpoint refers to")
     private final String path;
+    @UriParam
     private final EtcdConfiguration configuration;
 
-    protected AbstractEtcdEndpoint(String uri, EtcdComponent component, EtcdConfiguration configuration, EtcdNamespace namespace, String path) {
+    protected AbstractEtcdEndpoint(String uri, AbstractEtcdComponent component, EtcdConfiguration configuration, String path) {
         super(uri, component);
 
         this.configuration = configuration;
-        this.namespace = namespace;
         this.path = path;
     }
 
@@ -42,11 +41,6 @@ public abstract class AbstractEtcdEndpoint extends DefaultEndpoint implements Et
     }
 
     @Override
-    public EtcdNamespace getNamespace() {
-        return this.namespace;
-    }
-
-    @Override
     public String getPath() {
         return this.path;
     }
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdPollingEndpoint.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdPollingEndpoint.java
index 7cc5543..fb9094b 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdPollingEndpoint.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdPollingEndpoint.java
@@ -17,32 +17,21 @@
 package org.apache.camel.component.etcd;
 
 import mousio.etcd4j.EtcdClient;
-import org.apache.camel.spi.Metadata;
-import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
 import org.apache.camel.support.DefaultPollingEndpoint;
 
-/**
- * The camel etcd component allows you to work with <a href="https://coreos.com/etcd">Etcd</a>, a distributed reliable key-value store.
- */
-@UriEndpoint(firstVersion = "2.18.0", scheme = "etcd", title = "Etcd", syntax = "etcd:namespace/path", label = "clustering,database")
 public abstract class AbstractEtcdPollingEndpoint extends DefaultPollingEndpoint implements EtcdEndpoint {
 
-    @UriPath(description = "The API namespace to use", enums = "keys,stats,watch")
-    @Metadata(required = true)
-    private final EtcdNamespace namespace;
     @UriPath(description = "The path the endpoint refers to")
-    @Metadata(required = false)
     private final String path;
     @UriParam
     private final EtcdConfiguration configuration;
 
-    protected AbstractEtcdPollingEndpoint(String uri, EtcdComponent component, EtcdConfiguration configuration, EtcdNamespace namespace, String path) {
+    protected AbstractEtcdPollingEndpoint(String uri, AbstractEtcdComponent component, EtcdConfiguration configuration, String path) {
         super(uri, component);
 
         this.configuration = configuration;
-        this.namespace = namespace;
         this.path = path;
     }
 
@@ -52,11 +41,6 @@ public abstract class AbstractEtcdPollingEndpoint extends DefaultPollingEndpoint
     }
 
     @Override
-    public EtcdNamespace getNamespace() {
-        return this.namespace;
-    }
-
-    @Override
     public String getPath() {
         return this.path;
     }
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdProducer.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdProducer.java
index 31353e8..8114bd4 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdProducer.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/AbstractEtcdProducer.java
@@ -25,16 +25,14 @@ import org.apache.camel.support.DefaultProducer;
  */
 public abstract class AbstractEtcdProducer extends DefaultProducer {
     private final EtcdConfiguration configuration;
-    private final EtcdNamespace namespace;
     private final String path;
 
     private EtcdClient client;
 
-    protected AbstractEtcdProducer(Endpoint endpoint, EtcdConfiguration configuration, EtcdNamespace namespace, String path) {
+    protected AbstractEtcdProducer(Endpoint endpoint, EtcdConfiguration configuration, String path) {
         super(endpoint);
 
         this.configuration = configuration;
-        this.namespace = namespace;
         this.path = path;
         this.client = null;
     }
@@ -60,10 +58,6 @@ public abstract class AbstractEtcdProducer extends DefaultProducer {
         return configuration;
     }
 
-    protected EtcdNamespace getNamespace() {
-        return namespace;
-    }
-
     protected String getPath() {
         return this.path;
     }
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdEndpoint.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdEndpoint.java
index 79afb06..5669b6b 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdEndpoint.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdEndpoint.java
@@ -21,8 +21,6 @@ import mousio.etcd4j.EtcdClient;
 interface EtcdEndpoint {
     EtcdConfiguration getConfiguration();
 
-    EtcdNamespace getNamespace();
-
     String getPath();
 
     EtcdClient createClient() throws Exception;
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdKeysComponent.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdKeysComponent.java
new file mode 100644
index 0000000..bf229a1
--- /dev/null
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdKeysComponent.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.etcd;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.util.ObjectHelper;
+
+@Component("etcd-keys")
+public class EtcdKeysComponent extends AbstractEtcdComponent {
+
+    public EtcdKeysComponent() {
+    }
+
+    public EtcdKeysComponent(CamelContext context) {
+        super(context);
+    }
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        EtcdConfiguration configuration = loadConfiguration(parameters);
+
+        // path must start with leading slash
+        String path = ObjectHelper.isEmpty(remaining) ? "/" : remaining;
+        if (!path.startsWith("/")) {
+            path = "/" + path;
+        }
+
+        Endpoint endpoint = new EtcdKeysEndpoint(uri, this, configuration, path);
+        setProperties(endpoint, parameters);
+        return endpoint;
+    }
+}
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdKeysEndpoint.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdKeysEndpoint.java
index e34a0a0..8b0f1a3 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdKeysEndpoint.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdKeysEndpoint.java
@@ -19,17 +19,20 @@ package org.apache.camel.component.etcd;
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
+import org.apache.camel.spi.UriEndpoint;
 
+@UriEndpoint(firstVersion = "2.18.0", scheme = "etcd-keys", title = "Etcd Keys", producerOnly = true,
+        syntax = "etcd-keys:path", label = "clustering,database")
 public class EtcdKeysEndpoint extends AbstractEtcdEndpoint {
 
     public EtcdKeysEndpoint(
-        String uri, EtcdComponent component, EtcdConfiguration configuration, EtcdNamespace namespace, String path) {
-        super(uri, component, configuration, namespace, path);
+            String uri, AbstractEtcdComponent component, EtcdConfiguration configuration, String path) {
+        super(uri, component, configuration, path);
     }
 
     @Override
     public Producer createProducer() throws Exception {
-        return new EtcdKeysProducer(this, getConfiguration(), getNamespace(), getPath());
+        return new EtcdKeysProducer(this, getConfiguration(), getPath());
     }
 
     @Override
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdKeysProducer.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdKeysProducer.java
index 732bd07..33cd874 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdKeysProducer.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdKeysProducer.java
@@ -31,8 +31,8 @@ import org.apache.camel.util.StringHelper;
 public class EtcdKeysProducer extends AbstractEtcdProducer {
     private final EtcdConfiguration configuration;
 
-    public EtcdKeysProducer(EtcdKeysEndpoint endpoint, EtcdConfiguration configuration, EtcdNamespace namespace, String path) {
-        super(endpoint, configuration, namespace, path);
+    public EtcdKeysProducer(EtcdKeysEndpoint endpoint, EtcdConfiguration configuration, String path) {
+        super(endpoint, configuration, path);
 
         this.configuration = configuration;
     }
@@ -76,7 +76,7 @@ public class EtcdKeysProducer extends AbstractEtcdProducer {
         setRequestTimeout(request, exchange);
 
         try {
-            exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, getNamespace());
+            exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, "keys");
             exchange.getIn().setBody(request.send().get());
         } catch (TimeoutException e) {
             throw new ExchangeTimedOutException(exchange, configuration.getTimeout());
@@ -89,7 +89,7 @@ public class EtcdKeysProducer extends AbstractEtcdProducer {
         setRequestRecursive(request, exchange);
 
         try {
-            exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, getNamespace());
+            exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, "keys");
             exchange.getIn().setBody(request.send().get());
         } catch (TimeoutException e) {
             throw new ExchangeTimedOutException(exchange, configuration.getTimeout());
@@ -106,7 +106,7 @@ public class EtcdKeysProducer extends AbstractEtcdProducer {
         }
 
         try {
-            exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, getNamespace());
+            exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, "keys");
             exchange.getIn().setBody(request.send().get());
         } catch (TimeoutException e) {
             throw new ExchangeTimedOutException(exchange, configuration.getTimeout());
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdNamespace.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdNamespace.java
deleted file mode 100644
index ae1a4b1..0000000
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdNamespace.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.etcd;
-
-public enum EtcdNamespace {
-
-    stats, watch, keys
-}
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsProducer.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsComponent.java
similarity index 51%
copy from components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsProducer.java
copy to components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsComponent.java
index 66b867c..dee43ea 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsProducer.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsComponent.java
@@ -16,28 +16,35 @@
  */
 package org.apache.camel.component.etcd;
 
-import org.apache.camel.Exchange;
+import java.util.Map;
 
-public class EtcdStatsProducer extends AbstractEtcdProducer {
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.annotations.Component;
 
-    public EtcdStatsProducer(EtcdStatsEndpoint endpoint, EtcdConfiguration configuration, EtcdNamespace namespace, String path) {
-        super(endpoint, configuration, namespace, path);
+@Component("etcd-stats")
+public class EtcdStatsComponent extends AbstractEtcdComponent {
+
+    public EtcdStatsComponent() {
     }
 
-    @Override
-    public EtcdStatsEndpoint getEndpoint() {
-        return (EtcdStatsEndpoint) super.getEndpoint();
+    public EtcdStatsComponent(CamelContext context) {
+        super(context);
     }
 
     @Override
-    public void process(Exchange exchange) throws Exception {
-        EtcdStatsEndpoint endpoint = getEndpoint();
-        Object answer = endpoint.getStats(getClient());
-
-        if (answer != null) {
-            exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, getNamespace());
-            exchange.getIn().setHeader(EtcdConstants.ETCD_PATH, getPath());
-            exchange.getIn().setBody(answer);
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        EtcdConfiguration configuration = loadConfiguration(parameters);
+
+        // path must start with leading slash
+        String path = remaining;
+        if (!path.startsWith("/")) {
+            path = "/" + path;
         }
+
+        Endpoint endpoint = new EtcdStatsEndpoint(uri, this, configuration, path);
+        setProperties(endpoint, parameters);
+        return endpoint;
     }
+
 }
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsConsumer.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsConsumer.java
index 10eacce..5bd9d14 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsConsumer.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsConsumer.java
@@ -36,7 +36,7 @@ public class EtcdStatsConsumer extends AbstractEtcdPollingConsumer {
 
         if (answer != null) {
             Exchange exchange = endpoint.createExchange();
-            exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, endpoint.getNamespace());
+            exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, "stats");
             exchange.getIn().setHeader(EtcdConstants.ETCD_PATH, endpoint.getPath());
             exchange.getIn().setBody(answer);
 
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsEndpoint.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsEndpoint.java
index 525bf97..192e392 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsEndpoint.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsEndpoint.java
@@ -20,17 +20,23 @@ import mousio.etcd4j.EtcdClient;
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
+import org.apache.camel.spi.UriEndpoint;
 
+/**
+ * The camel etcd component allows you to work with <a href="https://coreos.com/etcd">Etcd</a>, a distributed reliable key-value store.
+ */
+@UriEndpoint(firstVersion = "2.18.0", scheme = "etcd-stats", title = "Etcd Stats",
+        syntax = "etcd-stats:path", label = "clustering,database")
 public class EtcdStatsEndpoint extends AbstractEtcdPollingEndpoint {
 
     public EtcdStatsEndpoint(
-        String uri, EtcdComponent component, EtcdConfiguration configuration, EtcdNamespace namespace, String path) {
-        super(uri, component, configuration, namespace, path);
+            String uri, AbstractEtcdComponent component, EtcdConfiguration configuration, String path) {
+        super(uri, component, configuration, path);
     }
 
     @Override
     public Producer createProducer() throws Exception {
-        return new EtcdStatsProducer(this, getConfiguration(), getNamespace(), getPath());
+        return new EtcdStatsProducer(this, getConfiguration(), getPath());
     }
 
     @Override
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsProducer.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsProducer.java
index 66b867c..3ce338e 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsProducer.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsProducer.java
@@ -20,8 +20,8 @@ import org.apache.camel.Exchange;
 
 public class EtcdStatsProducer extends AbstractEtcdProducer {
 
-    public EtcdStatsProducer(EtcdStatsEndpoint endpoint, EtcdConfiguration configuration, EtcdNamespace namespace, String path) {
-        super(endpoint, configuration, namespace, path);
+    public EtcdStatsProducer(EtcdStatsEndpoint endpoint, EtcdConfiguration configuration, String path) {
+        super(endpoint, configuration, path);
     }
 
     @Override
@@ -35,7 +35,7 @@ public class EtcdStatsProducer extends AbstractEtcdProducer {
         Object answer = endpoint.getStats(getClient());
 
         if (answer != null) {
-            exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, getNamespace());
+            exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, "stats");
             exchange.getIn().setHeader(EtcdConstants.ETCD_PATH, getPath());
             exchange.getIn().setBody(answer);
         }
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsProducer.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdWatchComponent.java
similarity index 51%
copy from components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsProducer.java
copy to components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdWatchComponent.java
index 66b867c..7e4c0fe 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdStatsProducer.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdWatchComponent.java
@@ -16,28 +16,35 @@
  */
 package org.apache.camel.component.etcd;
 
-import org.apache.camel.Exchange;
+import java.util.Map;
 
-public class EtcdStatsProducer extends AbstractEtcdProducer {
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.annotations.Component;
 
-    public EtcdStatsProducer(EtcdStatsEndpoint endpoint, EtcdConfiguration configuration, EtcdNamespace namespace, String path) {
-        super(endpoint, configuration, namespace, path);
+@Component("etcd-watch")
+public class EtcdWatchComponent extends AbstractEtcdComponent {
+
+    public EtcdWatchComponent() {
     }
 
-    @Override
-    public EtcdStatsEndpoint getEndpoint() {
-        return (EtcdStatsEndpoint) super.getEndpoint();
+    public EtcdWatchComponent(CamelContext context) {
+        super(context);
     }
 
     @Override
-    public void process(Exchange exchange) throws Exception {
-        EtcdStatsEndpoint endpoint = getEndpoint();
-        Object answer = endpoint.getStats(getClient());
-
-        if (answer != null) {
-            exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, getNamespace());
-            exchange.getIn().setHeader(EtcdConstants.ETCD_PATH, getPath());
-            exchange.getIn().setBody(answer);
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        EtcdConfiguration configuration = loadConfiguration(parameters);
+
+        // path must start with leading slash
+        String path = remaining;
+        if (!path.startsWith("/")) {
+            path = "/" + path;
         }
+
+        Endpoint endpoint = new EtcdWatchEndpoint(uri, this, configuration, path);
+        setProperties(endpoint, parameters);
+        return endpoint;
     }
+
 }
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdWatchConsumer.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdWatchConsumer.java
index d2b9b8a..6fe130a 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdWatchConsumer.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdWatchConsumer.java
@@ -36,8 +36,8 @@ public class EtcdWatchConsumer extends AbstractEtcdConsumer implements ResponseP
     private final EtcdConfiguration configuration;
     private final AtomicLong index;
 
-    public EtcdWatchConsumer(EtcdWatchEndpoint endpoint, Processor processor, EtcdConfiguration configuration, EtcdNamespace namespace, String path) {
-        super(endpoint, processor, configuration, namespace, path);
+    public EtcdWatchConsumer(EtcdWatchEndpoint endpoint, Processor processor, EtcdConfiguration configuration, String path) {
+        super(endpoint, processor, configuration, path);
 
         this.endpoint = endpoint;
         this.configuration = configuration;
@@ -93,7 +93,7 @@ public class EtcdWatchConsumer extends AbstractEtcdConsumer implements ResponseP
                 EtcdKeysResponse response = promise.get();
 
                 exchange = endpoint.createExchange();
-                exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, getNamespace());
+                exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, "watch");
                 exchange.getIn().setHeader(EtcdConstants.ETCD_PATH, response.node.key);
                 exchange.getIn().setBody(response);
 
@@ -105,7 +105,7 @@ public class EtcdWatchConsumer extends AbstractEtcdConsumer implements ResponseP
 
                 if (configuration.isSendEmptyExchangeOnTimeout()) {
                     exchange = endpoint.createExchange();
-                    exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, getNamespace());
+                    exchange.getIn().setHeader(EtcdConstants.ETCD_NAMESPACE, "watch");
                     exchange.getIn().setHeader(EtcdConstants.ETCD_TIMEOUT, true);
                     exchange.getIn().setHeader(EtcdConstants.ETCD_PATH, getPath());
                     exchange.getIn().setBody(null);
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdWatchEndpoint.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdWatchEndpoint.java
index fd3d2bf..cfe4ff5 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdWatchEndpoint.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdWatchEndpoint.java
@@ -19,12 +19,18 @@ package org.apache.camel.component.etcd;
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
+import org.apache.camel.spi.UriEndpoint;
 
+/**
+ * The camel etcd component allows you to work with <a href="https://coreos.com/etcd">Etcd</a>, a distributed reliable key-value store.
+ */
+@UriEndpoint(firstVersion = "2.18.0", scheme = "etcd-watch", title = "Etcd Watch", consumerOnly = true,
+        syntax = "etcd-watch:path", label = "clustering,database")
 public class EtcdWatchEndpoint extends AbstractEtcdEndpoint {
 
     public EtcdWatchEndpoint(
-        String uri, EtcdComponent component, EtcdConfiguration configuration, EtcdNamespace namespace, String path) {
-        super(uri, component, configuration, namespace, path);
+            String uri, AbstractEtcdComponent component, EtcdConfiguration configuration, String path) {
+        super(uri, component, configuration, path);
     }
 
     @Override
@@ -34,7 +40,7 @@ public class EtcdWatchEndpoint extends AbstractEtcdEndpoint {
 
     @Override
     public Consumer createConsumer(Processor processor) throws Exception {
-        EtcdWatchConsumer consumer = new EtcdWatchConsumer(this, processor, getConfiguration(), getNamespace(), getPath());
+        EtcdWatchConsumer consumer = new EtcdWatchConsumer(this, processor, getConfiguration(), getPath());
         configureConsumer(consumer);
         return consumer;
     }
diff --git a/components/camel-etcd/src/test/java/org/apache/camel/component/etcd/EtcdKeysTest.java b/components/camel-etcd/src/test/java/org/apache/camel/component/etcd/EtcdKeysTest.java
index 4a8d91e..3e0ac31 100644
--- a/components/camel-etcd/src/test/java/org/apache/camel/component/etcd/EtcdKeysTest.java
+++ b/components/camel-etcd/src/test/java/org/apache/camel/component/etcd/EtcdKeysTest.java
@@ -50,7 +50,7 @@ public class EtcdKeysTest extends EtcdTestSupport {
 
         MockEndpoint mockSet = getMockEndpoint("mock:result-set");
         mockSet.expectedMinimumMessageCount(1);
-        mockSet.expectedHeaderReceived(EtcdConstants.ETCD_NAMESPACE, EtcdNamespace.keys.name());
+        mockSet.expectedHeaderReceived(EtcdConstants.ETCD_NAMESPACE, "keys");
         mockSet.expectedHeaderReceived(EtcdConstants.ETCD_PATH, path);
         mockSet.assertIsSatisfied();
 
@@ -66,7 +66,7 @@ public class EtcdKeysTest extends EtcdTestSupport {
 
         MockEndpoint mockGet = getMockEndpoint("mock:result-get");
         mockGet.expectedMinimumMessageCount(1);
-        mockSet.expectedHeaderReceived(EtcdConstants.ETCD_NAMESPACE, EtcdNamespace.keys.name());
+        mockSet.expectedHeaderReceived(EtcdConstants.ETCD_NAMESPACE, "keys");
         mockGet.expectedHeaderReceived(EtcdConstants.ETCD_PATH, path);
         mockGet.expectedMessagesMatches(new Predicate() {
             @Override
@@ -94,7 +94,7 @@ public class EtcdKeysTest extends EtcdTestSupport {
 
         MockEndpoint mockDel = getMockEndpoint("mock:result-del");
         mockDel.expectedMinimumMessageCount(1);
-        mockSet.expectedHeaderReceived(EtcdConstants.ETCD_NAMESPACE, EtcdNamespace.keys.name());
+        mockSet.expectedHeaderReceived(EtcdConstants.ETCD_NAMESPACE, "keys");
         mockDel.expectedHeaderReceived(EtcdConstants.ETCD_PATH, path);
         mockDel.assertIsSatisfied();
 
@@ -112,13 +112,13 @@ public class EtcdKeysTest extends EtcdTestSupport {
         return new RouteBuilder() {
             public void configure() {
                 from("direct:keys-set")
-                    .to("etcd:keys")
+                    .to("etcd-keys")
                         .to("mock:result-set");
                 from("direct:keys-get")
-                    .to("etcd:keys")
+                    .to("etcd-keys")
                         .to("mock:result-get");
                 from("direct:keys-del")
-                    .to("etcd:keys")
+                    .to("etcd-keys")
                         .to("mock:result-del");
             }
         };
diff --git a/components/camel-etcd/src/test/java/org/apache/camel/component/etcd/EtcdStatsTest.java b/components/camel-etcd/src/test/java/org/apache/camel/component/etcd/EtcdStatsTest.java
index 6a5b23b..ab6657b 100644
--- a/components/camel-etcd/src/test/java/org/apache/camel/component/etcd/EtcdStatsTest.java
+++ b/components/camel-etcd/src/test/java/org/apache/camel/component/etcd/EtcdStatsTest.java
@@ -41,7 +41,7 @@ public class EtcdStatsTest extends EtcdTestSupport {
     protected void testStatsConsumer(String mockEnpoint, String expectedPath, final Class<?> expectedType) throws Exception {
         MockEndpoint mock = getMockEndpoint(mockEnpoint);
         mock.expectedMinimumMessageCount(1);
-        mock.expectedHeaderReceived(EtcdConstants.ETCD_NAMESPACE, EtcdNamespace.stats.name());
+        mock.expectedHeaderReceived(EtcdConstants.ETCD_NAMESPACE, "stats");
         mock.expectedHeaderReceived(EtcdConstants.ETCD_PATH, expectedPath);
         mock.expectedMessagesMatches(new Predicate() {
             @Override
@@ -64,22 +64,22 @@ public class EtcdStatsTest extends EtcdTestSupport {
         return new RouteBuilder() {
             public void configure() {
                 // CONSUMER
-                from("etcd:stats/leader?delay=50&initialDelay=0")
+                from("etcd-stats:leader?delay=50&initialDelay=0")
                     .to("mock:stats-leader-consumer");
-                from("etcd:stats/self?delay=50&initialDelay=0")
+                from("etcd-stats:self?delay=50&initialDelay=0")
                     .to("mock:stats-self-consumer");
-                from("etcd:stats/store?delay=50&initialDelay=0")
+                from("etcd-stats:store?delay=50&initialDelay=0")
                     .to("mock:stats-store-consumer");
 
                 // PRODUCER
                 from("direct:stats-leader")
-                    .to("etcd:stats/leader")
+                    .to("etcd-stats:leader")
                         .to("mock:stats-leader-producer");
                 from("direct:stats-self")
-                    .to("etcd:stats/self")
+                    .to("etcd-stats:self")
                         .to("mock:stats-self-producer");
                 from("direct:stats-store")
-                    .to("etcd:stats/store")
+                    .to("etcd-stats:store")
                         .to("mock:stats-store-producer");
             }
         };
diff --git a/components/camel-etcd/src/test/java/org/apache/camel/component/etcd/EtcdWatchTest.java b/components/camel-etcd/src/test/java/org/apache/camel/component/etcd/EtcdWatchTest.java
index bbf315b..a11ba36 100644
--- a/components/camel-etcd/src/test/java/org/apache/camel/component/etcd/EtcdWatchTest.java
+++ b/components/camel-etcd/src/test/java/org/apache/camel/component/etcd/EtcdWatchTest.java
@@ -68,7 +68,7 @@ public class EtcdWatchTest extends EtcdTestSupport {
     public void testWatchWithTimeout() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:watch-with-timeout");
         mock.expectedMessageCount(1);
-        mock.expectedHeaderReceived(EtcdConstants.ETCD_NAMESPACE, EtcdNamespace.watch.name());
+        mock.expectedHeaderReceived(EtcdConstants.ETCD_NAMESPACE, "watch");
         mock.expectedHeaderReceived(EtcdConstants.ETCD_PATH, "/timeoutKey");
         mock.expectedHeaderReceived(EtcdConstants.ETCD_TIMEOUT, true);
         mock.allMessages().body().isNull();
@@ -83,7 +83,7 @@ public class EtcdWatchTest extends EtcdTestSupport {
 
         MockEndpoint mock = getMockEndpoint(mockEndpoint);
         mock.expectedMessageCount(2);
-        mock.expectedHeaderReceived(EtcdConstants.ETCD_NAMESPACE, EtcdNamespace.watch.name());
+        mock.expectedHeaderReceived(EtcdConstants.ETCD_NAMESPACE, "watch");
         mock.expectedHeaderReceived(EtcdConstants.ETCD_PATH, key);
         mock.expectedBodiesReceived(values);
 
@@ -99,22 +99,22 @@ public class EtcdWatchTest extends EtcdTestSupport {
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             public void configure() {
-                from("etcd:watch/myKey1")
+                from("etcd-watch:myKey1")
                     .process(NODE_TO_VALUE_IN)
                     .to("mock:watch-with-path");
-                fromF("etcd:watch/myKeyRecovery?timeout=%s&fromIndex=%s", 1000 * 60 * 5, 1)
+                fromF("etcd-watch:myKeyRecovery?timeout=%s&fromIndex=%s", 1000 * 60 * 5, 1)
                     .id("watchRecovery")
                     .autoStartup(false)
                     .process(NODE_TO_VALUE_IN)
                     .to("mock:watch-recovery");
-                from("etcd:watch/recursive?recursive=true")
+                from("etcd-watch:recursive?recursive=true")
                    .process(NODE_TO_VALUE_IN)
                     .to("log:org.apache.camel.component.etcd?level=INFO")
                     .to("mock:watch-recursive");
-                from("etcd:watch/myKey2")
+                from("etcd-watch:myKey2")
                     .process(NODE_TO_VALUE_IN)
                     .to("mock:watch-with-config-path");
-                from("etcd:watch/timeoutKey?timeout=250&sendEmptyExchangeOnTimeout=true")
+                from("etcd-watch:timeoutKey?timeout=250&sendEmptyExchangeOnTimeout=true")
                     .to("mock:watch-with-timeout");
             }
         };
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
index ca5303b..04eb48f 100644
--- a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
@@ -1239,6 +1239,41 @@ public interface ComponentsBuilderFactory {
         return org.apache.camel.builder.component.dsl.EtcdComponentBuilderFactory.etcd();
     }
     /**
+     * Etcd Keys (camel-etcd)
+     * Camel Etcd support
+     * 
+     * Category: clustering,database
+     * Since: 2.18
+     * Maven coordinates: org.apache.camel:camel-etcd
+     */
+    static org.apache.camel.builder.component.dsl.EtcdKeysComponentBuilderFactory.EtcdKeysComponentBuilder etcdKeys() {
+        return org.apache.camel.builder.component.dsl.EtcdKeysComponentBuilderFactory.etcdKeys();
+    }
+    /**
+     * Etcd Stats (camel-etcd)
+     * The camel etcd component allows you to work with Etcd, a distributed
+     * reliable key-value store.
+     * 
+     * Category: clustering,database
+     * Since: 2.18
+     * Maven coordinates: org.apache.camel:camel-etcd
+     */
+    static org.apache.camel.builder.component.dsl.EtcdStatsComponentBuilderFactory.EtcdStatsComponentBuilder etcdStats() {
+        return org.apache.camel.builder.component.dsl.EtcdStatsComponentBuilderFactory.etcdStats();
+    }
+    /**
+     * Etcd Watch (camel-etcd)
+     * The camel etcd component allows you to work with Etcd, a distributed
+     * reliable key-value store.
+     * 
+     * Category: clustering,database
+     * Since: 2.18
+     * Maven coordinates: org.apache.camel:camel-etcd
+     */
+    static org.apache.camel.builder.component.dsl.EtcdWatchComponentBuilderFactory.EtcdWatchComponentBuilder etcdWatch() {
+        return org.apache.camel.builder.component.dsl.EtcdWatchComponentBuilderFactory.etcdWatch();
+    }
+    /**
      * OSGi EventAdmin (camel-eventadmin)
      * The eventadmin component can be used in an OSGi environment to receive
      * OSGi EventAdmin events and process them.
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/EtcdKeysComponentBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/EtcdKeysComponentBuilderFactory.java
new file mode 100644
index 0000000..70e6e3a
--- /dev/null
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/EtcdKeysComponentBuilderFactory.java
@@ -0,0 +1,187 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder.component.dsl;
+
+import javax.annotation.Generated;
+import org.apache.camel.Component;
+import org.apache.camel.builder.component.AbstractComponentBuilder;
+import org.apache.camel.builder.component.ComponentBuilder;
+import org.apache.camel.component.etcd.EtcdKeysComponent;
+
+/**
+ * Camel Etcd support
+ * 
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.ComponentDslMojo")
+public interface EtcdKeysComponentBuilderFactory {
+
+    /**
+     * Etcd Keys (camel-etcd)
+     * Camel Etcd support
+     * 
+     * Category: clustering,database
+     * Since: 2.18
+     * Maven coordinates: org.apache.camel:camel-etcd
+     */
+    static EtcdKeysComponentBuilder etcdKeys() {
+        return new EtcdKeysComponentBuilderImpl();
+    }
+
+    /**
+     * Builder for the Etcd Keys component.
+     */
+    interface EtcdKeysComponentBuilder
+            extends
+                ComponentBuilder<EtcdKeysComponent> {
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default EtcdKeysComponentBuilder lazyStartProducer(
+                boolean lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * The password to use for basic authentication.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default EtcdKeysComponentBuilder password(java.lang.String password) {
+            doSetProperty("password", password);
+            return this;
+        }
+        /**
+         * To configure security using SSLContextParameters.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.support.jsse.SSLContextParameters</code> type.
+         * 
+         * Group: producer
+         */
+        default EtcdKeysComponentBuilder sslContextParameters(
+                org.apache.camel.support.jsse.SSLContextParameters sslContextParameters) {
+            doSetProperty("sslContextParameters", sslContextParameters);
+            return this;
+        }
+        /**
+         * To set the URIs the client connects.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default EtcdKeysComponentBuilder uris(java.lang.String uris) {
+            doSetProperty("uris", uris);
+            return this;
+        }
+        /**
+         * The user name to use for basic authentication.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default EtcdKeysComponentBuilder userName(java.lang.String userName) {
+            doSetProperty("userName", userName);
+            return this;
+        }
+        /**
+         * Whether the component should use basic property binding (Camel 2.x)
+         * or the newer property binding with additional capabilities.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default EtcdKeysComponentBuilder basicPropertyBinding(
+                boolean basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            return this;
+        }
+        /**
+         * Sets the common configuration shared among endpoints.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.component.etcd.EtcdConfiguration</code> type.
+         * 
+         * Group: advanced
+         */
+        default EtcdKeysComponentBuilder configuration(
+                org.apache.camel.component.etcd.EtcdConfiguration configuration) {
+            doSetProperty("configuration", configuration);
+            return this;
+        }
+        /**
+         * Enable usage of global SSL context parameters.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: security
+         */
+        default EtcdKeysComponentBuilder useGlobalSslContextParameters(
+                boolean useGlobalSslContextParameters) {
+            doSetProperty("useGlobalSslContextParameters", useGlobalSslContextParameters);
+            return this;
+        }
+    }
+
+    class EtcdKeysComponentBuilderImpl
+            extends
+                AbstractComponentBuilder<EtcdKeysComponent>
+            implements
+                EtcdKeysComponentBuilder {
+        @Override
+        protected EtcdKeysComponent buildConcreteComponent() {
+            return new EtcdKeysComponent();
+        }
+        @Override
+        protected boolean setPropertyOnComponent(
+                Component component,
+                String name,
+                Object value) {
+            switch (name) {
+            case "lazyStartProducer": ((EtcdKeysComponent) component).setLazyStartProducer((boolean) value); return true;
+            case "password": ((EtcdKeysComponent) component).setPassword((java.lang.String) value); return true;
+            case "sslContextParameters": ((EtcdKeysComponent) component).setSslContextParameters((org.apache.camel.support.jsse.SSLContextParameters) value); return true;
+            case "uris": ((EtcdKeysComponent) component).setUris((java.lang.String) value); return true;
+            case "userName": ((EtcdKeysComponent) component).setUserName((java.lang.String) value); return true;
+            case "basicPropertyBinding": ((EtcdKeysComponent) component).setBasicPropertyBinding((boolean) value); return true;
+            case "configuration": ((EtcdKeysComponent) component).setConfiguration((org.apache.camel.component.etcd.EtcdConfiguration) value); return true;
+            case "useGlobalSslContextParameters": ((EtcdKeysComponent) component).setUseGlobalSslContextParameters((boolean) value); return true;
+            default: return false;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/EtcdStatsComponentBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/EtcdStatsComponentBuilderFactory.java
new file mode 100644
index 0000000..a6af10b
--- /dev/null
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/EtcdStatsComponentBuilderFactory.java
@@ -0,0 +1,209 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder.component.dsl;
+
+import javax.annotation.Generated;
+import org.apache.camel.Component;
+import org.apache.camel.builder.component.AbstractComponentBuilder;
+import org.apache.camel.builder.component.ComponentBuilder;
+import org.apache.camel.component.etcd.EtcdStatsComponent;
+
+/**
+ * The camel etcd component allows you to work with Etcd, a distributed reliable
+ * key-value store.
+ * 
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.ComponentDslMojo")
+public interface EtcdStatsComponentBuilderFactory {
+
+    /**
+     * Etcd Stats (camel-etcd)
+     * The camel etcd component allows you to work with Etcd, a distributed
+     * reliable key-value store.
+     * 
+     * Category: clustering,database
+     * Since: 2.18
+     * Maven coordinates: org.apache.camel:camel-etcd
+     */
+    static EtcdStatsComponentBuilder etcdStats() {
+        return new EtcdStatsComponentBuilderImpl();
+    }
+
+    /**
+     * Builder for the Etcd Stats component.
+     */
+    interface EtcdStatsComponentBuilder
+            extends
+                ComponentBuilder<EtcdStatsComponent> {
+        /**
+         * The password to use for basic authentication.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default EtcdStatsComponentBuilder password(java.lang.String password) {
+            doSetProperty("password", password);
+            return this;
+        }
+        /**
+         * To configure security using SSLContextParameters.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.support.jsse.SSLContextParameters</code> type.
+         * 
+         * Group: common
+         */
+        default EtcdStatsComponentBuilder sslContextParameters(
+                org.apache.camel.support.jsse.SSLContextParameters sslContextParameters) {
+            doSetProperty("sslContextParameters", sslContextParameters);
+            return this;
+        }
+        /**
+         * To set the URIs the client connects.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default EtcdStatsComponentBuilder uris(java.lang.String uris) {
+            doSetProperty("uris", uris);
+            return this;
+        }
+        /**
+         * The user name to use for basic authentication.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default EtcdStatsComponentBuilder userName(java.lang.String userName) {
+            doSetProperty("userName", userName);
+            return this;
+        }
+        /**
+         * Allows for bridging the consumer to the Camel routing Error Handler,
+         * which mean any exceptions occurred while the consumer is trying to
+         * pickup incoming messages, or the likes, will now be processed as a
+         * message and handled by the routing Error Handler. By default the
+         * consumer will use the org.apache.camel.spi.ExceptionHandler to deal
+         * with exceptions, that will be logged at WARN or ERROR level and
+         * ignored.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default EtcdStatsComponentBuilder bridgeErrorHandler(
+                boolean bridgeErrorHandler) {
+            doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
+            return this;
+        }
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default EtcdStatsComponentBuilder lazyStartProducer(
+                boolean lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * Whether the component should use basic property binding (Camel 2.x)
+         * or the newer property binding with additional capabilities.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default EtcdStatsComponentBuilder basicPropertyBinding(
+                boolean basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            return this;
+        }
+        /**
+         * Sets the common configuration shared among endpoints.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.component.etcd.EtcdConfiguration</code> type.
+         * 
+         * Group: advanced
+         */
+        default EtcdStatsComponentBuilder configuration(
+                org.apache.camel.component.etcd.EtcdConfiguration configuration) {
+            doSetProperty("configuration", configuration);
+            return this;
+        }
+        /**
+         * Enable usage of global SSL context parameters.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: security
+         */
+        default EtcdStatsComponentBuilder useGlobalSslContextParameters(
+                boolean useGlobalSslContextParameters) {
+            doSetProperty("useGlobalSslContextParameters", useGlobalSslContextParameters);
+            return this;
+        }
+    }
+
+    class EtcdStatsComponentBuilderImpl
+            extends
+                AbstractComponentBuilder<EtcdStatsComponent>
+            implements
+                EtcdStatsComponentBuilder {
+        @Override
+        protected EtcdStatsComponent buildConcreteComponent() {
+            return new EtcdStatsComponent();
+        }
+        @Override
+        protected boolean setPropertyOnComponent(
+                Component component,
+                String name,
+                Object value) {
+            switch (name) {
+            case "password": ((EtcdStatsComponent) component).setPassword((java.lang.String) value); return true;
+            case "sslContextParameters": ((EtcdStatsComponent) component).setSslContextParameters((org.apache.camel.support.jsse.SSLContextParameters) value); return true;
+            case "uris": ((EtcdStatsComponent) component).setUris((java.lang.String) value); return true;
+            case "userName": ((EtcdStatsComponent) component).setUserName((java.lang.String) value); return true;
+            case "bridgeErrorHandler": ((EtcdStatsComponent) component).setBridgeErrorHandler((boolean) value); return true;
+            case "lazyStartProducer": ((EtcdStatsComponent) component).setLazyStartProducer((boolean) value); return true;
+            case "basicPropertyBinding": ((EtcdStatsComponent) component).setBasicPropertyBinding((boolean) value); return true;
+            case "configuration": ((EtcdStatsComponent) component).setConfiguration((org.apache.camel.component.etcd.EtcdConfiguration) value); return true;
+            case "useGlobalSslContextParameters": ((EtcdStatsComponent) component).setUseGlobalSslContextParameters((boolean) value); return true;
+            default: return false;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/EtcdWatchComponentBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/EtcdWatchComponentBuilderFactory.java
new file mode 100644
index 0000000..0b7f3ec
--- /dev/null
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/EtcdWatchComponentBuilderFactory.java
@@ -0,0 +1,187 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder.component.dsl;
+
+import javax.annotation.Generated;
+import org.apache.camel.Component;
+import org.apache.camel.builder.component.AbstractComponentBuilder;
+import org.apache.camel.builder.component.ComponentBuilder;
+import org.apache.camel.component.etcd.EtcdWatchComponent;
+
+/**
+ * The camel etcd component allows you to work with Etcd, a distributed reliable
+ * key-value store.
+ * 
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.ComponentDslMojo")
+public interface EtcdWatchComponentBuilderFactory {
+
+    /**
+     * Etcd Watch (camel-etcd)
+     * The camel etcd component allows you to work with Etcd, a distributed
+     * reliable key-value store.
+     * 
+     * Category: clustering,database
+     * Since: 2.18
+     * Maven coordinates: org.apache.camel:camel-etcd
+     */
+    static EtcdWatchComponentBuilder etcdWatch() {
+        return new EtcdWatchComponentBuilderImpl();
+    }
+
+    /**
+     * Builder for the Etcd Watch component.
+     */
+    interface EtcdWatchComponentBuilder
+            extends
+                ComponentBuilder<EtcdWatchComponent> {
+        /**
+         * Allows for bridging the consumer to the Camel routing Error Handler,
+         * which mean any exceptions occurred while the consumer is trying to
+         * pickup incoming messages, or the likes, will now be processed as a
+         * message and handled by the routing Error Handler. By default the
+         * consumer will use the org.apache.camel.spi.ExceptionHandler to deal
+         * with exceptions, that will be logged at WARN or ERROR level and
+         * ignored.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default EtcdWatchComponentBuilder bridgeErrorHandler(
+                boolean bridgeErrorHandler) {
+            doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
+            return this;
+        }
+        /**
+         * The password to use for basic authentication.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default EtcdWatchComponentBuilder password(java.lang.String password) {
+            doSetProperty("password", password);
+            return this;
+        }
+        /**
+         * To configure security using SSLContextParameters.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.support.jsse.SSLContextParameters</code> type.
+         * 
+         * Group: consumer
+         */
+        default EtcdWatchComponentBuilder sslContextParameters(
+                org.apache.camel.support.jsse.SSLContextParameters sslContextParameters) {
+            doSetProperty("sslContextParameters", sslContextParameters);
+            return this;
+        }
+        /**
+         * To set the URIs the client connects.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default EtcdWatchComponentBuilder uris(java.lang.String uris) {
+            doSetProperty("uris", uris);
+            return this;
+        }
+        /**
+         * The user name to use for basic authentication.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default EtcdWatchComponentBuilder userName(java.lang.String userName) {
+            doSetProperty("userName", userName);
+            return this;
+        }
+        /**
+         * Whether the component should use basic property binding (Camel 2.x)
+         * or the newer property binding with additional capabilities.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default EtcdWatchComponentBuilder basicPropertyBinding(
+                boolean basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            return this;
+        }
+        /**
+         * Sets the common configuration shared among endpoints.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.component.etcd.EtcdConfiguration</code> type.
+         * 
+         * Group: advanced
+         */
+        default EtcdWatchComponentBuilder configuration(
+                org.apache.camel.component.etcd.EtcdConfiguration configuration) {
+            doSetProperty("configuration", configuration);
+            return this;
+        }
+        /**
+         * Enable usage of global SSL context parameters.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: security
+         */
+        default EtcdWatchComponentBuilder useGlobalSslContextParameters(
+                boolean useGlobalSslContextParameters) {
+            doSetProperty("useGlobalSslContextParameters", useGlobalSslContextParameters);
+            return this;
+        }
+    }
+
+    class EtcdWatchComponentBuilderImpl
+            extends
+                AbstractComponentBuilder<EtcdWatchComponent>
+            implements
+                EtcdWatchComponentBuilder {
+        @Override
+        protected EtcdWatchComponent buildConcreteComponent() {
+            return new EtcdWatchComponent();
+        }
+        @Override
+        protected boolean setPropertyOnComponent(
+                Component component,
+                String name,
+                Object value) {
+            switch (name) {
+            case "bridgeErrorHandler": ((EtcdWatchComponent) component).setBridgeErrorHandler((boolean) value); return true;
+            case "password": ((EtcdWatchComponent) component).setPassword((java.lang.String) value); return true;
+            case "sslContextParameters": ((EtcdWatchComponent) component).setSslContextParameters((org.apache.camel.support.jsse.SSLContextParameters) value); return true;
+            case "uris": ((EtcdWatchComponent) component).setUris((java.lang.String) value); return true;
+            case "userName": ((EtcdWatchComponent) component).setUserName((java.lang.String) value); return true;
+            case "basicPropertyBinding": ((EtcdWatchComponent) component).setBasicPropertyBinding((boolean) value); return true;
+            case "configuration": ((EtcdWatchComponent) component).setConfiguration((org.apache.camel.component.etcd.EtcdConfiguration) value); return true;
+            case "useGlobalSslContextParameters": ((EtcdWatchComponent) component).setUseGlobalSslContextParameters((boolean) value); return true;
+            default: return false;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/camel-componentdsl/src/generated/resources/metadata.json b/core/camel-componentdsl/src/generated/resources/metadata.json
index 906bab4..3e4da68 100644
--- a/core/camel-componentdsl/src/generated/resources/metadata.json
+++ b/core/camel-componentdsl/src/generated/resources/metadata.json
@@ -2089,6 +2089,66 @@
     "artifactId": "camel-etcd",
     "version": "3.1.0-SNAPSHOT"
   },
+  "EtcdKeysComponentBuilderFactory": {
+    "kind": "component",
+    "scheme": "etcd-keys",
+    "extendsScheme": "",
+    "syntax": "etcd-keys:path",
+    "title": "Etcd Keys",
+    "description": "Camel Etcd support",
+    "label": "clustering,database",
+    "deprecated": false,
+    "deprecationNote": "clustering,database",
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false,
+    "javaType": "org.apache.camel.component.etcd.EtcdKeysComponent",
+    "firstVersion": "2.18.0",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-etcd",
+    "version": "3.1.0-SNAPSHOT"
+  },
+  "EtcdStatsComponentBuilderFactory": {
+    "kind": "component",
+    "scheme": "etcd-stats",
+    "extendsScheme": "",
+    "syntax": "etcd-stats:path",
+    "title": "Etcd Stats",
+    "description": "The camel etcd component allows you to work with Etcd, a distributed reliable key-value store.",
+    "label": "clustering,database",
+    "deprecated": false,
+    "deprecationNote": "clustering,database",
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": false,
+    "lenientProperties": false,
+    "javaType": "org.apache.camel.component.etcd.EtcdStatsComponent",
+    "firstVersion": "2.18.0",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-etcd",
+    "version": "3.1.0-SNAPSHOT"
+  },
+  "EtcdWatchComponentBuilderFactory": {
+    "kind": "component",
+    "scheme": "etcd-watch",
+    "extendsScheme": "",
+    "syntax": "etcd-watch:path",
+    "title": "Etcd Watch",
+    "description": "The camel etcd component allows you to work with Etcd, a distributed reliable key-value store.",
+    "label": "clustering,database",
+    "deprecated": false,
+    "deprecationNote": "clustering,database",
+    "async": false,
+    "consumerOnly": true,
+    "producerOnly": false,
+    "lenientProperties": false,
+    "javaType": "org.apache.camel.component.etcd.EtcdWatchComponent",
+    "firstVersion": "2.18.0",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-etcd",
+    "version": "3.1.0-SNAPSHOT"
+  },
   "EventadminComponentBuilderFactory": {
     "kind": "component",
     "scheme": "eventadmin",