Merge branch 'master' of github.com:apache/camel
diff --git a/apache-camel/pom.xml b/apache-camel/pom.xml
index 2fc4526..3e65b10 100644
--- a/apache-camel/pom.xml
+++ b/apache-camel/pom.xml
@@ -85,10 +85,6 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-core-osgi-activator</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel</groupId>
             <artifactId>camel-core-xml</artifactId>
         </dependency>
         <dependency>
@@ -1151,6 +1147,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
+      <artifactId>camel-osgi-activator</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
       <artifactId>camel-paho</artifactId>
       <version>${project.version}</version>
     </dependency>
diff --git a/apache-camel/src/main/descriptors/common-bin.xml b/apache-camel/src/main/descriptors/common-bin.xml
index 0ca818b..2cff4e0 100644
--- a/apache-camel/src/main/descriptors/common-bin.xml
+++ b/apache-camel/src/main/descriptors/common-bin.xml
@@ -36,7 +36,6 @@
         <include>org.apache.camel:camel-core</include>
         <include>org.apache.camel:camel-core-engine</include>
         <include>org.apache.camel:camel-core-osgi</include>
-        <include>org.apache.camel:camel-core-osgi-activator</include>
         <include>org.apache.camel:camel-core-xml</include>
         <include>org.apache.camel:camel-cloud</include>
         <include>org.apache.camel:camel-jaxp</include>
@@ -251,6 +250,7 @@
         <include>org.apache.camel:camel-openstack</include>
         <include>org.apache.camel:camel-opentracing</include>
         <include>org.apache.camel:camel-optaplanner</include>
+        <include>org.apache.camel:camel-osgi-activator</include>
         <include>org.apache.camel:camel-paho</include>
         <include>org.apache.camel:camel-paxlogging</include>
         <include>org.apache.camel:camel-pdf</include>
diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index a4cdbb9..25201c1 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -1934,11 +1934,6 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
-        <artifactId>camel-core-osgi-activator</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.camel</groupId>
         <artifactId>camel-core-xml</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/components/camel-crypto-cms/pom.xml b/components/camel-crypto-cms/pom.xml
index 6e2757b..1f9224a 100644
--- a/components/camel-crypto-cms/pom.xml
+++ b/components/camel-crypto-cms/pom.xml
@@ -28,7 +28,7 @@
 
     <artifactId>camel-crypto-cms</artifactId>
     <packaging>jar</packaging>
-    <name>Camel :: Crypto CMS</name>
+    <name>Camel :: Crypto CMS (deprecated)</name>
     <description>Camel Cryptographic Message Syntax Support</description>
 
     <dependencies>
diff --git a/components/camel-crypto-cms/src/main/docs/crypto-cms-component.adoc b/components/camel-crypto-cms/src/main/docs/crypto-cms-component.adoc
index f35fe2e..ecee9d9 100644
--- a/components/camel-crypto-cms/src/main/docs/crypto-cms-component.adoc
+++ b/components/camel-crypto-cms/src/main/docs/crypto-cms-component.adoc
@@ -1,8 +1,11 @@
 [[crypto-cms-component]]
-= Crypto CMS Component
+= Crypto CMS Component (deprecated)
 
 *Since Camel 2.20*
 
+*Since Camel 2.20*
+
+
 // HEADER START
 *Only producer is supported*
 // HEADER END
@@ -431,4 +434,4 @@
         <to uri="crypto-cms:verify://testverify?keyStoreParameters=#keyStoreParameters1&amp;signedDataHeaderBase64=true" />
         <to uri="mock:result" />
     </route>    
-----
+----
\ No newline at end of file
diff --git a/components/camel-jcache/src/main/docs/jcache-component.adoc b/components/camel-jcache/src/main/docs/jcache-component.adoc
index 946876a..0905da5 100644
--- a/components/camel-jcache/src/main/docs/jcache-component.adoc
+++ b/components/camel-jcache/src/main/docs/jcache-component.adoc
@@ -85,7 +85,7 @@
 ----
 
 
-The component supports 8 options, which are listed below.
+The component supports 9 options, which are listed below.
 
 
 
@@ -95,7 +95,8 @@
 | *camel.component.jcache.basic-property-binding* | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | Boolean
 | *camel.component.jcache.bridge-error-handler* | 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
 | *camel.component.jcache.cache-configuration* | A Configuration for the Cache. The option is a javax.cache.configuration.Configuration type. |  | String
-| *camel.component.jcache.cache-configuration-properties* | The Properties for the javax.cache.spi.CachingProvider to create the CacheManager. The option is a java.util.Properties type. |  | String
+| *camel.component.jcache.cache-configuration-properties* | Properties to configure jcache |  | Map
+| *camel.component.jcache.cache-configuration-properties-ref* | References to an existing Properties or Map to lookup in the registry to use for configuring jcache. |  | String
 | *camel.component.jcache.caching-provider* | The fully qualified class name of the javax.cache.spi.CachingProvider |  | String
 | *camel.component.jcache.configuration-uri* | An implementation specific URI for the CacheManager |  | String
 | *camel.component.jcache.enabled* | Whether to enable auto configuration of the jcache component. This is enabled by default. |  | Boolean
@@ -112,7 +113,7 @@
 
 
 // component options: START
-The JCache component supports 7 options, which are listed below.
+The JCache component supports 8 options, which are listed below.
 
 
 
@@ -121,7 +122,8 @@
 | Name | Description | Default | Type
 | *cachingProvider* (common) | The fully qualified class name of the javax.cache.spi.CachingProvider |  | String
 | *cacheConfiguration* (common) | A Configuration for the Cache |  | Configuration
-| *cacheConfiguration Properties* (common) | The Properties for the javax.cache.spi.CachingProvider to create the CacheManager |  | Properties
+| *cacheConfiguration Properties* (common) | Properties to configure jcache |  | Map
+| *cacheConfiguration PropertiesRef* (common) | References to an existing Properties or Map to lookup in the registry to use for configuring jcache. |  | String
 | *configurationUri* (common) | An implementation specific URI for the CacheManager |  | String
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
diff --git a/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/JCacheComponent.java b/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/JCacheComponent.java
index 124ef5b..61cd4b7 100644
--- a/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/JCacheComponent.java
+++ b/components/camel-jcache/src/main/java/org/apache/camel/component/jcache/JCacheComponent.java
@@ -26,6 +26,7 @@
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.DefaultComponent;
 
 /**
@@ -36,7 +37,8 @@
 
     private String cachingProvider;
     private Configuration cacheConfiguration;
-    private Properties cacheConfigurationProperties;
+    private String cacheConfigurationPropertiesRef;
+    private Map cacheConfigurationProperties;
     private String configurationUri;
 
     public JCacheComponent() {
@@ -53,13 +55,27 @@
 
         configuration.setCachingProvider(cachingProvider);
         configuration.setCacheConfiguration(cacheConfiguration);
-        configuration.setCacheConfigurationProperties(cacheConfigurationProperties);
+        configuration.setCacheConfigurationProperties(loadProperties());
         configuration.setConfigurationUri(configurationUri);
 
         setProperties(configuration, parameters);
         return new JCacheEndpoint(uri, this, configuration);
     }
 
+    private Properties loadProperties() {
+        Properties answer = null;
+        if (cacheConfigurationProperties != null) {
+            answer = new Properties();
+            answer.putAll(cacheConfigurationProperties);
+        }
+        if (answer == null && cacheConfigurationPropertiesRef != null) {
+            Map map = CamelContextHelper.mandatoryLookup(getCamelContext(), cacheConfigurationPropertiesRef, Map.class);
+            answer = new Properties();
+            answer.putAll(map);
+        }
+        return answer;
+    }
+
     /**
      * The fully qualified class name of the {@link javax.cache.spi.CachingProvider}
      */
@@ -83,17 +99,27 @@
     }
 
     /**
-     * The {@link Properties} for the {@link javax.cache.spi.CachingProvider} to
-     * create the {@link CacheManager}
+     * Properties to configure jcache
      */
