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

[camel] 10/11: [CAMEL-14786] Move as much initialisation code from start() to init() phase

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

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

commit be547c1d177aaec8c8520ac1970ef9b055b1deb7
Author: gnodet <gn...@gmail.com>
AuthorDate: Mon Mar 23 16:56:58 2020 +0100

    [CAMEL-14786] Move as much initialisation code from start() to init() phase
---
 .../camel/blueprint/BlueprintCamelContext.java     |   6 +-
 .../blueprint/handler/CamelNamespaceHandler.java   |   2 +-
 .../apache/camel/component/cron/CronComponent.java |   2 +-
 .../spring/javaconfig/CamelConfiguration.java      |   2 +-
 .../main/java/org/apache/camel/spring/Main.java    |   9 +-
 .../camel/spring/CamelContextFactoryBean.java      |   2 +-
 .../apache/camel/spring/SpringCamelContext.java    |   2 +-
 .../spring/remoting/CamelServiceExporter.java      |   4 +-
 .../org/apache/camel/CamelContextLifecycle.java    |   2 +
 .../main/java/org/apache/camel/ServiceStatus.java  |  12 +-
 .../java/org/apache/camel/spi/EventFactory.java    |  16 ++
 .../org/apache/camel/spi/LifecycleStrategy.java    |  10 +
 .../apache/camel/support/service/BaseService.java  |  41 +--
 .../camel/support/service/ServiceHelper.java       |  14 ++
 .../AbstractLocationPropertiesSource.java          |  10 -
 .../component/properties/PropertiesComponent.java  |  56 +++--
 .../impl/converter/BaseTypeConverterRegistry.java  |   2 +-
 .../impl/converter/CoreTypeConverterRegistry.java  |   3 -
 .../camel/impl/converter/DefaultTypeConverter.java |   9 +-
 .../TypeConvertersPackageScanClassResolver.java    |   9 -
 .../camel/impl/engine/AbstractCamelContext.java    | 280 +++++++++++++--------
 .../impl/engine/BaseExecutorServiceManager.java    |   8 +-
 .../engine/DefaultAsyncProcessorAwaitManager.java  |   5 -
 .../impl/engine/DefaultBeanIntrospection.java      |   2 +-
 .../camel/impl/engine/DefaultConsumerCache.java    |  18 +-
 .../camel/impl/engine/DefaultConsumerTemplate.java |  12 +-
 .../impl/engine/DefaultFluentProducerTemplate.java |  41 +--
 .../impl/engine/DefaultInflightRepository.java     |   4 -
 .../impl/engine/DefaultManagementStrategy.java     |  48 ++--
 .../impl/engine/DefaultMessageHistoryFactory.java  |   9 -
 .../engine/DefaultPackageScanClassResolver.java    |   5 -
 .../engine/DefaultPackageScanResourceResolver.java |   2 +-
 .../camel/impl/engine/DefaultProducerCache.java    |  20 +-
 .../camel/impl/engine/DefaultProducerTemplate.java |  47 ++--
 .../camel/impl/engine/DefaultReactiveExecutor.java |   5 -
 .../org/apache/camel/impl/engine/DefaultRoute.java |   2 -
 .../camel/impl/engine/DefaultRouteController.java  |  14 --
 .../engine/DefaultRuntimeEndpointRegistry.java     |   7 +-
 .../impl/event/CamelContextInitializedEvent.java   |  33 +++
 .../impl/event/CamelContextInitializingEvent.java  |  33 +++
 .../camel/impl/event/DefaultEventFactory.java      |  10 +
 .../camel/processor/RemovePropertiesProcessor.java |   9 -
 .../processor/interceptor/DefaultDebugger.java     |  10 +-
 .../loadbalancer/LoadBalancerSupport.java          |   5 +
 .../camel/builder/AdviceWithRouteBuilder.java      |   1 +
 .../org/apache/camel/builder/NotifyBuilder.java    |   3 +-
 .../camel/impl/lw/LightweightCamelContext.java     |   9 +-
 .../impl/lw/LightweightRuntimeCamelContext.java    |  10 +
 .../core/xml/AbstractCamelContextFactoryBean.java  |   2 -
 .../java/org/apache/camel/ContextTestSupport.java  |  25 +-
 .../camel/builder/BuilderWithScopesTest.java       |   2 +-
 .../camel/impl/MultipleLifecycleStrategyTest.java  |   6 +-
 .../issues/SentExchangeEventNotifierIssueTest.java |   1 -
 .../SentExchangeEventNotifierTwoIssueTest.java     |   1 -
 .../EventNotifierExchangeSentExampleTest.java      |   1 -
 .../ProducerTemplateDisableEventNotifierTest.java  |   1 -
 ...litterUseOriginalNotPropagateExceptionTest.java |   1 -
 .../EnricherAsyncUnhandledExceptionTest.java       |   1 -
 .../processor/enricher/EnricherSendEventTest.java  |   1 -
 .../DynamicRouterEventNotifierTest.java            |   1 -
 .../RecipientListEventNotifierTest.java            |   1 -
 .../routingslip/RoutingSlipEventNotifierTest.java  |   1 -
 .../org/apache/camel/main/BaseMainSupport.java     |   2 +-
 .../camel/management/DefaultManagementAgent.java   |  18 +-
 .../management/JmxManagementLifecycleStrategy.java |  94 +++----
 .../camel/management/JmxManagementStrategy.java    |  23 +-
 .../management/JmxManagementStrategyFactory.java   |   4 +-
 ...ationOnlyRegisterProcessorWithCustomIdTest.java |   1 -
 .../ManagedCamelContextPropertiesTest.java         |   1 -
 .../camel/management/ManagedCamelContextTest.java  |   3 +-
 .../camel/management/ManagedDynamicRouterTest.java |   1 -
 .../ManagedEndpointUtilizationStatisticsTest.java  |   1 -
 .../camel/management/ManagedEnricherTest.java      |   1 -
 .../management/ManagedNamePatternFixedTest.java    |   1 -
 .../ManagedNamePatternIncludeHostNameTest.java     |   2 +-
 .../camel/management/ManagedNamePatternTest.java   |   1 -
 .../management/ManagedNonManagedServiceTest.java   |   2 +-
 .../camel/management/ManagedPollEnricherTest.java  |   1 -
 ...gedProducerRecipientListRegisterAlwaysTest.java |   1 -
 ...edProducerRouteAddRemoveRegisterAlwaysTest.java |   3 +-
 .../camel/management/ManagedRecipientListTest.java |   1 -
 .../management/ManagedRouteAddRemoveTest.java      |   2 +-
 .../camel/management/ManagedRoutingSlipTest.java   |   1 -
 .../camel/management/ManagedSanitizeTest.java      |   1 -
 .../ManagedSendDynamicProcessorTest.java           |   1 -
 .../camel/management/ManagedStartupFailedTest.java |   3 +-
 .../management/ManagedStatisticsLevelOffTest.java  |   1 -
 .../ManagedStatisticsLevelRoutesOnlyTest.java      |   1 -
 .../camel/management/ManagedWireTapTest.java       |   1 -
 .../apache/camel/support/ChildServiceSupport.java  |  25 +-
 .../java/org/apache/camel/support/EventHelper.java | 200 ++-------------
 docs/components/modules/ROOT/pages/index.adoc      | 145 +++++++++++
 92 files changed, 815 insertions(+), 637 deletions(-)

diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java
index e9fcf46..8733ab0 100644
--- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java
+++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java
@@ -76,7 +76,7 @@ public class BlueprintCamelContext extends DefaultCamelContext implements Servic
         setLanguageResolver(new BlueprintLanguageResolver(bundleContext));
         setDataFormatResolver(new BlueprintDataFormatResolver(bundleContext));
         setApplicationContextClassLoader(new BundleDelegatingClassLoader(bundleContext.getBundle()));
-        init();
+        build();
     }
 
     @Override
@@ -110,7 +110,7 @@ public class BlueprintCamelContext extends DefaultCamelContext implements Servic
     }
 
     @Override
