http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-netty4-starter/src/main/java/org/apache/camel/component/netty4/springboot/NettyComponentConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-netty4-starter/src/main/java/org/apache/camel/component/netty4/springboot/NettyComponentConfiguration.java
 
b/components-starter/camel-netty4-starter/src/main/java/org/apache/camel/component/netty4/springboot/NettyComponentConfiguration.java
index 6325701..bdfacc9 100644
--- 
a/components-starter/camel-netty4-starter/src/main/java/org/apache/camel/component/netty4/springboot/NettyComponentConfiguration.java
+++ 
b/components-starter/camel-netty4-starter/src/main/java/org/apache/camel/component/netty4/springboot/NettyComponentConfiguration.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.netty4.springboot;
 
+import java.io.File;
 import java.util.List;
 import java.util.Map;
 import io.netty.channel.ChannelHandler;
@@ -25,12 +26,14 @@ import io.netty.handler.ssl.SslHandler;
 import io.netty.util.concurrent.EventExecutorGroup;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.component.netty4.ClientInitializerFactory;
-import org.apache.camel.component.netty4.NettyConfiguration;
+import org.apache.camel.component.netty4.NettyComponent;
 import org.apache.camel.component.netty4.NettyServerBootstrapFactory;
 import org.apache.camel.component.netty4.ServerInitializerFactory;
 import org.apache.camel.component.netty4.TextLineDelimiter;
 import org.apache.camel.util.jsse.SSLContextParameters;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import 
org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
 
 /**
  * Socket level networking using TCP or UDP with the Netty 4.x library.
@@ -47,362 +50,13 @@ public class NettyComponentConfiguration {
     private Integer maximumPoolSize;
     /**
      * To use the NettyConfiguration as configuration when creating endpoints.
-     * Properties of the shared configuration can also be set individually.
      */
-    private NettyConfiguration configuration;
+    private NettyConfigurationNestedConfiguration configuration;
     /**
      * To use the given EventExecutorGroup
      */
+    @NestedConfigurationProperty
     private EventExecutorGroup executorService;