-    public Properties getCacheConfigurationProperties() {
+    public Map getCacheConfigurationProperties() {
         return cacheConfigurationProperties;
     }
 
-    public void setCacheConfigurationProperties(Properties cacheConfigurationProperties) {
+    public void setCacheConfigurationProperties(Map cacheConfigurationProperties) {
         this.cacheConfigurationProperties = cacheConfigurationProperties;
     }
 
+    public String getCacheConfigurationPropertiesRef() {
+        return cacheConfigurationPropertiesRef;
+    }
+
+    /**
+     * References to an existing {@link Properties} or {@link Map} to lookup in the registry to use for configuring jcache.
+     */
+    public void setCacheConfigurationPropertiesRef(String cacheConfigurationPropertiesRef) {
+        this.cacheConfigurationPropertiesRef = cacheConfigurationPropertiesRef;
+    }
+
     /**
      * An implementation specific URI for the {@link CacheManager}
      */
diff --git a/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConfiguration.java b/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConfiguration.java
index 742375b..0717e52 100644
--- a/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConfiguration.java
+++ b/components/camel-nats/src/main/java/org/apache/camel/component/nats/NatsConfiguration.java
@@ -27,6 +27,7 @@
 import org.apache.camel.spi.UriParams;
 import org.apache.camel.spi.UriPath;
 import org.apache.camel.support.jsse.SSLContextParameters;
+import org.apache.camel.util.ObjectHelper;
 
 @UriParams
 public class NatsConfiguration {
@@ -373,7 +374,10 @@
         StringBuilder servers = new StringBuilder();
         String prefix = "nats://";
 
-        String[] pieces = getServers().split(",");
+        String srvspec = getServers();
+        ObjectHelper.notNull(srvspec, "No servers configured");
+
+        String[] pieces = srvspec.split(",");
         for (int i = 0; i < pieces.length; i++) {
             if (i < pieces.length - 1) {
                 servers.append(prefix + pieces[i] + ",");
diff --git a/components/camel-osgi-activator/pom.xml b/components/camel-osgi-activator/pom.xml
new file mode 100644
index 0000000..41fcdd8
--- /dev/null
+++ b/components/camel-osgi-activator/pom.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>3.1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-osgi-activator</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Camel :: OSGi Activator</name>
+    <description>Camel OSGi Activator for running Camel routes from other bundles</description>
+
+    <properties>
+        <camel.osgi.activator>org.apache.camel.osgi.activator.CamelRoutesActivator</camel.osgi.activator>
+        <camel.osgi.dynamic>*</camel.osgi.dynamic>
+        <firstVersion>3.1.0</firstVersion>
+    </properties>
+
+    <dependencies>
+        <!-- osgi -->
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>osgi.cmpn</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core-osgi</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/components/camel-osgi-activator/src/main/docs/osgi-activator.adoc b/components/camel-osgi-activator/src/main/docs/osgi-activator.adoc
new file mode 100644
index 0000000..f4fe423
--- /dev/null
+++ b/components/camel-osgi-activator/src/main/docs/osgi-activator.adoc
@@ -0,0 +1,56 @@
+[[OsgiActivator]]
+= OSGi Camel Routes Activator
+
+*Since Camel 3.1*
+
+A small OSGi activator for starting an OSGi Apache Camel Project.
+
+The bundle starts a shared CamelContext and registers any RouteBuilder instances
+(discovered via the OSGi Service Registry), from any other bundles that gets installed.
+And when the bundles gets uninstalled then the routes are stopped and removed from the shared CamelContext.
+
+== Important
+
+This OSGi activator is a based prototype for quickly starting up an OSGi container with a single shared
+CamelContext and then being able to use OSGi dynamism to deploy and undeploy bundlers with Camel routes.
+
+Beware that this OSGi activator is a basic implementation and has limited support for dealing with errors
+when new routes are added which may clash with existing routes (route ids).
+
+Configuration of the CamelContext is also very limited.
+
+Therefore only use this for prototyping and experiments. This is NOT recommended for production usage.
+
+== Install bundle
+
+Register an Apache Camel RouteBuilder as an OSGi service.
+
+Using OSGi annotations:
+
+[source,java]
+----
+@Component(service = RouteBuilder.class)
+public class MyRouteBuilder extends RouteBuilder {
+    @Override
+    public void configure() throws Exception {
+        from("timer:test?fixedRate=true&period=1000")
+            .log("Hello");
+    }
+}
+----
+
+Or Manually:
+
+[source,java]
+----
+public void start(BundleContext context) throws Exception {
+  context.registerService(RouteBuilder.class, new MyRouteBuilder(), null);
+}
+----
+
+And it's automatically added or removed to the context from any bundle!
+
+[source,text]
+----
+Route: route1 started and consuming from: timer://test?fixedRate=true&period=1000
+----
diff --git a/core/camel-core-osgi-activator/src/main/java/org/apache/camel/core/osgi/main/internal/Activator.java b/components/camel-osgi-activator/src/main/java/org/apache/camel/osgi/activator/CamelRoutesActivator.java
similarity index 88%
rename from core/camel-core-osgi-activator/src/main/java/org/apache/camel/core/osgi/main/internal/Activator.java
rename to components/camel-osgi-activator/src/main/java/org/apache/camel/osgi/activator/CamelRoutesActivator.java
index a82a94f..5c78c14 100644
--- a/core/camel-core-osgi-activator/src/main/java/org/apache/camel/core/osgi/main/internal/Activator.java
+++ b/components/camel-osgi-activator/src/main/java/org/apache/camel/osgi/activator/CamelRoutesActivator.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.core.osgi.main.internal;
+package org.apache.camel.osgi.activator;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -33,9 +33,9 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class Activator implements BundleActivator, ServiceTrackerCustomizer<RouteBuilder, RouteBuilder> {
+public class CamelRoutesActivator implements BundleActivator, ServiceTrackerCustomizer<RouteBuilder, RouteBuilder> {
 
-    private static final Logger LOG = LoggerFactory.getLogger(Activator.class);
+    private static final Logger LOG = LoggerFactory.getLogger(CamelRoutesActivator.class);
     private ServiceRegistration<CamelContext> camelContextRef;
     private ModelCamelContext camelContext;
     private BundleContext bundleContext;
@@ -63,7 +63,7 @@
         }
 
         this.routeServiceTracker.open();
-        LOG.info("Camel Core OSGi Activator RouteBuilder ServiceTracker Tracker Open");
+        LOG.info("Camel OSGi Activator RouteBuilder ServiceTracker Tracker Open");
     }
 
     @Override
@@ -73,10 +73,10 @@
             // need to synchronize here since adding routes is not synchronized
             synchronized (camelContext) {
                 this.camelContext.addRoutes(builder);
-                LOG.debug("Camel Routes from RouteBuilder Class {} Added to Camel Core OSGi Activator Context", builder.getClass().getName());
+                LOG.debug("Camel Routes from RouteBuilder Class {} Added to Camel OSGi Activator Context", builder.getClass().getName());
             }
         } catch (Exception e) {
-            LOG.error("Error Adding Camel Route Builder", e);
+            LOG.error("Error Adding Camel RouteBuilder", e);
         }
 
         return builder;
@@ -103,7 +103,7 @@
         try {
             synchronized (camelContext) {
                 camelContext.removeRouteDefinitions(routesToBeRemoved);
-                LOG.debug("Camel Routes from RouteBuilder Class {} Removed from Camel Core OSGi Activator Context",
+                LOG.debug("Camel Routes from RouteBuilder Class {} Removed from Camel OSGi Activator Context",
                         service.getClass().getName());
             }
         } catch (Exception e) {
diff --git a/components/camel-quartz/src/main/docs/quartz-component.adoc b/components/camel-quartz/src/main/docs/quartz-component.adoc
index 594075a..5d09aa3 100644
--- a/components/camel-quartz/src/main/docs/quartz-component.adoc
+++ b/components/camel-quartz/src/main/docs/quartz-component.adoc
@@ -48,7 +48,7 @@
 
 
 // component options: START
-The Quartz component supports 13 options, which are listed below.
+The Quartz component supports 14 options, which are listed below.
 
 
 
@@ -59,7 +59,8 @@
 | *startDelayedSeconds* (scheduler) | Seconds to wait before starting the quartz scheduler. |  | int
 | *prefixJobNameWith EndpointId* (consumer) | Whether to prefix the quartz job with the endpoint id. This option is default false. | false | boolean
 | *enableJmx* (consumer) | Whether to enable Quartz JMX which allows to manage the Quartz scheduler from JMX. This options is default true | true | boolean
-| *properties* (consumer) | Properties to configure the Quartz scheduler. |  | Properties
+| *propertiesRef* (consumer) | References to an existing Properties or Map to lookup in the registry to use for configuring quartz. |  | String
+| *properties* (consumer) | Properties to configure the Quartz scheduler. |  | Map
 | *propertiesFile* (consumer) | File name of the properties to load from the classpath |  | String
 | *prefixInstanceName* (consumer) | Whether to prefix the Quartz Scheduler instance name with the CamelContext name. This is enabled by default, to let each CamelContext use its own Quartz scheduler instance by default. You can set this option to false to reuse Quartz scheduler instances between multiple CamelContext's. | true | boolean
 | *interruptJobsOn Shutdown* (scheduler) | Whether to interrupt jobs on shutdown which forces the scheduler to shutdown quicker and attempt to interrupt any running jobs. If this is enabled then any running jobs can fail due to being interrupted. | false | boolean
@@ -138,7 +139,7 @@
 ----
 
 
-The component supports 14 options, which are listed below.
+The component supports 15 options, which are listed below.
 
 
 
@@ -154,8 +155,9 @@
 | *camel.component.quartz.lazy-start-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 starting the producer may take a little time and prolong the total processing time of the processing. | false | Boolean
 | *camel.component.quartz.prefix-instance-name* | Whether to prefix the Quartz Scheduler instance name with the CamelContext name. This is enabled by default, to let each CamelContext use its own Quartz scheduler instance by default. You can set this option to false to reuse Quartz scheduler instances between multiple CamelContext's. | true | Boolean
 | *camel.component.quartz.prefix-job-name-with-endpoint-id* | Whether to prefix the quartz job with the endpoint id. This option is default false. | false | Boolean
-| *camel.component.quartz.properties* | Properties to configure the Quartz scheduler. The option is a java.util.Properties type. |  | String
+| *camel.component.quartz.properties* | Properties to configure the Quartz scheduler. |  | Map
 | *camel.component.quartz.properties-file* | File name of the properties to load from the classpath |  | String
+| *camel.component.quartz.properties-ref* | References to an existing Properties or Map to lookup in the registry to use for configuring quartz. |  | String
 | *camel.component.quartz.scheduler* | To use the custom configured Quartz scheduler, instead of creating a new Scheduler. The option is a org.quartz.Scheduler type. |  | String
 | *camel.component.quartz.scheduler-factory* | To use the custom SchedulerFactory which is used to create the Scheduler. The option is a org.quartz.SchedulerFactory type. |  | String
 | *camel.component.quartz.start-delayed-seconds* | Seconds to wait before starting the quartz scheduler. |  | Integer
diff --git a/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzComponent.java b/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzComponent.java
index 7969931..4796373 100644
--- a/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzComponent.java
+++ b/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzComponent.java
@@ -19,6 +19,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -28,6 +29,7 @@
 import org.apache.camel.ExtendedStartupListener;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.DefaultComponent;
 import org.apache.camel.support.ResourceHelper;
 import org.apache.camel.util.IOHelper;
@@ -52,7 +54,8 @@
     private Scheduler scheduler;
     @Metadata(label = "advanced")
     private SchedulerFactory schedulerFactory;
-    private Properties properties;
+    private String propertiesRef;
+    private Map properties;
     private String propertiesFile;
     @Metadata(label = "scheduler")
     private int startDelayedSeconds;
@@ -123,14 +126,25 @@
         this.enableJmx = enableJmx;
     }
 
-    public Properties getProperties() {
+    public String getPropertiesRef() {
+        return propertiesRef;
+    }
+
+    /**
+     * References to an existing {@link Properties} or {@link Map} to lookup in the registry to use for configuring quartz.
+     */
+    public void setPropertiesRef(String propertiesRef) {
+        this.propertiesRef = propertiesRef;
+    }
+
+    public Map getProperties() {
         return properties;
     }
 
     /**
      * Properties to configure the Quartz scheduler.
      */
-    public void setProperties(Properties properties) {
+    public void setProperties(Map properties) {
         this.properties = properties;
     }
 
@@ -278,7 +292,16 @@
     }
 
     private Properties loadProperties() throws SchedulerException {
-        Properties answer = getProperties();
+        Properties answer = null;
+        if (getProperties() != null) {
+            answer = new Properties();
+            answer.putAll(getProperties());
+        }
+        if (answer == null && getPropertiesRef() != null) {
+            Map map = CamelContextHelper.mandatoryLookup(getCamelContext(), getPropertiesRef(), Map.class);
+            answer = new Properties();
+            answer.putAll(map);
+        }
         if (answer == null && getPropertiesFile() != null) {
             log.info("Loading Quartz properties file from: {}", getPropertiesFile());
             InputStream is = null;
diff --git a/components/pom.xml b/components/pom.xml
index 8d7607a..a34304b 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -267,6 +267,7 @@
         <module>camel-openstack</module>
         <module>camel-opentracing</module>
         <module>camel-optaplanner</module>
+        <module>camel-osgi-activator</module>
         <module>camel-paho</module>
         <module>camel-paxlogging</module>
         <module>camel-pdf</module>
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/ContractAdvice.java b/core/camel-base/src/main/java/org/apache/camel/processor/ContractAdvice.java
index d3676c2..e314b77 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/ContractAdvice.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/ContractAdvice.java
@@ -142,7 +142,7 @@
     private boolean convertIfRequired(Message message, DataType type) throws Exception {
         // TODO for better performance it may be better to add TypeConverterTransformer
         // into transformer registry automatically to avoid unnecessary scan in transformer registry
-        if (type != null && type.isJavaType() && type.getName() != null) {
+        if (type != null && type.isJavaType() && type.getName() != null && message != null && message.getBody() != null) {
             CamelContext context = message.getExchange().getContext();
             Class<?> typeJava = getClazz(type.getName(), context);
             if (!typeJava.isAssignableFrom(message.getBody().getClass())) {
diff --git a/core/camel-core-osgi-activator/pom.xml b/core/camel-core-osgi-activator/pom.xml
deleted file mode 100644
index 4b12500..0000000
--- a/core/camel-core-osgi-activator/pom.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.camel</groupId>
-    <artifactId>core</artifactId>
-    <version>3.1.0-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>camel-core-osgi-activator</artifactId>
-  <packaging>jar</packaging>
-
-  <name>Camel :: Core OSGi Activator</name>
-  <description>Camel Core OSGi Activator</description>
-
-  <properties>
-    <maven.failsafe.version>2.22.1</maven.failsafe.version>
-    <camel.osgi.activator>org.apache.camel.core.osgi.main.internal.Activator</camel.osgi.activator>
-    <camel.osgi.dynamic>*</camel.osgi.dynamic>
-  </properties>
-
-  <dependencies>
-    <!-- osgi -->
-    <dependency>
-      <groupId>org.osgi</groupId>
-      <artifactId>osgi.cmpn</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.osgi</groupId>
-      <artifactId>osgi.core</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.camel</groupId>
-      <artifactId>camel-core-osgi</artifactId>
-      <scope>provided</scope>
-    </dependency>
-  </dependencies>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.servicemix.tooling</groupId>
-        <artifactId>depends-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>generate-depends-file</id>
-            <goals>
-              <goal>generate-depends-file</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/core/camel-core-osgi-activator/src/assembly/test-bundles.xml b/core/camel-core-osgi-activator/src/assembly/test-bundles.xml
deleted file mode 100644
index bd6fc39..0000000
--- a/core/camel-core-osgi-activator/src/assembly/test-bundles.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
-  <id>bundles</id>
-  <formats>
-    <format>dir</format>
-  </formats>
-  <includeBaseDirectory>false</includeBaseDirectory>
-  <dependencySets>
-    <dependencySet>
-      <outputDirectory/>
-      <outputFileNameMapping>${artifact.artifactId}.jar</outputFileNameMapping>
-      <includes>
-        <include>org.apache.camel:camel-core-osgi-activator</include>
-      </includes>
-    </dependencySet>
-  </dependencySets>
-</assembly>
\ No newline at end of file
diff --git a/core/camel-core-osgi-activator/src/main/docs/camel-core-osgi-activator.adoc b/core/camel-core-osgi-activator/src/main/docs/camel-core-osgi-activator.adoc
deleted file mode 100644
index f0614a6..0000000
--- a/core/camel-core-osgi-activator/src/main/docs/camel-core-osgi-activator.adoc
+++ /dev/null
@@ -1,37 +0,0 @@
-= camel-core-osgi-activator

-

-A small bundle for starting an OSGi Apache Camel Project.  The bundle starts the CamelContext and registering RouteBuilders from any bundle.

-

-Install bundle

-

-Register an Apache Camel RouteBuilder as an OSGi service.

-

-Using annotations

-

-[source,java]

-----

-@Component(service = RouteBuilder.class)

-public class MyRouteBuilder extends RouteBuilder {

-    @Override

-    public void configure() throws Exception {

-        from("timer:test?fixedRate=true&period=1000")

-            .log("Hello");

-    }

-}

-----

-

-Or Manually

-

-[source,java]

-----

-public void start(BundleContext context) throws Exception {

-  context.registerService(RouteBuilder.class, new MyRouteBuilder(), null);

-}

-----

-

-And it's automatically added or removed to the context from any bundle!

-

-[source,text]

-----

-Route: route1 started and consuming from: timer://test?fixedRate=true&period=1000

-----

diff --git a/core/camel-core/src/test/java/org/apache/camel/component/file/FileProducerChmodOptionTest.java b/core/camel-core/src/test/java/org/apache/camel/component/file/FileProducerChmodOptionTest.java
index 0a2d36a..b94c9cf 100644
--- a/core/camel-core/src/test/java/org/apache/camel/component/file/FileProducerChmodOptionTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/component/file/FileProducerChmodOptionTest.java
@@ -27,6 +27,7 @@
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
 import org.apache.camel.FailedToCreateRouteException;
+import org.apache.camel.PropertyBindingException;
 import org.apache.camel.ResolveEndpointFailedException;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
@@ -101,7 +102,9 @@
             fail("Expected FailedToCreateRouteException");
         } catch (FailedToCreateRouteException e) {
             assertIsInstanceOf(ResolveEndpointFailedException.class, e.getCause());
-            IllegalArgumentException iae = assertIsInstanceOf(IllegalArgumentException.class, e.getCause().getCause());
+            PropertyBindingException pbe = assertIsInstanceOf(PropertyBindingException.class, e.getCause().getCause());
+            assertEquals("chmod", pbe.getPropertyName());
+            IllegalArgumentException iae = assertIsInstanceOf(IllegalArgumentException.class, pbe.getCause());
             assertEquals("chmod option [abc] is not valid", iae.getMessage());
         }
     }
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/CryptoCmsEndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/CryptoCmsEndpointBuilderFactory.java
index 49e8063..1a770da 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/CryptoCmsEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/CryptoCmsEndpointBuilderFactory.java
@@ -557,6 +557,7 @@
      * different signer/verifier/encryptor/decryptor endpoints within the camel
      * context.
      */
+    @Deprecated
     default CryptoCmsEndpointBuilder cryptoCms(String path) {
         class CryptoCmsEndpointBuilderImpl extends AbstractEndpointBuilder implements CryptoCmsEndpointBuilder, AdvancedCryptoCmsEndpointBuilder {
             public CryptoCmsEndpointBuilderImpl(String path) {
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/JCacheEndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/JCacheEndpointBuilderFactory.java
index 757152d..cd691be 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/JCacheEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/JCacheEndpointBuilderFactory.java
@@ -17,7 +17,7 @@
 package org.apache.camel.builder.endpoint.dsl;
 
 import java.util.List;
-import java.util.Properties;
+import java.util.Map;
 import javax.annotation.Generated;
 import org.apache.camel.ExchangePattern;
 import org.apache.camel.builder.EndpointConsumerBuilder;
@@ -74,12 +74,12 @@
          * The Properties for the javax.cache.spi.CachingProvider to create the
          * CacheManager.
          * 
-         * The option is a: <code>java.util.Properties</code> type.
+         * The option is a: <code>java.util.Map</code> type.
          * 
          * Group: common
          */
         default JCacheEndpointConsumerBuilder cacheConfigurationProperties(
-                Properties cacheConfigurationProperties) {
+                Map cacheConfigurationProperties) {
             doSetProperty("cacheConfigurationProperties", cacheConfigurationProperties);
             return this;
         }
@@ -87,8 +87,7 @@
          * The Properties for the javax.cache.spi.CachingProvider to create the
          * CacheManager.
          * 
-         * The option will be converted to a <code>java.util.Properties</code>
-         * type.
+         * The option will be converted to a <code>java.util.Map</code> type.
          * 
          * Group: common
          */
@@ -639,12 +638,12 @@
          * The Properties for the javax.cache.spi.CachingProvider to create the
          * CacheManager.
          * 
-         * The option is a: <code>java.util.Properties</code> type.
+         * The option is a: <code>java.util.Map</code> type.
          * 
          * Group: common
          */
         default JCacheEndpointProducerBuilder cacheConfigurationProperties(
-                Properties cacheConfigurationProperties) {
+                Map cacheConfigurationProperties) {
             doSetProperty("cacheConfigurationProperties", cacheConfigurationProperties);
             return this;
         }
@@ -652,8 +651,7 @@
          * The Properties for the javax.cache.spi.CachingProvider to create the
          * CacheManager.
          * 
-         * The option will be converted to a <code>java.util.Properties</code>
-         * type.
+         * The option will be converted to a <code>java.util.Map</code> type.
          * 
          * Group: common
          */
@@ -1062,12 +1060,12 @@
          * The Properties for the javax.cache.spi.CachingProvider to create the
          * CacheManager.
          * 
-         * The option is a: <code>java.util.Properties</code> type.
+         * The option is a: <code>java.util.Map</code> type.
          * 
          * Group: common
          */
         default JCacheEndpointBuilder cacheConfigurationProperties(
-                Properties cacheConfigurationProperties) {
+                Map cacheConfigurationProperties) {
             doSetProperty("cacheConfigurationProperties", cacheConfigurationProperties);
             return this;
         }
@@ -1075,8 +1073,7 @@
          * The Properties for the javax.cache.spi.CachingProvider to create the
          * CacheManager.
          * 
-         * The option will be converted to a <code>java.util.Properties</code>
-         * type.
+         * The option will be converted to a <code>java.util.Map</code> type.
          * 
          * Group: common
          */
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
index 991e6ab..7b5e8ea 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
@@ -21,7 +21,6 @@
 import java.io.InputStream;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
@@ -122,15 +121,13 @@
     }
 
     protected static boolean setPropertiesOnTarget(CamelContext context, Object target, Map<String, Object> properties,
-                                                   String optionKey, String optionPrefix, boolean failIfNotSet, boolean ignoreCase,
+                                                   String optionPrefix, boolean failIfNotSet, boolean ignoreCase,
                                                    Map<String, String> autoConfiguredProperties) throws Exception {
         ObjectHelper.notNull(context, "context");
         ObjectHelper.notNull(target, "target");
         ObjectHelper.notNull(properties, "properties");
 
         boolean rc = false;
-        Iterator it = properties.entrySet().iterator();
-
         PropertyConfigurer configurer = null;
         if (target instanceof Component) {
             // the component needs to be initialized to have the configurer ready
@@ -138,41 +135,47 @@
             configurer = ((Component) target).getComponentPropertyConfigurer();
         }
 
-        while (it.hasNext()) {
-            Map.Entry<String, Object> entry = (Map.Entry) it.next();
-            String name = entry.getKey();
-            Object value = entry.getValue();
-            String stringValue = value != null ? value.toString() : null;
-            String key = name;
-            if (optionPrefix != null && optionKey != null) {
-                key = optionPrefix + optionKey;
-            } else if (optionPrefix != null) {
-                key = optionPrefix + name;
+        try {
+            // keep a reference of the original keys
+            Map<String, Object> backup = new LinkedHashMap<>(properties);
+
+            rc = PropertyBindingSupport.build()
+                .withMandatory(failIfNotSet)
+                .withRemoveParameters(true)
+                .withConfigurer(configurer)
+                .withIgnoreCase(ignoreCase)
+                .bind(context, target, properties);
+
+            for (Map.Entry<String, Object> entry: backup.entrySet()) {
+                if (entry.getValue() != null && !properties.containsKey(entry.getKey())) {
+                    String prefix = optionPrefix;
+                    if (prefix != null && !prefix.endsWith(".")) {
+                        prefix = "." + prefix;
+                    }
+
+                    LOG.debug("Configured property: {}{}={} on bean: {}", prefix, entry.getKey(), entry.getValue(), target);
+                    autoConfiguredProperties.put(prefix + entry.getKey(), entry.getValue().toString());
+                }
+            }
+        } catch (PropertyBindingException e) {
+            String key = e.getOptionKey();
+            if (key == null) {
+                String prefix = e.getOptionPrefix();
+                if (prefix != null && !prefix.endsWith(".")) {
+                    prefix = "." + prefix;
+                }
+
+                key = prefix != null
+                    ? prefix + "." + e.getPropertyName()
+                    : e.getPropertyName();
             }
 
-            LOG.debug("Configuring property: {}={} on bean: {}", key, stringValue, target);
-            try {
-                boolean hit;
-                if (failIfNotSet) {
-                    PropertyBindingSupport.build().withMandatory(true).withConfigurer(configurer).withIgnoreCase(ignoreCase).bind(context, target, name, stringValue);
-                    hit = true;
-                } else {
-                    hit = PropertyBindingSupport.build().withConfigurer(configurer).withIgnoreCase(true).bind(context, target, name, stringValue);
-                }
-                if (hit) {
-                    it.remove();
-                    rc = true;
-                    LOG.debug("Configured property: {}={} on bean: {}", key, stringValue, target);
-                    autoConfiguredProperties.put(key, stringValue);
-                }
-            } catch (PropertyBindingException e) {
-                if (failIfNotSet) {
-                    // enrich the error with more precise details with option prefix and key
-                    throw new PropertyBindingException(e.getTarget(), e.getPropertyName(), e.getValue(), optionPrefix, optionKey, e.getCause());
-                } else {
-                    LOG.debug("Error configuring property (" + key + ") with name: " + name + ") on bean: " + target
-                            + " with value: " + stringValue + ". This exception is ignored as failIfNotSet=false.", e);
-                }
+            if (failIfNotSet) {
+                // enrich the error with more precise details with option prefix and key
+                throw new PropertyBindingException(e.getTarget(), e.getPropertyName(), e.getValue(), optionPrefix, key, e.getCause());
+            } else {
+                LOG.debug("Error configuring property (" + key + ") with name: " + e.getPropertyName() + ") on bean: " + target
+                    + " with value: " + e.getValue() + ". This exception is ignored as failIfNotSet=false.", e);
             }
         }
 
@@ -707,7 +710,7 @@
         }
         if (!contextProperties.isEmpty()) {
             LOG.debug("Auto-configuring CamelContext from loaded properties: {}", contextProperties.size());
-            setPropertiesOnTarget(camelContext, camelContext, contextProperties, null, "camel.context.",
+            setPropertiesOnTarget(camelContext, camelContext, contextProperties, "camel.context.",
                     mainConfigurationProperties.isAutoConfigurationFailFast(), true, autoConfiguredProperties);
         }
         if (!hystrixProperties.isEmpty()) {
@@ -718,7 +721,7 @@
                 hystrix = new HystrixConfigurationDefinition();
                 model.setHystrixConfiguration(hystrix);
             }
-            setPropertiesOnTarget(camelContext, hystrix, hystrixProperties, null, "camel.hystrix.",
+            setPropertiesOnTarget(camelContext, hystrix, hystrixProperties, "camel.hystrix.",
                     mainConfigurationProperties.isAutoConfigurationFailFast(), true, autoConfiguredProperties);
         }
         if (!resilience4jProperties.isEmpty()) {
@@ -729,7 +732,7 @@
                 resilience4j = new Resilience4jConfigurationDefinition();
                 model.setResilience4jConfiguration(resilience4j);
             }
-            setPropertiesOnTarget(camelContext, resilience4j, resilience4jProperties, null, "camel.resilience4j.",
+            setPropertiesOnTarget(camelContext, resilience4j, resilience4jProperties, "camel.resilience4j.",
                     mainConfigurationProperties.isAutoConfigurationFailFast(), true, autoConfiguredProperties);
         }
         if (!restProperties.isEmpty()) {
@@ -740,7 +743,7 @@
                 rest = new RestConfiguration();
                 model.setRestConfiguration(rest);
             }
-            setPropertiesOnTarget(camelContext, rest, restProperties, null, "camel.rest.",
+            setPropertiesOnTarget(camelContext, rest, restProperties, "camel.rest.",
                     mainConfigurationProperties.isAutoConfigurationFailFast(), true, autoConfiguredProperties);
         }
 
@@ -799,9 +802,8 @@
 
         if (!properties.isEmpty()) {
             LOG.debug("Auto-configuring properties component from loaded properties: {}", properties.size());
-            setPropertiesOnTarget(camelContext, camelContext.getPropertiesComponent(), properties, null,
-                    "camel.component.properties.", mainConfigurationProperties.isAutoConfigurationFailFast(),
-                    true, autoConfiguredProperties);
+            setPropertiesOnTarget(camelContext, camelContext.getPropertiesComponent(), properties, "camel.component.properties.",
+                    mainConfigurationProperties.isAutoConfigurationFailFast(), true, autoConfiguredProperties);
         }
 
         // log which options was not set
@@ -838,7 +840,7 @@
 
         if (!properties.isEmpty()) {
             LOG.debug("Auto-configuring main from loaded properties: {}", properties.size());
-            setPropertiesOnTarget(camelContext, config, properties, null, "camel.main.",
+            setPropertiesOnTarget(camelContext, config, properties, "camel.main.",
                     mainConfigurationProperties.isAutoConfigurationFailFast(), true, autoConfiguredProperties);
         }
 
@@ -923,11 +925,15 @@
             LOG.debug("Auto-configuring {} components/dataformat/languages from loaded properties: {}", properties.size(), total);
         }
 
-        for (PropertyOptionKey pok : properties.keySet()) {
-            Map<String, Object> values = properties.get(pok);
-            String optionKey = pok.getKey().substring(pok.getOptionPrefix().length());
-            setPropertiesOnTarget(camelContext, pok.getInstance(), values, optionKey, pok.getOptionPrefix(),
-                    mainConfigurationProperties.isAutoConfigurationFailFast(), true, autoConfiguredProperties);
+        for (Map.Entry<PropertyOptionKey, Map<String, Object>> entry: properties.entrySet()) {
+            setPropertiesOnTarget(
+                    camelContext,
+                    entry.getKey().getInstance(),
+                    entry.getValue(),
+                    entry.getKey().getOptionPrefix(),
+                    mainConfigurationProperties.isAutoConfigurationFailFast(),
+                    true,
+                    autoConfiguredProperties);
         }
 
         // log which options was not set
@@ -936,7 +942,7 @@
                 Map<String, Object> values = properties.get(pok);
                 values.forEach((k, v) -> {
                     String stringValue = v != null ? v.toString() : null;
-                    LOG.warn("Property ({}={}) not auto-configured with name: {} on bean: {} with value: {}", pok.getKey(), stringValue, k, pok.getInstance(), stringValue);
+                    LOG.warn("Property ({}={}) not auto-configured with name: {} on bean: {} with value: {}", pok.getOptionPrefix() +  "." + k, stringValue, k, pok.getInstance(), stringValue);
                 });
             }
         }
@@ -1010,19 +1016,12 @@
     }
 
     private static final class PropertyOptionKey {
-
-        private final String key;
         private final Object instance;
         private final String optionPrefix;
 
-        private PropertyOptionKey(String key, Object instance, String optionPrefix) {
-            this.key = key;
-            this.instance = instance;
-            this.optionPrefix = optionPrefix;
-        }
-
-        public String getKey() {
-            return key;
+        private PropertyOptionKey(Object instance, String optionPrefix) {
+            this.instance = ObjectHelper.notNull(instance, "instance");
+            this.optionPrefix = ObjectHelper.notNull(optionPrefix, "optionPrefix");
         }
 
         public Object getInstance() {
@@ -1038,16 +1037,17 @@
             if (this == o) {
                 return true;
             }
-            if (o == null || getClass() != o.getClass()) {
+            if (!(o instanceof PropertyOptionKey)) {
                 return false;
             }
-            PropertyOptionKey that = (PropertyOptionKey) o;
-            return key.equals(that.key) && instance.equals(that.instance);
+            PropertyOptionKey key = (PropertyOptionKey) o;
+            return Objects.equals(instance, key.instance)
+                && Objects.equals(optionPrefix, key.optionPrefix);
         }
 
         @Override
         public int hashCode() {
-            return Objects.hash(key, instance);
+            return Objects.hash(instance, optionPrefix);
         }
     }
 
@@ -1093,7 +1093,7 @@
 
             validateOptionAndValue(key, option, value);
 
-            PropertyOptionKey pok = new PropertyOptionKey(key, target, prefix);
+            PropertyOptionKey pok = new PropertyOptionKey(target, prefix);
             Map<String, Object> values = properties.computeIfAbsent(pok, k -> new LinkedHashMap<>());
 
             // we ignore case for property keys (so we should store them in canonical style
diff --git a/core/camel-main/src/test/java/org/apache/camel/main/MainComponentConfigurationTest.java b/core/camel-main/src/test/java/org/apache/camel/main/MainComponentConfigurationTest.java
new file mode 100644
index 0000000..a2360ba
--- /dev/null
+++ b/core/camel-main/src/test/java/org/apache/camel/main/MainComponentConfigurationTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.main;
+
+import java.util.Properties;
+
+import org.apache.camel.main.support.MyDummyComponent;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MainComponentConfigurationTest extends Assert {
+    @Test
+    public void testComponentConfiguration() {
+        Properties properties = new Properties();
+        properties.setProperty("camel.component.dummy.configuration.log", "true");
+        properties.setProperty("camel.component.dummy.component-value", "component-value");
+        properties.setProperty("camel.component.dummy.configuration.nested.value", "nested-value");
+        properties.setProperty("camel.component.dummy.configuration", "#class:org.apache.camel.main.support.MyDummyConfiguration");
+
+        Main main = new Main();
+        try {
+            MyDummyComponent dummy = new MyDummyComponent(false);
+
+            main.bind("dummy", dummy);
+            main.setOverrideProperties(properties);
+            main.setDefaultPropertyPlaceholderLocation("false");
+            main.start();
+
+            assertEquals("component-value", dummy.getComponentValue());
+
+            assertNotNull(dummy.getConfiguration());
+            assertTrue(dummy.getConfiguration().isLog());
+            assertNotNull(dummy.getConfiguration().getNested());
+            assertEquals("nested-value", dummy.getConfiguration().getNested().getValue());
+        } finally {
+            main.stop();
+        }
+    }
+}
+
diff --git a/core/camel-main/src/test/java/org/apache/camel/main/support/MyDummyComponent.java b/core/camel-main/src/test/java/org/apache/camel/main/support/MyDummyComponent.java
new file mode 100644
index 0000000..9b3d73f
--- /dev/null
+++ b/core/camel-main/src/test/java/org/apache/camel/main/support/MyDummyComponent.java
@@ -0,0 +1,67 @@
+/*
+ * 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.main.support;
+
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.PropertyConfigurer;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
+
+@Component("dummy")
+public class MyDummyComponent extends DefaultComponent {
+    private MyDummyConfiguration configuration;
+    private boolean configurer;
+    private String componentValue;
+
+    public MyDummyComponent(boolean configurer) {
+        this.configurer = configurer;
+    }
+
+    public MyDummyConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    public void setConfiguration(MyDummyConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    // this method makes camel no able to find a suitable setter
+    public void setConfiguration(Object configuration) {
+        this.configuration = (MyDummyConfiguration)configuration;
+    }
+
+    public String getComponentValue() {
+        return componentValue;
+    }
+
+    public MyDummyComponent setComponentValue(String componentValue) {
+        this.componentValue = componentValue;
+        return this;
+    }
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public PropertyConfigurer getComponentPropertyConfigurer() {
+        return configurer ? new MyDummyComponentConfigurer() : null;
+    }
+}
diff --git a/core/camel-main/src/test/java/org/apache/camel/main/support/MyDummyComponentConfigurer.java b/core/camel-main/src/test/java/org/apache/camel/main/support/MyDummyComponentConfigurer.java
new file mode 100644
index 0000000..9751c7b
--- /dev/null
+++ b/core/camel-main/src/test/java/org/apache/camel/main/support/MyDummyComponentConfigurer.java
@@ -0,0 +1,52 @@
+/*
+ * 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.main.support;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+public class MyDummyComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
+    @Override
+    public boolean configure(CamelContext camelContext, Object component, String name, Object value, boolean ignoreCase) {
+        if (ignoreCase) {
+            return doConfigureIgnoreCase(camelContext, component, name, value);
+        } else {
+            return doConfigure(camelContext, component, name, value);
+        }
+    }
+
+    private static boolean doConfigure(CamelContext camelContext, Object component, String name, Object value) {
+        switch (name) {
+        case "configuration":
+            ((MyDummyComponent) component).setConfiguration(property(camelContext, MyDummyConfiguration.class, value));
+            return true;
+        default:
+            return false;
+        }
+    }
+
+    private static boolean doConfigureIgnoreCase(CamelContext camelContext, Object component, String name, Object value) {
+        switch (name.toLowerCase()) {
+        case "configuration":
+            ((MyDummyComponent) component).setConfiguration(property(camelContext, MyDummyConfiguration.class, value));
+            return true;
+        default:
+            return false;
+        }
+    }
+}
diff --git a/core/camel-main/src/test/java/org/apache/camel/main/support/MyDummyConfiguration.java b/core/camel-main/src/test/java/org/apache/camel/main/support/MyDummyConfiguration.java
new file mode 100644
index 0000000..153dadf
--- /dev/null
+++ b/core/camel-main/src/test/java/org/apache/camel/main/support/MyDummyConfiguration.java
@@ -0,0 +1,52 @@
+/*
+ * 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.main.support;
+
+public class MyDummyConfiguration {
+    private boolean log;
+    private NestedConfig nested;
+
+    public boolean isLog() {
+        return log;
+    }
+
+    public MyDummyConfiguration setLog(boolean log) {
+        this.log = log;
+        return this;
+    }
+
+    public NestedConfig getNested() {
+        return nested;
+    }
+
+    public void setNested(NestedConfig nested) {
+        this.nested = nested;
+    }
+
+    public static class NestedConfig {
+        private String value;
+
+        public String getValue() {
+            return value;
+        }
+
+        public NestedConfig setValue(String value) {
+            this.value = value;
+            return this;
+        }
+    }
+}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java
index 4d101c1..1c8205d 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java
@@ -19,6 +19,7 @@
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -471,7 +472,9 @@
         org.apache.camel.util.ObjectHelper.notNull(camelContext, "camelContext");
         org.apache.camel.util.ObjectHelper.notNull(target, "target");
         org.apache.camel.util.ObjectHelper.notNull(properties, "properties");
-        boolean rc = false;
+
+        final String uOptionPrefix = ignoreCase && isNotEmpty(optionPrefix) ? optionPrefix.toUpperCase(Locale.US) : "";
+        final int size = properties.size();
 
         if (configurer instanceof GeneratedPropertyConfigurer) {
             GeneratedPropertyConfigurer gen = (GeneratedPropertyConfigurer) configurer;
@@ -480,12 +483,9 @@
                 Map.Entry<String, Object> entry = iter.next();
                 String key = entry.getKey();
                 Object value = entry.getValue();
-                boolean valid = true;
-                if (nesting) {
-                    // property configurer does not support nested names so skip if the name has a dot
-                    valid = key.indexOf('.') == -1;
-                }
-                if (valid) {
+
+                // property configurer does not support nested names so skip if the name has a dot
+                if (key.indexOf('.') != -1) {
                     try {
                         // GeneratedPropertyConfigurer works by invoking the methods directly but it does
                         // not resolve property placeholders eventually defined in the value before invoking
@@ -497,7 +497,6 @@
                         boolean hit = gen.configure(camelContext, target, key, value, ignoreCase);
                         if (removeParameter && hit) {
                             iter.remove();
-                            rc = true;
                         }
                     } catch (Exception e) {
                         throw new PropertyBindingException(target, key, value, e);
@@ -507,39 +506,44 @@
         }
 
         // must set reference parameters first before the other bindings
-        int size = properties.size();
         setReferenceProperties(camelContext, target, properties);
-        rc |= properties.size() != size;
 
-        String uOptionPrefix = "";
-        if (ignoreCase && isNotEmpty(optionPrefix)) {
-            uOptionPrefix = optionPrefix.toUpperCase(Locale.US);
-        }
+        // sort the keys by nesting level so when moving to the nest level all the
+        // propertis of the curent level are bound to the target. This allow the 
+        // properties binging engine to be indipendent to the order of properrties.
+        //
+        // As example:
+        //
+        //     configuration.my-property = myCustomValue
+        //     configuration = #class:my.custom.Config
+        //
+        // 'configuration.my-property' has lower precedence over 'configuration' as
+        // it is one level deep and will be set after all the properties of the current
+        // level are set which allow `my-property` to be set of the right instance.
+        properties.keySet().stream()
+            .sorted(Comparator.comparingInt(s -> StringHelper.countChar(s, '.')))
+            .forEach(key -> {
+                final Object value = properties.get(key);
 
-        for (Iterator<Map.Entry<String, Object>> iter = properties.entrySet().iterator(); iter.hasNext();) {
-            Map.Entry<String, Object> entry = iter.next();
-            String key = entry.getKey();
-            Object value = entry.getValue();
-
-            if (isNotEmpty(optionPrefix)) {
-                boolean match = key.startsWith(optionPrefix) || ignoreCase && key.toUpperCase(Locale.US).startsWith(uOptionPrefix);
-                if (!match) {
-                    continue;
+                if (isNotEmpty(optionPrefix)) {
+                    boolean match = key.startsWith(optionPrefix) || ignoreCase && key.toUpperCase(Locale.US).startsWith(uOptionPrefix);
+                    if (!match) {
+                        return;
+                    }
+                    key = key.substring(optionPrefix.length());
                 }
-                key = key.substring(optionPrefix.length());
-            }
 
-            boolean bound = bindProperty(camelContext, target, key, value, ignoreCase, nesting, deepNesting, fluentBuilder, allowPrivateSetter, reference, placeholder);
-            if (bound && removeParameter) {
-                iter.remove();
-                rc = true;
+                boolean bound = bindProperty(camelContext, target, key, value, ignoreCase, nesting, deepNesting, fluentBuilder, allowPrivateSetter, reference, placeholder);
+                if (bound && removeParameter) {
+                    properties.remove(key);
+                }
+                if (mandatory && !bound) {
+                    throw new PropertyBindingException(target, key, value);
+                }
             }
-            if (mandatory && !bound) {
-                throw new PropertyBindingException(target, key, value);
-            }
-        }
+        );
 
-        return rc;
+        return properties.size() != size;
     }
 
     private static boolean bindProperty(CamelContext camelContext, Object target, String name, Object value,
diff --git a/core/pom.xml b/core/pom.xml
index 9c25515..25db9fd 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -47,7 +47,6 @@
         <module>camel-core</module>
         <module>camel-endpointdsl</module>
         <module>camel-core-osgi</module>
-        <module>camel-core-osgi-activator</module>
         <module>camel-core-xml</module>
         <module>camel-cloud</module>
         <module>camel-main</module>
diff --git a/docs/components/modules/ROOT/nav.adoc b/docs/components/modules/ROOT/nav.adoc
index 8df3117..aab755b 100644
--- a/docs/components/modules/ROOT/nav.adoc
+++ b/docs/components/modules/ROOT/nav.adoc
@@ -76,7 +76,7 @@
 * xref:corda-component.adoc[Corda Component]
 * xref:couchbase-component.adoc[Couchbase Component]
 * xref:couchdb-component.adoc[CouchDB Component]
-* xref:crypto-cms-component.adoc[Crypto CMS Component]
+* xref:crypto-cms-component.adoc[Crypto CMS Component (deprecated)]
 * xref:crypto-component.adoc[Crypto (JCE) Component]
 * xref:crypto-dataformat.adoc[Crypto (Java Cryptographic Extension) DataFormat]
 * xref:pgp-dataformat.adoc[PGP DataFormat]
@@ -272,6 +272,7 @@
 * xref:openstack.adoc[Openstack Component]
 * xref:opentracing.adoc[OpenTracing Component]
 * xref:optaplanner-component.adoc[OptaPlanner Component]
+* xref:osgi-activator.adoc[OSGi Camel Routes Activator]
 * xref:paho-component.adoc[Paho Component]
 * xref:paxlogging-component.adoc[OSGi PAX Logging Component]
 * xref:pdf-component.adoc[PDF Component]
diff --git a/docs/components/modules/ROOT/pages/crypto-cms-component.adoc b/docs/components/modules/ROOT/pages/crypto-cms-component.adoc
index 589bd7a..28ad342 100644
--- a/docs/components/modules/ROOT/pages/crypto-cms-component.adoc
+++ b/docs/components/modules/ROOT/pages/crypto-cms-component.adoc
@@ -1,9 +1,12 @@
 [[crypto-cms-component]]
-= Crypto CMS Component
+= Crypto CMS Component (deprecated)
 :page-source: components/camel-crypto-cms/src/main/docs/crypto-cms-component.adoc
 
 *Since Camel 2.20*
 
+*Since Camel 2.20*
+
+
 // HEADER START
 *Only producer is supported*
 // HEADER END
@@ -432,4 +435,4 @@
         <to uri="crypto-cms:verify://testverify?keyStoreParameters=#keyStoreParameters1&amp;signedDataHeaderBase64=true" />
         <to uri="mock:result" />
     </route>    
-----
+----
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/pages/index.adoc b/docs/components/modules/ROOT/pages/index.adoc
index 88df8c4..76d53d7 100644
--- a/docs/components/modules/ROOT/pages/index.adoc
+++ b/docs/components/modules/ROOT/pages/index.adoc
@@ -6,7 +6,7 @@
 == Components
 
 // components: START
-Number of Components: 306 in 244 JAR artifacts (0 deprecated)
+Number of Components: 306 in 244 JAR artifacts (1 deprecated)
 
 [width="100%",cols="4,1,5",options="header"]
 |===
@@ -136,7 +136,7 @@
 
 | xref:crypto-component.adoc[Crypto (JCE)] (camel-crypto) | 2.3 | The crypto component is used for signing and verifying exchanges using the Signature Service of the Java Cryptographic Extension (JCE).
 
-| xref:crypto-cms-component.adoc[Crypto CMS] (camel-crypto-cms) | 2.20 | The crypto cms component is used for encrypting data in CMS Enveloped Data format, decrypting CMS Enveloped Data, signing data in CMS Signed Data format, and verifying CMS Signed Data.
+| xref:crypto-cms-component.adoc[Crypto CMS] (camel-crypto-cms) | 2.20 | *deprecated* The crypto cms component is used for encrypting data in CMS Enveloped Data format, decrypting CMS Enveloped Data, signing data in CMS Signed Data format, and verifying CMS Signed Data.
 
 | xref:cxf-component.adoc[CXF] (camel-cxf) | 1.0 | The cxf component is used for SOAP WebServices using Apache CXF.
 
@@ -776,7 +776,7 @@
 == Miscellaneous Components
 
 // others: START
-Number of Miscellaneous Components: 39 in 39 JAR artifacts (0 deprecated)
+Number of Miscellaneous Components: 40 in 40 JAR artifacts (0 deprecated)
 
 [width="100%",cols="4,1,5",options="header"]
 |===
@@ -808,6 +808,8 @@
 
 | xref:opentracing.adoc[OpenTracing] (camel-opentracing) | 2.19 | Distributed tracing using OpenTracing
 
+| xref:osgi-activator.adoc[Osgi Activator] (camel-osgi-activator) |  | Camel OSGi Activator
+
 | xref:reactive-executor-vertx.adoc[Reactive Executor Vert.x] (camel-reactive-executor-vertx) | 3.0 | Reactive Executor for camel-core using Vert.x
 
 | xref:reactor.adoc[Reactor] (camel-reactor) | 2.20 | Reactor based back-end for Camel's reactive streams component
diff --git a/docs/components/modules/ROOT/pages/jcache-component.adoc b/docs/components/modules/ROOT/pages/jcache-component.adoc
index 92e87e0..fb5fe24 100644
--- a/docs/components/modules/ROOT/pages/jcache-component.adoc
+++ b/docs/components/modules/ROOT/pages/jcache-component.adoc
@@ -86,7 +86,7 @@
 ----
 
 
-The component supports 8 options, which are listed below.
+The component supports 9 options, which are listed below.
 
 
 
@@ -96,7 +96,8 @@
 | *camel.component.jcache.basic-property-binding* | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | Boolean
 | *camel.component.jcache.bridge-error-handler* | 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
 | *camel.component.jcache.cache-configuration* | A Configuration for the Cache. The option is a javax.cache.configuration.Configuration type. |  | String
-| *camel.component.jcache.cache-configuration-properties* | The Properties for the javax.cache.spi.CachingProvider to create the CacheManager. The option is a java.util.Properties type. |  | String
+| *camel.component.jcache.cache-configuration-properties* | Properties to configure jcache |  | Map
+| *camel.component.jcache.cache-configuration-properties-ref* | References to an existing Properties or Map to lookup in the registry to use for configuring jcache. |  | String
 | *camel.component.jcache.caching-provider* | The fully qualified class name of the javax.cache.spi.CachingProvider |  | String
 | *camel.component.jcache.configuration-uri* | An implementation specific URI for the CacheManager |  | String
 | *camel.component.jcache.enabled* | Whether to enable auto configuration of the jcache component. This is enabled by default. |  | Boolean
@@ -113,7 +114,7 @@
 
 
 // component options: START
-The JCache component supports 7 options, which are listed below.
+The JCache component supports 8 options, which are listed below.
 
 
 
@@ -122,7 +123,8 @@
 | Name | Description | Default | Type
 | *cachingProvider* (common) | The fully qualified class name of the javax.cache.spi.CachingProvider |  | String
 | *cacheConfiguration* (common) | A Configuration for the Cache |  | Configuration
-| *cacheConfiguration Properties* (common) | The Properties for the javax.cache.spi.CachingProvider to create the CacheManager |  | Properties
+| *cacheConfiguration Properties* (common) | Properties to configure jcache |  | Map
+| *cacheConfiguration PropertiesRef* (common) | References to an existing Properties or Map to lookup in the registry to use for configuring jcache. |  | String
 | *configurationUri* (common) | An implementation specific URI for the CacheManager |  | String
 | *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
diff --git a/docs/components/modules/ROOT/pages/osgi-activator.adoc b/docs/components/modules/ROOT/pages/osgi-activator.adoc
new file mode 100644
index 0000000..00438d2
--- /dev/null
+++ b/docs/components/modules/ROOT/pages/osgi-activator.adoc
@@ -0,0 +1,57 @@
+[[OsgiActivator]]
+= OSGi Camel Routes Activator
+:page-source: components/camel-osgi-activator/src/main/docs/osgi-activator.adoc
+
+*Since Camel 3.1*
+
+A small OSGi activator for starting an OSGi Apache Camel Project.
+
+The bundle starts a shared CamelContext and registers any RouteBuilder instances
+(discovered via the OSGi Service Registry), from any other bundles that gets installed.
+And when the bundles gets uninstalled then the routes are stopped and removed from the shared CamelContext.
+
+== Important
+
+This OSGi activator is a based prototype for quickly starting up an OSGi container with a single shared
+CamelContext and then being able to use OSGi dynamism to deploy and undeploy bundlers with Camel routes.
+
+Beware that this OSGi activator is a basic implementation and has limited support for dealing with errors
+when new routes are added which may clash with existing routes (route ids).
+
+Configuration of the CamelContext is also very limited.
+
+Therefore only use this for prototyping and experiments. This is NOT recommended for production usage.
+
+== Install bundle
+
+Register an Apache Camel RouteBuilder as an OSGi service.
+
+Using OSGi annotations:
+
+[source,java]
+----
+@Component(service = RouteBuilder.class)
+public class MyRouteBuilder extends RouteBuilder {
+    @Override
+    public void configure() throws Exception {
+        from("timer:test?fixedRate=true&period=1000")
+            .log("Hello");
+    }
+}
+----
+
+Or Manually:
+
+[source,java]
+----
+public void start(BundleContext context) throws Exception {
+  context.registerService(RouteBuilder.class, new MyRouteBuilder(), null);
+}
+----
+
+And it's automatically added or removed to the context from any bundle!
+
+[source,text]
+----
+Route: route1 started and consuming from: timer://test?fixedRate=true&period=1000
+----
diff --git a/docs/components/modules/ROOT/pages/quartz-component.adoc b/docs/components/modules/ROOT/pages/quartz-component.adoc
index 0f2bfa7..c881b41 100644
--- a/docs/components/modules/ROOT/pages/quartz-component.adoc
+++ b/docs/components/modules/ROOT/pages/quartz-component.adoc
@@ -49,7 +49,7 @@
 
 
 // component options: START
-The Quartz component supports 13 options, which are listed below.
+The Quartz component supports 14 options, which are listed below.
 
 
 
@@ -60,7 +60,8 @@
 | *startDelayedSeconds* (scheduler) | Seconds to wait before starting the quartz scheduler. |  | int
 | *prefixJobNameWith EndpointId* (consumer) | Whether to prefix the quartz job with the endpoint id. This option is default false. | false | boolean
 | *enableJmx* (consumer) | Whether to enable Quartz JMX which allows to manage the Quartz scheduler from JMX. This options is default true | true | boolean
-| *properties* (consumer) | Properties to configure the Quartz scheduler. |  | Properties
+| *propertiesRef* (consumer) | References to an existing Properties or Map to lookup in the registry to use for configuring quartz. |  | String
+| *properties* (consumer) | Properties to configure the Quartz scheduler. |  | Map
 | *propertiesFile* (consumer) | File name of the properties to load from the classpath |  | String
 | *prefixInstanceName* (consumer) | Whether to prefix the Quartz Scheduler instance name with the CamelContext name. This is enabled by default, to let each CamelContext use its own Quartz scheduler instance by default. You can set this option to false to reuse Quartz scheduler instances between multiple CamelContext's. | true | boolean
 | *interruptJobsOn Shutdown* (scheduler) | Whether to interrupt jobs on shutdown which forces the scheduler to shutdown quicker and attempt to interrupt any running jobs. If this is enabled then any running jobs can fail due to being interrupted. | false | boolean
@@ -139,7 +140,7 @@
 ----
 
 
-The component supports 14 options, which are listed below.
+The component supports 15 options, which are listed below.
 
 
 
@@ -155,8 +156,9 @@
 | *camel.component.quartz.lazy-start-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 starting the producer may take a little time and prolong the total processing time of the processing. | false | Boolean
 | *camel.component.quartz.prefix-instance-name* | Whether to prefix the Quartz Scheduler instance name with the CamelContext name. This is enabled by default, to let each CamelContext use its own Quartz scheduler instance by default. You can set this option to false to reuse Quartz scheduler instances between multiple CamelContext's. | true | Boolean
 | *camel.component.quartz.prefix-job-name-with-endpoint-id* | Whether to prefix the quartz job with the endpoint id. This option is default false. | false | Boolean
-| *camel.component.quartz.properties* | Properties to configure the Quartz scheduler. The option is a java.util.Properties type. |  | String
+| *camel.component.quartz.properties* | Properties to configure the Quartz scheduler. |  | Map
 | *camel.component.quartz.properties-file* | File name of the properties to load from the classpath |  | String
+| *camel.component.quartz.properties-ref* | References to an existing Properties or Map to lookup in the registry to use for configuring quartz. |  | String
 | *camel.component.quartz.scheduler* | To use the custom configured Quartz scheduler, instead of creating a new Scheduler. The option is a org.quartz.Scheduler type. |  | String
 | *camel.component.quartz.scheduler-factory* | To use the custom SchedulerFactory which is used to create the Scheduler. The option is a org.quartz.SchedulerFactory type. |  | String
 | *camel.component.quartz.start-delayed-seconds* | Seconds to wait before starting the quartz scheduler. |  | Integer
diff --git a/parent/pom.xml b/parent/pom.xml
index 700b2bd..109e96d 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -787,11 +787,6 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
-                <artifactId>camel-core-osgi-activator</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.camel</groupId>
                 <artifactId>camel-core-xml</artifactId>
                 <version>${project.version}</version>
             </dependency>
@@ -1890,6 +1885,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-osgi-activator</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-paho</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/platforms/spring-boot/components-starter/camel-jcache-starter/src/main/java/org/apache/camel/component/jcache/springboot/JCacheComponentConfiguration.java b/platforms/spring-boot/components-starter/camel-jcache-starter/src/main/java/org/apache/camel/component/jcache/springboot/JCacheComponentConfiguration.java
index 51d281c..a8d3c53 100644
--- a/platforms/spring-boot/components-starter/camel-jcache-starter/src/main/java/org/apache/camel/component/jcache/springboot/JCacheComponentConfiguration.java
+++ b/platforms/spring-boot/components-starter/camel-jcache-starter/src/main/java/org/apache/camel/component/jcache/springboot/JCacheComponentConfiguration.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.jcache.springboot;
 
+import java.util.Map;
 import javax.annotation.Generated;
 import org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon;
 import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -47,10 +48,14 @@
      */
     private String cacheConfiguration;
     /**
-     * The Properties for the javax.cache.spi.CachingProvider to create the
-     * CacheManager. The option is a java.util.Properties type.
+     * Properties to configure jcache
      */
-    private String cacheConfigurationProperties;
+    private Map cacheConfigurationProperties;
+    /**
+     * References to an existing Properties or Map to lookup in the registry to
+     * use for configuring jcache.
+     */
+    private String cacheConfigurationPropertiesRef;
     /**
      * An implementation specific URI for the CacheManager
      */
@@ -97,15 +102,23 @@
         this.cacheConfiguration = cacheConfiguration;
     }
 
-    public String getCacheConfigurationProperties() {
+    public Map getCacheConfigurationProperties() {
         return cacheConfigurationProperties;
     }
 
-    public void setCacheConfigurationProperties(
-            String cacheConfigurationProperties) {
+    public void setCacheConfigurationProperties(Map cacheConfigurationProperties) {
         this.cacheConfigurationProperties = cacheConfigurationProperties;
     }
 
+    public String getCacheConfigurationPropertiesRef() {
+        return cacheConfigurationPropertiesRef;
+    }
+
+    public void setCacheConfigurationPropertiesRef(
+            String cacheConfigurationPropertiesRef) {
+        this.cacheConfigurationPropertiesRef = cacheConfigurationPropertiesRef;
+    }
+
     public String getConfigurationUri() {
         return configurationUri;
     }
diff --git a/platforms/spring-boot/components-starter/camel-quartz-starter/src/main/java/org/apache/camel/component/quartz/springboot/QuartzComponentConfiguration.java b/platforms/spring-boot/components-starter/camel-quartz-starter/src/main/java/org/apache/camel/component/quartz/springboot/QuartzComponentConfiguration.java
index 6dafec7..4c2bf0a 100644
--- a/platforms/spring-boot/components-starter/camel-quartz-starter/src/main/java/org/apache/camel/component/quartz/springboot/QuartzComponentConfiguration.java
+++ b/platforms/spring-boot/components-starter/camel-quartz-starter/src/main/java/org/apache/camel/component/quartz/springboot/QuartzComponentConfiguration.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.quartz.springboot;
 
+import java.util.Map;
 import javax.annotation.Generated;
 import org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon;
 import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -56,10 +57,14 @@
      */
     private Boolean enableJmx = true;
     /**
-     * Properties to configure the Quartz scheduler. The option is a
-     * java.util.Properties type.
+     * References to an existing Properties or Map to lookup in the registry to
+     * use for configuring quartz.
      */
-    private String properties;
+    private String propertiesRef;
+    /**
+     * Properties to configure the Quartz scheduler.
+     */
+    private Map properties;
     /**
      * File name of the properties to load from the classpath
      */
@@ -147,11 +152,19 @@
         this.enableJmx = enableJmx;
     }
 
-    public String getProperties() {
+    public String getPropertiesRef() {
+        return propertiesRef;
+    }
+
+    public void setPropertiesRef(String propertiesRef) {
+        this.propertiesRef = propertiesRef;
+    }
+
+    public Map getProperties() {
         return properties;
     }
 
-    public void setProperties(String properties) {
+    public void setProperties(Map properties) {
         this.properties = properties;
     }
 
diff --git a/platforms/spring-boot/spring-boot-dm/camel-spring-boot-dependencies/pom.xml b/platforms/spring-boot/spring-boot-dm/camel-spring-boot-dependencies/pom.xml
index b17c44c..2df5ffc 100644
--- a/platforms/spring-boot/spring-boot-dm/camel-spring-boot-dependencies/pom.xml
+++ b/platforms/spring-boot/spring-boot-dm/camel-spring-boot-dependencies/pom.xml
@@ -2154,11 +2154,6 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
-        <artifactId>camel-core-osgi-activator</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.camel</groupId>
         <artifactId>camel-core-xml</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/tests/camel-itest-karaf/pom.xml b/tests/camel-itest-karaf/pom.xml
index a3b67ba..02c38e4 100644
--- a/tests/camel-itest-karaf/pom.xml
+++ b/tests/camel-itest-karaf/pom.xml
@@ -132,6 +132,11 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-osgi-activator</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.camel.karaf</groupId>
             <artifactId>apache-camel</artifactId>
             <version>${project.version}</version>
diff --git a/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/main/BundleIT.java b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/activator/CamelOsgiActivatorTest.java
similarity index 74%
rename from tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/main/BundleIT.java
rename to tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/activator/CamelOsgiActivatorTest.java
index 429df96..5046c73 100644
--- a/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/main/BundleIT.java
+++ b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/activator/CamelOsgiActivatorTest.java
@@ -14,12 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.itest.karaf.main;
+package org.apache.camel.itest.karaf.activator;
 
 import java.io.IOException;
-import java.net.URISyntaxException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -34,35 +31,26 @@
 import org.ops4j.pax.exam.junit.PaxExam;
 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
-import org.ops4j.pax.tinybundles.core.TinyBundles;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
-import static org.ops4j.pax.exam.CoreOptions.junitBundles;
-import static org.ops4j.pax.exam.CoreOptions.streamBundle;
-import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.*;
 
 @RunWith(PaxExam.class)
 @ExamReactorStrategy(PerClass.class)
-public class BundleIT {
+public class CamelOsgiActivatorTest {
     @Inject
     private BundleContext bc;
 
     @Configuration
-    public Option[] configuration() throws IOException, URISyntaxException, ClassNotFoundException {
+    public Option[] configuration() throws IOException {
         return options(
                 PaxExamOptions.KARAF.option(),
                 PaxExamOptions.CAMEL_CORE_OSGI.option(),
-                streamBundle(
-                    TinyBundles.bundle()
-                        .read(
-                            Files.newInputStream(
-                                Paths.get("target/test-bundles")
-                                    .resolve("camel-core-osgi-activator.jar")))
-                        .build()),
+                mavenBundle("org.apache.camel", "camel-osgi-activator").versionAsInProject(),
                 junitBundles());
     }
     
@@ -70,7 +58,7 @@
     public void testBundleLoaded() throws Exception {
         boolean hasCore = false;
         boolean hasOsgi = false;
-        boolean hasCamelCoreOsgiActivator = false;
+        boolean hasCamelOsgiActivator = false;
         for (Bundle b : bc.getBundles()) {
             if ("org.apache.camel.camel-core".equals(b.getSymbolicName())) {
                 hasCore = true;
@@ -81,14 +69,14 @@
                 assertEquals("Camel Core OSGi not activated", Bundle.ACTIVE, b.getState());
             }
             
-            if ("org.apache.camel.camel-core-osgi-activator".equals(b.getSymbolicName())) {
-                hasCamelCoreOsgiActivator = true;
-                assertEquals("Camel Core OSGi Activator not activated", Bundle.ACTIVE, b.getState());
+            if ("org.apache.camel.camel-osgi-activator".equals(b.getSymbolicName())) {
+                hasCamelOsgiActivator = true;
+                assertEquals("Camel OSGi Activator not activated", Bundle.ACTIVE, b.getState());
             }
         }
         assertTrue("Camel Core bundle not found", hasCore);
         assertTrue("Camel Core OSGi bundle not found", hasOsgi);
-        assertTrue("Camel Core OSGi Activator bundle not found", hasCamelCoreOsgiActivator);
+        assertTrue("Camel OSGi Activator bundle not found", hasCamelOsgiActivator);
     }
 
     @Test
diff --git a/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/main/PaxExamOptions.java b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/activator/PaxExamOptions.java
similarity index 98%
rename from tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/main/PaxExamOptions.java
rename to tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/activator/PaxExamOptions.java
index 07b43f4..fa812ac 100644
--- a/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/main/PaxExamOptions.java
+++ b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/activator/PaxExamOptions.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.itest.karaf.main;
+package org.apache.camel.itest.karaf.activator;
 
 import java.io.File;
 
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootStarterMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootStarterMojo.java
index 39fe0a8..99a5ca8 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootStarterMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootStarterMojo.java
@@ -75,7 +75,7 @@
 public class SpringBootStarterMojo extends AbstractMojo {
 
     private static final String[] IGNORE_MODULES = {
-        /* OSGi -> */ "camel-blueprint", "camel-core-osgi", "camel-eventadmin", "camel-paxlogging",
+        /* OSGi -> */ "camel-blueprint", "camel-core-osgi", "camel-osgi-activator", "camel-eventadmin", "camel-paxlogging",
         /* extended core */ "camel-attachments",
         /* Java EE -> */ "camel-cdi",
         /* MicroProfile -> */ "camel-microprofile-config",