-    public void doInit() throws Exception {
+    public void doBuild() throws Exception {
         LOG.trace("init {}", this);
         // add service listener so we can be notified when blueprint container is done
         // and we would be ready to start CamelContext
@@ -119,7 +119,7 @@ public class BlueprintCamelContext extends DefaultCamelContext implements Servic
         // to support change events when it changes states
         registration = bundleContext.registerService(BlueprintListener.class, this, null);
         // call super
-        super.doInit();
+        super.doBuild();
     }
 
     public void destroy() throws Exception {
diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java
index f4c8173..3d71208 100644
--- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java
+++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java
@@ -283,7 +283,7 @@ public class CamelNamespaceHandler implements NamespaceHandler {
         ctx.setFactoryComponent(factory2);
         ctx.setFactoryMethod("getContext");
         ctx.addProperty("bundleStateService", createRef(context, ".camelBlueprint.bundleStateService"));
-        ctx.setInitMethod("init");
+        ctx.setInitMethod("build");
         ctx.setDestroyMethod("destroy");
 
         // Register factory beans
diff --git a/components/camel-cron/src/main/java/org/apache/camel/component/cron/CronComponent.java b/components/camel-cron/src/main/java/org/apache/camel/component/cron/CronComponent.java
index 0a112a4..c48356c 100644
--- a/components/camel-cron/src/main/java/org/apache/camel/component/cron/CronComponent.java
+++ b/components/camel-cron/src/main/java/org/apache/camel/component/cron/CronComponent.java
@@ -60,7 +60,7 @@ public class CronComponent extends DefaultComponent {
     }
 
     @Override
-    protected void doStart() throws Exception {
+    protected void doInit() throws Exception {
         initCamelCronService();
     }
 
diff --git a/components/camel-spring-javaconfig/src/main/java/org/apache/camel/spring/javaconfig/CamelConfiguration.java b/components/camel-spring-javaconfig/src/main/java/org/apache/camel/spring/javaconfig/CamelConfiguration.java
index adbfe6a..e98dbcc 100644
--- a/components/camel-spring-javaconfig/src/main/java/org/apache/camel/spring/javaconfig/CamelConfiguration.java
+++ b/components/camel-spring-javaconfig/src/main/java/org/apache/camel/spring/javaconfig/CamelConfiguration.java
@@ -161,7 +161,7 @@ public abstract class CamelConfiguration implements BeanFactoryAware, Applicatio
     public CamelContext camelContext() throws Exception {
         CamelContext camelContext = createCamelContext();
         setupCamelContext(camelContext);
-        camelContext.init();
+        camelContext.build();
         return camelContext;
     }
 
diff --git a/components/camel-spring-main/src/main/java/org/apache/camel/spring/Main.java b/components/camel-spring-main/src/main/java/org/apache/camel/spring/Main.java
index 92df8b0..940652a 100644
--- a/components/camel-spring-main/src/main/java/org/apache/camel/spring/Main.java
+++ b/components/camel-spring-main/src/main/java/org/apache/camel/spring/Main.java
@@ -30,7 +30,9 @@ import java.util.Set;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.main.MainCommandLineSupport;
+import org.apache.camel.VetoCamelContextStartException;
 import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.ObjectHelper;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 import org.springframework.context.support.AbstractApplicationContext;
@@ -177,10 +179,13 @@ public class Main extends MainCommandLineSupport {
             applicationContext.start();
 
             initCamelContext();
-        } finally {
+        } catch (Exception e) {
             // if we were veto started then mark as completed
-            if (getCamelContext() != null && getCamelContext().isVetoStarted()) {
+            VetoCamelContextStartException veto = ObjectHelper.getException(VetoCamelContextStartException.class, e);
+            if (veto != null) {
                 completed();
+            } else {
+                throw e;
             }
         }
     }
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
index 3429e9d..364fcb7 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
@@ -483,7 +483,7 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Spr
         if (context == null && create) {
             context = createContext();
             configure(context);
-            context.init();
+            context.build();
         }
         return context;
     }
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java b/components/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java
index c4e344a..100f857 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java
@@ -100,7 +100,7 @@ public class SpringCamelContext extends DefaultCamelContext implements Lifecycle
         }
         SpringCamelContext answer = new SpringCamelContext();
         answer.setApplicationContext(applicationContext);
-        answer.init();
+        answer.build();
         if (maybeStart) {
             answer.start();
         }
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/remoting/CamelServiceExporter.java b/components/camel-spring/src/main/java/org/apache/camel/spring/remoting/CamelServiceExporter.java
index ceed311..a7d3f85 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/remoting/CamelServiceExporter.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/remoting/CamelServiceExporter.java
@@ -114,12 +114,12 @@ public class CamelServiceExporter extends RemoteExporter implements Initializing
 
         try {
             // need to start endpoint before we create consumer
-            ServiceHelper.startService(endpoint);
+            ServiceHelper.initService(endpoint);
             BeanProcessor processor = new BeanProcessor(proxy, camelContext);
             processor.setMethod(method);
             consumer = endpoint.createConsumer(processor);
             // add and start consumer
-            camelContext.addService(consumer, true, true);
+            camelContext.addService(consumer, true, false);
         } catch (Exception e) {
             throw new FailedToCreateConsumerException(endpoint, e);
         }
diff --git a/core/camel-api/src/main/java/org/apache/camel/CamelContextLifecycle.java b/core/camel-api/src/main/java/org/apache/camel/CamelContextLifecycle.java
index 7c4b327..152290b 100644
--- a/core/camel-api/src/main/java/org/apache/camel/CamelContextLifecycle.java
+++ b/core/camel-api/src/main/java/org/apache/camel/CamelContextLifecycle.java
@@ -90,6 +90,8 @@ public interface CamelContextLifecycle extends AutoCloseable {
      */
     boolean isRunAllowed();
 
+    void build();
+
     void init();
 
     /**
diff --git a/core/camel-api/src/main/java/org/apache/camel/ServiceStatus.java b/core/camel-api/src/main/java/org/apache/camel/ServiceStatus.java
index 312a42c..6f4d941 100644
--- a/core/camel-api/src/main/java/org/apache/camel/ServiceStatus.java
+++ b/core/camel-api/src/main/java/org/apache/camel/ServiceStatus.java
@@ -22,10 +22,10 @@ import java.io.Serializable;
  * Represents the status of a {@link Service} instance
  */
 public enum ServiceStatus implements Serializable {
-    Starting, Started, Stopping, Stopped, Suspending, Suspended;
+    Initializing, Initialized, Starting, Started, Stopping, Stopped, Suspending, Suspended;
 
     public boolean isStartable() {
-        return this == Stopped || this == Suspended;
+        return this == Initialized || this == Stopped || this == Suspended;
     }
 
     public boolean isStoppable() {
@@ -36,6 +36,14 @@ public enum ServiceStatus implements Serializable {
         return this == Started;
     }
 
+    public boolean isInitializing() {
+        return this == Initializing;
+    }
+
+    public boolean isInitialized() {
+        return this == Initialized;
+    }
+
     public boolean isStarting() {
         return this == Starting;
     }
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java b/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java
index 41754e7..b9de47f 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java
@@ -30,6 +30,22 @@ import org.apache.camel.Route;
 public interface EventFactory {
 
     /**
+     * Creates an {@link CamelEvent} for Camel is initializing.
+     *
+     * @param context camel context
+     * @return the created event
+     */
+    CamelEvent createCamelContextInitializingEvent(CamelContext context);
+
+    /**
+     * Creates an {@link CamelEvent} for Camel has been initialized successfully.
+     *
+     * @param context camel context
+     * @return the created event
+     */
+    CamelEvent createCamelContextInitializedEvent(CamelContext context);
+
+    /**
      * Creates an {@link CamelEvent} for Camel is starting.
      *
      * @param context camel context
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/LifecycleStrategy.java b/core/camel-api/src/main/java/org/apache/camel/spi/LifecycleStrategy.java
index 20ddeaa..cf74794 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/LifecycleStrategy.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/LifecycleStrategy.java
@@ -34,6 +34,16 @@ import org.apache.camel.VetoCamelContextStartException;
 public interface LifecycleStrategy {
 
     /**
+     * Notification on initializing a {@link CamelContext}.
+     *
+     * @param context the camel context
+     * @throws VetoCamelContextStartException can be thrown to veto starting {@link CamelContext}.
+     *                                        Any other runtime exceptions will be logged at <tt>WARN</tt> level by Camel will continue starting itself.
+     */
+    default void onContextInitialized(CamelContext context) throws VetoCamelContextStartException {
+    }
+
+    /**
      * Notification on starting a {@link CamelContext}.
      *
      * @param context the camel context
diff --git a/core/camel-api/src/main/java/org/apache/camel/support/service/BaseService.java b/core/camel-api/src/main/java/org/apache/camel/support/service/BaseService.java
index d408b10..054235b 100644
--- a/core/camel-api/src/main/java/org/apache/camel/support/service/BaseService.java
+++ b/core/camel-api/src/main/java/org/apache/camel/support/service/BaseService.java
@@ -37,16 +37,17 @@ public abstract class BaseService {
 
     protected static final byte NEW = 0;
     protected static final byte BUILDED = 1;
-    protected static final byte INITIALIZED = 2;
-    protected static final byte STARTING = 3;
-    protected static final byte STARTED = 4;
-    protected static final byte SUSPENDING = 5;
-    protected static final byte SUSPENDED = 6;
-    protected static final byte STOPPING = 7;
-    protected static final byte STOPPED = 8;
-    protected static final byte SHUTTINGDOWN = 9;
-    protected static final byte SHUTDOWN = 10;
-    protected static final byte FAILED = 11;
+    protected static final byte INITIALIZING = 2;
+    protected static final byte INITIALIZED = 3;
+    protected static final byte STARTING = 4;
+    protected static final byte STARTED = 5;
+    protected static final byte SUSPENDING = 6;
+    protected static final byte SUSPENDED = 7;
+    protected static final byte STOPPING = 8;
+    protected static final byte STOPPED = 9;
+    protected static final byte SHUTTINGDOWN = 10;
+    protected static final byte SHUTDOWN = 11;
+    protected static final byte FAILED = 12;
 
     private static final Logger LOG = LoggerFactory.getLogger(BaseService.class);
 
@@ -75,15 +76,17 @@ public abstract class BaseService {
         if (status <= BUILDED || status >= STOPPED) {
             synchronized (lock) {
                 if (status <= BUILDED || status >= STOPPED) {
+                    build();
                     LOG.trace("Initializing service: {}", this);
                     try (AutoCloseable ignored = doLifecycleChange()) {
+                        status = INITIALIZING;
                         doInit();
+                        status = INITIALIZED;
+                        LOG.trace("Initialized service: {}", this);
                     } catch (Exception e) {
                         LOG.trace("Error while initializing service: " + this, e);
                         fail(e);
                     }
-                    status = INITIALIZED;
-                    LOG.trace("Initialized service: {}", this);
                 }
             }
         }
@@ -245,6 +248,10 @@ public abstract class BaseService {
 
     public ServiceStatus getStatus() {
         switch (status) {
+            case INITIALIZING:
+                return ServiceStatus.Initializing;
+            case INITIALIZED:
+                return ServiceStatus.Initialized;
             case STARTING:
                 return ServiceStatus.Starting;
             case STARTED:
@@ -338,6 +345,7 @@ public abstract class BaseService {
      * This method will only be called by frameworks which supports pre-building projects such as camel-quarkus.
      */
     protected void doBuild() throws Exception {
+        // noop
     }
 
     /**
@@ -345,6 +353,7 @@ public abstract class BaseService {
      * This method will only be called once before starting.
      */
     protected void doInit() throws Exception {
+        // noop
     }
 
     /**
@@ -354,7 +363,9 @@ public abstract class BaseService {
      *
      * @see #doStop()
      */
-    protected abstract void doStart() throws Exception;
+    protected void doStart() throws Exception {
+        // noop
+    }
 
     /**
      * Implementations override this method to support customized start/stop.
@@ -368,7 +379,9 @@ public abstract class BaseService {
      *
      * @see #doStart()
      */
-    protected abstract void doStop() throws Exception;
+    protected void doStop() throws Exception {
+        // noop
+    }
 
     /**
      * Implementations override this method to support customized suspend/resume.
diff --git a/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceHelper.java b/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceHelper.java
index 6ecfdc7..6ae854a 100644
--- a/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceHelper.java
+++ b/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceHelper.java
@@ -61,6 +61,20 @@ public final class ServiceHelper {
     }
 
     /**
+     * Initializes each element of the given {@code services} if {@code services} itself is
+     * not {@code null}, otherwise this method would return immediately.
+     *
+     * @see #initService(Object)
+     */
+    public static void initService(Object... services) {
+        if (services != null) {
+            for (Object o : services) {
+                initService(o);
+            }
+        }
+    }
+
+    /**
      * Starts the given {@code value} if it's a {@link Service} or a collection of it.
      * <p/>
      * Calling this method has no effect if {@code value} is {@code null}.
diff --git a/core/camel-base/src/main/java/org/apache/camel/component/properties/AbstractLocationPropertiesSource.java b/core/camel-base/src/main/java/org/apache/camel/component/properties/AbstractLocationPropertiesSource.java
index 1e08cb5..306ef8a 100644
--- a/core/camel-base/src/main/java/org/apache/camel/component/properties/AbstractLocationPropertiesSource.java
+++ b/core/camel-base/src/main/java/org/apache/camel/component/properties/AbstractLocationPropertiesSource.java
@@ -79,16 +79,6 @@ public abstract class AbstractLocationPropertiesSource extends ServiceSupport im
         }
     }
 
-    @Override
-    protected void doStart() throws Exception {
-        // noop
-    }
-
-    @Override
-    protected void doStop() throws Exception {
-        // noop
-    }
-
     /**
      * Strategy to prepare loaded properties before being used by Camel.
      * <p/>
diff --git a/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java b/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
index 138d223..36d66f8 100644
--- a/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
@@ -513,10 +513,15 @@ public class PropertiesComponent extends ServiceSupport implements org.apache.ca
         if (propertiesSource instanceof CamelContextAware) {
             ((CamelContextAware) propertiesSource).setCamelContext(getCamelContext());
         }
-        sources.add(propertiesSource);
-        if (!this.isNew()) {
-            // if we have already initialized or started then we should also init the source
-            ServiceHelper.initService(propertiesSource);
+        synchronized (lock) {
+            sources.add(propertiesSource);
+            if (!isNew()) {
+                // if we have already initialized or started then we should also init the source
+                ServiceHelper.initService(propertiesSource);
+            }
+            if (isStarted()) {
+                ServiceHelper.startService(propertiesSource);
+            }
         }
     }
 
@@ -528,6 +533,24 @@ public class PropertiesComponent extends ServiceSupport implements org.apache.ca
     protected void doInit() throws Exception {
         super.doInit();
 
+        ObjectHelper.notNull(camelContext, "CamelContext", this);
+
+        if (systemPropertiesMode != SYSTEM_PROPERTIES_MODE_NEVER
+                && systemPropertiesMode != SYSTEM_PROPERTIES_MODE_FALLBACK
+                && systemPropertiesMode != SYSTEM_PROPERTIES_MODE_OVERRIDE) {
+            throw new IllegalArgumentException("Option systemPropertiesMode has invalid value: " + systemPropertiesMode);
+        }
+        if (environmentVariableMode != ENVIRONMENT_VARIABLES_MODE_NEVER
+                && environmentVariableMode != ENVIRONMENT_VARIABLES_MODE_FALLBACK
+                && environmentVariableMode != ENVIRONMENT_VARIABLES_MODE_OVERRIDE) {
+            throw new IllegalArgumentException("Option environmentVariableMode has invalid value: " + environmentVariableMode);
+        }
+
+        // inject the component to the parser
+        if (propertiesParser instanceof DefaultPropertiesParser) {
+            ((DefaultPropertiesParser) propertiesParser).setPropertiesComponent(this);
+        }
+
         if (isAutoDiscoverPropertiesSources()) {
             // discover any 3rd party properties sources
             try {
@@ -553,35 +576,22 @@ public class PropertiesComponent extends ServiceSupport implements org.apache.ca
             }
         }
 
+        sources.sort(OrderedComparator.get());
         ServiceHelper.initService(sources);
     }
 
     @Override
     protected void doStart() throws Exception {
-        ObjectHelper.notNull(camelContext, "CamelContext", this);
-
-        sources.sort(OrderedComparator.get());
         ServiceHelper.startService(sources);
-
-        if (systemPropertiesMode != SYSTEM_PROPERTIES_MODE_NEVER
-                && systemPropertiesMode != SYSTEM_PROPERTIES_MODE_FALLBACK
-                && systemPropertiesMode != SYSTEM_PROPERTIES_MODE_OVERRIDE) {
-            throw new IllegalArgumentException("Option systemPropertiesMode has invalid value: " + systemPropertiesMode);
-        }
-        if (environmentVariableMode != ENVIRONMENT_VARIABLES_MODE_NEVER
-                && environmentVariableMode != ENVIRONMENT_VARIABLES_MODE_FALLBACK
-                && environmentVariableMode != ENVIRONMENT_VARIABLES_MODE_OVERRIDE) {
-            throw new IllegalArgumentException("Option environmentVariableMode has invalid value: " + environmentVariableMode);
-        }
-
-        // inject the component to the parser
-        if (propertiesParser instanceof DefaultPropertiesParser) {
-            ((DefaultPropertiesParser) propertiesParser).setPropertiesComponent(this);
-        }
     }
 
     @Override
     protected void doStop() throws Exception {
+        ServiceHelper.stopService(sources);
+    }
+
+    @Override
+    protected void doShutdown() throws Exception {
         ServiceHelper.stopAndShutdownServices(sources);
     }
 
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
index ee08b33..7b58856 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
@@ -272,7 +272,7 @@ public abstract class BaseTypeConverterRegistry extends CoreTypeConverterRegistr
     }
 
     @Override
-    protected void doInit() {
+    protected void doInit() throws Exception {
         if (injector == null && camelContext != null) {
             injector = camelContext.getInjector();
         }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java
index 5df13ca..b0456ce 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java
@@ -587,9 +587,6 @@ public class CoreTypeConverterRegistry extends ServiceSupport implements TypeCon
         this.typeConverterExists = typeConverterExists;
     }
 
-    protected void doStart() throws Exception {
-    }
-
     protected void doStop() throws Exception {
         // log utilization statistics when stopping, including mappings
         if (statistics.isStatisticsEnabled()) {
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
index bc8a6a2..e311563 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
@@ -57,15 +57,10 @@ public class DefaultTypeConverter extends BaseTypeConverterRegistry implements A
     }
 
     @Override
-    protected void doInit() {
-        super.doInit();
-    }
-
-    @Override
-    protected void doStart() throws Exception {
+    protected void doInit() throws Exception {
         StopWatch watch = new StopWatch();
 
-        super.doStart();
+        super.doInit();
 
         // core type converters is always loaded which does not use any classpath scanning and therefore is fast
         loadCoreAndFastTypeConverters();
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/TypeConvertersPackageScanClassResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/TypeConvertersPackageScanClassResolver.java
index 4898a7c..1aa3a12 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/TypeConvertersPackageScanClassResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/TypeConvertersPackageScanClassResolver.java
@@ -96,13 +96,4 @@ public class TypeConvertersPackageScanClassResolver extends ServiceSupport imple
         // noop
     }
 
-    @Override
-    protected void doStart() throws Exception {
-        // noop
-    }
-
-    @Override
-    protected void doStop() throws Exception {
-        // noop
-    }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 2980c01..e6cabb6 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -325,7 +325,7 @@ public abstract class AbstractCamelContext extends BaseService
         setRegistry(registry);
     }
 
-    public AbstractCamelContext(boolean init) {
+    public AbstractCamelContext(boolean build) {
         // create a provisional (temporary) endpoint registry at first since end
         // users may access endpoints before CamelContext is started
         // we will later transfer the endpoints to the actual
@@ -337,9 +337,9 @@ public abstract class AbstractCamelContext extends BaseService
 
         setDefaultExtension(HealthCheckRegistry.class, this::createHealthCheckRegistry);
 
-        if (init) {
+        if (build) {
             try {
-                init();
+                build();
             } catch (Exception e) {
                 throw new RuntimeException("Error initializing CamelContext", e);
             }
@@ -506,7 +506,7 @@ public abstract class AbstractCamelContext extends BaseService
     @Override
     public Component getComponent(String name, boolean autoCreateComponents, boolean autoStart) {
         // ensure CamelContext are initialized before we can get a component
-        init();
+        build();
 
         // Check if the named component is already being created, that would mean
         // that the initComponent has triggered a new getComponent
@@ -594,7 +594,7 @@ public abstract class AbstractCamelContext extends BaseService
                 component = getComponentResolver().resolveComponent(name, getCamelContextReference());
                 if (component != null) {
                     component.setCamelContext(getCamelContextReference());
-                    ServiceHelper.initService(component);
+                    component.build();
                     postInitComponent(name, component);
                 }
             } catch (Exception e) {
@@ -778,8 +778,8 @@ public abstract class AbstractCamelContext extends BaseService
     }
 
     protected Endpoint doGetEndpoint(String uri, boolean normalized, boolean prototype) {
-        // ensure CamelContext are initialized before we can get an endpoint
-        init();
+        // ensure CamelContext are initialized before we can get a component
+        build();
 
         StringHelper.notEmpty(uri, "uri");
 
@@ -827,6 +827,7 @@ public abstract class AbstractCamelContext extends BaseService
                 }
                 LOG.trace("Endpoint uri: {} is from component with name: {}", uri, scheme);
                 Component component = getComponent(scheme);
+                ServiceHelper.initService(component);
 
                 // Ask the component to resolve the endpoint.
                 if (component != null) {
@@ -1163,7 +1164,7 @@ public abstract class AbstractCamelContext extends BaseService
     @Override
     public void addRoutes(final RoutesBuilder builder) throws Exception {
         try (LifecycleHelper helper = new LifecycleHelper()) {
-            init();
+            build();
             LOG.debug("Adding routes from builder: {}", builder);
             builder.addRoutesToCamelContext(AbstractCamelContext.this);
         }
@@ -1446,12 +1447,13 @@ public abstract class AbstractCamelContext extends BaseService
                         } else {
                             route = setupRoute.get();
                         }
-                        strategy.onServiceAdd(this, service, route);
+                        strategy.onServiceAdd(getCamelContextReference(), service, route);
                     }
                 }
             }
 
             if (!forceStart) {
+                ServiceHelper.initService(service);
                 // now start the service (and defer starting if CamelContext is
                 // starting up itself)
                 deferStartService(object, stopOnShutdown);
@@ -1474,7 +1476,11 @@ public abstract class AbstractCamelContext extends BaseService
                         }
                     }
                 }
-                ServiceHelper.startService(service);
+                if (isStartingOrStarted()) {
+                    ServiceHelper.startService(service);
+                } else {
+                    ServiceHelper.initService(service);
+                }
             }
         }
     }
@@ -2414,24 +2420,19 @@ public abstract class AbstractCamelContext extends BaseService
     }
 
     @Override
-    public void doInit() throws Exception {
-        // Initialize LRUCacheFactory as eager as possible,
-        // to let it warm up concurrently while Camel is startup up
-        if (initialization != Initialization.Lazy) {
-            LRUCacheFactory.init();
-        }
+    public void init() {
+        super.init();
 
-        // Setup management first since end users may use it to add event
-        // notifiers using the management strategy before the CamelContext has been started
-        setupManagement(null);
-
-        // Call all registered trackers with this context
-        // Note, this may use a partially constructed object
-        CamelContextTracker.notifyContextCreated(this);
-
-        // Setup type converter eager as its highly in use and should not be lazy initialized
-        if (eagerCreateTypeConverter()) {
-            getOrCreateTypeConverter();
+        // was the initialization vetoed?
+        if (vetoed != null) {
+            if (vetoed.isRethrowException()) {
+                throw RuntimeCamelException.wrapRuntimeException(vetoed);
+            } else {
+                LOG.info("CamelContext ({}) vetoed to not initialize due to {}", getName(), vetoed.getMessage());
+                // swallow exception and change state of this camel context to stopped
+                fail(vetoed);
+                return;
+            }
         }
     }
 
@@ -2439,12 +2440,17 @@ public abstract class AbstractCamelContext extends BaseService
     public void start() {
         super.start();
 
+        //
+        // We need to perform the following actions after the {@link #start()} method
+        // is called, so that the state of the {@link CamelContext} is <code>Started<code>.
+        //
+
         // did the start veto?
         if (vetoed != null) {
             if (vetoed.isRethrowException()) {
                 throw RuntimeCamelException.wrapRuntimeException(vetoed);
             } else {
-                LOG.info("CamelContext ({}) vetoed to not start due {}", getName(), vetoed.getMessage());
+                LOG.info("CamelContext ({}) vetoed to not start due to {}", getName(), vetoed.getMessage());
                 // swallow exception and change state of this camel context to stopped
                 stop();
                 return;
@@ -2468,7 +2474,129 @@ public abstract class AbstractCamelContext extends BaseService
     }
 
     @Override
-    protected synchronized void doStart() throws Exception {
+    public void doBuild() throws Exception {
+        // Initialize LRUCacheFactory as eager as possible,
+        // to let it warm up concurrently while Camel is startup up
+        if (initialization != Initialization.Lazy) {
+            LRUCacheFactory.init();
+        }
+
+        // Setup management first since end users may use it to add event
+        // notifiers using the management strategy before the CamelContext has been started
+        setupManagement(null);
+
+        // Call all registered trackers with this context
+        // Note, this may use a partially constructed object
+        CamelContextTracker.notifyContextCreated(this);
+
+        // Setup type converter eager as its highly in use and should not be lazy initialized
+        if (eagerCreateTypeConverter()) {
+            getOrCreateTypeConverter();
+        }
+
+    }
+
+    @Override
+    public void doInit() throws Exception {
+        // Start the route controller
+        getRouteController();
+        ServiceHelper.initService(this.routeController);
+
+        // optimize - before starting routes lets check if event notifications is possible
+        eventNotificationApplicable = EventHelper.eventsApplicable(this);
+
+        // ensure additional type converters is loaded
+        if (loadTypeConverters && typeConverter instanceof AnnotationScanTypeConverters) {
+            ((AnnotationScanTypeConverters) typeConverter).scanTypeConverters();
+        }
+
+        // custom properties may use property placeholders so resolve those
+        // early on
+        if (globalOptions != null && !globalOptions.isEmpty()) {
+            for (Map.Entry<String, String> entry : globalOptions.entrySet()) {
+                String key = entry.getKey();
+                String value = entry.getValue();
+                if (value != null) {
+                    String replaced = resolvePropertyPlaceholders(value);
+                    if (!value.equals(replaced)) {
+                        if (LOG.isDebugEnabled()) {
+                            LOG.debug("Camel property with key {} replaced value from {} -> {}", key, value, replaced);
+                        }
+                        entry.setValue(replaced);
+                    }
+                }
+            }
+        }
+
+        forceLazyInitialization();
+
+        addService(getManagementStrategy(), false);
+        ServiceHelper.initService(lifecycleStrategies);
+        for (LifecycleStrategy strategy : lifecycleStrategies) {
+            try {
+                strategy.onContextInitialized(this);
+            } catch (VetoCamelContextStartException e) {
+                // okay we should not start Camel since it was vetoed
+                LOG.warn("Lifecycle strategy " + strategy + " vetoed initializing CamelContext ({}) due to: {}", getName(), e.getMessage());
+                throw e;
+            } catch (Exception e) {
+                LOG.warn("Lifecycle strategy " + strategy + " failed initializing CamelContext ({}) due to: {}", getName(), e.getMessage());
+                throw e;
+            }
+        }
+
+        // optimize - before starting routes lets check if event notifications is possible
+        eventNotificationApplicable = EventHelper.eventsApplicable(this);
+
+        // start notifiers as services
+        for (EventNotifier notifier : getManagementStrategy().getEventNotifiers()) {
+            if (notifier instanceof Service) {
+                Service service = (Service) notifier;
+                for (LifecycleStrategy strategy : lifecycleStrategies) {
+                    strategy.onServiceAdd(getCamelContextReference(), service, null);
+                }
+            }
+            ServiceHelper.initService(notifier);
+        }
+
+        EventHelper.notifyCamelContextInitializing(this);
+
+        // re-create endpoint registry as the cache size limit may be set after the constructor of this instance was called.
+        // and we needed to create endpoints up-front as it may be accessed before this context is started
+        endpoints = doAddService(createEndpointRegistry(endpoints));
+
+        // optimised to not include runtimeEndpointRegistry unless startServices
+        // is enabled or JMX statistics is in extended mode
+        if (runtimeEndpointRegistry == null && getManagementStrategy() != null && getManagementStrategy().getManagementAgent() != null) {
+            Boolean isEnabled = getManagementStrategy().getManagementAgent().getEndpointRuntimeStatisticsEnabled();
+            boolean isExtended = getManagementStrategy().getManagementAgent().getStatisticsLevel().isExtended();
+            // extended mode is either if we use Extended statistics level or
+            // the option is explicit enabled
+            boolean extended = isExtended || isEnabled != null && isEnabled;
+            if (extended) {
+                runtimeEndpointRegistry = new DefaultRuntimeEndpointRegistry();
+            }
+        }
+        if (runtimeEndpointRegistry != null) {
+            if (runtimeEndpointRegistry instanceof EventNotifier && getManagementStrategy() != null) {
+                getManagementStrategy().addEventNotifier((EventNotifier)runtimeEndpointRegistry);
+            }
+            addService(runtimeEndpointRegistry, true, true);
+        }
+
+        bindDataFormats();
+
+        // start components
+        ServiceHelper.initService(components.values());
+
+        // start the route definitions before the routes is started
+        startRouteDefinitions();
+
+        EventHelper.notifyCamelContextInitialized(this);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
         try {
             doStartContext();
         } catch (Exception e) {
@@ -2480,20 +2608,16 @@ public abstract class AbstractCamelContext extends BaseService
     }
 
     protected void doStartContext() throws Exception {
-        startDate = new Date();
-
+        LOG.info("Apache Camel {} (CamelContext: {}) is starting", getVersion(), getName());
         vetoed = null;
+        startDate = new Date();
         stopWatch.restart();
-        LOG.info("Apache Camel {} (CamelContext: {}) is starting", getVersion(), getName());
 
         // Start the route controller
         ServiceHelper.startService(this.routeController);
 
         doNotStartRoutesOnFirstStart = !firstStartDone && !isAutoStartup();
 
-        // optimize - before starting routes lets check if event notifications is possible
-        eventNotificationApplicable = EventHelper.eventsApplicable(this);
-
         // if the context was configured with auto startup = false, and we
         // are already started,
         // then we may need to start the routes on the 2nd start call
@@ -2546,38 +2670,13 @@ public abstract class AbstractCamelContext extends BaseService
     }
 
     protected void doStartCamel() throws Exception {
-        // ensure additional type converters is loaded
-        if (loadTypeConverters && typeConverter instanceof AnnotationScanTypeConverters) {
-            ((AnnotationScanTypeConverters) typeConverter).scanTypeConverters();
-        }
-
-        // custom properties may use property placeholders so resolve those
-        // early on
-        if (globalOptions != null && !globalOptions.isEmpty()) {
-            for (Map.Entry<String, String> entry : globalOptions.entrySet()) {
-                String key = entry.getKey();
-                String value = entry.getValue();
-                if (value != null) {
-                    String replaced = resolvePropertyPlaceholders(value);
-                    if (!value.equals(replaced)) {
-                        if (LOG.isDebugEnabled()) {
-                            LOG.debug("Camel property with key {} replaced value from {} -> {}", key, value, replaced);
-                        }
-                        entry.setValue(replaced);
-                    }
-                }
-            }
-        }
-
         if (LOG.isDebugEnabled()) {
             LOG.debug("Using ClassResolver={}, PackageScanClassResolver={}, ApplicationContextClassLoader={}, RouteController={}", getClassResolver(),
                       getPackageScanClassResolver(), getApplicationContextClassLoader(), getRouteController());
         }
-
         if (isStreamCaching()) {
             LOG.info("StreamCaching is enabled on CamelContext: {}", getName());
         }
-
         if (isBacklogTracing()) {
             // tracing is added in the DefaultChannel so we can enable it on the fly
             LOG.info("Backlog Tracing is enabled on CamelContext: {}", getName());
@@ -2586,7 +2685,6 @@ public abstract class AbstractCamelContext extends BaseService
             // tracing is added in the DefaultChannel so we can enable it on the fly
             LOG.info("Tracing is enabled on CamelContext: {}", getName());
         }
-
         if (isUseMDCLogging()) {
             // log if MDC has been enabled
             String pattern = getMDCLoggingKeysPattern();
@@ -2596,7 +2694,6 @@ public abstract class AbstractCamelContext extends BaseService
                 LOG.info("MDC logging is enabled on CamelContext: {}", getName());
             }
         }
-
         if (getDelayer() != null && getDelayer() > 0) {
             LOG.info("Delayer is enabled with: {} ms. on CamelContext: {}", getDelayer(), getName());
         }
@@ -2607,17 +2704,15 @@ public abstract class AbstractCamelContext extends BaseService
 
         // start lifecycle strategies
         ServiceHelper.startService(lifecycleStrategies);
-        Iterator<LifecycleStrategy> it = lifecycleStrategies.iterator();
-        while (it.hasNext()) {
-            LifecycleStrategy strategy = it.next();
+        for (LifecycleStrategy strategy : lifecycleStrategies) {
             try {
                 strategy.onContextStart(this);
             } catch (VetoCamelContextStartException e) {
                 // okay we should not start Camel since it was vetoed
-                LOG.warn("Lifecycle strategy vetoed starting CamelContext ({}) due: {}", getName(), e.getMessage());
+                LOG.warn("Lifecycle strategy " + strategy + " vetoed starting CamelContext ({}) due to: {}", getName(), e.getMessage());
                 throw e;
             } catch (Exception e) {
-                LOG.warn("Lifecycle strategy " + strategy + " failed starting CamelContext ({}) due: {}", getName(), e.getMessage());
+                LOG.warn("Lifecycle strategy " + strategy + " failed starting CamelContext ({}) due to: {}", getName(), e.getMessage());
                 throw e;
             }
         }
@@ -2625,51 +2720,16 @@ public abstract class AbstractCamelContext extends BaseService
         // start notifiers as services
         for (EventNotifier notifier : getManagementStrategy().getEventNotifiers()) {
             if (notifier instanceof Service) {
-                Service service = (Service)notifier;
-                for (LifecycleStrategy strategy : lifecycleStrategies) {
-                    strategy.onServiceAdd(this, service, null);
-                }
                 startService((Service)notifier);
             }
         }
 
-        // must let some bootstrap service be started before we can notify the
-        // starting event
+        // must let some bootstrap service be started before we can notify the starting event
         EventHelper.notifyCamelContextStarting(this);
 
-        forceLazyInitialization();
-
-        // re-create endpoint registry as the cache size limit may be set after the constructor of this instance was called.
-        // and we needed to create endpoints up-front as it may be accessed before this context is started
-        endpoints = doAddService(createEndpointRegistry(endpoints));
-
-        // optimised to not include runtimeEndpointRegistry unless startServices
-        // its enabled or JMX statistics is in extended mode
-        if (runtimeEndpointRegistry == null && getManagementStrategy() != null && getManagementStrategy().getManagementAgent() != null) {
-            Boolean isEnabled = getManagementStrategy().getManagementAgent().getEndpointRuntimeStatisticsEnabled();
-            boolean isExtended = getManagementStrategy().getManagementAgent().getStatisticsLevel().isExtended();
-            // extended mode is either if we use Extended statistics level or
-            // the option is explicit enabled
-            boolean extended = isExtended || isEnabled != null && isEnabled;
-            if (extended) {
-                runtimeEndpointRegistry = new DefaultRuntimeEndpointRegistry();
-            }
-        }
-        if (runtimeEndpointRegistry != null) {
-            if (runtimeEndpointRegistry instanceof EventNotifier && getManagementStrategy() != null) {
-                getManagementStrategy().addEventNotifier((EventNotifier)runtimeEndpointRegistry);
-            }
-            addService(runtimeEndpointRegistry, true, true);
-        }
-
-        bindDataFormats();
-
         // start components
         startServices(components.values());
 
-        // start the route definitions before the routes is started
-        startRouteDefinitions();
-
         if (isUseDataType()) {
             // log if DataType has been enabled
             LOG.info("Message DataType is enabled on CamelContext: {}", getName());
@@ -2731,7 +2791,7 @@ public abstract class AbstractCamelContext extends BaseService
     }
 
     @Override
-    protected synchronized void doStop() throws Exception {
+    protected void doStop() throws Exception {
         stopWatch.restart();
         LOG.info("Apache Camel {} (CamelContext: {}) is shutting down", getVersion(), getName());
         EventHelper.notifyCamelContextStopping(this);
@@ -2828,8 +2888,10 @@ public abstract class AbstractCamelContext extends BaseService
         EventHelper.notifyCamelContextStopped(this);
 
         // stop the notifier service
-        for (EventNotifier notifier : getManagementStrategy().getEventNotifiers()) {
-            shutdownServices(notifier);
+        if (getManagementStrategy() != null) {
+            for (EventNotifier notifier : getManagementStrategy().getEventNotifiers()) {
+                shutdownServices(notifier);
+            }
         }
 
         // shutdown executor service, reactive executor and management as the last one
@@ -3681,7 +3743,7 @@ public abstract class AbstractCamelContext extends BaseService
     public void disableJMX() {
         if (isNew()) {
             disableJMX = true;
-        } else if (isInit()) {
+        } else if (isInit() || isBuild()) {
             disableJMX = true;
             // we are still in initializing mode, so we can disable JMX, by
             // setting up management again
@@ -4038,7 +4100,7 @@ public abstract class AbstractCamelContext extends BaseService
         if (isStartingOrStarted()) {
             throw new IllegalStateException("Can not set debugger on a started CamelContext");
         }
-        this.debugger = doAddService(debugger);
+        this.debugger = doAddService(debugger, true, false, true);
         // enable debugging if we set a custom debugger
         setDebugging(true);
     }
@@ -4057,7 +4119,7 @@ public abstract class AbstractCamelContext extends BaseService
 
     @Override
     public void setTracer(Tracer tracer) {
-        this.tracer = tracer;
+        this.tracer = doAddService(tracer, true, false, true);
         // enable tracing if we set a custom tracer
         setTracing(true);
     }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java
index 3428d2d..261e8e5 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java
@@ -421,7 +421,8 @@ public class BaseExecutorServiceManager extends ServiceSupport implements Execut
     }
 
     @Override
-    protected void doStart() throws Exception {
+    protected void doInit() throws Exception {
+        super.doInit();
         if (threadNamePattern == null) {
             // set default name pattern which includes the camel context name
             threadNamePattern = "Camel (" + camelContext.getName() + ") thread ##counter# - #name#";
@@ -429,11 +430,6 @@ public class BaseExecutorServiceManager extends ServiceSupport implements Execut
     }
 
     @Override
-    protected void doStop() throws Exception {
-        // noop
-    }
-
-    @Override
     protected void doShutdown() throws Exception {
         // shutdown all remainder executor services by looping and doing this aggressively
         // as by normal all threads pool should have been shutdown using proper lifecycle
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java
index f3c2ad9..21dd10c 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java
@@ -220,11 +220,6 @@ public class DefaultAsyncProcessorAwaitManager extends ServiceSupport implements
     }
 
     @Override
-    protected void doStart() throws Exception {
-        // noop
-    }
-
-    @Override
     protected void doStop() throws Exception {
         Collection<AwaitThread> threads = browse();
         int count = threads.size();
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultBeanIntrospection.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultBeanIntrospection.java
index 69c01b5..3db2234 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultBeanIntrospection.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultBeanIntrospection.java
@@ -221,7 +221,7 @@ public class DefaultBeanIntrospection extends ServiceSupport implements BeanIntr
     }
 
     @Override
-    protected void doStart() throws Exception {
+    protected void doInit() throws Exception {
         if (camelContext != null) {
             camelContext.addStartupListener(this);
         }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerCache.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerCache.java
index e77656f..cc90b9b 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerCache.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerCache.java
@@ -228,21 +228,29 @@ public class DefaultConsumerCache extends ServiceSupport implements ConsumerCach
     }
 
     @Override
-    protected void doStart() throws Exception {
+    protected void doInit() throws Exception {
         if (extendedStatistics) {
             int max = maxCacheSize == 0 ? CamelContextHelper.getMaximumCachePoolSize(camelContext) : maxCacheSize;
             statistics = new DefaultEndpointUtilizationStatistics(max);
         }
-        ServiceHelper.startService(consumers);
+        ServiceHelper.initService(consumers);
     }
 
     @Override
-    protected void doStop() throws Exception {
-        // when stopping we intend to shutdown
-        ServiceHelper.stopAndShutdownServices(statistics, consumers);
+    protected void doStart() throws Exception {
         if (statistics != null) {
             statistics.clear();
         }
+        ServiceHelper.startService(consumers);
     }
 
+    @Override
+    protected void doStop() throws Exception {
+        ServiceHelper.stopService(consumers);
+    }
+
+    @Override
+    protected void doShutdown() throws Exception {
+        ServiceHelper.stopAndShutdownServices(consumers);
+    }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerTemplate.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerTemplate.java
index cabf240..96cd50b 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerTemplate.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerTemplate.java
@@ -272,15 +272,25 @@ public class DefaultConsumerTemplate extends ServiceSupport implements ConsumerT
     }
 
     @Override
-    protected void doStart() throws Exception {
+    protected void doInit() throws Exception {
         if (consumerCache == null) {
             consumerCache = new DefaultConsumerCache(this, camelContext, maximumCacheSize);
         }
+        ServiceHelper.initService(consumerCache);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
         ServiceHelper.startService(consumerCache);
     }
 
     @Override
     protected void doStop() throws Exception {
+        ServiceHelper.stopService(consumerCache);
+    }
+
+    @Override
+    protected void doShutdown() throws Exception {
         // we should shutdown the services as this is our intention, to not re-use the services anymore
         ServiceHelper.stopAndShutdownService(consumerCache);
         consumerCache = null;
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java
index 74dda14..312593a 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java
@@ -337,23 +337,12 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu
      * @param context the camel context
      */
     public static FluentProducerTemplate on(CamelContext context) {
-        return new DefaultFluentProducerTemplate(context);
+        DefaultFluentProducerTemplate fluent = new DefaultFluentProducerTemplate(context);
+        fluent.start();
+        return fluent;
     }
 
     private ProducerTemplate template() {
-        ObjectHelper.notNull(context, "CamelContext");
-
-        if (template == null) {
-            template = context.createProducerTemplate(maximumCacheSize);
-            if (defaultEndpoint != null) {
-                template.setDefaultEndpoint(defaultEndpoint);
-            }
-            template.setEventNotifierEnabled(eventNotifierEnabled);
-            if (templateCustomizer.get() != null) {
-                templateCustomizer.get().accept(template);
-            }
-        }
-
         return template;
     }
 
@@ -390,10 +379,21 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu
     }
 
     @Override
-    protected void doStart() throws Exception {
-        if (template == null) {
-            template = template();
+    protected void doInit() throws Exception {
+        ObjectHelper.notNull(context, "CamelContext");
+        template = context.createProducerTemplate(maximumCacheSize);
+        if (defaultEndpoint != null) {
+            template.setDefaultEndpoint(defaultEndpoint);
+        }
+        template.setEventNotifierEnabled(eventNotifierEnabled);
+        if (templateCustomizer.get() != null) {
+            templateCustomizer.get().accept(template);
         }
+        ServiceHelper.initService(template);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
         ServiceHelper.startService(template);
     }
 
@@ -404,7 +404,12 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu
         this.exchangeSupplier.remove();
         this.processorSupplier.remove();
         this.templateCustomizer.remove();
-
         ServiceHelper.stopService(template);
     }
+
+    @Override
+    protected void doShutdown() throws Exception {
+        ServiceHelper.stopAndShutdownService(template);
+        template = null;
+    }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInflightRepository.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInflightRepository.java
index 79adbe9..3634ec8 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInflightRepository.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInflightRepository.java
@@ -198,10 +198,6 @@ public class DefaultInflightRepository extends ServiceSupport implements Infligh
     }
 
     @Override
-    protected void doStart() throws Exception {
-    }
-
-    @Override
     protected void doStop() throws Exception {
         int count = size();
         if (count > 0) {
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java
index 43fca10..dad1658 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java
@@ -103,9 +103,6 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
 
     @Override
     public ManagementObjectNameStrategy getManagementObjectNameStrategy() {
-        if (managementObjectNameStrategy == null) {
-            managementObjectNameStrategy = createManagementObjectNameStrategy(null);
-        }
         return managementObjectNameStrategy;
     }
 
@@ -116,9 +113,6 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
 
     @Override
     public ManagementObjectStrategy getManagementObjectStrategy() {
-        if (managementObjectStrategy == null) {
-            managementObjectStrategy = createManagementObjectStrategy();
-        }
         return managementObjectStrategy;
     }
 
@@ -186,47 +180,46 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
     }
 
     @Override
-    protected void doStart() throws Exception {
-        LOG.info("JMX is disabled");
+    protected void doInit() throws Exception {
+        LOG.info("JMX is enabled");
 
         ObjectHelper.notNull(getCamelContext(), "CamelContext", this);
         if (!getEventNotifiers().isEmpty()) {
             getCamelContext().adapt(ExtendedCamelContext.class).setEventNotificationApplicable(true);
         }
-
-        doStartManagementStrategy();
-    }
-
-    protected void doStartManagementStrategy() throws Exception {
-        ObjectHelper.notNull(camelContext, "CamelContext");
-
         for (EventNotifier notifier : eventNotifiers) {
-
             // inject CamelContext if the service is aware
             if (notifier instanceof CamelContextAware) {
                 CamelContextAware aware = (CamelContextAware) notifier;
                 aware.setCamelContext(camelContext);
             }
+        }
+        ServiceHelper.initService(eventNotifiers, managementAgent);
 
-            ServiceHelper.startService(notifier);
+        if (managementObjectStrategy == null) {
+            managementObjectStrategy = createManagementObjectStrategy();
+        }
+        if (managementObjectStrategy instanceof CamelContextAware) {
+            ((CamelContextAware) managementObjectStrategy).setCamelContext(getCamelContext());
         }
 
-        if (managementAgent != null) {
-            ServiceHelper.startService(managementAgent);
-            // set the naming strategy using the domain name from the agent
-            if (managementObjectNameStrategy == null) {
-                String domain = managementAgent.getMBeanObjectDomainName();
-                managementObjectNameStrategy = createManagementObjectNameStrategy(domain);
-            }
+        if (managementObjectNameStrategy == null) {
+            managementObjectNameStrategy = createManagementObjectNameStrategy();
         }
         if (managementObjectNameStrategy instanceof CamelContextAware) {
             ((CamelContextAware) managementObjectNameStrategy).setCamelContext(getCamelContext());
         }
+        ServiceHelper.initService(managementObjectStrategy, managementObjectNameStrategy);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        ServiceHelper.startService(eventNotifiers, managementAgent, managementObjectStrategy, managementObjectNameStrategy);
     }
 
     @Override
     protected void doStop() throws Exception {
-        ServiceHelper.stopService(managementAgent, eventNotifiers);
+        ServiceHelper.stopService(managementObjectNameStrategy, managementObjectStrategy, managementAgent, eventNotifiers);
     }
 
     protected ManagementObjectNameStrategy createManagementObjectNameStrategy(String domain) {
@@ -237,4 +230,9 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
         return null;
     }
 
+    protected ManagementObjectNameStrategy createManagementObjectNameStrategy() {
+        String domain = managementAgent != null ? managementAgent.getMBeanObjectDomainName() : null;
+        return createManagementObjectNameStrategy(domain);
+    }
+
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultMessageHistoryFactory.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultMessageHistoryFactory.java
index eac990f..b9adef5 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultMessageHistoryFactory.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultMessageHistoryFactory.java
@@ -98,13 +98,4 @@ public class DefaultMessageHistoryFactory extends ServiceSupport implements Mess
         }
     }
 
-    @Override
-    protected void doStart() throws Exception {
-        // noop
-    }
-
-    @Override
-    protected void doStop() throws Exception {
-        // noop
-    }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanClassResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanClassResolver.java
index bbd7c92..6df8d5e 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanClassResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanClassResolver.java
@@ -450,11 +450,6 @@ public class DefaultPackageScanClassResolver extends BasePackageScanResolver imp
     }
 
     @Override
-    protected void doStart() throws Exception {
-        // noop
-    }
-
-    @Override
     protected void doStop() throws Exception {
         clearCache();
     }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanResourceResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanResourceResolver.java
index f814af6..7c7fef0 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanResourceResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanResourceResolver.java
@@ -300,7 +300,7 @@ public class DefaultPackageScanResourceResolver extends BasePackageScanResolver
     }
 
     @Override
-    protected void doStart() throws Exception {
+    protected void doInit() throws Exception {
         ObjectHelper.notNull(getCamelContext(), "CamelContext", this);
     }
 
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerCache.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerCache.java
index 1db1029..d8da3c0 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerCache.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerCache.java
@@ -355,22 +355,30 @@ public class DefaultProducerCache extends ServiceSupport implements ProducerCach
     }
 
     @Override
-    protected void doStart() throws Exception {
+    protected void doInit() throws Exception {
         if (extendedStatistics) {
             int max = maxCacheSize == 0 ? CamelContextHelper.getMaximumCachePoolSize(camelContext) : maxCacheSize;
             statistics = new DefaultEndpointUtilizationStatistics(max);
         }
-
-        ServiceHelper.startService(producers, statistics);
+        ServiceHelper.initService(producers);
     }
 
     @Override
-    protected void doStop() throws Exception {
-        // when stopping we intend to shutdown
-        ServiceHelper.stopAndShutdownServices(statistics, producers);
+    protected void doStart() throws Exception {
         if (statistics != null) {
             statistics.clear();
         }
+        ServiceHelper.startService(producers);
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        ServiceHelper.stopService(producers);
+    }
+
+    @Override
+    protected void doShutdown() throws Exception {
+        ServiceHelper.stopAndShutdownServices(producers);
     }
 
     @Override
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java
index d4bdd1e..02fcbc6 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java
@@ -777,51 +777,50 @@ public class DefaultProducerTemplate extends ServiceSupport implements ProducerT
         if (!isStarted()) {
             throw new IllegalStateException("ProducerTemplate has not been started");
         }
-
-        if (executor != null) {
-            return executor;
-        }
-
-        // create a default executor which must be synchronized
-        synchronized (this) {
-            if (executor != null) {
-                return executor;
-            }
-            if (!threadedAsyncMode) {
-                executor = new SynchronousExecutorService();
-            } else {
-                executor = camelContext.getExecutorServiceManager().newDefaultThreadPool(this, "ProducerTemplate");
+        if (executor == null) {
+            // create a default executor which must be synchronized
+            synchronized (lock) {
+                if (executor == null) {
+                    if (threadedAsyncMode) {
+                        executor = camelContext.getExecutorServiceManager().newDefaultThreadPool(this, "ProducerTemplate");
+                        ObjectHelper.notNull(executor, "ExecutorService");
+                    } else {
+                        executor = new SynchronousExecutorService();
+                    }
+                }
             }
         }
-
-        ObjectHelper.notNull(executor, "ExecutorService");
         return executor;
     }
 
     @Override
-    protected void doStart() throws Exception {
-        if (producerCache == null) {
-            producerCache = new DefaultProducerCache(this, camelContext, maximumCacheSize);
-            producerCache.setEventNotifierEnabled(isEventNotifierEnabled());
-        }
-
+    protected void doInit() throws Exception {
         // need to lookup default endpoint as it may have been intercepted
         if (defaultEndpoint != null) {
             defaultEndpoint = camelContext.getEndpoint(defaultEndpoint.getEndpointUri());
         }
+        producerCache = new DefaultProducerCache(this, camelContext, maximumCacheSize);
+        producerCache.setEventNotifierEnabled(isEventNotifierEnabled());
+        ServiceHelper.initService(producerCache);
+    }
 
+    @Override
+    protected void doStart() throws Exception {
         ServiceHelper.startService(producerCache);
     }
 
     @Override
     protected void doStop() throws Exception {
         ServiceHelper.stopService(producerCache);
-        producerCache = null;
-
         if (executor != null) {
             camelContext.getExecutorServiceManager().shutdownNow(executor);
             executor = null;
         }
     }
 
+    @Override
+    protected void doShutdown() throws Exception {
+        ServiceHelper.stopAndShutdownService(producerCache);
+        producerCache = null;
+    }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultReactiveExecutor.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultReactiveExecutor.java
index dbba46e..406e21f 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultReactiveExecutor.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultReactiveExecutor.java
@@ -86,11 +86,6 @@ public class DefaultReactiveExecutor extends ServiceSupport implements ReactiveE
     }
 
     @Override
-    protected void doStart() throws Exception {
-        // noop
-    }
-
-    @Override
     protected void doStop() throws Exception {
         if (LOG.isDebugEnabled()) {
             LOG.debug("Stopping DefaultReactiveExecutor [createdWorkers: {}, runningWorkers: {}, pendingTasks: {}]",
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
index d464456..b5a91ac 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
@@ -212,8 +212,6 @@ public class DefaultRoute extends ServiceSupport implements Route {
 
     @Override
     protected void doShutdown() throws Exception {
-        // and clear start date
-        startDate = null;
         // clear services when shutting down
         services.clear();
     }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRouteController.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRouteController.java
index 11d4eba..b0a3891 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRouteController.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRouteController.java
@@ -53,20 +53,6 @@ public class DefaultRouteController extends ServiceSupport implements RouteContr
     }
 
     // ***************************************************
-    // Life cycle
-    // ***************************************************
-
-    @Override
-    protected void doStart() throws Exception {
-        // noop
-    }
-
-    @Override
-    protected void doStop() throws Exception {
-        // noop
-    }
-
-    // ***************************************************
     // Route management
     // ***************************************************
 
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRuntimeEndpointRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRuntimeEndpointRegistry.java
index 956c4726..0a1b851 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRuntimeEndpointRegistry.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRuntimeEndpointRegistry.java
@@ -186,7 +186,7 @@ public class DefaultRuntimeEndpointRegistry extends EventNotifierSupport impleme
     }
 
     @Override
-    protected void doStart() throws Exception {
+    protected void doInit() throws Exception {
         ObjectHelper.notNull(camelContext, "camelContext", this);
 
         if (inputs == null) {
@@ -207,6 +207,11 @@ public class DefaultRuntimeEndpointRegistry extends EventNotifierSupport impleme
         } else {
             LOG.info("Runtime endpoint registry is in normal mode gathering information of all incoming and outgoing endpoints (cache limit: {})", limit);
         }
+        ServiceHelper.initService(inputUtilization, outputUtilization);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
         ServiceHelper.startService(inputUtilization, outputUtilization);
     }
 
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextInitializedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextInitializedEvent.java
new file mode 100644
index 0000000..a277459
--- /dev/null
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextInitializedEvent.java
@@ -0,0 +1,33 @@
+/*
+ * 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.impl.event;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.CamelEvent;
+
+public class CamelContextInitializedEvent extends AbstractContextEvent implements CamelEvent.CamelContextStartingEvent {
+    private static final long serialVersionUID = -3416082218670845373L;
+
+    public CamelContextInitializedEvent(CamelContext source) {
+        super(source);
+    }
+
+    @Override
+    public String toString() {
+        return "Initialized CamelContext: " + getContext().getName();
+    }
+}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextInitializingEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextInitializingEvent.java
new file mode 100644
index 0000000..9674817
--- /dev/null
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextInitializingEvent.java
@@ -0,0 +1,33 @@
+/*
+ * 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.impl.event;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.CamelEvent;
+
+public class CamelContextInitializingEvent extends AbstractContextEvent implements CamelEvent.CamelContextStartingEvent {
+    private static final long serialVersionUID = 3931186946570864733L;
+
+    public CamelContextInitializingEvent(CamelContext source) {
+        super(source);
+    }
+
+    @Override
+    public String toString() {
+        return "Initializing CamelContext: " + getContext().getName();
+    }
+}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java
index 7729788..3b2f22f 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java
@@ -31,6 +31,16 @@ import org.apache.camel.spi.EventFactory;
 public class DefaultEventFactory implements EventFactory {
 
     @Override
+    public CamelEvent createCamelContextInitializingEvent(CamelContext context) {
+        return new CamelContextInitializingEvent(context);
+    }
+
+    @Override
+    public CamelEvent createCamelContextInitializedEvent(CamelContext context) {
+        return new CamelContextInitializedEvent(context);
+    }
+
+    @Override
     public CamelEvent createCamelContextStartingEvent(CamelContext context) {
         return new CamelContextStartingEvent(context);
     }
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/RemovePropertiesProcessor.java b/core/camel-base/src/main/java/org/apache/camel/processor/RemovePropertiesProcessor.java
index 042571a..8dffb58 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/RemovePropertiesProcessor.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/RemovePropertiesProcessor.java
@@ -87,13 +87,4 @@ public class RemovePropertiesProcessor extends AsyncProcessorSupport implements
         return excludePattern;
     }
 
-    @Override
-    protected void doStart() throws Exception {
-        // noop
-    }
-
-    @Override
-    protected void doStop() throws Exception {
-        // noop
-    }
 }
\ No newline at end of file
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/DefaultDebugger.java b/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/DefaultDebugger.java
index 319dc8e..4fb6cf2 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/DefaultDebugger.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/DefaultDebugger.java
@@ -331,7 +331,7 @@ public class DefaultDebugger extends ServiceSupport implements Debugger, CamelCo
     }
 
     @Override
-    protected void doStart() throws Exception {
+    protected void doInit() throws Exception {
         ObjectHelper.notNull(camelContext, "CamelContext", this);
 
         // must have message history enabled when using this debugger
@@ -340,8 +340,14 @@ public class DefaultDebugger extends ServiceSupport implements Debugger, CamelCo
         }
 
         // register our event notifier
-        ServiceHelper.startService(debugEventNotifier);
         camelContext.getManagementStrategy().addEventNotifier(debugEventNotifier);
+
+        ServiceHelper.initService(debugEventNotifier);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        ServiceHelper.startService(debugEventNotifier);
     }
 
     @Override
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/loadbalancer/LoadBalancerSupport.java b/core/camel-base/src/main/java/org/apache/camel/processor/loadbalancer/LoadBalancerSupport.java
index d098969..590bc46 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/loadbalancer/LoadBalancerSupport.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/loadbalancer/LoadBalancerSupport.java
@@ -112,6 +112,11 @@ public abstract class LoadBalancerSupport extends AsyncProcessorSupport implemen
     }
 
     @Override
+    protected void doInit() throws Exception {
+        ServiceHelper.initService((Object[]) processors.get());
+    }
+
+    @Override
     protected void doStart() throws Exception {
         ServiceHelper.startService((Object[]) processors.get());
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/builder/AdviceWithRouteBuilder.java b/core/camel-core-engine/src/main/java/org/apache/camel/builder/AdviceWithRouteBuilder.java
index 15a0077..4b15319 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/builder/AdviceWithRouteBuilder.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/builder/AdviceWithRouteBuilder.java
@@ -26,6 +26,7 @@ import org.apache.camel.impl.engine.InterceptSendToMockEndpointStrategy;
 import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.reifier.RouteReifier;
 import org.apache.camel.support.EndpointHelper;
 import org.apache.camel.support.PatternHelper;
 import org.apache.camel.util.ObjectHelper;
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/builder/NotifyBuilder.java b/core/camel-core-engine/src/main/java/org/apache/camel/builder/NotifyBuilder.java
index c70a64e..a839dc7 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/builder/NotifyBuilder.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/builder/NotifyBuilder.java
@@ -96,7 +96,8 @@ public class NotifyBuilder {
         this.context = context;
         eventNotifier = new ExchangeNotifier();
         try {
-            ServiceHelper.startService(eventNotifier);
+            context.addService(eventNotifier, false);
+            eventNotifier.start();
         } catch (Exception e) {
             throw RuntimeCamelException.wrapRuntimeCamelException(e);
         }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java
index 5a0a9f5..21919db 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java
@@ -147,12 +147,14 @@ public class LightweightCamelContext implements ExtendedCamelContext, CatalogCam
      * Use one of the other constructors to force use an explicit registry.
      */
     public LightweightCamelContext() {
-        delegate = new DefaultCamelContext(false) {
+        DefaultCamelContext d = new DefaultCamelContext(false) {
             @Override
             public CamelContext getCamelContextReference() {
                 return LightweightCamelContext.this;
             }
         };
+        delegate = d;
+        d.build();
     }
 
     /**
@@ -217,6 +219,11 @@ public class LightweightCamelContext implements ExtendedCamelContext, CatalogCam
     }
 
     @Override
+    public void build() {
+        delegate.build();
+    }
+
+    @Override
     public void init() {
         delegate.init();
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java
index 8971d9c..2e616ab 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java
@@ -267,6 +267,11 @@ public class LightweightRuntimeCamelContext implements ExtendedCamelContext, Cat
     }
 
     @Override
+    public void build() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
     public void init() {
         throw new UnsupportedOperationException();
     }
@@ -288,6 +293,11 @@ public class LightweightRuntimeCamelContext implements ExtendedCamelContext, Cat
         for (Route route : routes) {
             route.getConsumer().start();
         }
+        if (LOG.isInfoEnabled()) {
+            long l = System.currentTimeMillis() - startDate.getTime();
+            LOG.info("Apache Camel {} (CamelContext: {}) {} routes started in {}",
+                    getVersion(), getName(), routes.size(), TimeUtils.printDuration(l));
+        }
     }
 
     @Override
diff --git a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
index 6cfb14f..9752c5b 100644
--- a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
+++ b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
@@ -410,8 +410,6 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
 
         // init stream caching strategy
         initStreamCachingStrategy();
-
-        getContext().init();
     }
     //CHECKSTYLE:ON
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java b/core/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java
index d641d62..49029e0 100644
--- a/core/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java
+++ b/core/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java
@@ -106,10 +106,18 @@ public abstract class ContextTestSupport extends TestSupport {
             throw new Exception("Context must be a ModelCamelContext");
         }
         assertValidContext(context);
-        context.init();
 
-        // reduce default shutdown timeout to avoid waiting for 300 seconds
-        context.getShutdownStrategy().setTimeout(10);
+        if (isUseRouteBuilder()) {
+            RouteBuilder[] builders = createRouteBuilders();
+            for (RouteBuilder builder : builders) {
+                log.debug("Using created route builder: {}", builder);
+                context.addRoutes(builder);
+            }
+            context.init();
+        } else {
+            log.debug("isUseRouteBuilder() is false");
+        }
+
 
         template = context.createProducerTemplate();
         template.start();
@@ -121,16 +129,11 @@ public abstract class ContextTestSupport extends TestSupport {
         oneExchangeDone = event().whenDone(1).create();
 
         if (isUseRouteBuilder()) {
-            RouteBuilder[] builders = createRouteBuilders();
-            for (RouteBuilder builder : builders) {
-                log.debug("Using created route builder: {}", builder);
-                context.addRoutes(builder);
-            }
             startCamelContext();
-        } else {
-            log.debug("isUseRouteBuilder() is false");
         }
 
+        // reduce default shutdown timeout to avoid waiting for 300 seconds
+        context.getShutdownStrategy().setTimeout(10);
     }
 
     @Override
@@ -202,7 +205,7 @@ public abstract class ContextTestSupport extends TestSupport {
             ctx.setRegistry(createRegistry());
             context = ctx;
         } else {
-            DefaultCamelContext ctx = new DefaultCamelContext(false);
+            DefaultCamelContext ctx = new DefaultCamelContext(true);
             ctx.setRegistry(createRegistry());
             context = ctx;
         }
diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/BuilderWithScopesTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/BuilderWithScopesTest.java
index 35f58f4..24a3e14 100644
--- a/core/camel-core/src/test/java/org/apache/camel/builder/BuilderWithScopesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/builder/BuilderWithScopesTest.java
@@ -89,7 +89,7 @@ public class BuilderWithScopesTest extends TestSupport {
         order.clear();
         DefaultCamelContext container = new DefaultCamelContext(false);
         container.disableJMX();
-        container.init();
+        container.build();
 
         container.addRoutes(builder);
         container.start();
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java
index 7a34a4c..bdb5fa1 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java
@@ -48,9 +48,11 @@ public class MultipleLifecycleStrategyTest extends TestSupport {
         context.removeComponent("log");
         context.stop();
 
-        List<String> expectedEvents = Arrays.asList("onContextStart",
-            "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd",
+        List<String> expectedEvents = Arrays.asList(
+            "onServiceAdd", "onServiceAdd",
             "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd",
+            "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd",
+            "onContextStart",
             "onComponentAdd", "onEndpointAdd", "onComponentRemove", "onContextStop");
         
         assertEquals(expectedEvents, dummy1.getEvents());
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierIssueTest.java
index 5b6635b..de4d5c6 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierIssueTest.java
@@ -57,7 +57,6 @@ public class SentExchangeEventNotifierIssueTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().addEventNotifier(notifier);
         return context;
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierTwoIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierTwoIssueTest.java
index 81ccbe1..5f1f1c8 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierTwoIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierTwoIssueTest.java
@@ -57,7 +57,6 @@ public class SentExchangeEventNotifierTwoIssueTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().addEventNotifier(notifier);
         return context;
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/EventNotifierExchangeSentExampleTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/EventNotifierExchangeSentExampleTest.java
index 0c79526..0c99012 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/EventNotifierExchangeSentExampleTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/EventNotifierExchangeSentExampleTest.java
@@ -27,7 +27,6 @@ public class EventNotifierExchangeSentExampleTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         DefaultCamelContext context = (DefaultCamelContext)super.createCamelContext();
-        context.init();
 
         // START SNIPPET: e1
         // add event notifier where we can log the times it took to process
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/ProducerTemplateDisableEventNotifierTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/ProducerTemplateDisableEventNotifierTest.java
index c6a9b89..9d53fc2 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/ProducerTemplateDisableEventNotifierTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/ProducerTemplateDisableEventNotifierTest.java
@@ -30,7 +30,6 @@ public class ProducerTemplateDisableEventNotifierTest extends ContextTestSupport
     @Override
     protected CamelContext createCamelContext() throws Exception {
         DefaultCamelContext context = (DefaultCamelContext)super.createCamelContext();
-        context.init();
         context.getManagementStrategy().addEventNotifier(notifier);
         return context;
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/SplitterUseOriginalNotPropagateExceptionTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/SplitterUseOriginalNotPropagateExceptionTest.java
index 48948ba..93c07ed 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/SplitterUseOriginalNotPropagateExceptionTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/SplitterUseOriginalNotPropagateExceptionTest.java
@@ -32,7 +32,6 @@ public class SplitterUseOriginalNotPropagateExceptionTest extends ContextTestSup
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().addEventNotifier(notifier);
         return context;
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherAsyncUnhandledExceptionTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherAsyncUnhandledExceptionTest.java
index 59160aa..7af0e97 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherAsyncUnhandledExceptionTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherAsyncUnhandledExceptionTest.java
@@ -66,7 +66,6 @@ public class EnricherAsyncUnhandledExceptionTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext camelContext = super.createCamelContext();
-        camelContext.init();
         ShutdownStrategy shutdownStrategy = camelContext.getShutdownStrategy();
         camelContext.addComponent("async", new MyAsyncComponent());
         shutdownStrategy.setTimeout(1000);
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherSendEventTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherSendEventTest.java
index 47fb180..3a77bda 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherSendEventTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherSendEventTest.java
@@ -53,7 +53,6 @@ public class EnricherSendEventTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext camelContext = super.createCamelContext();
-        camelContext.init();
         ShutdownStrategy shutdownStrategy = camelContext.getShutdownStrategy();
         camelContext.addComponent("async", new MyAsyncComponent());
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/DynamicRouterEventNotifierTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/DynamicRouterEventNotifierTest.java
index fe5835b..7b49930 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/DynamicRouterEventNotifierTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/DynamicRouterEventNotifierTest.java
@@ -35,7 +35,6 @@ public class DynamicRouterEventNotifierTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().addEventNotifier(notifier);
         return context;
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RecipientListEventNotifierTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RecipientListEventNotifierTest.java
index 8cbcbac..fe6278d 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RecipientListEventNotifierTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RecipientListEventNotifierTest.java
@@ -32,7 +32,6 @@ public class RecipientListEventNotifierTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().addEventNotifier(notifier);
         return context;
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipEventNotifierTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipEventNotifierTest.java
index 922c2b4..0fe3d31 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipEventNotifierTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipEventNotifierTest.java
@@ -32,7 +32,6 @@ public class RoutingSlipEventNotifierTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().addEventNotifier(notifier);
         return context;
     }
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 2493155..1679fcf 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
@@ -595,7 +595,7 @@ public abstract class BaseMainSupport extends BaseService {
 
     protected void postProcessCamelContext(CamelContext camelContext) throws Exception {
         // ensure camel is initialized
-        camelContext.init();
+        camelContext.build();
 
         configurePropertiesService(camelContext);
 
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java b/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
index 2a165cf..5d2d635 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
@@ -428,20 +428,26 @@ public class DefaultManagementAgent extends ServiceSupport implements Management
     }
 
     @Override
-    protected void doStart() throws Exception {
+    protected void doInit() throws Exception {
         ObjectHelper.notNull(camelContext, "CamelContext");
 
+        finalizeSettings();
+
+        assembler = camelContext.adapt(ExtendedCamelContext.class).getManagementMBeanAssembler();
+        if (assembler == null) {
+            assembler = new DefaultManagementMBeanAssembler(camelContext);
+        }
+        ServiceHelper.initService(assembler);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
         // create mbean server if is has not be injected.
         if (server == null) {
-            finalizeSettings();
             createMBeanServer();
         }
 
         // ensure assembler is started
-        assembler = camelContext.adapt(ExtendedCamelContext.class).getManagementMBeanAssembler();
-        if (assembler == null) {
-            assembler = new DefaultManagementMBeanAssembler(camelContext);
-        }
         ServiceHelper.startService(assembler);
 
         LOG.debug("Starting JMX agent on server: {}", getMBeanServer());
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java b/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
index eb9e61c..48a9d0b 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
@@ -125,7 +125,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
     // the wrapped processors is for performance counters, which are in use for the created routes
     // when a route is removed, we should remove the associated processors from this map
     private final Map<Processor, KeyValueHolder<NamedNode, InstrumentationProcessor>> wrappedProcessors = new HashMap<>();
-    private final List<PreRegisterService> preServices = new ArrayList<>();
+    private final List<java.util.function.Consumer<JmxManagementLifecycleStrategy>> preServices = new ArrayList<>();
     private final TimerListenerManager loadTimer = new ManagedLoadTimer();
     private final TimerListenerManagerStartupListener loadTimerStartupListener = new TimerListenerManagerStartupListener();
     private volatile CamelContext camelContext;
@@ -145,13 +145,13 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
 
     // used for handing over pre-services between a provisional lifecycycle strategy
     // and then later the actual strategy to be used when using XML
-    List<PreRegisterService> getPreServices() {
+    List<java.util.function.Consumer<JmxManagementLifecycleStrategy>> getPreServices() {
         return preServices;
     }
 
     // used for handing over pre-services between a provisional lifecycycle strategy
     // and then later the actual strategy to be used when using XML
-    void addPreService(PreRegisterService preService) {
+    void addPreService(java.util.function.Consumer<JmxManagementLifecycleStrategy> preService) {
         preServices.add(preService);
     }
 
@@ -216,6 +216,9 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
         // set the name we are going to use
         context.setManagementName(managementName);
 
+        // yes we made it and are initialized
+        initialized = true;
+
         try {
             manageObject(mc);
         } catch (Exception e) {
@@ -224,9 +227,6 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
             throw RuntimeCamelException.wrapRuntimeCamelException(e);
         }
 
-        // yes we made it and are initialized
-        initialized = true;
-
         if (mc instanceof ManagedCamelContext) {
             camelContextMBean = (ManagedCamelContext) mc;
         }
@@ -293,14 +293,8 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
         }
 
         LOG.debug("Registering {} pre registered services", preServices.size());
-        for (PreRegisterService pre : preServices) {
-            if (pre.getComponent() != null) {
-                onComponentAdd(pre.getName(), pre.getComponent());
-            } else if (pre.getEndpoint() != null) {
-                onEndpointAdd(pre.getEndpoint());
-            } else if (pre.getService() != null) {
-                onServiceAdd(pre.getCamelContext(), pre.getService(), pre.getRoute());
-            }
+        for (java.util.function.Consumer<JmxManagementLifecycleStrategy> pre : preServices) {
+            pre.accept(this);
         }
 
         // we are done so clear the list
@@ -352,9 +346,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
         // always register components as there are only a few of those
         if (!initialized) {
             // pre register so we can register later when we have been initialized
-            PreRegisterService pre = new PreRegisterService();
-            pre.onComponentAdd(name, component);
-            preServices.add(pre);
+            preServices.add(lf -> lf.onComponentAdd(name, component));
             return;
         }
         try {
@@ -390,9 +382,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
     public void onEndpointAdd(Endpoint endpoint) {
         if (!initialized) {
             // pre register so we can register later when we have been initialized
-            PreRegisterService pre = new PreRegisterService();
-            pre.onEndpointAdd(endpoint);
-            preServices.add(pre);
+            preServices.add(lf -> lf.onEndpointAdd(endpoint));
             return;
         }
 
@@ -429,12 +419,10 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
     }
 
     @Override
-    public void onServiceAdd(CamelContext context, Service service, org.apache.camel.Route route) {
+    public void onServiceAdd(CamelContext context, Service service, Route route) {
         if (!initialized) {
             // pre register so we can register later when we have been initialized
-            PreRegisterService pre = new PreRegisterService();
-            pre.onServiceAdd(context, service, route);
-            preServices.add(pre);
+            preServices.add(lf -> lf.onServiceAdd(camelContext, service, route));
             return;
         }
 
@@ -466,7 +454,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
     }
 
     @Override
-    public void onServiceRemove(CamelContext context, Service service, org.apache.camel.Route route) {
+    public void onServiceRemove(CamelContext context, Service service, Route route) {
         // the agent hasn't been started
         if (!initialized) {
             return;
@@ -483,7 +471,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
     }
 
     @SuppressWarnings("unchecked")
-    private Object getManagedObjectForService(CamelContext context, Service service, org.apache.camel.Route route) {
+    private Object getManagedObjectForService(CamelContext context, Service service, Route route) {
         // skip channel, UoW and dont double wrap instrumentation
         if (service instanceof Channel || service instanceof UnitOfWork || service instanceof InstrumentationProcessor) {
             return null;
@@ -575,7 +563,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
         return answer;
     }
 
-    private Object getManagedObjectForProcessor(CamelContext context, Processor processor, org.apache.camel.Route route) {
+    private Object getManagedObjectForProcessor(CamelContext context, Processor processor, Route route) {
         // a bit of magic here as the processors we want to manage have already been registered
         // in the wrapped processors map when Camel have instrumented the route on route initialization
         // so the idea is now to only manage the processors from the map
@@ -603,8 +591,8 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
     }
 
     @Override
-    public void onRoutesAdd(Collection<org.apache.camel.Route> routes) {
-        for (org.apache.camel.Route route : routes) {
+    public void onRoutesAdd(Collection<Route> routes) {
+        for (Route route : routes) {
 
             // if we are starting CamelContext or either of the two options has been
             // enabled, then enlist the route as a known route
@@ -658,13 +646,13 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
     }
 
     @Override
-    public void onRoutesRemove(Collection<org.apache.camel.Route> routes) {
+    public void onRoutesRemove(Collection<Route> routes) {
         // the agent hasn't been started
         if (!initialized) {
             return;
         }
 
-        for (org.apache.camel.Route route : routes) {
+        for (Route route : routes) {
             Object mr = getManagementObjectStrategy().getManagedObjectForRoute(camelContext, route);
 
             // skip unmanaged routes
@@ -690,6 +678,12 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
 
     @Override
     public void onErrorHandlerAdd(Route route, Processor errorHandler, ErrorHandlerFactory errorHandlerBuilder) {
+        if (!initialized) {
+            // pre register so we can register later when we have been initialized
+            preServices.add(lf -> lf.onErrorHandlerAdd(route, errorHandler, errorHandlerBuilder));
+            return;
+        }
+
         if (!shouldRegister(errorHandler, null)) {
             // avoid registering if not needed
             return;
@@ -730,6 +724,12 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
     public void onThreadPoolAdd(CamelContext camelContext, ThreadPoolExecutor threadPool, String id,
                                 String sourceId, String routeId, String threadPoolProfileId) {
 
+        if (!initialized) {
+            // pre register so we can register later when we have been initialized
+            preServices.add(lf -> lf.onThreadPoolAdd(camelContext, threadPool, id, sourceId, routeId, threadPoolProfileId));
+            return;
+        }
+
         if (!shouldRegister(threadPool, null)) {
             // avoid registering if not needed
             return;
@@ -778,10 +778,6 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
 
     @Override
     public void onRouteContextCreate(Route route) {
-        if (!initialized) {
-            return;
-        }
-
         // Create a map (ProcessorType -> PerformanceCounter)
         // to be passed to InstrumentationInterceptStrategy.
         Map<NamedNode, PerformanceCounter> registeredCounters = new HashMap<>();
@@ -808,9 +804,9 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
      *
      * @param routes the routes
      */
-    private void removeWrappedProcessorsForRoutes(Collection<org.apache.camel.Route> routes) {
+    private void removeWrappedProcessorsForRoutes(Collection<Route> routes) {
         // loop the routes, and remove the route associated wrapped processors, as they are no longer in use
-        for (org.apache.camel.Route route : routes) {
+        for (Route route : routes) {
             String id = route.getId();
 
             Iterator<KeyValueHolder<NamedNode, InstrumentationProcessor>> it = wrappedProcessors.values().iterator();
@@ -935,7 +931,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
      * @param route   an optional route the mbean is associated with, can be <tt>null</tt>
      * @return <tt>true</tt> to register, <tt>false</tt> to skip registering
      */
-    protected boolean shouldRegister(Object service, org.apache.camel.Route route) {
+    protected boolean shouldRegister(Object service, Route route) {
         // the agent hasn't been started
         if (!initialized) {
             return false;
@@ -950,7 +946,8 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
         }
 
         // always register if we are starting CamelContext
-        if (getCamelContext().getStatus().isStarting()) {
+        if (getCamelContext().getStatus().isStarting()
+                || getCamelContext().getStatus().isInitializing()) {
             return true;
         }
 
@@ -1029,7 +1026,15 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
         private Endpoint endpoint;
         private CamelContext camelContext;
         private Service service;
-        private org.apache.camel.Route route;
+        private Route route;
+        private java.util.function.Consumer<JmxManagementLifecycleStrategy> runnable;
+
+        public PreRegisterService() {
+        }
+
+        public PreRegisterService(java.util.function.Consumer<JmxManagementLifecycleStrategy> runnable) {
+            this.runnable = runnable;
+        }
 
         public void onComponentAdd(String name, Component component) {
             this.name = name;
@@ -1040,7 +1045,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
             this.endpoint = endpoint;
         }
 
-        public void onServiceAdd(CamelContext camelContext, Service service, org.apache.camel.Route route) {
+        public void onServiceAdd(CamelContext camelContext, Service service, Route route) {
             this.camelContext = camelContext;
             this.service = service;
             this.route = route;
@@ -1066,9 +1071,14 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
             return service;
         }
 
-        public org.apache.camel.Route getRoute() {
+        public Route getRoute() {
             return route;
         }
+
+        public java.util.function.Consumer<JmxManagementLifecycleStrategy> getRunnable() {
+            return runnable;
+        }
+
     }
 
 }
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategy.java b/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategy.java
index 5829801..f492a64 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategy.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategy.java
@@ -30,6 +30,9 @@ import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * A JMX capable {@link org.apache.camel.spi.ManagementStrategy} that Camel by default uses if possible.
  * <p/>
@@ -42,6 +45,8 @@ public class JmxManagementStrategy extends DefaultManagementStrategy {
 
     private static final Logger LOG = LoggerFactory.getLogger(JmxManagementStrategy.class);
 
+    private final List<Object> managed = new ArrayList<>();
+
     public JmxManagementStrategy() {
     }
 
@@ -53,6 +58,10 @@ public class JmxManagementStrategy extends DefaultManagementStrategy {
 
     @Override
     public void manageObject(Object managedObject) throws Exception {
+        if (!isStartingOrStarted()) {
+            managed.add(managedObject);
+            return;
+        }
         ObjectName objectName = getManagementObjectNameStrategy().getObjectName(managedObject);
         if (objectName != null) {
             getManagementAgent().register(managedObject, objectName);
@@ -61,6 +70,10 @@ public class JmxManagementStrategy extends DefaultManagementStrategy {
 
     @Override
     public void unmanageObject(Object managedObject) throws Exception {
+        if (!isStartingOrStarted()) {
+            managed.remove(managedObject);
+            return;
+        }
         ObjectName objectName = getManagementObjectNameStrategy().getObjectName(managedObject);
         if (objectName != null) {
             getManagementAgent().unregister(objectName);
@@ -99,14 +112,10 @@ public class JmxManagementStrategy extends DefaultManagementStrategy {
 
     @Override
     protected void doStart() throws Exception {
-        LOG.info("JMX is enabled");
-
-        ObjectHelper.notNull(getCamelContext(), "CamelContext", this);
-        if (!getEventNotifiers().isEmpty()) {
-            getCamelContext().adapt(ExtendedCamelContext.class).setEventNotificationApplicable(true);
+        super.doStart();
+        for (Object o : managed) {
+            manageObject(o);
         }
-
-        doStartManagementStrategy();
     }
 
     @Override
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java b/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java
index ef4f9e7..0bddc12 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java
@@ -54,7 +54,7 @@ public class JmxManagementStrategyFactory implements ManagementStrategyFactory {
             // a bit of ugly code to handover pre registered services that has been add to an eager/provisional JmxManagementLifecycleStrategy
             // which is now re-placed with a new JmxManagementLifecycleStrategy that is based on the end user configured settings
             // and therefore will be in use
-            List<JmxManagementLifecycleStrategy.PreRegisterService> preServices = null;
+            List<java.util.function.Consumer<JmxManagementLifecycleStrategy>> preServices = null;
             JmxManagementLifecycleStrategy jmx = camelContext.getLifecycleStrategies().stream()
                     .filter(s -> s instanceof JmxManagementLifecycleStrategy)
                     .map(JmxManagementLifecycleStrategy.class::cast)
@@ -65,7 +65,7 @@ public class JmxManagementStrategyFactory implements ManagementStrategyFactory {
 
             if (preServices != null &&  !preServices.isEmpty() && lifecycle instanceof JmxManagementLifecycleStrategy) {
                 JmxManagementLifecycleStrategy existing = (JmxManagementLifecycleStrategy) lifecycle;
-                for (JmxManagementLifecycleStrategy.PreRegisterService pre : preServices) {
+                for (java.util.function.Consumer<JmxManagementLifecycleStrategy> pre : preServices) {
                     existing.addPreService(pre);
                 }
             }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/JmxInstrumentationOnlyRegisterProcessorWithCustomIdTest.java b/core/camel-management/src/test/java/org/apache/camel/management/JmxInstrumentationOnlyRegisterProcessorWithCustomIdTest.java
index bb48c72..325eb49 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/JmxInstrumentationOnlyRegisterProcessorWithCustomIdTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/JmxInstrumentationOnlyRegisterProcessorWithCustomIdTest.java
@@ -73,7 +73,6 @@ public class JmxInstrumentationOnlyRegisterProcessorWithCustomIdTest extends Con
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().getManagementAgent().setOnlyRegisterProcessorWithCustomId(true);
         return context;
     }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextPropertiesTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextPropertiesTest.java
index 13bc1e8..51110d6 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextPropertiesTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextPropertiesTest.java
@@ -30,7 +30,6 @@ public class ManagedCamelContextPropertiesTest extends ManagementTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         // to force a different management name than the camel id
         context.getManagementNameStrategy().setNamePattern("19-#name#");
         return context;
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java
index a1106cf..6830abe 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java
@@ -34,7 +34,6 @@ public class ManagedCamelContextTest extends ManagementTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         // to force a different management name than the camel id
         context.getManagementNameStrategy().setNamePattern("19-#name#");
         return context;
@@ -42,7 +41,7 @@ public class ManagedCamelContextTest extends ManagementTestSupport {
 
     @Test
     public void testManagedCamelContextClient() throws Exception {
-        // JMX tests dont work well on AIX CI servers (hangs them)
+        // JMX tests don't work well on AIX CI servers (hangs them)
         if (isPlatform("aix")) {
             return;
         }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedDynamicRouterTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedDynamicRouterTest.java
index 3b678c7..a5586a1 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedDynamicRouterTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedDynamicRouterTest.java
@@ -32,7 +32,6 @@ public class ManagedDynamicRouterTest extends ManagementTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
         return context;
     }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedEndpointUtilizationStatisticsTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedEndpointUtilizationStatisticsTest.java
index 1ce7489..4665b52 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedEndpointUtilizationStatisticsTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedEndpointUtilizationStatisticsTest.java
@@ -29,7 +29,6 @@ public class ManagedEndpointUtilizationStatisticsTest extends ManagementTestSupp
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext camelContext = super.createCamelContext();
-        camelContext.init();
         // turn on runtime statistics in extended mode
         camelContext.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
         return camelContext;
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedEnricherTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedEnricherTest.java
index e564351..f138804 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedEnricherTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedEnricherTest.java
@@ -32,7 +32,6 @@ public class ManagedEnricherTest extends ManagementTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
         return context;
     }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java
index f477a70..1ea5a0c 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java
@@ -28,7 +28,6 @@ public class ManagedNamePatternFixedTest extends ManagementTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementNameStrategy().setNamePattern("cool");
         return context;
     }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternIncludeHostNameTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternIncludeHostNameTest.java
index e8441a1..d0ab4b6 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternIncludeHostNameTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternIncludeHostNameTest.java
@@ -28,7 +28,7 @@ public class ManagedNamePatternIncludeHostNameTest extends ManagementTestSupport
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
+        context.getManagementStrategy().init();
         DefaultManagementObjectNameStrategy naming = (DefaultManagementObjectNameStrategy)context.getManagementStrategy().getManagementObjectNameStrategy();
         naming.setHostName("localhost");
         context.getManagementStrategy().getManagementAgent().setIncludeHostName(true);
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java
index 754cc5e..28209ef 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java
@@ -28,7 +28,6 @@ public class ManagedNamePatternTest extends ManagementTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementNameStrategy().setNamePattern("cool-#name#");
         return context;
     }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java
index e9d545e..3642872 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java
@@ -29,7 +29,7 @@ import org.junit.Test;
 
 public class ManagedNonManagedServiceTest extends ManagementTestSupport {
 
-    private static final int SERVICES = 10;
+    private static final int SERVICES = 11;
 
     @Test
     public void testService() throws Exception {
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedPollEnricherTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedPollEnricherTest.java
index 559f64f..e57cb34 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedPollEnricherTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedPollEnricherTest.java
@@ -32,7 +32,6 @@ public class ManagedPollEnricherTest extends ManagementTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
         return context;
     }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRecipientListRegisterAlwaysTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRecipientListRegisterAlwaysTest.java
index 168530e..d756ad0 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRecipientListRegisterAlwaysTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRecipientListRegisterAlwaysTest.java
@@ -31,7 +31,6 @@ public class ManagedProducerRecipientListRegisterAlwaysTest extends ManagementTe
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().getManagementAgent().setRegisterAlways(true);
         return context;
     }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
index dc68cdb..ac22496 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
@@ -28,12 +28,11 @@ import org.junit.Test;
 
 public class ManagedProducerRouteAddRemoveRegisterAlwaysTest extends ManagementTestSupport {
 
-    private static final int SERVICES = 10;
+    private static final int SERVICES = 11;
 
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().getManagementAgent().setRegisterAlways(true);
         return context;
     }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRecipientListTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRecipientListTest.java
index ca86746..2383634 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRecipientListTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRecipientListTest.java
@@ -32,7 +32,6 @@ public class ManagedRecipientListTest extends ManagementTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
         return context;
     }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java
index 702ff39..fff6e2d 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java
@@ -33,7 +33,7 @@ import org.junit.Test;
  */
 public class ManagedRouteAddRemoveTest extends ManagementTestSupport {
     
-    private static final int SERVICES = 10;
+    private static final int SERVICES = 11;
 
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRoutingSlipTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRoutingSlipTest.java
index 7207f76..89ce72f 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRoutingSlipTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRoutingSlipTest.java
@@ -32,7 +32,6 @@ public class ManagedRoutingSlipTest extends ManagementTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
         return context;
     }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedSanitizeTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedSanitizeTest.java
index 397bac2..49be27c 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedSanitizeTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedSanitizeTest.java
@@ -28,7 +28,6 @@ public class ManagedSanitizeTest extends ManagementTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().getManagementAgent().setMask(true);
         return context;
     }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedSendDynamicProcessorTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedSendDynamicProcessorTest.java
index 78e8259..06ec234 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedSendDynamicProcessorTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedSendDynamicProcessorTest.java
@@ -32,7 +32,6 @@ public class ManagedSendDynamicProcessorTest extends ManagementTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
         return context;
     }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedStartupFailedTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedStartupFailedTest.java
index 3e9f655..66da93c 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedStartupFailedTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedStartupFailedTest.java
@@ -77,7 +77,6 @@ public class ManagedStartupFailedTest extends ManagementTestSupport {
         }
 
         MBeanServer server = getMBeanServer();
-        Set<ObjectName> onames = server.queryNames(new ObjectName("org.apache.camel:*"), null);
-        assertEquals(Collections.emptySet(), onames);
+        assertNull(server);
     }
 }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelOffTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelOffTest.java
index 78136d5..3a6bbae 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelOffTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelOffTest.java
@@ -32,7 +32,6 @@ public class ManagedStatisticsLevelOffTest extends ManagementTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         // disable it by default
         context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Off);
         return context;
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelRoutesOnlyTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelRoutesOnlyTest.java
index 6dd018e..32766bc 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelRoutesOnlyTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelRoutesOnlyTest.java
@@ -31,7 +31,6 @@ public class ManagedStatisticsLevelRoutesOnlyTest extends ManagementTestSupport
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         // only routes
         context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.RoutesOnly);
         return context;
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedWireTapTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedWireTapTest.java
index e71f03e..8e0174b 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedWireTapTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedWireTapTest.java
@@ -32,7 +32,6 @@ public class ManagedWireTapTest extends ManagementTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.init();
         context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
         return context;
     }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ChildServiceSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/ChildServiceSupport.java
index c3bbb30..7fe1aed 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/ChildServiceSupport.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/ChildServiceSupport.java
@@ -47,7 +47,7 @@ public abstract class ChildServiceSupport extends ServiceSupport {
                 return;
             }
             try {
-                initService(childServices);
+                ServiceHelper.initService(childServices);
             } catch (Exception e) {
                 status = FAILED;
                 LOG.trace("Error while initializing service: " + this, e);
@@ -124,25 +124,24 @@ public abstract class ChildServiceSupport extends ServiceSupport {
 
     protected void addChildService(Object childService) {
         if (childService instanceof Service) {
-            if (childServices == null) {
-                synchronized (lock) {
-                    if (childServices == null) {
-                        childServices = new ArrayList<>();
-                    }
+            synchronized (lock) {
+                if (childServices == null) {
+                    childServices = new ArrayList<>();
                 }
+                childServices.add((Service) childService);
             }
-            childServices.add((Service) childService);
         }
     }
 
     protected boolean removeChildService(Object childService) {
-        return childServices != null && childServices.remove(childService);
-    }
-
-    private void initService(List<Service> services) {
-        if (services != null) {
-            services.forEach(Service::init);
+        if (childService instanceof Service) {
+            synchronized (lock) {
+                if (childServices != null) {
+                    return childServices.remove(childService);
+                }
+            }
         }
+        return false;
     }
 
 }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
index 4dd349a..31fc1a4 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
@@ -17,6 +17,9 @@
 package org.apache.camel.support;
 
 import java.util.List;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import java.util.function.Supplier;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
@@ -69,202 +72,39 @@ public final class EventHelper {
         return true;
     }
 
-    public static boolean notifyCamelContextStarting(CamelContext context) {
-        ManagementStrategy management = context.getManagementStrategy();
-        if (management == null) {
-            return false;
-        }
-
-        EventFactory factory = management.getEventFactory();
-        if (factory == null) {
-            return false;
-        }
-
-        List<EventNotifier> notifiers = management.getEventNotifiers();
-        if (notifiers == null || notifiers.isEmpty()) {
-            return false;
-        }
+    public static boolean notifyCamelContextInitializing(CamelContext context) {
+        return notifyCamelContext(context, EventFactory::createCamelContextInitializingEvent);
+    }
 
-        boolean answer = false;
-        CamelEvent event = null;
-        for (EventNotifier notifier : notifiers) {
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreCamelContextEvents()) {
-                continue;
-            }
+    public static boolean notifyCamelContextInitialized(CamelContext context) {
+        return notifyCamelContext(context, EventFactory::createCamelContextInitializedEvent);
+    }
 
-            if (event == null) {
-                // only create event once
-                event = factory.createCamelContextStartingEvent(context);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
+    public static boolean notifyCamelContextStarting(CamelContext context) {
+        return notifyCamelContext(context, EventFactory::createCamelContextStartingEvent);
     }
 
     public static boolean notifyCamelContextStarted(CamelContext context) {
-        ManagementStrategy management = context.getManagementStrategy();
-        if (management == null) {
-            return false;
-        }
-
-        EventFactory factory = management.getEventFactory();
-        if (factory == null) {
-            return false;
-        }
-
-        List<EventNotifier> notifiers = management.getEventNotifiers();
-        if (notifiers == null || notifiers.isEmpty()) {
-            return false;
-        }
-
-        boolean answer = false;
-        CamelEvent event = null;
-        for (EventNotifier notifier : notifiers) {
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreCamelContextEvents()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createCamelContextStartedEvent(context);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
+        return notifyCamelContext(context, EventFactory::createCamelContextStartedEvent);
     }
 
     public static boolean notifyCamelContextStartupFailed(CamelContext context, Throwable cause) {
-        ManagementStrategy management = context.getManagementStrategy();
-        if (management == null) {
-            return false;
-        }
-
-        EventFactory factory = management.getEventFactory();
-        if (factory == null) {
-            return false;
-        }
-
-        List<EventNotifier> notifiers = management.getEventNotifiers();
-        if (notifiers == null || notifiers.isEmpty()) {
-            return false;
-        }
-
-        boolean answer = false;
-        CamelEvent event = null;
-        for (EventNotifier notifier : notifiers) {
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreCamelContextEvents()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createCamelContextStartupFailureEvent(context, cause);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
+        return notifyCamelContext(context, (ef, ctx) -> ef.createCamelContextStartupFailureEvent(ctx, cause));
     }
 
     public static boolean notifyCamelContextStopping(CamelContext context) {
-        ManagementStrategy management = context.getManagementStrategy();
-        if (management == null) {
-            return false;
-        }
-
-        EventFactory factory = management.getEventFactory();
-        if (factory == null) {
-            return false;
-        }
-
-        List<EventNotifier> notifiers = management.getEventNotifiers();
-        if (notifiers == null || notifiers.isEmpty()) {
-            return false;
-        }
-
-        boolean answer = false;
-        CamelEvent event = null;
-        for (EventNotifier notifier : notifiers) {
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreCamelContextEvents()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createCamelContextStoppingEvent(context);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
+        return notifyCamelContext(context, EventFactory::createCamelContextStoppingEvent);
     }
 
     public static boolean notifyCamelContextStopped(CamelContext context) {
-        ManagementStrategy management = context.getManagementStrategy();
-        if (management == null) {
-            return false;
-        }
-
-        EventFactory factory = management.getEventFactory();
-        if (factory == null) {
-            return false;
-        }
-
-        List<EventNotifier> notifiers = management.getEventNotifiers();
-        if (notifiers == null || notifiers.isEmpty()) {
-            return false;
-        }
-
-        boolean answer = false;
-        CamelEvent event = null;
-        for (EventNotifier notifier : notifiers) {
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreCamelContextEvents()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createCamelContextStoppedEvent(context);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
+        return notifyCamelContext(context, EventFactory::createCamelContextStoppedEvent);
     }
 
     public static boolean notifyCamelContextStopFailed(CamelContext context, Throwable cause) {
+        return notifyCamelContext(context, (ef, ctx) -> ef.createCamelContextStopFailureEvent(ctx, cause));
+    }
+
+    private static boolean notifyCamelContext(CamelContext context, BiFunction<EventFactory, CamelContext, CamelEvent> eventSupplier) {
         ManagementStrategy management = context.getManagementStrategy();
         if (management == null) {
             return false;
@@ -292,7 +132,7 @@ public final class EventHelper {
 
             if (event == null) {
                 // only create event once
-                event = factory.createCamelContextStopFailureEvent(context, cause);
+                event = eventSupplier.apply(factory, context);
                 if (event == null) {
                     // factory could not create event so exit
                     return false;
diff --git a/docs/components/modules/ROOT/pages/index.adoc b/docs/components/modules/ROOT/pages/index.adoc
index e058017..20180bf 100644
--- a/docs/components/modules/ROOT/pages/index.adoc
+++ b/docs/components/modules/ROOT/pages/index.adoc
@@ -684,6 +684,151 @@ Number of Components: 332 in 265 JAR artifacts (1 deprecated)
 |===
 // components: END
 
+== Data Formats
+
+// dataformats: START
+Number of Data Formats: 45 in 37 JAR artifacts (0 deprecated)
+
+[width="100%",cols="4,1,5",options="header"]
+|===
+| Data Format | Since | Description
+
+| xref:dataformats:any23-dataformat.adoc[Any23] (camel-any23) | 3.0 | Any23 data format is used for parsing data to RDF.
+
+| xref:dataformats:asn1-dataformat.adoc[ASN.1 File] (camel-asn1) | 2.20 | The ASN.1 data format is used for file transfer with telecommunications protocols.
+
+| xref:dataformats:avro-dataformat.adoc[Avro] (camel-avro) | 2.14 | The Avro data format is used for serialization and deserialization of messages using Apache Avro binary dataformat.
+
+| xref:dataformats:barcode-dataformat.adoc[Barcode] (camel-barcode) | 2.14 | The Barcode data format is used for creating barccode images (such as QR-Code)
+
+| xref:dataformats:base64-dataformat.adoc[Base64] (camel-base64) | 2.11 | The Base64 data format is used for base64 encoding and decoding.
+
+| xref:dataformats:beanio-dataformat.adoc[BeanIO] (camel-beanio) | 2.10 | The BeanIO data format is used for working with flat payloads (such as CSV, delimited, or fixed length formats).
+
+| xref:dataformats:bindy-dataformat.adoc[Bindy CSV] (camel-bindy) | 2.0 | The Bindy data format is used for working with flat payloads (such as CSV, delimited, fixed length formats, or FIX messages).
+
+| xref:dataformats:bindy-dataformat.adoc[Bindy Fixed Length] (camel-bindy) | 2.0 | The Bindy data format is used for working with flat payloads (such as CSV, delimited, fixed length formats, or FIX messages).
+
+| xref:dataformats:bindy-dataformat.adoc[Bindy Key Value Pair] (camel-bindy) | 2.0 | The Bindy data format is used for working with flat payloads (such as CSV, delimited, fixed length formats, or FIX messages).
+
+| xref:dataformats:cbor-dataformat.adoc[CBOR] (camel-cbor) | 3.0 | CBOR data format is used for unmarshal a CBOR payload to POJO or to marshal POJO back to CBOR payload.
+
+| xref:dataformats:crypto-dataformat.adoc[Crypto (Java Cryptographic Extension)] (camel-crypto) | 2.3 | Crypto data format is used for encrypting and decrypting of messages using Java Cryptographic Extension.
+
+| xref:dataformats:csv-dataformat.adoc[CSV] (camel-csv) | 1.3 | The CSV data format is used for handling CSV payloads.
+
+| xref:dataformats:fhirJson-dataformat.adoc[FHIR JSon] (camel-fhir) | 2.21 | The FHIR JSon data format is used to marshall/unmarshall to/from FHIR objects to/from JSON.
+
+| xref:dataformats:fhirXml-dataformat.adoc[FHIR XML] (camel-fhir) | 2.21 | The FHIR XML data format is used to marshall/unmarshall from/to FHIR objects to/from XML.
+
+| xref:dataformats:flatpack-dataformat.adoc[Flatpack] (camel-flatpack) | 2.1 | The Flatpack data format is used for working with flat payloads (such as CSV, delimited, or fixed length formats).
+
+| xref:dataformats:grok-dataformat.adoc[Grok] (camel-grok) | 3.0 | The Grok data format is used for unmarshalling unstructured data to objects using Logstash based Grok patterns.
+
+| xref:dataformats:gzipdeflater-dataformat.adoc[GZip Deflater] (camel-zip-deflater) | 2.0 | The GZip data format is a message compression and de-compression format (which works with the popular gzip/gunzip tools).
+
+| xref:dataformats:hl7-dataformat.adoc[HL7] (camel-hl7) | 2.0 | The HL7 data format can be used to marshal or unmarshal HL7 (Health Care) model objects.
+
+| xref:dataformats:ical-dataformat.adoc[iCal] (camel-ical) | 2.12 | The iCal dataformat is used for working with iCalendar messages.
+
+| xref:dataformats:jacksonxml-dataformat.adoc[JacksonXML] (camel-jacksonxml) | 2.16 | JacksonXML data format is used for unmarshal a XML payload to POJO or to marshal POJO back to XML payload.
+
+| xref:dataformats:jaxb-dataformat.adoc[JAXB] (camel-jaxb) | 1.0 | JAXB data format uses the JAXB2 XML marshalling standard to unmarshal an XML payload into Java objects or to marshal Java objects into an XML payload.
+
+| xref:dataformats:json-fastjson-dataformat.adoc[JSon Fastjson] (camel-fastjson) | 2.20 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+
+| xref:dataformats:json-gson-dataformat.adoc[JSon GSon] (camel-gson) | 2.10 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+
+| xref:dataformats:json-jackson-dataformat.adoc[JSon Jackson] (camel-jackson) | 2.0 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+
+| xref:dataformats:json-johnzon-dataformat.adoc[JSon Johnzon] (camel-johnzon) | 2.18 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+
+| xref:dataformats:json-xstream-dataformat.adoc[JSon XStream] (camel-xstream) | 2.0 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+
+| xref:dataformats:jsonApi-dataformat.adoc[JSonApi] (camel-jsonapi) | 3.0 | JSonApi data format is used for marshal and unmarshal Json API object.
+
+| xref:dataformats:lzf-dataformat.adoc[LZF Deflate Compression] (camel-lzf) | 2.17 | The LZF data format is a message compression and de-compression format (uses the LZF deflate algorithm).
+
+| xref:dataformats:mime-multipart-dataformat.adoc[MIME Multipart] (camel-mail) | 2.17 | The MIME Multipart data format is used for marshalling Camel messages with attachments into MIME-Multipart message, and vise-versa.
+
+| xref:dataformats:pgp-dataformat.adoc[PGP] (camel-crypto) | 2.9 | PGP data format is used for encrypting and decrypting of messages using Java Cryptographic Extension and PGP.
+
+| xref:dataformats:protobuf-dataformat.adoc[Protobuf] (camel-protobuf) | 2.2 | The Protobuf data format is used for serializing between Java objects and the Google Protobuf protocol.
+
+| xref:dataformats:rss-dataformat.adoc[RSS] (camel-rss) | 2.1 | RSS data format is used for working with RSS sync feed Java Objects and transforming to XML and vice-versa.
+
+| xref:dataformats:soapjaxb-dataformat.adoc[SOAP] (camel-soap) | 2.3 | SOAP is a data format which uses JAXB2 and JAX-WS annotations to marshal and unmarshal SOAP payloads.
+
+| xref:dataformats:syslog-dataformat.adoc[Syslog] (camel-syslog) | 2.6 | The Syslog dataformat is used for working with RFC3164 and RFC5424 messages (logging and monitoring).
+
+| xref:dataformats:tarfile-dataformat.adoc[Tar File] (camel-tarfile) | 2.16 | The Tar File data format is a message compression and de-compression format of tar files.
+
+| xref:dataformats:thrift-dataformat.adoc[Thrift] (camel-thrift) | 2.20 | The Thrift data format is used for serialization and deserialization of messages using Apache Thrift binary dataformat.
+
+| xref:dataformats:tidyMarkup-dataformat.adoc[TidyMarkup] (camel-tagsoup) | 2.0 | TidyMarkup data format is used for parsing HTML and return it as pretty well-formed HTML.
+
+| xref:dataformats:univocity-csv-dataformat.adoc[uniVocity CSV] (camel-univocity-parsers) | 2.15 | The uniVocity CSV data format is used for working with CSV (Comma Separated Values) flat payloads.
+
+| xref:dataformats:univocity-fixed-dataformat.adoc[uniVocity Fixed Length] (camel-univocity-parsers) | 2.15 | The uniVocity Fixed Length data format is used for working with fixed length flat payloads.
+
+| xref:dataformats:univocity-tsv-dataformat.adoc[uniVocity TSV] (camel-univocity-parsers) | 2.15 | The uniVocity TSV data format is used for working with TSV (Tabular Separated Values) flat payloads.
+
+| xref:dataformats:secureXML-dataformat.adoc[XML Security] (camel-xmlsecurity) | 2.0 | The XML Security data format facilitates encryption and decryption of XML payloads.
+
+| xref:dataformats:xstream-dataformat.adoc[XStream] (camel-xstream) | 1.3 | XStream data format is used for unmarshal a XML payload to POJO or to marshal POJO back to XML payload.
+
+| xref:dataformats:yaml-snakeyaml-dataformat.adoc[YAML SnakeYAML] (camel-snakeyaml) | 2.17 | YAML is a data format to marshal and unmarshal Java objects to and from YAML.
+
+| xref:dataformats:zipdeflater-dataformat.adoc[Zip Deflate Compression] (camel-zip-deflater) | 2.12 | Zip Deflate Compression data format is a message compression and de-compression format (not zip files).
+
+| xref:dataformats:zipfile-dataformat.adoc[Zip File] (camel-zipfile) | 2.11 | The Zip File data format is a message compression and de-compression format of zip files.
+|===
+// dataformats: END
+
+== Expression Languages
+
+// languages: START
+Number of Languages: 17 in 11 JAR artifacts (0 deprecated)
+
+[width="100%",cols="4,1,5",options="header"]
+|===
+| Language | Since | Description
+
+| xref:languages:bean-language.adoc[Bean method] (camel-bean) | 1.3 | To use a Java bean (aka method call) in Camel expressions or predicates.
+
+| xref:languages:constant-language.adoc[Constant] (camel-core-languages) | 1.5 | To use a constant value in Camel expressions or predicates. Important: this is a fixed constant value that is only set once during starting up the route, do not use this if you want dynamic values during routing.
+
+| xref:languages:exchangeProperty-language.adoc[ExchangeProperty] (camel-core-languages) | 2.0 | To use a Camel Exchange property in expressions or predicates.
+
+| xref:languages:file-language.adoc[File] (camel-core-languages) | 1.1 | For expressions and predicates using the file/simple language.
+
+| xref:languages:groovy-language.adoc[Groovy] (camel-groovy) | 1.3 | To use Groovy scripts in Camel expressions or predicates.
+
+| xref:languages:header-language.adoc[Header] (camel-core-languages) | 1.5 | To use a Camel Message header in expressions or predicates.
+
+| xref:languages:hl7terser-language.adoc[HL7 Terser] (camel-hl7) | 2.11 | To use HL7 terser scripts in Camel expressions or predicates.
+
+| xref:languages:jsonpath-language.adoc[JsonPath] (camel-jsonpath) | 2.13 | To use JsonPath in Camel expressions or predicates.
+
+| xref:languages:mvel-language.adoc[MVEL] (camel-mvel) | 2.0 | To use MVEL scripts in Camel expressions or predicates.
+
+| xref:languages:ognl-language.adoc[OGNL] (camel-ognl) | 1.1 | To use OGNL scripts in Camel expressions or predicates.
+
+| xref:languages:ref-language.adoc[Ref] (camel-core-languages) | 2.8 | Reference to an existing Camel expression or predicate, which is looked up from the Camel registry.
+
+| xref:languages:simple-language.adoc[Simple] (camel-core-languages) | 1.1 | To use Camels built-in Simple language in Camel expressions or predicates.
+
+| xref:languages:spel-language.adoc[SpEL] (camel-spring) | 2.7 | To use Spring Expression Language (SpEL) in Camel expressions or predicates.
+
+| xref:languages:tokenize-language.adoc[Tokenize] (camel-core-languages) | 2.0 | To use Camel message body or header with a tokenizer in Camel expressions or predicates.
+
+| xref:languages:xtokenize-language.adoc[XML Tokenize] (camel-xml-jaxp) | 2.14 | To use Camel message body or header with a XML tokenizer in Camel expressions or predicates.
+
+| xref:languages:xpath-language.adoc[XPath] (camel-xpath) | 1.1 | To use XPath (XML) in Camel expressions or predicates.
+
+| xref:languages:xquery-language.adoc[XQuery] (camel-saxon) | 1.0 | To use XQuery (XML) in Camel expressions or predicates.
+|===
+// languages: END
 
 == Miscellaneous Components