-    /**
-     * The protocol to use which can be tcp or udp.
-     */
-    private String protocol;
-    /**
-     * The hostname. For the consumer the hostname is localhost or 0.0.0.0 For
-     * the producer the hostname is the remote host to connect to
-     */
-    private String host;
-    /**
-     * The host port number
-     */
-    private Integer port;
-    /**
-     * Setting to choose Multicast over UDP
-     */
-    private Boolean broadcast;
-    /**
-     * The TCP/UDP buffer sizes to be used during outbound communication. Size
-     * is bytes.
-     */
-    private Integer sendBufferSize;
-    /**
-     * The TCP/UDP buffer sizes to be used during inbound communication. Size 
is
-     * bytes.
-     */
-    private Integer receiveBufferSize;
-    /**
-     * Configures the buffer size predictor. See details at Jetty documentation
-     * and this mail thread.
-     */
-    private Integer receiveBufferSizePredictor;
-    /**
-     * When netty works on nio mode it uses default workerCount parameter from
-     * Netty which is cpu_core_threads2. User can use this operation to 
override
-     * the default workerCount from Netty
-     */
-    private Integer workerCount;
-    /**
-     * When netty works on nio mode it uses default bossCount parameter from
-     * Netty which is 1. User can use this operation to override the default
-     * bossCount from Netty
-     */
-    private Integer bossCount;
-    /**
-     * Setting to ensure socket is not closed due to inactivity
-     */
-    private Boolean keepAlive;
-    /**
-     * Setting to improve TCP protocol performance
-     */
-    private Boolean tcpNoDelay;
-    /**
-     * Setting to facilitate socket multiplexing
-     */
-    private Boolean reuseAddress;
-    /**
-     * Time to wait for a socket connection to be available. Value is in 
millis.
-     */
-    private Integer connectTimeout;
-    /**
-     * Allows to configure a backlog for netty consumer (server). Note the
-     * backlog is just a best effort depending on the OS. Setting this option 
to
-     * a value such as 200 500 or 1000 tells the TCP stack how long the accept
-     * queue can be If this option is not configured then the backlog depends 
on
-     * OS setting.
-     */
-    private Integer backlog;
-    /**
-     * Setting to specify whether SSL encryption is applied to this endpoint
-     */
-    private Boolean ssl;
-    /**
-     * When enabled and in SSL mode then the Netty consumer will enrich the
-     * Camel Message with headers having information about the client
-     * certificate such as subject name issuer name serial number and the valid
-     * date range.
-     */
-    private Boolean sslClientCertHeaders;
-    /**
-     * Reference to a class that could be used to return an SSL Handler
-     */
-    private SslHandler sslHandler;
-    /**
-     * To configure security using SSLContextParameters
-     */
-    private SSLContextParameters sslContextParameters;
-    /**
-     * Configures whether the server needs client authentication when using 
SSL.
-     */
-    private Boolean needClientAuth;
-    /**
-     * Client side certificate keystore to be used for encryption. Is loaded by
-     * default from classpath but you can prefix with classpath: file: or http:
-     * to load the resource from different systems.
-     */
-    private String keyStoreResource;
-    /**
-     * Server side certificate keystore to be used for encryption. Is loaded by
-     * default from classpath but you can prefix with classpath: file: or http:
-     * to load the resource from different systems.
-     */
-    private String trustStoreResource;
-    /**
-     * Keystore format to be used for payload encryption. Defaults to JKS if 
not
-     * set
-     */
-    private String keyStoreFormat;
-    /**
-     * Security provider to be used for payload encryption. Defaults to SunX509
-     * if not set.
-     */
-    private String securityProvider;
-    /**
-     * Password setting to use in order to encrypt/decrypt payloads sent using
-     * SSH
-     */
-    private String passphrase;
-    /**
-     * To use a custom ServerInitializerFactory
-     */
-    private ServerInitializerFactory serverInitializerFactory;
-    /**
-     * To use a custom NettyServerBootstrapFactory
-     */
-    private NettyServerBootstrapFactory nettyServerBootstrapFactory;
-    /**
-     * Allows to use a timeout for the Netty producer when calling a remote
-     * server. By default no timeout is in use. The value is in milli seconds 
so
-     * eg 30000 is 30 seconds. The requestTimeout is using Netty's
-     * ReadTimeoutHandler to trigger the timeout.
-     */
-    private long requestTimeout;
-    /**
-     * Setting to set endpoint as one-way or request-response
-     */
-    private Boolean sync;
-    /**
-     * Allows to configure additional netty options using option. as prefix. 
For
-     * example option.child.keepAlive=false to set the netty option
-     * child.keepAlive=false. See the Netty documentation for possible options
-     * that can be used.
-     */
-    private Map<String, Object> options;
-    /**
-     * Only used for TCP. If no codec is specified you can use this flag to
-     * indicate a text line based codec; if not specified or the value is false
-     * then Object Serialization is assumed over TCP.
-     */
-    private Boolean textline;
-    /**
-     * Whether to use native transport instead of NIO. Native transport takes
-     * advantage of the host operating system and is only supported on some
-     * platforms. You need to add the netty JAR for the host operating system
-     * you are using. See more details at:
-     * http://netty.io/wiki/native-transports.html
-     */
-    private Boolean nativeTransport;
-    /**
-     * The max line length to use for the textline codec.
-     */
-    private Integer decoderMaxLineLength;
-    /**
-     * Set the BossGroup which could be used for handling the new connection of
-     * the server side across the NettyEndpoint
-     */
-    private EventLoopGroup bossGroup;
-    /**
-     * The delimiter to use for the textline codec. Possible values are LINE 
and
-     * NULL.
-     */
-    private TextLineDelimiter delimiter;
-    /**
-     * Whether or not to auto append missing end delimiter when sending using
-     * the textline codec.
-     */
-    private Boolean autoAppendDelimiter;
-    /**
-     * To use a explicit EventLoopGroup as the boss thread pool. For example to
-     * share a thread pool with multiple consumers. By default each consumer 
has
-     * their own boss pool with 1 core thread.
-     */
-    private EventLoopGroup workerGroup;
-    /**
-     * To use a explicit ChannelGroup.
-     */
-    private ChannelGroup channelGroup;
-    /**
-     * The encoding (a charset name) to use for the textline codec. If not
-     * provided Camel will use the JVM default Charset.
-     */
-    private String encoding;
-    /**
-     * When using UDP then this option can be used to specify a network
-     * interface by its name such as eth0 to join a multicast group.
-     */
-    private String networkInterface;
-    /**
-     * A list of decoders to be used. You can use a String which have values
-     * separated by comma and have the values be looked up in the Registry. 
Just
-     * remember to prefix the value with so Camel knows it should lookup.
-     */
-    private List<ChannelHandler> decoders;
-    /**
-     * Which protocols to enable when using SSL
-     */
-    private String enabledProtocols;
-    /**
-     * A list of encoders to be used. You can use a String which have values
-     * separated by comma and have the values be looked up in the Registry. 
Just
-     * remember to prefix the value with so Camel knows it should lookup.
-     */
-    private List<ChannelHandler> encoders;
-    /**
-     * Used only in clientMode in consumer the consumer will attempt to
-     * reconnect on disconnection if this is enabled
-     */
-    private Boolean reconnect;
-    /**
-     * A custom ChannelHandler class that can be used to perform special
-     * marshalling of outbound payloads.
-     */
-    private ChannelHandler encoder;
-    /**
-     * Used if reconnect and clientMode is enabled. The interval in milli
-     * seconds to attempt reconnection
-     */
-    private Integer reconnectInterval;
-    /**
-     * A custom ChannelHandler class that can be used to perform special
-     * marshalling of inbound payloads.
-     */
-    private ChannelHandler decoder;
-    /**
-     * Whether or not to disconnect(close) from Netty Channel right after use.
-     * Can be used for both consumer and producer.
-     */
-    private Boolean disconnect;
-    /**
-     * Channels can be lazily created to avoid exceptions if the remote server
-     * is not up and running when the Camel producer is started.
-     */
-    private Boolean lazyChannelCreation;
-    /**
-     * Only used for TCP. You can transfer the exchange over the wire instead 
of
-     * just the body. The following fields are transferred: In body Out body
-     * fault body In headers Out headers fault headers exchange properties
-     * exchange exception. This requires that the objects are serializable.
-     * Camel will exclude any non-serializable objects and log it at WARN 
level.
-     */
-    private Boolean transferExchange;
-    /**
-     * If sync is enabled then this option dictates NettyConsumer if it should
-     * disconnect where there is no reply to send back.
-     */
-    private Boolean disconnectOnNoReply;
-    /**
-     * If sync is enabled this option dictates NettyConsumer which logging 
level
-     * to use when logging a there is no reply to send back.
-     */
-    private LoggingLevel noReplyLogLevel;
-    /**
-     * If the server (NettyConsumer) catches an exception then its logged using
-     * this logging level.
-     */
-    private LoggingLevel serverExceptionCaughtLogLevel;
-    /**
-     * If the server (NettyConsumer) catches an
-     * java.nio.channels.ClosedChannelException then its logged using this
-     * logging level. This is used to avoid logging the closed channel
-     * exceptions as clients can disconnect abruptly and then cause a flood of
-     * closed exceptions in the Netty server.
-     */
-    private LoggingLevel serverClosedChannelExceptionCaughtLogLevel;
-    /**
-     * The netty component installs a default codec if both encoder/deocder is
-     * null and textline is false. Setting allowDefaultCodec to false prevents
-     * the netty component from installing a default codec as the first element
-     * in the filter chain.
-     */
-    private Boolean allowDefaultCodec;
-    /**
-     * To use a custom ClientInitializerFactory
-     */
-    private ClientInitializerFactory clientInitializerFactory;
-    /**
-     * Whether to use ordered thread pool to ensure events are processed 
orderly
-     * on the same channel.
-     */
-    private Boolean usingExecutorService;
-    /**
-     * Sets the cap on the number of objects that can be allocated by the pool
-     * (checked out to clients or idle awaiting checkout) at a given time. Use 
a
-     * negative value for no limit.
-     */
-    private Integer producerPoolMaxActive;
-    /**
-     * Sets the minimum number of instances allowed in the producer pool before
-     * the evictor thread (if active) spawns new objects.
-     */
-    private Integer producerPoolMinIdle;
-    /**
-     * Sets the cap on the number of idle instances in the pool.
-     */
-    private Integer producerPoolMaxIdle;
-    /**
-     * Sets the minimum amount of time (value in millis) an object may sit idle
-     * in the pool before it is eligible for eviction by the idle object
-     * evictor.
-     */
-    private long producerPoolMinEvictableIdle;
-    /**
-     * Whether producer pool is enabled or not. Important: Do not turn this off
-     * as the pooling is needed for handling concurrency and reliable
-     * request/reply.
-     */
-    private Boolean producerPoolEnabled;
-    /**
-     * This option supports connection less udp sending which is a real fire 
and
-     * forget. A connected udp send receive the PortUnreachableException if no
-     * one is listen on the receiving port.
-     */
-    private Boolean udpConnectionlessSending;
-    /**
-     * If the clientMode is true netty consumer will connect the address as a
-     * TCP client.
-     */
-    private Boolean clientMode;
-    /**
-     * If the useByteBuf is true netty producer will turn the message body into
-     * ByteBuf before sending it out.
-     */
-    private Boolean useByteBuf;
-    /**
-     * For UDP only. If enabled the using byte array codec instead of Java
-     * serialization protocol.
-     */
-    private Boolean udpByteArrayCodec;
-    /**
-     * This option allows producers to reuse the same Netty Channel for the
-     * lifecycle of processing the Exchange. This is useable if you need to 
call
-     * a server multiple times in a Camel route and want to use the same 
network
-     * connection. When using this the channel is not returned to the 
connection
-     * pool until the Exchange is done; or disconnected if the disconnect 
option
-     * is set to true. The reused Channel is stored on the Exchange as an
-     * exchange property with the key link NettyConstantsNETTY_CHANNEL which
-     * allows you to obtain the channel during routing and use it as well.
-     */
-    private Boolean reuseChannel;
 
     public Integer getMaximumPoolSize() {
         return maximumPoolSize;
@@ -412,11 +66,12 @@ public class NettyComponentConfiguration {
         this.maximumPoolSize = maximumPoolSize;
     }
 
-    public NettyConfiguration getConfiguration() {
+    public NettyConfigurationNestedConfiguration getConfiguration() {
         return configuration;
     }
 
-    public void setConfiguration(NettyConfiguration configuration) {
+    public void setConfiguration(
+            NettyConfigurationNestedConfiguration configuration) {
         this.configuration = configuration;
     }
 
@@ -428,538 +83,981 @@ public class NettyComponentConfiguration {
         this.executorService = executorService;
     }
 
-    public String getProtocol() {
-        return protocol;
-    }
-
-    public void setProtocol(String protocol) {
-        this.protocol = protocol;
-    }
-
-    public String getHost() {
-        return host;
-    }
-
-    public void setHost(String host) {
-        this.host = host;
-    }
-
-    public Integer getPort() {
-        return port;
-    }
-
-    public void setPort(Integer port) {
-        this.port = port;
-    }
-
-    public Boolean getBroadcast() {
-        return broadcast;
-    }
-
-    public void setBroadcast(Boolean broadcast) {
-        this.broadcast = broadcast;
-    }
-
-    public Integer getSendBufferSize() {
-        return sendBufferSize;
-    }
-
-    public void setSendBufferSize(Integer sendBufferSize) {
-        this.sendBufferSize = sendBufferSize;
-    }
-
-    public Integer getReceiveBufferSize() {
-        return receiveBufferSize;
-    }
-
-    public void setReceiveBufferSize(Integer receiveBufferSize) {
-        this.receiveBufferSize = receiveBufferSize;
-    }
-
-    public Integer getReceiveBufferSizePredictor() {
-        return receiveBufferSizePredictor;
-    }
-
-    public void setReceiveBufferSizePredictor(Integer 
receiveBufferSizePredictor) {
-        this.receiveBufferSizePredictor = receiveBufferSizePredictor;
-    }
-
-    public Integer getWorkerCount() {
-        return workerCount;
-    }
-
-    public void setWorkerCount(Integer workerCount) {
-        this.workerCount = workerCount;
-    }
-
-    public Integer getBossCount() {
-        return bossCount;
-    }
-
-    public void setBossCount(Integer bossCount) {
-        this.bossCount = bossCount;
-    }
-
-    public Boolean getKeepAlive() {
-        return keepAlive;
-    }
-
-    public void setKeepAlive(Boolean keepAlive) {
-        this.keepAlive = keepAlive;
-    }
-
-    public Boolean getTcpNoDelay() {
-        return tcpNoDelay;
-    }
-
-    public void setTcpNoDelay(Boolean tcpNoDelay) {
-        this.tcpNoDelay = tcpNoDelay;
-    }
-
-    public Boolean getReuseAddress() {
-        return reuseAddress;
-    }
-
-    public void setReuseAddress(Boolean reuseAddress) {
-        this.reuseAddress = reuseAddress;
-    }
-
-    public Integer getConnectTimeout() {
-        return connectTimeout;
-    }
-
-    public void setConnectTimeout(Integer connectTimeout) {
-        this.connectTimeout = connectTimeout;
-    }
-
-    public Integer getBacklog() {
-        return backlog;
-    }
-
-    public void setBacklog(Integer backlog) {
-        this.backlog = backlog;
-    }
-
-    public Boolean getSsl() {
-        return ssl;
-    }
-
-    public void setSsl(Boolean ssl) {
-        this.ssl = ssl;
-    }
-
-    public Boolean getSslClientCertHeaders() {
-        return sslClientCertHeaders;
-    }
-
-    public void setSslClientCertHeaders(Boolean sslClientCertHeaders) {
-        this.sslClientCertHeaders = sslClientCertHeaders;
-    }
-
-    public SslHandler getSslHandler() {
-        return sslHandler;
-    }
-
-    public void setSslHandler(SslHandler sslHandler) {
-        this.sslHandler = sslHandler;
-    }
-
-    public SSLContextParameters getSslContextParameters() {
-        return sslContextParameters;
-    }
-
-    public void setSslContextParameters(
-            SSLContextParameters sslContextParameters) {
-        this.sslContextParameters = sslContextParameters;
-    }
-
-    public Boolean getNeedClientAuth() {
-        return needClientAuth;
-    }
-
-    public void setNeedClientAuth(Boolean needClientAuth) {
-        this.needClientAuth = needClientAuth;
-    }
-
-    public String getKeyStoreResource() {
-        return keyStoreResource;
-    }
-
-    public void setKeyStoreResource(String keyStoreResource) {
-        this.keyStoreResource = keyStoreResource;
-    }
-
-    public String getTrustStoreResource() {
-        return trustStoreResource;
-    }
-
-    public void setTrustStoreResource(String trustStoreResource) {
-        this.trustStoreResource = trustStoreResource;
-    }
-
-    public String getKeyStoreFormat() {
-        return keyStoreFormat;
-    }
-
-    public void setKeyStoreFormat(String keyStoreFormat) {
-        this.keyStoreFormat = keyStoreFormat;
-    }
-
-    public String getSecurityProvider() {
-        return securityProvider;
-    }
-
-    public void setSecurityProvider(String securityProvider) {
-        this.securityProvider = securityProvider;
-    }
-
-    public String getPassphrase() {
-        return passphrase;
-    }
-
-    public void setPassphrase(String passphrase) {
-        this.passphrase = passphrase;
-    }
-
-    public ServerInitializerFactory getServerInitializerFactory() {
-        return serverInitializerFactory;
-    }
-
-    public void setServerInitializerFactory(
-            ServerInitializerFactory serverInitializerFactory) {
-        this.serverInitializerFactory = serverInitializerFactory;
-    }
-
-    public NettyServerBootstrapFactory getNettyServerBootstrapFactory() {
-        return nettyServerBootstrapFactory;
-    }
-
-    public void setNettyServerBootstrapFactory(
-            NettyServerBootstrapFactory nettyServerBootstrapFactory) {
-        this.nettyServerBootstrapFactory = nettyServerBootstrapFactory;
-    }
-
-    public long getRequestTimeout() {
-        return requestTimeout;
-    }
-
-    public void setRequestTimeout(long requestTimeout) {
-        this.requestTimeout = requestTimeout;
-    }
-
-    public Boolean getSync() {
-        return sync;
-    }
-
-    public void setSync(Boolean sync) {
-        this.sync = sync;
-    }
-
-    public Map<String, Object> getOptions() {
-        return options;
-    }
-
-    public void setOptions(Map<String, Object> options) {
-        this.options = options;
-    }
-
-    public Boolean getTextline() {
-        return textline;
-    }
-
-    public void setTextline(Boolean textline) {
-        this.textline = textline;
-    }
-
-    public Boolean getNativeTransport() {
-        return nativeTransport;
-    }
-
-    public void setNativeTransport(Boolean nativeTransport) {
-        this.nativeTransport = nativeTransport;
-    }
-
-    public Integer getDecoderMaxLineLength() {
-        return decoderMaxLineLength;
-    }
-
-    public void setDecoderMaxLineLength(Integer decoderMaxLineLength) {
-        this.decoderMaxLineLength = decoderMaxLineLength;
-    }
-
-    public EventLoopGroup getBossGroup() {
-        return bossGroup;
-    }
-
-    public void setBossGroup(EventLoopGroup bossGroup) {
-        this.bossGroup = bossGroup;
-    }
-
-    public TextLineDelimiter getDelimiter() {
-        return delimiter;
-    }
-
-    public void setDelimiter(TextLineDelimiter delimiter) {
-        this.delimiter = delimiter;
-    }
-
-    public Boolean getAutoAppendDelimiter() {
-        return autoAppendDelimiter;
-    }
-
-    public void setAutoAppendDelimiter(Boolean autoAppendDelimiter) {
-        this.autoAppendDelimiter = autoAppendDelimiter;
-    }
-
-    public EventLoopGroup getWorkerGroup() {
-        return workerGroup;
-    }
-
-    public void setWorkerGroup(EventLoopGroup workerGroup) {
-        this.workerGroup = workerGroup;
-    }
-
-    public ChannelGroup getChannelGroup() {
-        return channelGroup;
-    }
-
-    public void setChannelGroup(ChannelGroup channelGroup) {
-        this.channelGroup = channelGroup;
-    }
-
-    public String getEncoding() {
-        return encoding;
-    }
-
-    public void setEncoding(String encoding) {
-        this.encoding = encoding;
-    }
-
-    public String getNetworkInterface() {
-        return networkInterface;
-    }
-
-    public void setNetworkInterface(String networkInterface) {
-        this.networkInterface = networkInterface;
-    }
-
-    public List<ChannelHandler> getDecoders() {
-        return decoders;
-    }
-
-    public void setDecoders(List<ChannelHandler> decoders) {
-        this.decoders = decoders;
-    }
-
-    public String getEnabledProtocols() {
-        return enabledProtocols;
-    }
-
-    public void setEnabledProtocols(String enabledProtocols) {
-        this.enabledProtocols = enabledProtocols;
-    }
-
-    public List<ChannelHandler> getEncoders() {
-        return encoders;
-    }
-
-    public void setEncoders(List<ChannelHandler> encoders) {
-        this.encoders = encoders;
-    }
-
-    public Boolean getReconnect() {
-        return reconnect;
-    }
-
-    public void setReconnect(Boolean reconnect) {
-        this.reconnect = reconnect;
-    }
-
-    public ChannelHandler getEncoder() {
-        return encoder;
-    }
-
-    public void setEncoder(ChannelHandler encoder) {
-        this.encoder = encoder;
-    }
-
-    public Integer getReconnectInterval() {
-        return reconnectInterval;
-    }
-
-    public void setReconnectInterval(Integer reconnectInterval) {
-        this.reconnectInterval = reconnectInterval;
-    }
-
-    public ChannelHandler getDecoder() {
-        return decoder;
-    }
-
-    public void setDecoder(ChannelHandler decoder) {
-        this.decoder = decoder;
-    }
-
-    public Boolean getDisconnect() {
-        return disconnect;
-    }
-
-    public void setDisconnect(Boolean disconnect) {
-        this.disconnect = disconnect;
-    }
-
-    public Boolean getLazyChannelCreation() {
-        return lazyChannelCreation;
-    }
-
-    public void setLazyChannelCreation(Boolean lazyChannelCreation) {
-        this.lazyChannelCreation = lazyChannelCreation;
-    }
-
-    public Boolean getTransferExchange() {
-        return transferExchange;
-    }
-
-    public void setTransferExchange(Boolean transferExchange) {
-        this.transferExchange = transferExchange;
-    }
-
-    public Boolean getDisconnectOnNoReply() {
-        return disconnectOnNoReply;
-    }
-
-    public void setDisconnectOnNoReply(Boolean disconnectOnNoReply) {
-        this.disconnectOnNoReply = disconnectOnNoReply;
-    }
-
-    public LoggingLevel getNoReplyLogLevel() {
-        return noReplyLogLevel;
-    }
-
-    public void setNoReplyLogLevel(LoggingLevel noReplyLogLevel) {
-        this.noReplyLogLevel = noReplyLogLevel;
-    }
-
-    public LoggingLevel getServerExceptionCaughtLogLevel() {
-        return serverExceptionCaughtLogLevel;
-    }
-
-    public void setServerExceptionCaughtLogLevel(
-            LoggingLevel serverExceptionCaughtLogLevel) {
-        this.serverExceptionCaughtLogLevel = serverExceptionCaughtLogLevel;
-    }
-
-    public LoggingLevel getServerClosedChannelExceptionCaughtLogLevel() {
-        return serverClosedChannelExceptionCaughtLogLevel;
-    }
-
-    public void setServerClosedChannelExceptionCaughtLogLevel(
-            LoggingLevel serverClosedChannelExceptionCaughtLogLevel) {
-        this.serverClosedChannelExceptionCaughtLogLevel = 
serverClosedChannelExceptionCaughtLogLevel;
-    }
-
-    public Boolean getAllowDefaultCodec() {
-        return allowDefaultCodec;
-    }
-
-    public void setAllowDefaultCodec(Boolean allowDefaultCodec) {
-        this.allowDefaultCodec = allowDefaultCodec;
-    }
-
-    public ClientInitializerFactory getClientInitializerFactory() {
-        return clientInitializerFactory;
-    }
-
-    public void setClientInitializerFactory(
-            ClientInitializerFactory clientInitializerFactory) {
-        this.clientInitializerFactory = clientInitializerFactory;
-    }
-
-    public Boolean getUsingExecutorService() {
-        return usingExecutorService;
-    }
-
-    public void setUsingExecutorService(Boolean usingExecutorService) {
-        this.usingExecutorService = usingExecutorService;
-    }
-
-    public Integer getProducerPoolMaxActive() {
-        return producerPoolMaxActive;
-    }
-
-    public void setProducerPoolMaxActive(Integer producerPoolMaxActive) {
-        this.producerPoolMaxActive = producerPoolMaxActive;
-    }
-
-    public Integer getProducerPoolMinIdle() {
-        return producerPoolMinIdle;
-    }
-
-    public void setProducerPoolMinIdle(Integer producerPoolMinIdle) {
-        this.producerPoolMinIdle = producerPoolMinIdle;
-    }
-
-    public Integer getProducerPoolMaxIdle() {
-        return producerPoolMaxIdle;
-    }
-
-    public void setProducerPoolMaxIdle(Integer producerPoolMaxIdle) {
-        this.producerPoolMaxIdle = producerPoolMaxIdle;
-    }
-
-    public long getProducerPoolMinEvictableIdle() {
-        return producerPoolMinEvictableIdle;
-    }
-
-    public void setProducerPoolMinEvictableIdle(
-            long producerPoolMinEvictableIdle) {
-        this.producerPoolMinEvictableIdle = producerPoolMinEvictableIdle;
-    }
-
-    public Boolean getProducerPoolEnabled() {
-        return producerPoolEnabled;
-    }
-
-    public void setProducerPoolEnabled(Boolean producerPoolEnabled) {
-        this.producerPoolEnabled = producerPoolEnabled;
-    }
-
-    public Boolean getUdpConnectionlessSending() {
-        return udpConnectionlessSending;
-    }
-
-    public void setUdpConnectionlessSending(Boolean udpConnectionlessSending) {
-        this.udpConnectionlessSending = udpConnectionlessSending;
-    }
-
-    public Boolean getClientMode() {
-        return clientMode;
-    }
-
-    public void setClientMode(Boolean clientMode) {
-        this.clientMode = clientMode;
-    }
-
-    public Boolean getUseByteBuf() {
-        return useByteBuf;
-    }
-
-    public void setUseByteBuf(Boolean useByteBuf) {
-        this.useByteBuf = useByteBuf;
-    }
-
-    public Boolean getUdpByteArrayCodec() {
-        return udpByteArrayCodec;
-    }
-
-    public void setUdpByteArrayCodec(Boolean udpByteArrayCodec) {
-        this.udpByteArrayCodec = udpByteArrayCodec;
-    }
-
-    public Boolean getReuseChannel() {
-        return reuseChannel;
-    }
+    public static class NettyConfigurationNestedConfiguration {
+        public static final Class CAMEL_NESTED_CLASS = 
org.apache.camel.component.netty4.NettyConfiguration.class;
+        /**
+         * Allows to use a timeout for the Netty producer when calling a remote
+         * server. By default no timeout is in use. The value is in milli
+         * seconds, so eg 30000 is 30 seconds. The requestTimeout is using
+         * Netty's ReadTimeoutHandler to trigger the timeout.
+         */
+        private Long requestTimeout;
+        /**
+         * Setting to set endpoint as one-way or request-response
+         */
+        private Boolean sync;
+        /**
+         * Only used for TCP. If no codec is specified, you can use this flag 
to
+         * indicate a text line based codec; if not specified or the value is
+         * false, then Object Serialization is assumed over TCP.
+         */
+        private Boolean textline;
+        /**
+         * The max line length to use for the textline codec.
+         */
+        private Integer decoderMaxLineLength;
+        /**
+         * The delimiter to use for the textline codec. Possible values are 
LINE
+         * and NULL.
+         */
+        private TextLineDelimiter delimiter = TextLineDelimiter.LINE;
+        /**
+         * Whether or not to auto append missing end delimiter when sending
+         * using the textline codec.
+         */
+        private Boolean autoAppendDelimiter;
+        /**
+         * The encoding (a charset name) to use for the textline codec. If not
+         * provided, Camel will use the JVM default Charset.
+         */
+        private String encoding;
+        /**
+         * A list of decoders to be used. You can use a String which have 
values
+         * separated by comma, and have the values be looked up in the 
Registry.
+         * Just remember to prefix the value with # so Camel knows it should
+         * lookup.
+         */
+        private List decoders;
+        /**
+         * A list of encoders to be used. You can use a String which have 
values
+         * separated by comma, and have the values be looked up in the 
Registry.
+         * Just remember to prefix the value with # so Camel knows it should
+         * lookup.
+         */
+        private List encoders;
+        /**
+         * A custom ChannelHandler class that can be used to perform special
+         * marshalling of outbound payloads.
+         */
+        @NestedConfigurationProperty
+        @Deprecated
+        private ChannelHandler encoder;
+        /**
+         * A custom ChannelHandler class that can be used to perform special
+         * marshalling of inbound payloads.
+         */
+        @NestedConfigurationProperty
+        @Deprecated
+        private ChannelHandler decoder;
+        /**
+         * Whether or not to disconnect(close) from Netty Channel right after
+         * use. Can be used for both consumer and producer.
+         */
+        private Boolean disconnect;
+        /**
+         * Channels can be lazily created to avoid exceptions, if the remote
+         * server is not up and running when the Camel producer is started.
+         */
+        private Boolean lazyChannelCreation;
+        /**
+         * Only used for TCP. You can transfer the exchange over the wire
+         * instead of just the body. The following fields are transferred: In
+         * body, Out body, fault body, In headers, Out headers, fault headers,
+         * exchange properties, exchange exception. This requires that the
+         * objects are serializable. Camel will exclude any non-serializable
+         * objects and log it at WARN level.
+         */
+        private Boolean transferExchange;
+        /**
+         * If sync is enabled then this option dictates NettyConsumer if it
+         * should disconnect where there is no reply to send back.
+         */
+        private Boolean disconnectOnNoReply;
+        /**
+         * If sync is enabled this option dictates NettyConsumer which logging
+         * level to use when logging a there is no reply to send back.
+         */
+        private LoggingLevel noReplyLogLevel = LoggingLevel.WARN;
+        /**
+         * If the server (NettyConsumer) catches an exception then its logged
+         * using this logging level.
+         */
+        private LoggingLevel serverExceptionCaughtLogLevel = LoggingLevel.WARN;
+        /**
+         * If the server (NettyConsumer) catches an
+         * java.nio.channels.ClosedChannelException then its logged using this
+         * logging level. This is used to avoid logging the closed channel
+         * exceptions, as clients can disconnect abruptly and then cause a 
flood
+         * of closed exceptions in the Netty server.
+         */
+        private LoggingLevel serverClosedChannelExceptionCaughtLogLevel = 
LoggingLevel.DEBUG;
+        /**
+         * The netty component installs a default codec if both, 
encoder/deocder
+         * is null and textline is false. Setting allowDefaultCodec to false
+         * prevents the netty component from installing a default codec as the
+         * first element in the filter chain.
+         */
+        private Boolean allowDefaultCodec;
+        /**
+         * @deprecated use #setClientInitializerFactory
+         */
+        @NestedConfigurationProperty
+        @Deprecated
+        private ClientInitializerFactory clientPipelineFactory;
+        /**
+         * To use a custom ClientInitializerFactory
+         */
+        @NestedConfigurationProperty
+        private ClientInitializerFactory clientInitializerFactory;
+        /**
+         * Whether to use ordered thread pool, to ensure events are processed
+         * orderly on the same channel.
+         */
+        private Boolean usingExecutorService;
+        /**
+         * Sets the cap on the number of objects that can be allocated by the
+         * pool (checked out to clients, or idle awaiting checkout) at a given
+         * time. Use a negative value for no limit.
+         */
+        private Integer producerPoolMaxActive;
+        /**
+         * Sets the minimum number of instances allowed in the producer pool
+         * before the evictor thread (if active) spawns new objects.
+         */
+        private Integer producerPoolMinIdle;
+        /**
+         * Sets the cap on the number of "idle" instances in the pool.
+         */
+        private Integer producerPoolMaxIdle;
+        /**
+         * Sets the minimum amount of time (value in millis) an object may sit
+         * idle in the pool before it is eligible for eviction by the idle
+         * object evictor.
+         */
+        private Long producerPoolMinEvictableIdle;
+        /**
+         * Whether producer pool is enabled or not. Important: Do not turn this
+         * off, as the pooling is needed for handling concurrency and reliable
+         * request/reply.
+         */
+        private Boolean producerPoolEnabled;
+        /**
+         * This option supports connection less udp sending which is a real 
fire
+         * and forget. A connected udp send receive the 
PortUnreachableException
+         * if no one is listen on the receiving port.
+         */
+        private Boolean udpConnectionlessSending;
+        /**
+         * If the clientMode is true, netty consumer will connect the address 
as
+         * a TCP client.
+         */
+        private Boolean clientMode;
+        /**
+         * If the useByteBuf is true, netty producer will turn the message body
+         * into {@link ByteBuf} before sending it out.
+         */
+        private Boolean useByteBuf;
+        /**
+         * For UDP only. If enabled the using byte array codec instead of Java
+         * serialization protocol.
+         */
+        private Boolean udpByteArrayCodec;
+        /**
+         * This option allows producers to reuse the same Netty {@link Channel}
+         * for the lifecycle of processing the {@link Exchange} . This is
+         * useable if you need to call a server multiple times in a Camel route
+         * and want to use the same network connection. When using this the
+         * channel is not returned to the connection pool until the
+         * {@link Exchange} is done; or disconnected if the disconnect option 
is
+         * set to true.
+         * <p/>
+         * The reused {@link Channel} is stored on the {@link Exchange} as an
+         * exchange property with the key {@link NettyConstants#NETTY_CHANNEL}
+         * which allows you to obtain the channel during routing and use it as
+         * well.
+         */
+        private Boolean reuseChannel;
+        /**
+         * The protocol to use which can be tcp or udp.
+         */
+        private String protocol;
+        /**
+         * The hostname.
+         * <p/>
+         * For the consumer the hostname is localhost or 0.0.0.0 For the
+         * producer the hostname is the remote host to connect to
+         */
+        private String host;
+        /**
+         * The host port number
+         */
+        private Integer port;
+        /**
+         * Setting to choose Multicast over UDP
+         */
+        private Boolean broadcast;
+        /**
+         * The TCP/UDP buffer sizes to be used during outbound communication.
+         * Size is bytes.
+         */
+        private Integer sendBufferSize;
+        /**
+         * The TCP/UDP buffer sizes to be used during inbound communication.
+         * Size is bytes.
+         */
+        private Integer receiveBufferSize;
+        /**
+         * Configures the buffer size predictor. See details at Jetty
+         * documentation and this mail thread.
+         */
+        private Integer receiveBufferSizePredictor;
+        /**
+         * When netty works on nio mode, it uses default workerCount parameter
+         * from Netty, which is cpu_core_threads*2. User can use this operation
+         * to override the default workerCount from Netty
+         */
+        private Integer workerCount;
+        /**
+         * When netty works on nio mode, it uses default bossCount parameter
+         * from Netty, which is 1. User can use this operation to override the
+         * default bossCount from Netty
+         */
+        private Integer bossCount;
+        /**
+         * Setting to ensure socket is not closed due to inactivity
+         */
+        private Boolean keepAlive;
+        /**
+         * Setting to improve TCP protocol performance
+         */
+        private Boolean tcpNoDelay;
+        /**
+         * Setting to facilitate socket multiplexing
+         */
+        private Boolean reuseAddress;
+        /**
+         * Time to wait for a socket connection to be available. Value is in
+         * millis.
+         */
+        private Integer connectTimeout;
+        /**
+         * Allows to configure a backlog for netty consumer (server). Note the
+         * backlog is just a best effort depending on the OS. Setting this
+         * option to a value such as 200, 500 or 1000, tells the TCP stack how
+         * long the "accept" queue can be If this option is not configured, 
then
+         * the backlog depends on OS setting.
+         */
+        private Integer backlog;
+        /**
+         * Setting to specify whether SSL encryption is applied to this 
endpoint
+         */
+        private Boolean ssl;
+        /**
+         * When enabled and in SSL mode, then the Netty consumer will enrich 
the
+         * Camel Message with headers having information about the client
+         * certificate such as subject name, issuer name, serial number, and 
the
+         * valid date range.
+         */
+        private Boolean sslClientCertHeaders;
+        /**
+         * Reference to a class that could be used to return an SSL Handler
+         */
+        @NestedConfigurationProperty
+        private SslHandler sslHandler;
+        /**
+         * To configure security using SSLContextParameters
+         */
+        @NestedConfigurationProperty
+        private SSLContextParameters sslContextParameters;
+        /**
+         * Configures whether the server needs client authentication when using
+         * SSL.
+         */
+        private Boolean needClientAuth;
+        /**
+         * Client side certificate keystore to be used for encryption
+         */
+        @Deprecated
+        private File keyStoreFile;
+        /**
+         * Server side certificate keystore to be used for encryption
+         */
+        @Deprecated
+        private File trustStoreFile;
+        /**
+         * Client side certificate keystore to be used for encryption. Is 
loaded
+         * by default from classpath, but you can prefix with "classpath:",
+         * "file:", or "http:" to load the resource from different systems.
+         */
+        private String keyStoreResource;
+        /**
+         * Server side certificate keystore to be used for encryption. Is 
loaded
+         * by default from classpath, but you can prefix with "classpath:",
+         * "file:", or "http:" to load the resource from different systems.
+         */
+        private String trustStoreResource;
+        /**
+         * Keystore format to be used for payload encryption. Defaults to "JKS"
+         * if not set
+         */
+        private String keyStoreFormat;
+        /**
+         * Security provider to be used for payload encryption. Defaults to
+         * "SunX509" if not set.
+         */
+        private String securityProvider;
+        /**
+         * Password setting to use in order to encrypt/decrypt payloads sent
+         * using SSH
+         */
+        private String passphrase;
+        /**
+         * @deprecated use #setServerInitializerFactory
+         */
+        @NestedConfigurationProperty
+        @Deprecated
+        private ServerInitializerFactory serverPipelineFactory;
+        /**
+         * To use a custom ServerInitializerFactory
+         */
+        @NestedConfigurationProperty
+        private ServerInitializerFactory serverInitializerFactory;
+        /**
+         * To use a custom NettyServerBootstrapFactory
+         */
+        @NestedConfigurationProperty
+        private NettyServerBootstrapFactory nettyServerBootstrapFactory;
+        /**
+         * Allows to configure additional netty options using "option." as
+         * prefix. For example "option.child.keepAlive=false" to set the netty
+         * option "child.keepAlive=false". See the Netty documentation for
+         * possible options that can be used.
+         */
+        private Map options;
+        /**
+         * Whether to use native transport instead of NIO. Native transport
+         * takes advantage of the host operating system and is only supported 
on
+         * some platforms. You need to add the netty JAR for the host operating
+         * system you are using. See more details at:
+         * http://netty.io/wiki/native-transports.html
+         */
+        private Boolean nativeTransport;
+        /**
+         * Set the BossGroup which could be used for handling the new 
connection
+         * of the server side across the NettyEndpoint
+         */
+        @NestedConfigurationProperty
+        private EventLoopGroup bossGroup;
+        /**
+         * To use a explicit EventLoopGroup as the boss thread pool. For 
example
+         * to share a thread pool with multiple consumers. By default each
+         * consumer has their own boss pool with 1 core thread.
+         */
+        @NestedConfigurationProperty
+        private EventLoopGroup workerGroup;
+        /**
+         * To use a explicit ChannelGroup.
+         */
+        @NestedConfigurationProperty
+        private ChannelGroup channelGroup;
+        /**
+         * When using UDP then this option can be used to specify a network
+         * interface by its name, such as eth0 to join a multicast group.
+         */
+        private String networkInterface;
+        /**
+         * Which protocols to enable when using SSL
+         */
+        private String enabledProtocols = "DEFAULT_ENABLED_PROTOCOLS";
+        private Boolean reconnect;
+        private Integer reconnectInterval;
+
+        public Long getRequestTimeout() {
+            return requestTimeout;
+        }
+
+        public void setRequestTimeout(Long requestTimeout) {
+            this.requestTimeout = requestTimeout;
+        }
+
+        public Boolean getSync() {
+            return sync;
+        }
+
+        public void setSync(Boolean sync) {
+            this.sync = sync;
+        }
+
+        public Boolean getTextline() {
+            return textline;
+        }
+
+        public void setTextline(Boolean textline) {
+            this.textline = textline;
+        }
+
+        public Integer getDecoderMaxLineLength() {
+            return decoderMaxLineLength;
+        }
+
+        public void setDecoderMaxLineLength(Integer decoderMaxLineLength) {
+            this.decoderMaxLineLength = decoderMaxLineLength;
+        }
+
+        public TextLineDelimiter getDelimiter() {
+            return delimiter;
+        }
+
+        public void setDelimiter(TextLineDelimiter delimiter) {
+            this.delimiter = delimiter;
+        }
+
+        public Boolean getAutoAppendDelimiter() {
+            return autoAppendDelimiter;
+        }
+
+        public void setAutoAppendDelimiter(Boolean autoAppendDelimiter) {
+            this.autoAppendDelimiter = autoAppendDelimiter;
+        }
+
+        public String getEncoding() {
+            return encoding;
+        }
+
+        public void setEncoding(String encoding) {
+            this.encoding = encoding;
+        }
+
+        public List getDecoders() {
+            return decoders;
+        }
+
+        public void setDecoders(List decoders) {
+            this.decoders = decoders;
+        }
+
+        public List getEncoders() {
+            return encoders;
+        }
+
+        public void setEncoders(List encoders) {
+            this.encoders = encoders;
+        }
+
+        @Deprecated
+        @DeprecatedConfigurationProperty
+        public ChannelHandler getEncoder() {
+            return encoder;
+        }
+
+        @Deprecated
+        public void setEncoder(ChannelHandler encoder) {
+            this.encoder = encoder;
+        }
+
+        @Deprecated
+        @DeprecatedConfigurationProperty
+        public ChannelHandler getDecoder() {
+            return decoder;
+        }
+
+        @Deprecated
+        public void setDecoder(ChannelHandler decoder) {
+            this.decoder = decoder;
+        }
+
+        public Boolean getDisconnect() {
+            return disconnect;
+        }
+
+        public void setDisconnect(Boolean disconnect) {
+            this.disconnect = disconnect;
+        }
+
+        public Boolean getLazyChannelCreation() {
+            return lazyChannelCreation;
+        }
+
+        public void setLazyChannelCreation(Boolean lazyChannelCreation) {
+            this.lazyChannelCreation = lazyChannelCreation;
+        }
+
+        public Boolean getTransferExchange() {
+            return transferExchange;
+        }
+
+        public void setTransferExchange(Boolean transferExchange) {
+            this.transferExchange = transferExchange;
+        }
+
+        public Boolean getDisconnectOnNoReply() {
+            return disconnectOnNoReply;
+        }
+
+        public void setDisconnectOnNoReply(Boolean disconnectOnNoReply) {
+            this.disconnectOnNoReply = disconnectOnNoReply;
+        }
+
+        public LoggingLevel getNoReplyLogLevel() {
+            return noReplyLogLevel;
+        }
+
+        public void setNoReplyLogLevel(LoggingLevel noReplyLogLevel) {
+            this.noReplyLogLevel = noReplyLogLevel;
+        }
+
+        public LoggingLevel getServerExceptionCaughtLogLevel() {
+            return serverExceptionCaughtLogLevel;
+        }
+
+        public void setServerExceptionCaughtLogLevel(
+                LoggingLevel serverExceptionCaughtLogLevel) {
+            this.serverExceptionCaughtLogLevel = serverExceptionCaughtLogLevel;
+        }
+
+        public LoggingLevel getServerClosedChannelExceptionCaughtLogLevel() {
+            return serverClosedChannelExceptionCaughtLogLevel;
+        }
+
+        public void setServerClosedChannelExceptionCaughtLogLevel(
+                LoggingLevel serverClosedChannelExceptionCaughtLogLevel) {
+            this.serverClosedChannelExceptionCaughtLogLevel = 
serverClosedChannelExceptionCaughtLogLevel;
+        }
+
+        public Boolean getAllowDefaultCodec() {
+            return allowDefaultCodec;
+        }
+
+        public void setAllowDefaultCodec(Boolean allowDefaultCodec) {
+            this.allowDefaultCodec = allowDefaultCodec;
+        }
+
+        @Deprecated
+        @DeprecatedConfigurationProperty
+        public ClientInitializerFactory getClientPipelineFactory() {
+            return clientPipelineFactory;
+        }
+
+        @Deprecated
+        public void setClientPipelineFactory(
+                ClientInitializerFactory clientPipelineFactory) {
+            this.clientPipelineFactory = clientPipelineFactory;
+        }
+
+        public ClientInitializerFactory getClientInitializerFactory() {
+            return clientInitializerFactory;
+        }
+
+        public void setClientInitializerFactory(
+                ClientInitializerFactory clientInitializerFactory) {
+            this.clientInitializerFactory = clientInitializerFactory;
+        }
+
+        public Boolean getUsingExecutorService() {
+            return usingExecutorService;
+        }
+
+        public void setUsingExecutorService(Boolean usingExecutorService) {
+            this.usingExecutorService = usingExecutorService;
+        }
+
+        public Integer getProducerPoolMaxActive() {
+            return producerPoolMaxActive;
+        }
+
+        public void setProducerPoolMaxActive(Integer producerPoolMaxActive) {
+            this.producerPoolMaxActive = producerPoolMaxActive;
+        }
+
+        public Integer getProducerPoolMinIdle() {
+            return producerPoolMinIdle;
+        }
+
+        public void setProducerPoolMinIdle(Integer producerPoolMinIdle) {
+            this.producerPoolMinIdle = producerPoolMinIdle;
+        }
+
+        public Integer getProducerPoolMaxIdle() {
+            return producerPoolMaxIdle;
+        }
+
+        public void setProducerPoolMaxIdle(Integer producerPoolMaxIdle) {
+            this.producerPoolMaxIdle = producerPoolMaxIdle;
+        }
+
+        public Long getProducerPoolMinEvictableIdle() {
+            return producerPoolMinEvictableIdle;
+        }
+
+        public void setProducerPoolMinEvictableIdle(
+                Long producerPoolMinEvictableIdle) {
+            this.producerPoolMinEvictableIdle = producerPoolMinEvictableIdle;
+        }
+
+        public Boolean getProducerPoolEnabled() {
+            return producerPoolEnabled;
+        }
+
+        public void setProducerPoolEnabled(Boolean producerPoolEnabled) {
+            this.producerPoolEnabled = producerPoolEnabled;
+        }
+
+        public Boolean getUdpConnectionlessSending() {
+            return udpConnectionlessSending;
+        }
+
+        public void setUdpConnectionlessSending(Boolean 
udpConnectionlessSending) {
+            this.udpConnectionlessSending = udpConnectionlessSending;
+        }
+
+        public Boolean getClientMode() {
+            return clientMode;
+        }
+
+        public void setClientMode(Boolean clientMode) {
+            this.clientMode = clientMode;
+        }
+
+        public Boolean getUseByteBuf() {
+            return useByteBuf;
+        }
+
+        public void setUseByteBuf(Boolean useByteBuf) {
+            this.useByteBuf = useByteBuf;
+        }
+
+        public Boolean getUdpByteArrayCodec() {
+            return udpByteArrayCodec;
+        }
+
+        public void setUdpByteArrayCodec(Boolean udpByteArrayCodec) {
+            this.udpByteArrayCodec = udpByteArrayCodec;
+        }
+
+        public Boolean getReuseChannel() {
+            return reuseChannel;
+        }
+
+        public void setReuseChannel(Boolean reuseChannel) {
+            this.reuseChannel = reuseChannel;
+        }
+
+        public String getProtocol() {
+            return protocol;
+        }
+
+        public void setProtocol(String protocol) {
+            this.protocol = protocol;
+        }
+
+        public String getHost() {
+            return host;
+        }
+
+        public void setHost(String host) {
+            this.host = host;
+        }
+
+        public Integer getPort() {
+            return port;
+        }
+
+        public void setPort(Integer port) {
+            this.port = port;
+        }
+
+        public Boolean getBroadcast() {
+            return broadcast;
+        }
+
+        public void setBroadcast(Boolean broadcast) {
+            this.broadcast = broadcast;
+        }
+
+        public Integer getSendBufferSize() {
+            return sendBufferSize;
+        }
+
+        public void setSendBufferSize(Integer sendBufferSize) {
+            this.sendBufferSize = sendBufferSize;
+        }
+
+        public Integer getReceiveBufferSize() {
+            return receiveBufferSize;
+        }
+
+        public void setReceiveBufferSize(Integer receiveBufferSize) {
+            this.receiveBufferSize = receiveBufferSize;
+        }
+
+        public Integer getReceiveBufferSizePredictor() {
+            return receiveBufferSizePredictor;
+        }
 
-    public void setReuseChannel(Boolean reuseChannel) {
-        this.reuseChannel = reuseChannel;
+        public void setReceiveBufferSizePredictor(
+                Integer receiveBufferSizePredictor) {
+            this.receiveBufferSizePredictor = receiveBufferSizePredictor;
+        }
+
+        public Integer getWorkerCount() {
+            return workerCount;
+        }
+
+        public void setWorkerCount(Integer workerCount) {
+            this.workerCount = workerCount;
+        }
+
+        public Integer getBossCount() {
+            return bossCount;
+        }
+
+        public void setBossCount(Integer bossCount) {
+            this.bossCount = bossCount;
+        }
+
+        public Boolean getKeepAlive() {
+            return keepAlive;
+        }
+
+        public void setKeepAlive(Boolean keepAlive) {
+            this.keepAlive = keepAlive;
+        }
+
+        public Boolean getTcpNoDelay() {
+            return tcpNoDelay;
+        }
+
+        public void setTcpNoDelay(Boolean tcpNoDelay) {
+            this.tcpNoDelay = tcpNoDelay;
+        }
+
+        public Boolean getReuseAddress() {
+            return reuseAddress;
+        }
+
+        public void setReuseAddress(Boolean reuseAddress) {
+            this.reuseAddress = reuseAddress;
+        }
+
+        public Integer getConnectTimeout() {
+            return connectTimeout;
+        }
+
+        public void setConnectTimeout(Integer connectTimeout) {
+            this.connectTimeout = connectTimeout;
+        }
+
+        public Integer getBacklog() {
+            return backlog;
+        }
+
+        public void setBacklog(Integer backlog) {
+            this.backlog = backlog;
+        }
+
+        public Boolean getSsl() {
+            return ssl;
+        }
+
+        public void setSsl(Boolean ssl) {
+            this.ssl = ssl;
+        }
+
+        public Boolean getSslClientCertHeaders() {
+            return sslClientCertHeaders;
+        }
+
+        public void setSslClientCertHeaders(Boolean sslClientCertHeaders) {
+            this.sslClientCertHeaders = sslClientCertHeaders;
+        }
+
+        public SslHandler getSslHandler() {
+            return sslHandler;
+        }
+
+        public void setSslHandler(SslHandler sslHandler) {
+            this.sslHandler = sslHandler;
+        }
+
+        public SSLContextParameters getSslContextParameters() {
+            return sslContextParameters;
+        }
+
+        public void setSslContextParameters(
+                SSLContextParameters sslContextParameters) {
+            this.sslContextParameters = sslContextParameters;
+        }
+
+        public Boolean getNeedClientAuth() {
+            return needClientAuth;
+        }
+
+        public void setNeedClientAuth(Boolean needClientAuth) {
+            this.needClientAuth = needClientAuth;
+        }
+
+        @Deprecated
+        @DeprecatedConfigurationProperty
+        public File getKeyStoreFile() {
+            return keyStoreFile;
+        }
+
+        @Deprecated
+        public void setKeyStoreFile(File keyStoreFile) {
+            this.keyStoreFile = keyStoreFile;
+        }
+
+        @Deprecated
+        @DeprecatedConfigurationProperty
+        public File getTrustStoreFile() {
+            return trustStoreFile;
+        }
+
+        @Deprecated
+        public void setTrustStoreFile(File trustStoreFile) {
+            this.trustStoreFile = trustStoreFile;
+        }
+
+        public String getKeyStoreResource() {
+            return keyStoreResource;
+        }
+
+        public void setKeyStoreResource(String keyStoreResource) {
+            this.keyStoreResource = keyStoreResource;
+        }
+
+        public String getTrustStoreResource() {
+            return trustStoreResource;
+        }
+
+        public void setTrustStoreResource(String trustStoreResource) {
+            this.trustStoreResource = trustStoreResource;
+        }
+
+        public String getKeyStoreFormat() {
+            return keyStoreFormat;
+        }
+
+        public void setKeyStoreFormat(String keyStoreFormat) {
+            this.keyStoreFormat = keyStoreFormat;
+        }
+
+        public String getSecurityProvider() {
+            return securityProvider;
+        }
+
+        public void setSecurityProvider(String securityProvider) {
+            this.securityProvider = securityProvider;
+        }
+
+        public String getPassphrase() {
+            return passphrase;
+        }
+
+        public void setPassphrase(String passphrase) {
+            this.passphrase = passphrase;
+        }
+
+        @Deprecated
+        @DeprecatedConfigurationProperty
+        public ServerInitializerFactory getServerPipelineFactory() {
+            return serverPipelineFactory;
+        }
+
+        @Deprecated
+        public void setServerPipelineFactory(
+                ServerInitializerFactory serverPipelineFactory) {
+            this.serverPipelineFactory = serverPipelineFactory;
+        }
+
+        public ServerInitializerFactory getServerInitializerFactory() {
+            return serverInitializerFactory;
+        }
+
+        public void setServerInitializerFactory(
+                ServerInitializerFactory serverInitializerFactory) {
+            this.serverInitializerFactory = serverInitializerFactory;
+        }
+
+        public NettyServerBootstrapFactory getNettyServerBootstrapFactory() {
+            return nettyServerBootstrapFactory;
+        }
+
+        public void setNettyServerBootstrapFactory(
+                NettyServerBootstrapFactory nettyServerBootstrapFactory) {
+            this.nettyServerBootstrapFactory = nettyServerBootstrapFactory;
+        }
+
+        public Map getOptions() {
+            return options;
+        }
+
+        public void setOptions(Map options) {
+            this.options = options;
+        }
+
+        public Boolean getNativeTransport() {
+            return nativeTransport;
+        }
+
+        public void setNativeTransport(Boolean nativeTransport) {
+            this.nativeTransport = nativeTransport;
+        }
+
+        public EventLoopGroup getBossGroup() {
+            return bossGroup;
+        }
+
+        public void setBossGroup(EventLoopGroup bossGroup) {
+            this.bossGroup = bossGroup;
+        }
+
+        public EventLoopGroup getWorkerGroup() {
+            return workerGroup;
+        }
+
+        public void setWorkerGroup(EventLoopGroup workerGroup) {
+            this.workerGroup = workerGroup;
+        }
+
+        public ChannelGroup getChannelGroup() {
+            return channelGroup;
+        }
+
+        public void setChannelGroup(ChannelGroup channelGroup) {
+            this.channelGroup = channelGroup;
+        }
+
+        public String getNetworkInterface() {
+            return networkInterface;
+        }
+
+        public void setNetworkInterface(String networkInterface) {
+            this.networkInterface = networkInterface;
+        }
+
+        public String getEnabledProtocols() {
+            return enabledProtocols;
+        }
+
+        public void setEnabledProtocols(String enabledProtocols) {
+            this.enabledProtocols = enabledProtocols;
+        }
+
+        public Boolean getReconnect() {
+            return reconnect;
+        }
+
+        public void setReconnect(Boolean reconnect) {
+            this.reconnect = reconnect;
+        }
+
+        public Integer getReconnectInterval() {
+            return reconnectInterval;
+        }
+
+        public void setReconnectInterval(Integer reconnectInterval) {
+            this.reconnectInterval = reconnectInterval;
+        }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-olingo2-starter/src/main/java/org/apache/camel/component/olingo2/springboot/Olingo2ComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-olingo2-starter/src/main/java/org/apache/camel/component/olingo2/springboot/Olingo2ComponentAutoConfiguration.java
 
b/components-starter/camel-olingo2-starter/src/main/java/org/apache/camel/component/olingo2/springboot/Olingo2ComponentAutoConfiguration.java
index 07292ee..3771b8a 100644
--- 
a/components-starter/camel-olingo2-starter/src/main/java/org/apache/camel/component/olingo2/springboot/Olingo2ComponentAutoConfiguration.java
+++ 
b/components-starter/camel-olingo2-starter/src/main/java/org/apache/camel/component/olingo2/springboot/Olingo2ComponentAutoConfiguration.java
@@ -45,6 +45,26 @@ public class Olingo2ComponentAutoConfiguration {
         Map<String, Object> parameters = new HashMap<>();
         IntrospectionSupport.getProperties(configuration, parameters, null,
                 false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
         IntrospectionSupport.setProperties(camelContext,
                 camelContext.getTypeConverter(), component, parameters);
         return component;

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-olingo2-starter/src/main/java/org/apache/camel/component/olingo2/springboot/Olingo2ComponentConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-olingo2-starter/src/main/java/org/apache/camel/component/olingo2/springboot/Olingo2ComponentConfiguration.java
 
b/components-starter/camel-olingo2-starter/src/main/java/org/apache/camel/component/olingo2/springboot/Olingo2ComponentConfiguration.java
index 037baa4..c41ceb4 100644
--- 
a/components-starter/camel-olingo2-starter/src/main/java/org/apache/camel/component/olingo2/springboot/Olingo2ComponentConfiguration.java
+++ 
b/components-starter/camel-olingo2-starter/src/main/java/org/apache/camel/component/olingo2/springboot/Olingo2ComponentConfiguration.java
@@ -16,8 +16,14 @@
  */
 package org.apache.camel.component.olingo2.springboot;
 
-import org.apache.camel.component.olingo2.Olingo2Configuration;
+import java.util.Map;
+import org.apache.camel.component.olingo2.internal.Olingo2ApiName;
+import org.apache.camel.util.jsse.SSLContextParameters;
+import org.apache.http.HttpHost;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
 
 /**
  * Communicates with OData 2.0 and 3.0 services using Apache Olingo.
@@ -30,13 +36,166 @@ public class Olingo2ComponentConfiguration {
     /**
      * To use the shared configuration
      */
-    private Olingo2Configuration configuration;
+    private Olingo2ConfigurationNestedConfiguration configuration;
 
-    public Olingo2Configuration getConfiguration() {
+    public Olingo2ConfigurationNestedConfiguration getConfiguration() {
         return configuration;
     }
 
-    public void setConfiguration(Olingo2Configuration configuration) {
+    public void setConfiguration(
+            Olingo2ConfigurationNestedConfiguration configuration) {
         this.configuration = configuration;
     }
+
+    public static class Olingo2ConfigurationNestedConfiguration {
+        public static final Class CAMEL_NESTED_CLASS = 
org.apache.camel.component.olingo2.Olingo2Configuration.class;
+        /**
+         * What kind of operation to perform
+         */
+        private Olingo2ApiName apiName;
+        /**
+         * What sub operation to use for the selected operation
+         */
+        private String methodName;
+        /**
+         * Target OData service base URI, e.g.
+         * http://services.odata.org/OData/OData.svc
+         */
+        private String serviceUri;
+        /**
+         * Content-Type header value can be used to specify JSON or XML message
+         * format, defaults to application/json;charset=utf-8
+         */
+        private String contentType = "application/json;charset=utf-8";
+        /**
+         * Custom HTTP headers to inject into every request, this could include
+         * OAuth tokens, etc.
+         */
+        private Map httpHeaders;
+        /**
+         * HTTP connection creation timeout in milliseconds, defaults to 30,000
+         * (30 seconds)
+         */
+        private Integer connectTimeout;
+        /**
+         * HTTP request timeout in milliseconds, defaults to 30,000 (30 
seconds)
+         */
+        private Integer socketTimeout;
+        /**
+         * HTTP proxy server configuration
+         */
+        @NestedConfigurationProperty
+        private HttpHost proxy;
+        /**
+         * To configure security using SSLContextParameters
+         */
+        @NestedConfigurationProperty
+        private SSLContextParameters sslContextParameters;
+        /**
+         * Custom HTTP async client builder for more complex HTTP client
+         * configuration, overrides connectionTimeout, socketTimeout, proxy and
+         * sslContext. Note that a socketTimeout MUST be specified in the
+         * builder, otherwise OData requests could block indefinitely
+         */
+        @NestedConfigurationProperty
+        private HttpAsyncClientBuilder httpAsyncClientBuilder;
+        /**
+         * Custom HTTP client builder for more complex HTTP client
+         * configuration, overrides connectionTimeout, socketTimeout, proxy and
+         * sslContext. Note that a socketTimeout MUST be specified in the
+         * builder, otherwise OData requests could block indefinitely
+         */
+        @NestedConfigurationProperty
+        private HttpClientBuilder httpClientBuilder;
+
+        public Olingo2ApiName getApiName() {
+            return apiName;
+        }
+
+        public void setApiName(Olingo2ApiName apiName) {
+            this.apiName = apiName;
+        }
+
+        public String getMethodName() {
+            return methodName;
+        }
+
+        public void setMethodName(String methodName) {
+            this.methodName = methodName;
+        }
+
+        public String getServiceUri() {
+            return serviceUri;
+        }
+
+        public void setServiceUri(String serviceUri) {
+            this.serviceUri = serviceUri;
+        }
+
+        public String getContentType() {
+            return contentType;
+        }
+
+        public void setContentType(String contentType) {
+            this.contentType = contentType;
+        }
+
+        public Map getHttpHeaders() {
+            return httpHeaders;
+        }
+
+        public void setHttpHeaders(Map httpHeaders) {
+            this.httpHeaders = httpHeaders;
+        }
+
+        public Integer getConnectTimeout() {
+            return connectTimeout;
+        }
+
+        public void setConnectTimeout(Integer connectTimeout) {
+            this.connectTimeout = connectTimeout;
+        }
+
+        public Integer getSocketTimeout() {
+            return socketTimeout;
+        }
+
+        public void setSocketTimeout(Integer socketTimeout) {
+            this.socketTimeout = socketTimeout;
+        }
+
+        public HttpHost getProxy() {
+            return proxy;
+        }
+
+        public void setProxy(HttpHost proxy) {
+            this.proxy = proxy;
+        }
+
+        public SSLContextParameters getSslContextParameters() {
+            return sslContextParameters;
+        }
+
+        public void setSslContextParameters(
+                SSLContextParameters sslContextParameters) {
+            this.sslContextParameters = sslContextParameters;
+        }
+
+        public HttpAsyncClientBuilder getHttpAsyncClientBuilder() {
+            return httpAsyncClientBuilder;
+        }
+
+        public void setHttpAsyncClientBuilder(
+                HttpAsyncClientBuilder httpAsyncClientBuilder) {
+            this.httpAsyncClientBuilder = httpAsyncClientBuilder;
+        }
+
+        public HttpClientBuilder getHttpClientBuilder() {
+            return httpClientBuilder;
+        }
+
+        public void setHttpClientBuilder(HttpClientBuilder httpClientBuilder) {
+            this.httpClientBuilder = httpClientBuilder;
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-openshift-starter/src/main/java/org/apache/camel/component/openshift/springboot/OpenShiftComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-openshift-starter/src/main/java/org/apache/camel/component/openshift/springboot/OpenShiftComponentAutoConfiguration.java
 
b/components-starter/camel-openshift-starter/src/main/java/org/apache/camel/component/openshift/springboot/OpenShiftComponentAutoConfiguration.java
index 26a8e5c..2c0ae0d 100644
--- 
a/components-starter/camel-openshift-starter/src/main/java/org/apache/camel/component/openshift/springboot/OpenShiftComponentAutoConfiguration.java
+++ 
b/components-starter/camel-openshift-starter/src/main/java/org/apache/camel/component/openshift/springboot/OpenShiftComponentAutoConfiguration.java
@@ -45,6 +45,26 @@ public class OpenShiftComponentAutoConfiguration {
         Map<String, Object> parameters = new HashMap<>();
         IntrospectionSupport.getProperties(configuration, parameters, null,
                 false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
         IntrospectionSupport.setProperties(camelContext,
                 camelContext.getTypeConverter(), component, parameters);
         return component;

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-paho-starter/src/main/java/org/apache/camel/component/paho/springboot/PahoComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-paho-starter/src/main/java/org/apache/camel/component/paho/springboot/PahoComponentAutoConfiguration.java
 
b/components-starter/camel-paho-starter/src/main/java/org/apache/camel/component/paho/springboot/PahoComponentAutoConfiguration.java
index eb7b8d4..59c826c 100644
--- 
a/components-starter/camel-paho-starter/src/main/java/org/apache/camel/component/paho/springboot/PahoComponentAutoConfiguration.java
+++ 
b/components-starter/camel-paho-starter/src/main/java/org/apache/camel/component/paho/springboot/PahoComponentAutoConfiguration.java
@@ -44,6 +44,26 @@ public class PahoComponentAutoConfiguration {
         Map<String, Object> parameters = new HashMap<>();
         IntrospectionSupport.getProperties(configuration, parameters, null,
                 false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
         IntrospectionSupport.setProperties(camelContext,
                 camelContext.getTypeConverter(), component, parameters);
         return component;

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-paho-starter/src/main/java/org/apache/camel/component/paho/springboot/PahoComponentConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-paho-starter/src/main/java/org/apache/camel/component/paho/springboot/PahoComponentConfiguration.java
 
b/components-starter/camel-paho-starter/src/main/java/org/apache/camel/component/paho/springboot/PahoComponentConfiguration.java
index 26d2cbb..9f6c827 100644
--- 
a/components-starter/camel-paho-starter/src/main/java/org/apache/camel/component/paho/springboot/PahoComponentConfiguration.java
+++ 
b/components-starter/camel-paho-starter/src/main/java/org/apache/camel/component/paho/springboot/PahoComponentConfiguration.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.paho.springboot;
 
 import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
 
 /**
  * Component for communicating with MQTT M2M message brokers using Eclipse Paho
@@ -39,6 +40,7 @@ public class PahoComponentConfiguration {
     /**
      * Client connection options
      */
+    @NestedConfigurationProperty
     private MqttConnectOptions connectOptions;
 
     public String getBrokerUrl() {

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-quartz-starter/src/main/java/org/apache/camel/component/quartz/springboot/QuartzComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-quartz-starter/src/main/java/org/apache/camel/component/quartz/springboot/QuartzComponentAutoConfiguration.java
 
b/components-starter/camel-quartz-starter/src/main/java/org/apache/camel/component/quartz/springboot/QuartzComponentAutoConfiguration.java
index 6a01589..6da90b1 100644
--- 
a/components-starter/camel-quartz-starter/src/main/java/org/apache/camel/component/quartz/springboot/QuartzComponentAutoConfiguration.java
+++ 
b/components-starter/camel-quartz-starter/src/main/java/org/apache/camel/component/quartz/springboot/QuartzComponentAutoConfiguration.java
@@ -44,6 +44,26 @@ public class QuartzComponentAutoConfiguration {
         Map<String, Object> parameters = new HashMap<>();
         IntrospectionSupport.getProperties(configuration, parameters, null,
                 false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
         IntrospectionSupport.setProperties(camelContext,
                 camelContext.getTypeConverter(), component, parameters);
         return component;

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-quartz-starter/src/main/java/org/apache/camel/component/quartz/springboot/QuartzComponentConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-quartz-starter/src/main/java/org/apache/camel/component/quartz/springboot/QuartzComponentConfiguration.java
 
b/components-starter/camel-quartz-starter/src/main/java/org/apache/camel/component/quartz/springboot/QuartzComponentConfiguration.java
index 8a200be..36509be 100644
--- 
a/components-starter/camel-quartz-starter/src/main/java/org/apache/camel/component/quartz/springboot/QuartzComponentConfiguration.java
+++ 
b/components-starter/camel-quartz-starter/src/main/java/org/apache/camel/component/quartz/springboot/QuartzComponentConfiguration.java
@@ -20,6 +20,7 @@ import java.util.Properties;
 import org.quartz.Scheduler;
 import org.quartz.SchedulerFactory;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
 
 /**
  * Provides a scheduled delivery of messages using the Quartz 1.x scheduler.
@@ -32,11 +33,13 @@ public class QuartzComponentConfiguration {
     /**
      * To use the custom SchedulerFactory which is used to create the 
Scheduler.
      */
+    @NestedConfigurationProperty
     private SchedulerFactory factory;
     /**
      * To use the custom configured Quartz scheduler instead of creating a new
      * Scheduler.
      */
+    @NestedConfigurationProperty
     private Scheduler scheduler;
     /**
      * Properties to configure the Quartz scheduler.

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-quartz2-starter/src/main/java/org/apache/camel/component/quartz2/springboot/QuartzComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-quartz2-starter/src/main/java/org/apache/camel/component/quartz2/springboot/QuartzComponentAutoConfiguration.java
 
b/components-starter/camel-quartz2-starter/src/main/java/org/apache/camel/component/quartz2/springboot/QuartzComponentAutoConfiguration.java
index eb06660..79dae37 100644
--- 
a/components-starter/camel-quartz2-starter/src/main/java/org/apache/camel/component/quartz2/springboot/QuartzComponentAutoConfiguration.java
+++ 
b/components-starter/camel-quartz2-starter/src/main/java/org/apache/camel/component/quartz2/springboot/QuartzComponentAutoConfiguration.java
@@ -44,6 +44,26 @@ public class QuartzComponentAutoConfiguration {
         Map<String, Object> parameters = new HashMap<>();
         IntrospectionSupport.getProperties(configuration, parameters, null,
                 false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
         IntrospectionSupport.setProperties(camelContext,
                 camelContext.getTypeConverter(), component, parameters);
         return component;

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-quartz2-starter/src/main/java/org/apache/camel/component/quartz2/springboot/QuartzComponentConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-quartz2-starter/src/main/java/org/apache/camel/component/quartz2/springboot/QuartzComponentConfiguration.java
 
b/components-starter/camel-quartz2-starter/src/main/java/org/apache/camel/component/quartz2/springboot/QuartzComponentConfiguration.java
index a3f9824..db3abee 100644
--- 
a/components-starter/camel-quartz2-starter/src/main/java/org/apache/camel/component/quartz2/springboot/QuartzComponentConfiguration.java
+++ 
b/components-starter/camel-quartz2-starter/src/main/java/org/apache/camel/component/quartz2/springboot/QuartzComponentConfiguration.java
@@ -20,6 +20,7 @@ import java.util.Properties;
 import org.quartz.Scheduler;
 import org.quartz.SchedulerFactory;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.NestedConfigurationProperty;
 
 /**
  * Provides a scheduled delivery of messages using the Quartz 2.x scheduler.
@@ -67,11 +68,13 @@ public class QuartzComponentConfiguration {
     /**
      * To use the custom SchedulerFactory which is used to create the 
Scheduler.
      */
+    @NestedConfigurationProperty
     private SchedulerFactory schedulerFactory;
     /**
      * To use the custom configured Quartz scheduler instead of creating a new
      * Scheduler.
      */
+    @NestedConfigurationProperty
     private Scheduler scheduler;
 
     public Boolean getAutoStartScheduler() {

http://git-wip-us.apache.org/repos/asf/camel/blob/d485f2f0/components-starter/camel-quickfix-starter/src/main/java/org/apache/camel/component/quickfixj/springboot/QuickfixjComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components-starter/camel-quickfix-starter/src/main/java/org/apache/camel/component/quickfixj/springboot/QuickfixjComponentAutoConfiguration.java
 
b/components-starter/camel-quickfix-starter/src/main/java/org/apache/camel/component/quickfixj/springboot/QuickfixjComponentAutoConfiguration.java
index 149e961..b644970 100644
--- 
a/components-starter/camel-quickfix-starter/src/main/java/org/apache/camel/component/quickfixj/springboot/QuickfixjComponentAutoConfiguration.java
+++ 
b/components-starter/camel-quickfix-starter/src/main/java/org/apache/camel/component/quickfixj/springboot/QuickfixjComponentAutoConfiguration.java
@@ -45,6 +45,26 @@ public class QuickfixjComponentAutoConfiguration {
         Map<String, Object> parameters = new HashMap<>();
         IntrospectionSupport.getProperties(configuration, parameters, null,
                 false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
         IntrospectionSupport.setProperties(camelContext,
                 camelContext.getTypeConverter(), component, parameters);
         return component;

Reply via email to