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 2018/10/12 11:26:45 UTC

[camel] 41/44: Prepare org.apache.camel.management for extraction

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

gnodet pushed a commit to branch sandbox/camel-3.x
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 7f16b9e78e2ddce1eecc6143c428f65d5dcc650f
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Fri Oct 12 09:50:54 2018 +0200

    Prepare org.apache.camel.management for extraction
    
    # Conflicts:
    #	camel-api/src/main/java/org/apache/camel/spi/ManagementObjectNameStrategy.java
    #	camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
    #	camel-core/src/main/java/org/apache/camel/impl/DefaultManagementStrategy.java
    #	camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
    #	camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectNameStrategy.java
    #	camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
    #	camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierExchangeSentParallelTest.java
    #	camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternIncludeHostNameTest.java
    #	components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
---
 .../main/java/org/apache/camel/CamelContext.java   |   64 +-
 .../src/main/java/org/apache/camel/Service.java    |    6 +
 .../org/apache/camel/health/HealthCheckHelper.java |    6 +-
 .../apache/camel/health/HealthCheckRegistry.java   |   18 +
 .../camel/spi/ManagementInterceptStrategy.java     |   35 +-
 .../camel/spi/ManagementObjectNameStrategy.java    |    4 +-
 .../org/apache/camel/spi/ManagementStrategy.java   |   42 +-
 .../java/org/apache/camel/spi/RouteContext.java    |    4 +-
 .../org/apache/camel/support/ServiceSupport.java   |   51 +-
 camel-core/src/main/docs/eips/pollEnrich-eip.adoc  |    2 +-
 .../org/apache/camel/builder/NotifyBuilder.java    |    4 -
 .../DefaultComponentVerifierExtension.java         |    2 +-
 .../apache/camel/component/mock/MockEndpoint.java  |    6 +-
 .../rest/RestComponentVerifierExtension.java       |    2 +-
 .../org/apache/camel/impl/DefaultCamelContext.java |  295 +++---
 .../org/apache/camel/impl/DefaultDebugger.java     |   10 -
 .../DefaultManagementStrategy.java                 |   49 +-
 .../org/apache/camel/impl/DefaultRouteContext.java |   16 +-
 .../java/org/apache/camel/impl/ServicePool.java    |    4 +-
 .../impl/health/DefaultHealthCheckService.java     |    2 +-
 .../apache/camel/impl/health/RouteHealthCheck.java |   11 +-
 .../java/org/apache/camel/main/MainSupport.java    |    2 +-
 ...r.java => DefaultInstrumentationProcessor.java} |   22 +-
 .../camel/management/DefaultManagementAgent.java   |    3 +
 .../DefaultManagementLifecycleStrategy.java        |   29 +-
 .../DefaultManagementObjectNameStrategy.java       |   94 +-
 .../DefaultManagementObjectStrategy.java           |    2 +-
 .../InstrumentationInterceptStrategy.java          |   24 +-
 .../management/JmxNotificationEventNotifier.java   |    4 -
 .../camel/management/LoggingEventNotifier.java     |    2 -
 .../camel/management/ManagedCamelContextImpl.java  |  104 ++
 .../management/ManagedManagementStrategy.java      |  174 +---
 .../management/ManagementStrategyFactory.java      |   16 +-
 .../camel/management/mbean/ManagedCamelHealth.java |    2 +-
 .../management/mbean/RouteCoverageXmlParser.java   |    8 +-
 .../camel/model/DynamicRouterDefinition.java       |    2 +-
 .../org/apache/camel/model/EnrichDefinition.java   |    2 +-
 .../camel/processor/CamelInternalProcessor.java    |   88 +-
 .../processor/CamelInternalProcessorAdvice.java    |   53 +-
 .../InterceptorToAsyncProcessorBridge.java         |   12 +-
 .../apache/camel/processor/RestBindingAdvice.java  |    2 +-
 .../processor/interceptor/BacklogDebugger.java     |   31 +-
 .../camel/processor/interceptor/BacklogTracer.java |   16 +-
 .../processor/interceptor/DefaultChannel.java      |  105 +-
 .../java/org/apache/camel/support/EventHelper.java | 1095 +++-----------------
 .../apache/camel/support/EventNotifierSupport.java |    6 +
 .../apache/camel/support/ProcessorEndpoint.java    |    6 +-
 .../throttling/ThrottlingInflightRoutePolicy.java  |   10 -
 .../java/org/apache/camel/ContextTestSupport.java  |    7 +-
 .../camel/builder/BuilderWithScopesTest.java       |    3 +-
 .../direct/DirectNoMultipleConsumersTest.java      |    2 +-
 .../CamelCustomDefaultThreadPoolProfileTest.java   |    5 +-
 .../camel/impl/CustomThreadPoolFactoryTest.java    |    4 +-
 .../impl/DefaultCamelContextAutoStartupTest.java   |   12 +-
 .../apache/camel/impl/DefaultCamelContextTest.java |   40 +-
 .../camel/impl/event/EventNotifierEventsTest.java  |   12 -
 .../event/EventNotifierExchangeCompletedTest.java  |    8 -
 .../impl/event/EventNotifierExchangeSentTest.java  |    8 -
 .../EventNotifierFailureHandledEventsTest.java     |   12 -
 .../event/EventNotifierRedeliveryEventsTest.java   |    8 -
 ...ventNotifierServiceStoppingFailedEventTest.java |   13 +-
 .../event/MultipleEventNotifierEventsTest.java     |   20 -
 .../impl/health/DefaultHealthCheckServiceTest.java |    3 +-
 .../issues/SentExchangeEventNotifierIssueTest.java |    1 +
 .../SentExchangeEventNotifierTwoIssueTest.java     |    1 +
 .../camel/management/AddEventNotifierTest.java     |   12 -
 .../management/CamelContextDisableJmxTest.java     |    2 +-
 ...ationOnlyRegisterProcessorWithCustomIdTest.java |    2 +
 .../management/ManagedAggregateControllerTest.java |    3 +-
 .../ManagedCamelContextEmptyRouteTest.java         |    1 +
 .../ManagedCamelContextPropertiesTest.java         |    1 +
 .../management/ManagedCamelContextRestartTest.java |    4 -
 .../camel/management/ManagedCamelContextTest.java  |    4 +-
 .../camel/management/ManagedComponentTest.java     |    1 +
 .../camel/management/ManagedDynamicRouterTest.java |    1 +
 .../ManagedEndpointUtilizationStatisticsTest.java  |    1 +
 .../camel/management/ManagedEnricherTest.java      |    1 +
 .../management/ManagedInlinedProcessorTest.java    |    3 +-
 .../management/ManagedListComponentsTest.java      |    2 +
 .../management/ManagedNamePatternFixedTest.java    |    1 +
 .../ManagedNamePatternIncludeHostNameTest.java     |    1 +
 .../camel/management/ManagedNamePatternTest.java   |    1 +
 .../camel/management/ManagedPollEnricherTest.java  |    1 +
 ...gedProducerRecipientListRegisterAlwaysTest.java |    1 +
 ...edProducerRouteAddRemoveRegisterAlwaysTest.java |    1 +
 .../camel/management/ManagedRecipientListTest.java |    1 +
 .../ManagedRouteSuspendAndResumeTest.java          |    3 +-
 .../camel/management/ManagedRoutingSlipTest.java   |    1 +
 .../camel/management/ManagedSanitizeTest.java      |    1 +
 .../ManagedSendDynamicProcessorTest.java           |    1 +
 .../management/ManagedStatisticsLevelOffTest.java  |    1 +
 .../ManagedStatisticsLevelRoutesOnlyTest.java      |    2 +-
 .../camel/management/ManagedWireTapTest.java       |    1 +
 .../camel/management/RemoveEventNotifierTest.java  |   12 -
 .../EventNotifierExchangeSentExampleTest.java      |    1 +
 .../camel/processor/MyLoggingSentEventNotifer.java |   12 -
 .../camel/processor/MySentEventNotifier.java       |   12 -
 .../ProducerTemplateDisableEventNotifierTest.java  |    1 +
 ...litterUseOriginalNotPropagateExceptionTest.java |    1 +
 .../camel/processor/UnitOfWorkProducerTest.java    |    8 -
 .../AsyncEndpointEventNotifierSendingTest.java     |    4 -
 .../async/AsyncEndpointEventNotifierTest.java      |    8 -
 .../EnricherAsyncUnhandledExceptionTest.java       |    1 +
 .../processor/enricher/EnricherSendEventTest.java  |   17 +-
 .../DynamicRouterEventNotifierTest.java            |   11 +-
 .../RecipientListEventNotifierTest.java            |   11 +-
 .../routingslip/RoutingSlipEventNotifierTest.java  |   11 +-
 .../runtimecatalog/impl/JSonSchemaHelperTest.java  |    3 +-
 .../impl/RuntimeCamelCatalogTest.java              |    2 +-
 .../camel/api}/management/ManagedCamelContext.java |   36 +-
 .../camel/component/beanstalk/EndpointTest.java    |    2 +-
 .../camel/blueprint/BlueprintCamelContext.java     |    2 +-
 .../camel/core/osgi/OsgiCamelContextPublisher.java |    8 -
 .../core/xml/AbstractCamelContextFactoryBean.java  |   11 +-
 .../component/couchbase/CouchbaseConsumer.java     |    3 +-
 .../camel/http/common/HttpSendDynamicAware.java    |    4 +-
 ...sumerObserveAttributeMatchStringDifferTest.java |   10 +-
 ...JmxConsumerObserveAttributeMatchStringTest.java |   10 +-
 .../jmx/CamelJmxConsumerObserveAttributeTest.java  |    6 +-
 .../camel/component/jmx/CamelJmxConsumerTest.java  |    4 +-
 .../engine/DefaultCamelReactiveStreamsService.java |    2 +-
 .../camel/spring/boot/CamelAutoConfiguration.java  |    6 +-
 .../boot/actuate/endpoint/CamelRoutesEndpoint.java |    6 +-
 .../camel/spring/boot/model/RouteDetailsInfo.java  |    5 +-
 .../boot/health/HealthCheckRegistryTest.java       |    3 +-
 .../apache/camel/spring/SpringCamelContext.java    |    8 +-
 .../spring/health/HealthCheckRegistryTest.java     |    3 +-
 .../camel/spring/management/MyEventNotifier.java   |   11 -
 .../blueprint/health/HealthCheckRegistryTest.java  |    3 +-
 .../camel/test/spring/CamelAnnotationsHandler.java |    3 +-
 .../camel/test/spring/RouteCoverageDumper.java     |    4 +-
 ...pringRunnerDisableJmxInheritedOverrideTest.java |    2 +-
 .../test/spring/CamelSpringRunnerPlainTest.java    |    2 +-
 .../apache/camel/test/junit4/CamelTestSupport.java |    8 +-
 .../camel/example/cdi/test/CustomContextTest.java  |    2 +-
 .../commands/AbstractLocalCamelController.java     |    4 +-
 .../commands/internal/CamelControllerImpl.java     |   10 +-
 137 files changed, 1014 insertions(+), 2040 deletions(-)

diff --git a/camel-api/src/main/java/org/apache/camel/CamelContext.java b/camel-api/src/main/java/org/apache/camel/CamelContext.java
index 704624b..f6d712f 100644
--- a/camel-api/src/main/java/org/apache/camel/CamelContext.java
+++ b/camel-api/src/main/java/org/apache/camel/CamelContext.java
@@ -24,8 +24,6 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.ScheduledExecutorService;
 
-import org.apache.camel.health.HealthCheckRegistry;
-import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
 import org.apache.camel.spi.CamelContextNameStrategy;
 import org.apache.camel.spi.ClassResolver;
@@ -108,6 +106,9 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration {
      */
     <T extends CamelContext> T adapt(Class<T> type);
 
+    <T> T getExtension(Class<T> type);
+    <T> void setExtension(Class<T> type, T module);
+
     /**
      * If CamelContext during the start procedure was vetoed, and therefore causing Camel to not start.
      */
@@ -1076,40 +1077,6 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration {
     void setManagementStrategy(ManagementStrategy strategy);
 
     /**
-     * Gets the default backlog tracer
-     *
-     * @return the default backlog tracer
-     */
-    InterceptStrategy getDefaultBacklogTracer();
-
-    /**
-     * Sets a custom backlog tracer to be used as the default backlog tracer.
-     * <p/>
-     * <b>Note:</b> This must be set before any routes are created,
-     * changing the default backlog tracer for existing routes is not supported.
-     *
-     * @param backlogTracer the custom tracer to use as default backlog tracer
-     */
-    void setDefaultBacklogTracer(InterceptStrategy backlogTracer);
-
-    /**
-     * Gets the default backlog debugger
-     *
-     * @return the default backlog debugger
-     */
-    InterceptStrategy getDefaultBacklogDebugger();
-
-    /**
-     * Sets a custom backlog debugger to be used as the default backlog debugger.
-     * <p/>
-     * <b>Note:</b> This must be set before any routes are created,
-     * changing the default backlog debugger for existing routes is not supported.
-     *
-     * @param backlogDebugger the custom debugger to use as default backlog debugger
-     */
-    void setDefaultBacklogDebugger(InterceptStrategy backlogDebugger);
-
-    /**
      * Disables using JMX as {@link org.apache.camel.spi.ManagementStrategy}.
      * <p/>
      * <b>Important:</b> This method must be called <b>before</b> the {@link CamelContext} is started.
@@ -1527,11 +1494,6 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration {
     void setReloadStrategy(ReloadStrategy reloadStrategy);
 
     /**
-     * Gets the associated {@link RuntimeCamelCatalog} for this CamelContext.
-     */
-    RuntimeCamelCatalog getRuntimeCamelCatalog();
-
-    /**
      * Gets a list of {@link LogListener}.
      */
     Set<LogListener> getLogListeners();
@@ -1561,24 +1523,4 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration {
      */
     void setHeadersMapFactory(HeadersMapFactory factory);
 
-    /**
-     * Returns an optional {@link HealthCheckRegistry}, by default no registry is
-     * present and it must be explicit activated. Components can register/unregister
-     * health checks in response to life-cycle events (i.e. start/stop).
-     *
-     * This registry is not used by the camel context but it is up to the impl to
-     * properly use it, i.e.
-     *
-     * - a RouteController could use the registry to decide to restart a route
-     *   with failing health checks
-     * - spring boot could integrate such checks within its health endpoint or
-     *   make it available only as separate endpoint.
-     */
-    HealthCheckRegistry getHealthCheckRegistry();
-
-    /**
-     * Sets a {@link HealthCheckRegistry}.
-     */
-    void setHealthCheckRegistry(HealthCheckRegistry healthCheckRegistry);
-
 }
diff --git a/camel-api/src/main/java/org/apache/camel/Service.java b/camel-api/src/main/java/org/apache/camel/Service.java
index fd198e7..3efde1b 100644
--- a/camel-api/src/main/java/org/apache/camel/Service.java
+++ b/camel-api/src/main/java/org/apache/camel/Service.java
@@ -22,6 +22,12 @@ package org.apache.camel;
 public interface Service {
 
     /**
+     * Initialize the service
+     */
+    default void init() {
+    }
+
+    /**
      * Starts the service
      * 
      * @throws Exception is thrown if starting failed
diff --git a/camel-api/src/main/java/org/apache/camel/health/HealthCheckHelper.java b/camel-api/src/main/java/org/apache/camel/health/HealthCheckHelper.java
index 25596bc..6a51a15 100644
--- a/camel-api/src/main/java/org/apache/camel/health/HealthCheckHelper.java
+++ b/camel-api/src/main/java/org/apache/camel/health/HealthCheckHelper.java
@@ -84,7 +84,7 @@ public final class HealthCheckHelper {
             Function<HealthCheck, Map<String, Object>> optionsSupplier,
             HealthCheckFilter filter) {
 
-        final HealthCheckRegistry registry = camelContext.getHealthCheckRegistry();
+        final HealthCheckRegistry registry = HealthCheckRegistry.get(camelContext);
         final HealthCheckService service = camelContext.hasService(HealthCheckService.class);
 
         if (service != null) {
@@ -123,7 +123,7 @@ public final class HealthCheckHelper {
      * @return an optional {@link HealthCheck.Result}.
      */
     public static Optional<HealthCheck.Result> query(CamelContext camelContext, String id, Map<String, Object> options) {
-        final HealthCheckRegistry registry = camelContext.getHealthCheckRegistry();
+        final HealthCheckRegistry registry = HealthCheckRegistry.get(camelContext);
         final HealthCheckService service = camelContext.hasService(HealthCheckService.class);
 
         if (service != null) {
@@ -148,7 +148,7 @@ public final class HealthCheckHelper {
      * @return an optional {@link HealthCheck.Result}.
      */
     public static Optional<HealthCheck.Result> invoke(CamelContext camelContext, String id, Map<String, Object> options) {
-        final HealthCheckRegistry registry = camelContext.getHealthCheckRegistry();
+        final HealthCheckRegistry registry = HealthCheckRegistry.get(camelContext);
         final HealthCheckService service = camelContext.hasService(HealthCheckService.class);
 
         if (service != null) {
diff --git a/camel-api/src/main/java/org/apache/camel/health/HealthCheckRegistry.java b/camel-api/src/main/java/org/apache/camel/health/HealthCheckRegistry.java
index dc523eb..6f389d1 100644
--- a/camel-api/src/main/java/org/apache/camel/health/HealthCheckRegistry.java
+++ b/camel-api/src/main/java/org/apache/camel/health/HealthCheckRegistry.java
@@ -20,6 +20,7 @@ import java.util.Collection;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.util.ObjectHelper;
 
@@ -77,4 +78,21 @@ public interface HealthCheckRegistry extends HealthCheckRepository, CamelContext
             .filter(check -> ObjectHelper.equal(check.getId(), id))
             .findFirst();
     }
+
+    /**
+     * Returns an optional {@link HealthCheckRegistry}, by default no registry is
+     * present and it must be explicit activated. Components can register/unregister
+     * health checks in response to life-cycle events (i.e. start/stop).
+     *
+     * This registry is not used by the camel context but it is up to the impl to
+     * properly use it, i.e.
+     *
+     * - a RouteController could use the registry to decide to restart a route
+     *   with failing health checks
+     * - spring boot could integrate such checks within its health endpoint or
+     *   make it available only as separate endpoint.
+     */
+    static HealthCheckRegistry get(CamelContext context) {
+        return context.getExtension(HealthCheckRegistry.class);
+    }
 }
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/management/MyEventNotifier.java b/camel-api/src/main/java/org/apache/camel/spi/ManagementInterceptStrategy.java
similarity index 54%
copy from components/camel-spring/src/test/java/org/apache/camel/spring/management/MyEventNotifier.java
copy to camel-api/src/main/java/org/apache/camel/spi/ManagementInterceptStrategy.java
index b40be29..12deb3b 100644
--- a/components/camel-spring/src/test/java/org/apache/camel/spring/management/MyEventNotifier.java
+++ b/camel-api/src/main/java/org/apache/camel/spi/ManagementInterceptStrategy.java
@@ -14,35 +14,28 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.spring.management;
+package org.apache.camel.spi;
 
-import java.util.ArrayList;
-import java.util.List;
+import org.apache.camel.AsyncProcessor;
+import org.apache.camel.Exchange;
+import org.apache.camel.NamedNode;
+import org.apache.camel.Ordered;
+import org.apache.camel.Processor;
 
-import org.apache.camel.spi.CamelEvent;
-import org.apache.camel.support.EventNotifierSupport;
+public interface ManagementInterceptStrategy {
 
-public class MyEventNotifier extends EventNotifierSupport {
+    InstrumentationProcessor<?> createProcessor(NamedNode definition, Processor target);
 
-    private List<CamelEvent> events = new ArrayList<>();
+    InstrumentationProcessor<?> createProcessor(String type);
 
-    public void notify(CamelEvent event) throws Exception {
-        events.add(event);
-    }
+    interface InstrumentationProcessor<T> extends AsyncProcessor, Ordered {
 
-    public boolean isEnabled(CamelEvent event) {
-        return true;
-    }
+        T before(Exchange exchange) throws Exception;
 
-    public List<CamelEvent> getEvents() {
-        return events;
-    }
+        void after(Exchange exchange, T data) throws Exception;
 
-    @Override
-    protected void doStart() throws Exception {
-    }
+        void setProcessor(Processor processor);
 
-    @Override
-    protected void doStop() throws Exception {
+        void setCounter(Object object);
     }
 }
diff --git a/camel-api/src/main/java/org/apache/camel/spi/ManagementObjectNameStrategy.java b/camel-api/src/main/java/org/apache/camel/spi/ManagementObjectNameStrategy.java
index 808ad10..7a75b33 100644
--- a/camel-api/src/main/java/org/apache/camel/spi/ManagementObjectNameStrategy.java
+++ b/camel-api/src/main/java/org/apache/camel/spi/ManagementObjectNameStrategy.java
@@ -38,6 +38,8 @@ import org.apache.camel.cluster.CamelClusterService;
  */
 public interface ManagementObjectNameStrategy {
 
+    ObjectName getObjectName(Object managedObject) throws MalformedObjectNameException;
+
     ObjectName getObjectNameForCamelContext(String managementName, String name) throws MalformedObjectNameException;
 
     ObjectName getObjectNameForCamelHealth(CamelContext context) throws MalformedObjectNameException;
@@ -62,7 +64,7 @@ public interface ManagementObjectNameStrategy {
 
     ObjectName getObjectNameForProducer(CamelContext context, Producer producer) throws MalformedObjectNameException;
 
-    ObjectName getObjectNameForTracer(CamelContext context, InterceptStrategy tracer) throws MalformedObjectNameException;
+    ObjectName getObjectNameForTracer(CamelContext context, Service tracer) throws MalformedObjectNameException;
 
     ObjectName getObjectNameForService(CamelContext context, Service service) throws MalformedObjectNameException;
 
diff --git a/camel-api/src/main/java/org/apache/camel/spi/ManagementStrategy.java b/camel-api/src/main/java/org/apache/camel/spi/ManagementStrategy.java
index 49573c4..33ff9bc 100644
--- a/camel-api/src/main/java/org/apache/camel/spi/ManagementStrategy.java
+++ b/camel-api/src/main/java/org/apache/camel/spi/ManagementStrategy.java
@@ -43,28 +43,6 @@ public interface ManagementStrategy extends Service {
     void manageObject(Object managedObject) throws Exception;
 
     /**
-     * Adds a managed object allowing the ManagementStrategy implementation
-     * to record or expose the object as it sees fit.
-     *
-     * @param managedObject the managed object
-     * @param preferredName representing the preferred name, maybe a String, or a JMX ObjectName
-     * @throws Exception can be thrown if the object could not be added
-     */
-    void manageNamedObject(Object managedObject, Object preferredName) throws Exception;
-
-    /**
-     * Construct an object name, where either the object to be managed and/or
-     * a custom name component are provided
-     *
-     * @param managedObject the object to be managed
-     * @param customName a custom name component
-     * @param nameType the name type required
-     * @return an object name of the required type if supported, otherwise <tt>null</tt>
-     * @throws Exception can be thrown if the object name could not be created
-     */
-    <T> T getManagedObjectName(Object managedObject, String customName, Class<T> nameType) throws Exception;
-
-    /**
      * Removes the managed object.
      *
      * @param managedObject the managed object
@@ -73,21 +51,20 @@ public interface ManagementStrategy extends Service {
     void unmanageObject(Object managedObject) throws Exception;
 
     /**
-     * Removes a managed object by name.
+     * Determines if an object or name is managed.
      *
-     * @param name an object name previously created by this strategy.
-     * @throws Exception can be thrown if the object could not be removed
+     * @param managedObject the object to consider
+     * @return <tt>true</tt> if the given object is managed
      */
-    void unmanageNamedObject(Object name) throws Exception;
+    boolean isManaged(Object managedObject);
 
     /**
      * Determines if an object or name is managed.
      *
-     * @param managedObject the object to consider
      * @param name the name to consider
-     * @return <tt>true</tt> if the given object or name is managed
+     * @return <tt>true</tt> if the given name is managed
      */
-    boolean isManaged(Object managedObject, Object name);
+    boolean isManagedName(Object name);
 
     /**
      * Management events provide a single model for capturing information about execution points in the
@@ -108,13 +85,6 @@ public interface ManagementStrategy extends Service {
     List<EventNotifier> getEventNotifiers();
 
     /**
-     * Sets the list of event notifier to use.
-     *
-     * @param eventNotifier list of event notifiers
-     */
-    void setEventNotifiers(List<EventNotifier> eventNotifier);
-
-    /**
      * Adds the event notifier to use.
      * <p/>
      * Ensure the event notifier has been started if its a {@link Service}, as otherwise
diff --git a/camel-api/src/main/java/org/apache/camel/spi/RouteContext.java b/camel-api/src/main/java/org/apache/camel/spi/RouteContext.java
index 10b7eac..8da17d4 100644
--- a/camel-api/src/main/java/org/apache/camel/spi/RouteContext.java
+++ b/camel-api/src/main/java/org/apache/camel/spi/RouteContext.java
@@ -138,14 +138,14 @@ public interface RouteContext extends RuntimeConfiguration, EndpointAware {
      *
      * @param interceptStrategy the managed intercept strategy
      */
-    void setManagedInterceptStrategy(InterceptStrategy interceptStrategy);
+    void setManagementInterceptStrategy(ManagementInterceptStrategy interceptStrategy);
 
     /**
      * Gets the special managed intercept strategy if any
      *
      * @return the managed intercept strategy, or <tt>null</tt> if not managed
      */
-    InterceptStrategy getManagedInterceptStrategy();
+    ManagementInterceptStrategy getManagementInterceptStrategy();
 
     /**
      * If this flag is true, {@link org.apache.camel.model.ProcessorDefinition#addRoutes(RouteContext, java.util.Collection)}
diff --git a/camel-api/src/main/java/org/apache/camel/support/ServiceSupport.java b/camel-api/src/main/java/org/apache/camel/support/ServiceSupport.java
index ccbd8b4..be0f98c 100644
--- a/camel-api/src/main/java/org/apache/camel/support/ServiceSupport.java
+++ b/camel-api/src/main/java/org/apache/camel/support/ServiceSupport.java
@@ -36,20 +36,31 @@ import org.slf4j.LoggerFactory;
 public abstract class ServiceSupport implements StatefulService {
 
     protected static final int NEW = 0;
-    protected static final int STARTING = 1;
-    protected static final int STARTED = 2;
-    protected static final int SUSPENDING = 3;
-    protected static final int SUSPENDED = 4;
-    protected static final int STOPPING = 5;
-    protected static final int STOPPED = 6;
-    protected static final int SHUTTINGDOWN = 7;
-    protected static final int SHUTDOWN = 8;
-    protected static final int FAILED = 9;
+    protected static final int INITIALIZED = 1;
+    protected static final int STARTING = 2;
+    protected static final int STARTED = 3;
+    protected static final int SUSPENDING = 4;
+    protected static final int SUSPENDED = 5;
+    protected static final int STOPPING = 6;
+    protected static final int STOPPED = 7;
+    protected static final int SHUTTINGDOWN = 8;
+    protected static final int SHUTDOWN = 9;
+    protected static final int FAILED = 10;
 
     protected final Logger log = LoggerFactory.getLogger(getClass());
     protected final Object lock = new Object();
     protected volatile int status = NEW;
 
+    public void init() {
+        synchronized (lock) {
+            if (status == NEW) {
+                log.trace("Initializing service");
+                doInit();
+                status = INITIALIZED;
+            }
+        }
+    }
+
     /**
      * <b>Important: </b> You should override the lifecycle methods that start with <tt>do</tt>, eg {@link #doStart()},
      * {@link #doStop()}, etc. where you implement your logic. The methods {@link #start()}, {@link #stop()} should
@@ -66,9 +77,10 @@ public abstract class ServiceSupport implements StatefulService {
                 log.trace("Service already starting");
                 return;
             }
-            status = STARTING;
-            log.trace("Starting service");
+            init();
             try {
+                status = STARTING;
+                log.trace("Starting service");
                 doStart();
                 status = STARTED;
                 log.trace("Service started");
@@ -217,7 +229,15 @@ public abstract class ServiceSupport implements StatefulService {
                 return ServiceStatus.Stopped;
         }
     }
-    
+
+    public boolean isNew() {
+        return status == NEW;
+    }
+
+    public boolean isInit() {
+        return status == INITIALIZED;
+    }
+
     @Override
     public boolean isStarted() {
         return status == STARTED;
@@ -279,6 +299,13 @@ public abstract class ServiceSupport implements StatefulService {
     }
 
     /**
+     * Initialize the service.
+     * This method will only be called once before starting.
+     */
+    protected void doInit() {
+    }
+
+    /**
      * Implementations override this method to support customized start/stop.
      * <p/>
      * <b>Important: </b> See {@link #doStop()} for more details.
diff --git a/camel-core/src/main/docs/eips/pollEnrich-eip.adoc b/camel-core/src/main/docs/eips/pollEnrich-eip.adoc
index 9207655..3d63d86 100644
--- a/camel-core/src/main/docs/eips/pollEnrich-eip.adoc
+++ b/camel-core/src/main/docs/eips/pollEnrich-eip.adoc
@@ -49,7 +49,7 @@ The Poll Enrich EIP supports 7 options which are listed below:
 | *strategyMethodName* | This option can be used to explicit declare the method name to use, when using POJOs as the AggregationStrategy. |  | String
 | *strategyMethodAllowNull* | If this option is false then the aggregate method is not used if there was no data to enrich. If this option is true then null values is used as the oldExchange (when no data to enrich), when using POJOs as the AggregationStrategy. | false | Boolean
 | *aggregateOnException* | If this option is false then the aggregate method is not used if there was an exception thrown while trying to retrieve the data to enrich from the resource. Setting this option to true allows end users to control what to do if there was an exception in the aggregate method. For example to suppress the exception or set a custom message body etc. | false | Boolean
-| *cacheSize* | Sets the maximum size used by the org.apache.camel.spi.ConsumerCache which is used to cache and reuse consumers when uris are reused. |  | Integer
+| *cacheSize* | Sets the maximum size used by the DefaultConsumerCache which is used to cache and reuse consumers when uris are reused. |  | Integer
 | *ignoreInvalidEndpoint* | Ignore the invalidate endpoint exception when try to create a producer with that endpoint | false | Boolean
 |===
 // eip options: END
diff --git a/camel-core/src/main/java/org/apache/camel/builder/NotifyBuilder.java b/camel-core/src/main/java/org/apache/camel/builder/NotifyBuilder.java
index cbf4f2c..3f02b31 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/NotifyBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/NotifyBuilder.java
@@ -1411,10 +1411,6 @@ public class NotifyBuilder {
             setIgnoreRouteEvents(true);
             setIgnoreServiceEvents(true);
         }
-
-        @Override
-        protected void doStop() throws Exception {
-        }
     }
 
     private enum EventOperation {
diff --git a/camel-core/src/main/java/org/apache/camel/component/extension/verifier/DefaultComponentVerifierExtension.java b/camel-core/src/main/java/org/apache/camel/component/extension/verifier/DefaultComponentVerifierExtension.java
index 20aa336..b93fefd 100644
--- a/camel-core/src/main/java/org/apache/camel/component/extension/verifier/DefaultComponentVerifierExtension.java
+++ b/camel-core/src/main/java/org/apache/camel/component/extension/verifier/DefaultComponentVerifierExtension.java
@@ -125,7 +125,7 @@ public class DefaultComponentVerifierExtension implements ComponentVerifierExten
         }
 
         // Grab the runtime catalog to check parameters
-        RuntimeCamelCatalog catalog = camelContext.getRuntimeCamelCatalog();
+        RuntimeCamelCatalog catalog = camelContext.getExtension(RuntimeCamelCatalog.class);
 
         // Convert from Map<String, Object> to  Map<String, String> as required
         // by the Camel Catalog
diff --git a/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java b/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java
index 7ada755..a3088c7 100644
--- a/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java
@@ -43,6 +43,7 @@ import org.apache.camel.Message;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
+import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.builder.ProcessorBuilder;
 import org.apache.camel.impl.InterceptSendToEndpoint;
 import org.apache.camel.spi.BrowsableEndpoint;
@@ -133,6 +134,7 @@ public class MockEndpoint extends DefaultEndpoint implements BrowsableEndpoint {
     private boolean copyOnExchange = true;
 
     public MockEndpoint() {
+        init();
     }
 
     public MockEndpoint(String endpointUri, Component component) {
@@ -294,7 +296,7 @@ public class MockEndpoint extends DefaultEndpoint implements BrowsableEndpoint {
     }
 
     public void reset() {
-        init();
+        doInit();
     }
 
 
@@ -1274,7 +1276,7 @@ public class MockEndpoint extends DefaultEndpoint implements BrowsableEndpoint {
 
     // Implementation methods
     // -------------------------------------------------------------------------
-    private void init() {
+    protected void doInit() {
         expectedCount = -1;
         counter = 0;
         defaultProcessor = null;
diff --git a/camel-core/src/main/java/org/apache/camel/component/rest/RestComponentVerifierExtension.java b/camel-core/src/main/java/org/apache/camel/component/rest/RestComponentVerifierExtension.java
index 649692d..079b646 100644
--- a/camel-core/src/main/java/org/apache/camel/component/rest/RestComponentVerifierExtension.java
+++ b/camel-core/src/main/java/org/apache/camel/component/rest/RestComponentVerifierExtension.java
@@ -85,7 +85,7 @@ public class RestComponentVerifierExtension extends DefaultComponentVerifierExte
 
                 if (extension.isPresent()) {
                     final ComponentVerifierExtension verifier = extension.get();
-                    final RuntimeCamelCatalog catalog = getCamelContext().getRuntimeCamelCatalog();
+                    final RuntimeCamelCatalog catalog = getCamelContext().getExtension(RuntimeCamelCatalog.class);
                     final String json = catalog.componentJSonSchema("rest");
                     final Map<String, Object> restParameters = new HashMap<>(parameters);
 
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
index a68ec91..e8edd43 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
@@ -42,9 +42,8 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
+import java.util.function.Supplier;
 
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
 import javax.naming.Context;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.Unmarshaller;
@@ -83,9 +82,6 @@ import org.apache.camel.Suspendable;
 import org.apache.camel.SuspendableService;
 import org.apache.camel.TypeConverter;
 import org.apache.camel.VetoCamelContextStartException;
-import org.apache.camel.api.management.mbean.ManagedCamelContextMBean;
-import org.apache.camel.api.management.mbean.ManagedProcessorMBean;
-import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.builder.DefaultFluentProducerTemplate;
 import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilderSupport;
@@ -96,10 +92,6 @@ import org.apache.camel.impl.converter.DefaultTypeConverter;
 import org.apache.camel.impl.health.DefaultHealthCheckRegistry;
 import org.apache.camel.impl.transformer.TransformerKey;
 import org.apache.camel.impl.validator.ValidatorKey;
-import org.apache.camel.management.DefaultManagementMBeanAssembler;
-import org.apache.camel.management.DefaultManagementStrategy;
-import org.apache.camel.management.JmxSystemPropertyKeys;
-import org.apache.camel.management.ManagedCamelContext;
 import org.apache.camel.management.ManagementStrategyFactory;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.model.FromDefinition;
@@ -116,8 +108,6 @@ import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
 import org.apache.camel.model.transformer.TransformerDefinition;
 import org.apache.camel.model.validator.ValidatorDefinition;
-import org.apache.camel.processor.interceptor.BacklogDebugger;
-import org.apache.camel.processor.interceptor.BacklogTracer;
 import org.apache.camel.processor.interceptor.Debug;
 import org.apache.camel.processor.interceptor.HandleFault;
 import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
@@ -199,13 +189,13 @@ import static org.apache.camel.impl.MDCUnitOfWork.MDC_CAMEL_CONTEXT_ID;
 /**
  * Represents the context used to configure routes and the policies to use.
  */
-public class DefaultCamelContext extends ServiceSupport implements ModelCamelContext, ManagedCamelContext, Suspendable {
+public class DefaultCamelContext extends ServiceSupport implements ModelCamelContext, Suspendable {
 
     private String version;
     private final AtomicBoolean vetoStated = new AtomicBoolean();
     private JAXBContext jaxbContext;
-    private CamelContextNameStrategy nameStrategy = createCamelContextNameStrategy();
-    private ManagementNameStrategy managementNameStrategy = createManagementNameStrategy();
+    private CamelContextNameStrategy nameStrategy;
+    private ManagementNameStrategy managementNameStrategy;
     private String managementName;
     private ClassLoader applicationContextClassLoader;
     private EndpointRegistry<EndpointKey> endpoints;
@@ -236,7 +226,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
     private List<InterceptStrategy> interceptStrategies = new ArrayList<>();
     private List<RoutePolicyFactory> routePolicyFactories = new ArrayList<>();
     private Set<LogListener> logListeners = new LinkedHashSet<>();
-    private HeadersMapFactory headersMapFactory = createHeadersMapFactory();
+    private HeadersMapFactory headersMapFactory;
     // special flags to control the first startup which can are special
     private volatile boolean firstStartDone;
     private volatile boolean doNotStartRoutesOnFirstStart;
@@ -274,26 +264,24 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
     private PackageScanClassResolver packageScanClassResolver;
     // we use a capacity of 100 per endpoint, so for the same endpoint we have at most 100 producers in the pool
     // so if we have 6 endpoints in the pool, we can have 6 x 100 producers in total
-    private ServicePool<Producer> producerServicePool = createProducerServicePool();
-    private ServicePool<PollingConsumer> pollingConsumerServicePool = createPollingConsumerServicePool();
-    private NodeIdFactory nodeIdFactory = createNodeIdFactory();
-    private ProcessorFactory processorFactory = createProcessorFactory();
-    private MessageHistoryFactory messageHistoryFactory = createMessageHistoryFactory();
-    private InterceptStrategy defaultBacklogTracer;
-    private InterceptStrategy defaultBacklogDebugger;
-    private InflightRepository inflightRepository = createInflightRepository();
-    private AsyncProcessorAwaitManager asyncProcessorAwaitManager = createAsyncProcessorAwaitManager();
+    private ServicePool<Producer> producerServicePool;
+    private ServicePool<PollingConsumer> pollingConsumerServicePool;
+    private NodeIdFactory nodeIdFactory;
+    private ProcessorFactory processorFactory;
+    private MessageHistoryFactory messageHistoryFactory;
+    private InflightRepository inflightRepository;
+    private AsyncProcessorAwaitManager asyncProcessorAwaitManager;
     private RuntimeEndpointRegistry runtimeEndpointRegistry;
     private final List<RouteStartupOrder> routeStartupOrder = new ArrayList<>();
     // start auto assigning route ids using numbering 1000 and upwards
     private int defaultRouteStartupOrder = 1000;
-    private ShutdownStrategy shutdownStrategy = createShutdownStrategy();
+    private ShutdownStrategy shutdownStrategy;
     private ShutdownRoute shutdownRoute = ShutdownRoute.Default;
     private ShutdownRunningTask shutdownRunningTask = ShutdownRunningTask.CompleteCurrentTaskOnly;
     private ExecutorServiceManager executorServiceManager;
     private Debugger debugger;
-    private UuidGenerator uuidGenerator = createDefaultUuidGenerator();
-    private UnitOfWorkFactory unitOfWorkFactory = createUnitOfWorkFactory();
+    private UuidGenerator uuidGenerator;
+    private UnitOfWorkFactory unitOfWorkFactory;
     private final StopWatch stopWatch = new StopWatch(false);
     private Date startDate;
     private ModelJAXBContextFactory modelJAXBContextFactory;
@@ -302,7 +290,6 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
     private List<ValidatorDefinition> validators = new ArrayList<>();
     private ValidatorRegistry<ValidatorKey> validatorRegistry;
     private ReloadStrategy reloadStrategy;
-    private final RuntimeCamelCatalog runtimeCamelCatalog = createRuntimeCamelCatalog();
     private SSLContextParameters sslContextParameters;
     private final ThreadLocal<Set<String>> componentsInCreation = new ThreadLocal<Set<String>>() {
         @Override
@@ -311,8 +298,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
         }
     };
     private RouteController routeController = createRouteController();
-    private HealthCheckRegistry healthCheckRegistry = createHealthCheckRegistry();
-
+    private Map<Class<?>, Object> extensions = new ConcurrentHashMap<>();
 
     /**
      * Creates the {@link CamelContext} using {@link JndiRegistry} as registry,
@@ -321,25 +307,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
      * Use one of the other constructors to force use an explicit registry / JNDI.
      */
     public DefaultCamelContext() {
-        this.executorServiceManager = createExecutorServiceManager();
-
-        // 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 DefaultEndpointRegistry later, but we do this to starup Camel faster.
-        this.endpoints = new ProvisionalEndpointRegistry();
-
-        // add the defer service startup listener
-        this.startupListeners.add(deferStartupListener);
-
-        packageScanClassResolver = createPackageScanClassResolver();
-
-        // setup management strategy first since end users may use it to add event notifiers
-        // using the management strategy before the CamelContext has been started
-        this.managementStrategy = createManagementStrategy();
-        this.managementMBeanAssembler = createManagementMBeanAssembler();
-
-        // Call all registered trackers with this context
-        // Note, this may use a partially constructed object
-        CamelContextTracker.notifyContextCreated(this);
+        this(true);
     }
 
     /**
@@ -362,10 +330,110 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
         setRegistry(registry);
     }
 
+    public DefaultCamelContext(boolean init) {
+        // 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 DefaultEndpointRegistry later, but we do this to starup Camel faster.
+        this.endpoints = new ProvisionalEndpointRegistry();
+
+        // add the defer service startup listener
+        this.startupListeners.add(deferStartupListener);
+
+        if (init) {
+            init();
+        }
+    }
+
+    public void doInit() {
+        if (nameStrategy == null) {
+            nameStrategy = createCamelContextNameStrategy();
+        }
+        if (managementNameStrategy == null) {
+            managementNameStrategy = createManagementNameStrategy();
+        }
+        if (headersMapFactory == null) {
+            headersMapFactory = createHeadersMapFactory();
+        }
+        if (classResolver == null) {
+            classResolver = createClassResolver();
+        }
+        if (producerServicePool == null) {
+            producerServicePool = createProducerServicePool();
+        }
+        if (pollingConsumerServicePool == null) {
+            pollingConsumerServicePool = createPollingConsumerServicePool();
+        }
+        if (nodeIdFactory == null){
+            nodeIdFactory = createNodeIdFactory();
+        }
+        if (processorFactory == null) {
+            processorFactory = createProcessorFactory();
+        }
+        if (messageHistoryFactory == null) {
+            messageHistoryFactory = createMessageHistoryFactory();
+        }
+        if (inflightRepository == null) {
+            inflightRepository = createInflightRepository();
+        }
+        if (asyncProcessorAwaitManager == null) {
+            asyncProcessorAwaitManager = createAsyncProcessorAwaitManager();
+        }
+        if (shutdownStrategy == null) {
+            shutdownStrategy = createShutdownStrategy();
+        }
+        if (uuidGenerator == null) {
+            uuidGenerator = createDefaultUuidGenerator();
+        }
+        if (unitOfWorkFactory == null) {
+            unitOfWorkFactory = createUnitOfWorkFactory();
+        }
+        if (executorServiceManager == null) {
+            executorServiceManager = createExecutorServiceManager();
+        }
+        if (packageScanClassResolver == null) {
+            packageScanClassResolver = createPackageScanClassResolver();
+        }
+        if (managementStrategy == null) {
+            // setup management strategy first since end users may use it to add event notifiers
+            // using the management strategy before the CamelContext has been started
+            managementStrategy = createManagementStrategy();
+        }
+
+        setDefaultExtension(HealthCheckRegistry.class, this::createHealthCheckRegistry);
+        setDefaultExtension(RuntimeCamelCatalog.class, this::createRuntimeCamelCatalog);
+
+        // Call all registered trackers with this context
+        // Note, this may use a partially constructed object
+        CamelContextTracker.notifyContextCreated(this);
+
+    }
+
     public <T extends CamelContext> T adapt(Class<T> type) {
         return type.cast(this);
     }
 
+    @Override
+    public <T> T getExtension(Class<T> type) {
+        Object extension = extensions.get(type);
+        if (extension instanceof Supplier) {
+            setExtension(type, ((Supplier<T>) extension).get());
+        }
+        return type.cast(extensions.get(type));
+    }
+
+    @Override
+    public <T> void setExtension(Class<T> type, T module) {
+        try {
+            addService(module, true, true);
+            extensions.put(type, module);
+        } catch (Exception e) {
+            throw RuntimeCamelException.wrapRuntimeCamelException(e);
+        }
+    }
+
+    public <T> void setDefaultExtension(Class<T> type, Supplier<T> module) {
+        extensions.putIfAbsent(type, module);
+    }
+
     public boolean isVetoStarted() {
         return vetoStated.get();
     }
@@ -442,6 +510,8 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
     }
 
     public Component getComponent(String name, boolean autoCreateComponents, boolean autoStart) {
+        init();
+
         // Check if the named component is already being created, that would mean
         // that the initComponent has triggered a new getComponent
         if (componentsInCreation.get().contains(name)) {
@@ -655,6 +725,8 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
     }
 
     public Endpoint getEndpoint(String uri) {
+        init();
+
         StringHelper.notEmpty(uri, "uri");
 
         log.trace("Getting endpoint with uri: {}", uri);
@@ -914,62 +986,6 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
         return null;
     }
 
-    public <T extends ManagedProcessorMBean> T getManagedProcessor(String id, Class<T> type) {
-        // jmx must be enabled
-        if (getManagementStrategy().getManagementAgent() == null) {
-            return null;
-        }
-
-        Processor processor = getProcessor(id);
-        ProcessorDefinition def = getProcessorDefinition(id);
-
-        // processor may be null if its anonymous inner class or as lambda
-        if (def != null) {
-            try {
-                ObjectName on = getManagementStrategy().getManagementObjectNameStrategy().getObjectNameForProcessor(this, processor, def);
-                return getManagementStrategy().getManagementAgent().newProxyClient(on, type);
-            } catch (MalformedObjectNameException e) {
-                throw RuntimeCamelException.wrapRuntimeCamelException(e);
-            }
-        }
-
-        return null;
-    }
-
-    public <T extends ManagedRouteMBean> T getManagedRoute(String routeId, Class<T> type) {
-        // jmx must be enabled
-        if (getManagementStrategy().getManagementAgent() == null) {
-            return null;
-        }
-
-        Route route = getRoute(routeId);
-
-        if (route != null) {
-            try {
-                ObjectName on = getManagementStrategy().getManagementObjectNameStrategy().getObjectNameForRoute(route);
-                return getManagementStrategy().getManagementAgent().newProxyClient(on, type);
-            } catch (MalformedObjectNameException e) {
-                throw RuntimeCamelException.wrapRuntimeCamelException(e);
-            }
-        }
-
-        return null;
-    }
-
-    public ManagedCamelContextMBean getManagedCamelContext() {
-        // jmx must be enabled
-        if (getManagementStrategy().getManagementAgent() == null) {
-            return null;
-        }
-
-        try {
-            ObjectName on = getManagementStrategy().getManagementObjectNameStrategy().getObjectNameForCamelContext(this);
-            return getManagementStrategy().getManagementAgent().newProxyClient(on, ManagedCamelContextMBean.class);
-        } catch (MalformedObjectNameException e) {
-            throw RuntimeCamelException.wrapRuntimeCamelException(e);
-        }
-    }
-
     public ProcessorDefinition getProcessorDefinition(String id) {
         for (RouteDefinition route : getRouteDefinitions()) {
             Iterator<ProcessorDefinition> it = ProcessorDefinitionHelper.filterTypeInOutputs(route.getOutputs(), ProcessorDefinition.class);
@@ -1004,6 +1020,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
     }
 
     public void addRoutes(final RoutesBuilder builder) throws Exception {
+        init();
         log.debug("Adding routes from builder: {}", builder);
         doWithDefinedClassLoader(() -> builder.addRoutesToCamelContext(DefaultCamelContext.this));
     }
@@ -2139,7 +2156,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
             Map<String, String[]> uriOptions = new LinkedHashMap<>();
 
             // insert values from uri
-            Map<String, Object> options = new HashMap<>(getRuntimeCamelCatalog().endpointProperties(uri));
+            Map<String, Object> options = new HashMap<>(getExtension(RuntimeCamelCatalog.class).endpointProperties(uri));
 
             // extract consumer. prefix options
             Map<String, Object> consumerOptions = IntrospectionSupport.extractProperties(options, "consumer.");
@@ -3061,6 +3078,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
     @Override
     public void start() throws Exception {
         try (MDCHelper mdcHelper = new MDCHelper()) {
+            init();
             vetoStated.set(false);
             startDate = new Date();
             stopWatch.restart();
@@ -3281,8 +3299,6 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
                 for (LifecycleStrategy strategy : lifecycleStrategies) {
                     strategy.onServiceAdd(this, service, null);
                 }
-            }
-            if (notifier instanceof Service) {
                 startService((Service) notifier);
             }
         }
@@ -3307,12 +3323,14 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
         addService(packageScanClassResolver, true, true);
         addService(restRegistry, true, true);
         addService(messageHistoryFactory, true, true);
-        addService(runtimeCamelCatalog, true, true);
         if (reloadStrategy != null) {
             log.info("Using ReloadStrategy: {}", reloadStrategy);
             addService(reloadStrategy, true, true);
         }
 
+        // Start runtime catalog
+        getExtension(RuntimeCamelCatalog.class);
+
         // Initialize declarative transformer/validator registry
         transformerRegistry = createTransformerRegistry(transformers);
         addService(transformerRegistry, true, true);
@@ -4048,13 +4066,6 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
     /**
      * Lazily create a default implementation
      */
-    protected ManagementMBeanAssembler createManagementMBeanAssembler() {
-        return new DefaultManagementMBeanAssembler(this);
-    }
-
-    /**
-     * Lazily create a default implementation
-     */
     protected ComponentResolver createComponentResolver() {
         return new DefaultComponentResolver();
     }
@@ -4229,35 +4240,16 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
         this.managementStrategy = managementStrategy;
     }
 
-    public InterceptStrategy getDefaultBacklogTracer() {
-        if (defaultBacklogTracer == null) {
-            defaultBacklogTracer = BacklogTracer.createTracer(this);
-        }
-        return defaultBacklogTracer;
-    }
-
-    public void setDefaultBacklogTracer(InterceptStrategy backlogTracer) {
-        this.defaultBacklogTracer = backlogTracer;
-    }
-
-    public InterceptStrategy getDefaultBacklogDebugger() {
-        if (defaultBacklogDebugger == null) {
-            defaultBacklogDebugger = new BacklogDebugger(this);
-        }
-        return defaultBacklogDebugger;
-    }
-
-    public void setDefaultBacklogDebugger(InterceptStrategy defaultBacklogDebugger) {
-        this.defaultBacklogDebugger = defaultBacklogDebugger;
-    }
-
     public void disableJMX() {
-        if (isStarting() || isStarted()) {
+        if (isNew()) {
+            disableJMX = true;
+        } else if (isInit()) {
+            disableJMX = true;
+            managementStrategy = createManagementStrategy();
+            lifecycleStrategies.clear();
+        } else {
             throw new IllegalStateException("Disabling JMX can only be done when CamelContext has not been started");
         }
-        managementStrategy = new DefaultManagementStrategy(this);
-        // must clear lifecycle strategies as we add DefaultManagementLifecycleStrategy by default for JMX support
-        lifecycleStrategies.clear();
     }
 
     public InflightRepository getInflightRepository() {
@@ -4544,11 +4536,6 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
     }
 
     @Override
-    public RuntimeCamelCatalog getRuntimeCamelCatalog() {
-        return runtimeCamelCatalog;
-    }
-
-    @Override
     public void setSSLContextParameters(SSLContextParameters sslContextParameters) {
         this.sslContextParameters = sslContextParameters;
     }
@@ -4573,7 +4560,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
     }
 
     protected ManagementStrategy createManagementStrategy() {
-        return new ManagementStrategyFactory().create(this, disableJMX || Boolean.getBoolean(JmxSystemPropertyKeys.DISABLED));
+        return new ManagementStrategyFactory().create(this, disableJMX);
     }
 
     /**
@@ -4628,18 +4615,6 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
         }
     }
 
-    @Override
-    public HealthCheckRegistry getHealthCheckRegistry() {
-        return healthCheckRegistry;
-    }
-
-    /**
-     * Sets a {@link HealthCheckRegistry}.
-     */
-    public void setHealthCheckRegistry(HealthCheckRegistry healthCheckRegistry) {
-        this.healthCheckRegistry = ObjectHelper.notNull(healthCheckRegistry, "HealthCheckRegistry");
-    }
-
     protected NodeIdFactory createNodeIdFactory() {
         return new DefaultNodeIdFactory();
     }
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultDebugger.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultDebugger.java
index 1a8ea52..567bda0 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultDebugger.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultDebugger.java
@@ -382,16 +382,6 @@ public class DefaultDebugger implements Debugger, CamelContextAware {
         public boolean isEnabled(CamelEvent event) {
             return event instanceof ExchangeEvent;
         }
-
-        @Override
-        protected void doStart() throws Exception {
-            // noop
-        }
-
-        @Override
-        protected void doStop() throws Exception {
-            // noop
-        }
     }
 
 }
diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementStrategy.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultManagementStrategy.java
similarity index 84%
rename from camel-core/src/main/java/org/apache/camel/management/DefaultManagementStrategy.java
rename to camel-core/src/main/java/org/apache/camel/impl/DefaultManagementStrategy.java
index b2f1a93..cb4a6b1 100644
--- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultManagementStrategy.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.management;
+package org.apache.camel.impl;
 
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -33,8 +33,6 @@ import org.apache.camel.spi.ManagementStrategy;
 import org.apache.camel.support.ServiceHelper;
 import org.apache.camel.support.ServiceSupport;
 import org.apache.camel.util.ObjectHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * A default management strategy that does <b>not</b> manage.
@@ -46,12 +44,11 @@ import org.slf4j.LoggerFactory;
  * This class can also be used to extend your custom management implement. In fact the JMX capable
  * provided by Camel extends this class as well.
  *
- * @see ManagedManagementStrategy
+ * @see org.apache.camel.management.ManagedManagementStrategy
  */
 public class DefaultManagementStrategy extends ServiceSupport implements ManagementStrategy, CamelContextAware {
 
-    private static final Logger LOG = LoggerFactory.getLogger(DefaultManagementStrategy.class);
-    private List<EventNotifier> eventNotifiers = new CopyOnWriteArrayList<>();
+    private final List<EventNotifier> eventNotifiers = new CopyOnWriteArrayList<>();
     private EventFactory eventFactory = new DefaultEventFactory();
     private ManagementObjectNameStrategy managementObjectNameStrategy;
     private ManagementObjectStrategy managementObjectStrategy;
@@ -65,6 +62,11 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
         this.camelContext = camelContext;
     }
 
+    public DefaultManagementStrategy(CamelContext camelContext, ManagementAgent managementAgent) {
+        this.camelContext = camelContext;
+        this.managementAgent = managementAgent;
+    }
+
     public List<EventNotifier> getEventNotifiers() {
         return eventNotifiers;
     }
@@ -77,10 +79,6 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
         return eventNotifiers.remove(eventNotifier);
     }
 
-    public void setEventNotifiers(List<EventNotifier> eventNotifiers) {
-        this.eventNotifiers = eventNotifiers;
-    }
-
     public EventFactory getEventFactory() {
         return eventFactory;
     }
@@ -91,7 +89,7 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
 
     public ManagementObjectNameStrategy getManagementObjectNameStrategy() {
         if (managementObjectNameStrategy == null) {
-            managementObjectNameStrategy = new DefaultManagementObjectNameStrategy();
+            managementObjectNameStrategy = createManagementObjectNameStrategy(null);
         }
         return managementObjectNameStrategy;
     }
@@ -102,7 +100,7 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
 
     public ManagementObjectStrategy getManagementObjectStrategy() {
         if (managementObjectStrategy == null) {
-            managementObjectStrategy = new DefaultManagementObjectStrategy();
+            managementObjectStrategy = createManagementObjectStrategy();
         }
         return managementObjectStrategy;
     }
@@ -127,24 +125,16 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
         // noop
     }
 
-    public void manageNamedObject(Object managedObject, Object preferredName) throws Exception {
-        // noop
-    }
-
-    public <T> T getManagedObjectName(Object managedObject, String customName, Class<T> nameType) throws Exception {
-        // noop
-        return null;
-    }
-
     public void unmanageObject(Object managedObject) throws Exception {
         // noop
     }
 
-    public void unmanageNamedObject(Object name) throws Exception {
+    public boolean isManaged(Object managedObject) {
         // noop
+        return false;
     }
 
-    public boolean isManaged(Object managedObject, Object name) {
+    public boolean isManagedName(Object name) {
         // noop
         return false;
     }
@@ -168,7 +158,7 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
     }
 
     protected void doStart() throws Exception {
-        LOG.info("JMX is disabled");
+        log.info("JMX is disabled");
         doStartManagementStrategy();
     }
 
@@ -192,7 +182,8 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
             ServiceHelper.startService(managementAgent);
             // set the naming strategy using the domain name from the agent
             if (managementObjectNameStrategy == null) {
-                setManagementObjectNameStrategy(new DefaultManagementObjectNameStrategy(managementAgent.getMBeanObjectDomainName()));
+                String domain = managementAgent.getMBeanObjectDomainName();
+                managementObjectNameStrategy = createManagementObjectNameStrategy(domain);
             }
         }
         if (managementObjectNameStrategy instanceof CamelContextAware) {
@@ -204,4 +195,12 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
         ServiceHelper.stopService(managementAgent, eventNotifiers);
     }
 
+    protected ManagementObjectNameStrategy createManagementObjectNameStrategy(String domain) {
+        return null;
+    }
+
+    protected ManagementObjectStrategy createManagementObjectStrategy() {
+        return null;
+    }
+
 }
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
index cca205f..95e334f 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
@@ -36,10 +36,12 @@ import org.apache.camel.model.FromDefinition;
 import org.apache.camel.model.PropertyDefinition;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.processor.CamelInternalProcessor;
+import org.apache.camel.processor.CamelInternalProcessorAdvice;
 import org.apache.camel.processor.ContractAdvice;
 import org.apache.camel.processor.Pipeline;
 import org.apache.camel.spi.Contract;
 import org.apache.camel.spi.InterceptStrategy;
+import org.apache.camel.spi.ManagementInterceptStrategy;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.spi.RouteController;
 import org.apache.camel.spi.RouteError;
@@ -58,7 +60,7 @@ public class DefaultRouteContext implements RouteContext {
     private final List<Processor> eventDrivenProcessors = new ArrayList<>();
     private CamelContext camelContext;
     private List<InterceptStrategy> interceptStrategies = new ArrayList<>();
-    private InterceptStrategy managedInterceptStrategy;
+    private ManagementInterceptStrategy managementInterceptStrategy;
     private boolean routeAdded;
     private Boolean trace;
     private Boolean messageHistory;
@@ -191,7 +193,9 @@ public class DefaultRouteContext implements RouteContext {
             internal.addAdvice(new CamelInternalProcessor.RouteInflightRepositoryAdvice(camelContext.getInflightRepository(), routeId));
 
             // wrap in JMX instrumentation processor that is used for performance stats
-            internal.addAdvice(new CamelInternalProcessor.InstrumentationAdvice("route"));
+            if (managementInterceptStrategy != null) {
+                internal.addAdvice(CamelInternalProcessorAdvice.wrap(managementInterceptStrategy.createProcessor("route")));
+            }
 
             // wrap in route lifecycle
             internal.addAdvice(new CamelInternalProcessor.RouteLifecycleAdvice());
@@ -300,12 +304,12 @@ public class DefaultRouteContext implements RouteContext {
         getInterceptStrategies().add(interceptStrategy);
     }
 
-    public void setManagedInterceptStrategy(InterceptStrategy interceptStrategy) {
-        this.managedInterceptStrategy = interceptStrategy;
+    public void setManagementInterceptStrategy(ManagementInterceptStrategy interceptStrategy) {
+        this.managementInterceptStrategy = interceptStrategy;
     }
 
-    public InterceptStrategy getManagedInterceptStrategy() {
-        return managedInterceptStrategy;
+    public ManagementInterceptStrategy getManagementInterceptStrategy() {
+        return managementInterceptStrategy;
     }
 
     public boolean isRouteAdded() {
diff --git a/camel-core/src/main/java/org/apache/camel/impl/ServicePool.java b/camel-core/src/main/java/org/apache/camel/impl/ServicePool.java
index 3aefd97..80adbf7 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/ServicePool.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/ServicePool.java
@@ -84,7 +84,9 @@ public class ServicePool<S extends Service> extends ServiceSupport implements No
     protected void onEvict(S s) {
         Endpoint e = getEndpoint.apply(s);
         Pool<S> p = pool.get(e);
-        p.evict(s);
+        if (p != null) {
+            p.evict(s);
+        }
     }
 
     /**
diff --git a/camel-core/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckService.java b/camel-core/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckService.java
index df60d94..85e9f65 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckService.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckService.java
@@ -176,7 +176,7 @@ public final class DefaultHealthCheckService extends ServiceSupport implements H
             future.cancel(true);
         }
         if (registry == null) {
-            registry = camelContext.getHealthCheckRegistry();
+            registry = HealthCheckRegistry.get(camelContext);
         }
 
         if (ObjectHelper.isNotEmpty(registry) && ObjectHelper.isEmpty(future)) {
diff --git a/camel-core/src/main/java/org/apache/camel/impl/health/RouteHealthCheck.java b/camel-core/src/main/java/org/apache/camel/impl/health/RouteHealthCheck.java
index a25e1a1..f62816c 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/health/RouteHealthCheck.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/health/RouteHealthCheck.java
@@ -19,7 +19,6 @@ package org.apache.camel.impl.health;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -28,7 +27,7 @@ import org.apache.camel.Route;
 import org.apache.camel.ServiceStatus;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.health.HealthCheckResultBuilder;
-import org.apache.camel.management.ManagedCamelContext;
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -88,14 +87,10 @@ public class RouteHealthCheck extends AbstractHealthCheck {
             if (builder.state() != State.DOWN) {
                 // If JMX is enabled, use the Managed MBeans to determine route
                 // health based on performance counters.
-                ManagedRouteMBean managedRoute = context.adapt(ManagedCamelContext.class).getManagedRoute(route.getId(), ManagedRouteMBean.class);
+                ManagedRouteMBean managedRoute = context.getExtension(ManagedCamelContext.class).getManagedRoute(route.getId());
 
                 if (managedRoute != null && !evaluators.isEmpty()) {
-                    Map<String, Object> details = new HashMap<>();
-
-                    for (PerformanceCounterEvaluator evaluator : evaluators) {
-                        details.clear();
-
+                    for (PerformanceCounterEvaluator<ManagedRouteMBean> evaluator : evaluators) {
                         evaluator.test(managedRoute, builder, options);
 
                         if (builder.state() == State.DOWN) {
diff --git a/camel-core/src/main/java/org/apache/camel/main/MainSupport.java b/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
index ed34e96..4d94157 100644
--- a/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
+++ b/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
@@ -580,7 +580,7 @@ public abstract class MainSupport extends ServiceSupport {
             }
 
             // skip already managed services, for example if a route has been restarted
-            if (camelContext.getManagementStrategy().isManaged(managedObject, null)) {
+            if (camelContext.getManagementStrategy().isManaged(managedObject)) {
                 LOG.trace("The service is already managed: {}", reload);
                 return;
             }
diff --git a/camel-core/src/main/java/org/apache/camel/management/InstrumentationProcessor.java b/camel-core/src/main/java/org/apache/camel/management/DefaultInstrumentationProcessor.java
similarity index 87%
rename from camel-core/src/main/java/org/apache/camel/management/InstrumentationProcessor.java
rename to camel-core/src/main/java/org/apache/camel/management/DefaultInstrumentationProcessor.java
index 33211fb..538dd0c 100644
--- a/camel-core/src/main/java/org/apache/camel/management/InstrumentationProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/management/DefaultInstrumentationProcessor.java
@@ -17,15 +17,14 @@
 package org.apache.camel.management;
 
 import org.apache.camel.AsyncCallback;
+import org.apache.camel.AsyncProcessor;
 import org.apache.camel.Exchange;
 import org.apache.camel.Ordered;
 import org.apache.camel.Processor;
 import org.apache.camel.management.mbean.ManagedPerformanceCounter;
-import org.apache.camel.processor.CamelInternalProcessorAdvice;
 import org.apache.camel.processor.DelegateAsyncProcessor;
+import org.apache.camel.spi.ManagementInterceptStrategy.InstrumentationProcessor;
 import org.apache.camel.util.StopWatch;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * JMX enabled processor or advice that uses the {@link org.apache.camel.management.mbean.ManagedCounter} for instrumenting
@@ -34,17 +33,22 @@ import org.slf4j.LoggerFactory;
  * This implementation has been optimised to work in dual mode, either as an advice or as a processor.
  * The former is faster and the latter is required when the error handler has been configured with redelivery enabled.
  */
-public class InstrumentationProcessor extends DelegateAsyncProcessor implements CamelInternalProcessorAdvice<StopWatch>, Ordered {
+public class DefaultInstrumentationProcessor extends DelegateAsyncProcessor
+        implements InstrumentationProcessor<StopWatch>, Ordered {
 
-    private static final Logger LOG = LoggerFactory.getLogger(InstrumentationProcessor.class);
     private PerformanceCounter counter;
     private String type;
 
-    public InstrumentationProcessor(String type, Processor processor) {
+    public DefaultInstrumentationProcessor(String type, Processor processor) {
         super(processor);
         this.type = type;
     }
 
+    public DefaultInstrumentationProcessor(String type) {
+        super((AsyncProcessor) null);
+        this.type = type;
+    }
+
     public void setCounter(Object counter) {
         ManagedPerformanceCounter mpc = null;
         if (counter instanceof ManagedPerformanceCounter) {
@@ -85,7 +89,7 @@ public class InstrumentationProcessor extends DelegateAsyncProcessor implements
 
             @Override
             public String toString() {
-                return InstrumentationProcessor.this.toString();
+                return DefaultInstrumentationProcessor.this.toString();
             }
         });
     }
@@ -95,8 +99,8 @@ public class InstrumentationProcessor extends DelegateAsyncProcessor implements
     }
 
     protected void recordTime(Exchange exchange, long duration) {
-        if (LOG.isTraceEnabled()) {
-            LOG.trace("{}Recording duration: {} millis for exchange: {}", type != null ? type + ": " : "", duration, exchange);
+        if (log.isTraceEnabled()) {
+            log.trace("{}Recording duration: {} millis for exchange: {}", type != null ? type + ": " : "", duration, exchange);
         }
 
         if (!exchange.isFailed() && exchange.getException() == null) {
diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementAgent.java b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
index c830b1e..fac1cee 100644
--- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
+++ b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
@@ -392,6 +392,9 @@ public class DefaultManagementAgent extends ServiceSupport implements Management
 
         // ensure assembler is started
         assembler = camelContext.getManagementMBeanAssembler();
+        if (assembler == null) {
+            assembler = new DefaultManagementMBeanAssembler(camelContext);
+        }
         ServiceHelper.startService(assembler);
 
         LOG.debug("Starting JMX agent on server: {}", getMBeanServer());
diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
index 9a006b4..3ec406e 100644
--- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
@@ -49,6 +49,7 @@ import org.apache.camel.StartupListener;
 import org.apache.camel.TimerListener;
 import org.apache.camel.VetoCamelContextStartException;
 import org.apache.camel.cluster.CamelClusterService;
+import org.apache.camel.spi.ManagementInterceptStrategy.InstrumentationProcessor;
 import org.apache.camel.throttling.ThrottlingExceptionRoutePolicy;
 import org.apache.camel.throttling.ThrottlingInflightRoutePolicy;
 import org.apache.camel.management.mbean.ManagedAsyncProcessorAwaitManager;
@@ -158,7 +159,11 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
             boolean done = false;
             while (!done) {
                 ObjectName on = getManagementStrategy().getManagementObjectNameStrategy().getObjectNameForCamelContext(managementName, name);
+<<<<<<< HEAD
                 boolean exists = getManagementStrategy().isManaged(mc, on);
+=======
+                boolean exists = getManagementStrategy().isManagedName(on);
+>>>>>>> db1604e8d06... wip
                 if (!exists) {
                     done = true;
                 } else {
@@ -248,7 +253,11 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
             // compute the next name
             newName = strategy.getNextName();
             ObjectName on = getManagementStrategy().getManagementObjectNameStrategy().getObjectNameForCamelContext(newName, name);
+<<<<<<< HEAD
             done = !getManagementStrategy().isManaged(mc, on);
+=======
+            done = !getManagementStrategy().isManagedName(on);
+>>>>>>> db1604e8d06... wip
             if (log.isTraceEnabled()) {
                 log.trace("Using name: {} in ObjectName[{}] exists? {}", name, on, done);
             }
@@ -294,7 +303,7 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
         try {
             Object mc = getManagementObjectStrategy().getManagedObjectForRouteController(context);
             // the context could have been removed already
-            if (getManagementStrategy().isManaged(mc, null)) {
+            if (getManagementStrategy().isManaged(mc)) {
                 unmanageObject(mc);
             }
         } catch (Exception e) {
@@ -304,7 +313,7 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
         try {
             Object mc = getManagementObjectStrategy().getManagedObjectForCamelHealth(context);
             // the context could have been removed already
-            if (getManagementStrategy().isManaged(mc, null)) {
+            if (getManagementStrategy().isManaged(mc)) {
                 unmanageObject(mc);
             }
         } catch (Exception e) {
@@ -314,7 +323,7 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
         try {
             Object mc = getManagementObjectStrategy().getManagedObjectForCamelContext(context);
             // the context could have been removed already
-            if (getManagementStrategy().isManaged(mc, null)) {
+            if (getManagementStrategy().isManaged(mc)) {
                 unmanageObject(mc);
             }
         } catch (Exception e) {
@@ -425,7 +434,7 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
         }
 
         // skip already managed services, for example if a route has been restarted
-        if (getManagementStrategy().isManaged(managedObject, null)) {
+        if (getManagementStrategy().isManaged(managedObject)) {
             log.trace("The service is already managed: {}", service);
             return;
         }
@@ -589,7 +598,7 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
             Object mr = getManagementObjectStrategy().getManagedObjectForRoute(camelContext, route);
 
             // skip already managed routes, for example if the route has been restarted
-            if (getManagementStrategy().isManaged(mr, null)) {
+            if (getManagementStrategy().isManaged(mr)) {
                 log.trace("The route is already managed: {}", route);
                 continue;
             }
@@ -601,7 +610,7 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
                 CamelInternalProcessor internal = (CamelInternalProcessor) processor;
                 ManagedRoute routeMBean = (ManagedRoute) mr;
 
-                CamelInternalProcessor.InstrumentationAdvice task = internal.getAdvice(CamelInternalProcessor.InstrumentationAdvice.class);
+                DefaultInstrumentationProcessor task = internal.getAdvice(DefaultInstrumentationProcessor.class);
                 if (task != null) {
                     // we need to wrap the counter with the camel context so we get stats updated on the context as well
                     if (camelContextMBean != null) {
@@ -662,7 +671,7 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
         Object me = getManagementObjectStrategy().getManagedObjectForErrorHandler(camelContext, routeContext, errorHandler, errorHandlerBuilder);
 
         // skip already managed services, for example if a route has been restarted
-        if (getManagementStrategy().isManaged(me, null)) {
+        if (getManagementStrategy().isManaged(me)) {
             log.trace("The error handler builder is already managed: {}", errorHandlerBuilder);
             return;
         }
@@ -700,7 +709,7 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
         Object mtp = getManagementObjectStrategy().getManagedObjectForThreadPool(camelContext, threadPool, id, sourceId, routeId, threadPoolProfileId);
 
         // skip already managed services, for example if a route has been restarted
-        if (getManagementStrategy().isManaged(mtp, null)) {
+        if (getManagementStrategy().isManaged(mtp)) {
             log.trace("The thread pool is already managed: {}", threadPool);
             return;
         }
@@ -724,7 +733,7 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
         Object mtp = managedThreadPools.remove(threadPool);
         if (mtp != null) {
             // skip unmanaged routes
-            if (!getManagementStrategy().isManaged(mtp, null)) {
+            if (!getManagementStrategy().isManaged(mtp)) {
                 log.trace("The thread pool is not managed: {}", threadPool);
                 return;
             }
@@ -758,7 +767,7 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
 
         // set this managed intercept strategy that executes the JMX instrumentation for performance metrics
         // so our registered counters can be used for fine grained performance instrumentation
-        routeContext.setManagedInterceptStrategy(new InstrumentationInterceptStrategy(registeredCounters, wrappedProcessors));
+        routeContext.setManagementInterceptStrategy(new InstrumentationInterceptStrategy(registeredCounters, wrappedProcessors));
     }
 
     /**
diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectNameStrategy.java b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectNameStrategy.java
index 804593c..3de1d09 100644
--- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectNameStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectNameStrategy.java
@@ -36,9 +36,25 @@ import org.apache.camel.Service;
 import org.apache.camel.StaticService;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.cluster.CamelClusterService;
+import org.apache.camel.management.mbean.ManagedBacklogDebugger;
+import org.apache.camel.management.mbean.ManagedBacklogTracer;
+import org.apache.camel.management.mbean.ManagedCamelContext;
+import org.apache.camel.management.mbean.ManagedCamelHealth;
+import org.apache.camel.management.mbean.ManagedClusterService;
+import org.apache.camel.management.mbean.ManagedComponent;
+import org.apache.camel.management.mbean.ManagedConsumer;
+import org.apache.camel.management.mbean.ManagedDataFormat;
+import org.apache.camel.management.mbean.ManagedEndpoint;
+import org.apache.camel.management.mbean.ManagedErrorHandler;
+import org.apache.camel.management.mbean.ManagedEventNotifier;
+import org.apache.camel.management.mbean.ManagedProcessor;
+import org.apache.camel.management.mbean.ManagedProducer;
+import org.apache.camel.management.mbean.ManagedRoute;
+import org.apache.camel.management.mbean.ManagedRouteController;
+import org.apache.camel.management.mbean.ManagedService;
+import org.apache.camel.management.mbean.ManagedThreadPool;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.EventNotifier;
-import org.apache.camel.spi.InterceptStrategy;
 import org.apache.camel.spi.ManagementObjectNameStrategy;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.util.InetAddressUtil;
@@ -75,14 +91,12 @@ public class DefaultManagementObjectNameStrategy implements ManagementObjectName
     protected CamelContext camelContext;
 
     public DefaultManagementObjectNameStrategy() {
-        this("org.apache.camel");
+        this(null);
         // default constructor needed for <bean> style configuration
     }
 
     public DefaultManagementObjectNameStrategy(String domainName) {
-        if (domainName != null) {
-            this.domainName = domainName;
-        }
+        this.domainName = domainName != null ? domainName : "org.apache.camel";
         try {
             hostName = InetAddressUtil.getLocalHostName();
         } catch (UnknownHostException ex) {
@@ -98,6 +112,74 @@ public class DefaultManagementObjectNameStrategy implements ManagementObjectName
         this.camelContext = camelContext;
     }
 
+    public ObjectName getObjectName(Object managedObject) throws MalformedObjectNameException {
+        if (managedObject == null) {
+            return null;
+        }
+        ObjectName objectName = null;
+        if (managedObject instanceof ManagedCamelContext) {
+            ManagedCamelContext mcc = (ManagedCamelContext) managedObject;
+            objectName = getObjectNameForCamelContext(mcc.getContext());
+        } else if (managedObject instanceof ManagedCamelHealth) {
+            ManagedCamelHealth mch = (ManagedCamelHealth) managedObject;
+            objectName = getObjectNameForCamelHealth(mch.getContext());
+        } else if (managedObject instanceof ManagedRouteController) {
+            ManagedRouteController mrc = (ManagedRouteController) managedObject;
+            objectName = getObjectNameForRouteController(mrc.getContext());
+        } else if (managedObject instanceof ManagedComponent) {
+            ManagedComponent mc = (ManagedComponent) managedObject;
+            objectName = getObjectNameForComponent(mc.getComponent(), mc.getComponentName());
+        } else if (managedObject instanceof ManagedDataFormat) {
+            ManagedDataFormat md = (ManagedDataFormat) managedObject;
+            objectName = getObjectNameForDataFormat(md.getContext(), md.getDataFormat());
+        } else if (managedObject instanceof ManagedEndpoint) {
+            ManagedEndpoint me = (ManagedEndpoint) managedObject;
+            objectName = getObjectNameForEndpoint(me.getEndpoint());
+        } else if (managedObject instanceof Endpoint) {
+            objectName = getObjectNameForEndpoint((Endpoint) managedObject);
+        } else if (managedObject instanceof ManagedRoute) {
+            ManagedRoute mr = (ManagedRoute) managedObject;
+            objectName = getObjectNameForRoute(mr.getRoute());
+        } else if (managedObject instanceof ManagedErrorHandler) {
+            ManagedErrorHandler meh = (ManagedErrorHandler) managedObject;
+            objectName = getObjectNameForErrorHandler(meh.getRouteContext(), meh.getErrorHandler(), meh.getErrorHandlerBuilder());
+        } else if (managedObject instanceof ManagedProcessor) {
+            ManagedProcessor mp = (ManagedProcessor) managedObject;
+            objectName = getObjectNameForProcessor(mp.getContext(), mp.getProcessor(), mp.getDefinition());
+        } else if (managedObject instanceof ManagedConsumer) {
+            ManagedConsumer ms = (ManagedConsumer) managedObject;
+            objectName = getObjectNameForConsumer(ms.getContext(), ms.getConsumer());
+        } else if (managedObject instanceof ManagedProducer) {
+            ManagedProducer ms = (ManagedProducer) managedObject;
+            objectName = getObjectNameForProducer(ms.getContext(), ms.getProducer());
+        } else if (managedObject instanceof ManagedBacklogTracer) {
+            ManagedBacklogTracer mt = (ManagedBacklogTracer) managedObject;
+            objectName = getObjectNameForTracer(mt.getContext(), mt.getBacklogTracer());
+        } else if (managedObject instanceof ManagedBacklogDebugger) {
+            ManagedBacklogDebugger md = (ManagedBacklogDebugger) managedObject;
+            objectName = getObjectNameForTracer(md.getContext(), md.getBacklogDebugger());
+        } else if (managedObject instanceof ManagedEventNotifier) {
+            ManagedEventNotifier men = (ManagedEventNotifier) managedObject;
+            objectName = getObjectNameForEventNotifier(men.getContext(), men.getEventNotifier());
+        } else if (managedObject instanceof ManagedThreadPool) {
+            ManagedThreadPool mes = (ManagedThreadPool) managedObject;
+            objectName = getObjectNameForThreadPool(mes.getContext(), mes.getThreadPool(), mes.getId(), mes.getSourceId());
+        } else if (managedObject instanceof ManagedClusterService) {
+            ManagedClusterService mcs = (ManagedClusterService) managedObject;
+            objectName = getObjectNameForClusterService(mcs.getContext(), mcs.getService());
+        } else if (managedObject instanceof ManagedService) {
+            // check for managed service should be last
+            ManagedService ms = (ManagedService) managedObject;
+            // skip endpoints as they are already managed
+            if (ms.getService() instanceof Endpoint) {
+                return null;
+            }
+            objectName = getObjectNameForService(ms.getContext(), ms.getService());
+        }
+
+        return objectName;
+    }
+
     public ObjectName getObjectNameForCamelContext(String managementName, String name) throws MalformedObjectNameException {
         StringBuilder buffer = new StringBuilder();
         buffer.append(domainName).append(":");
@@ -270,7 +352,7 @@ public class DefaultManagementObjectNameStrategy implements ManagementObjectName
         return createObjectName(buffer);
     }
 
-    public ObjectName getObjectNameForTracer(CamelContext context, InterceptStrategy tracer) throws MalformedObjectNameException {
+    public ObjectName getObjectNameForTracer(CamelContext context, Service tracer) throws MalformedObjectNameException {
         // use the simple name of the class as the mbean name (eg Tracer, BacklogTracer, BacklogDebugger)
         String name = tracer.getClass().getSimpleName();
 
diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
index 3d16dd4..aec139f 100644
--- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
@@ -222,7 +222,7 @@ public class DefaultManagementObjectStrategy implements ManagementObjectStrategy
     }
 
     public Object getManagedObjectForRouteController(CamelContext context) {
-        ManagedRouteController mrc = new ManagedRouteController((ModelCamelContext)context);
+        ManagedRouteController mrc = new ManagedRouteController((ModelCamelContext) context);
         mrc.init(context.getManagementStrategy());
         return mrc;
     }
diff --git a/camel-core/src/main/java/org/apache/camel/management/InstrumentationInterceptStrategy.java b/camel-core/src/main/java/org/apache/camel/management/InstrumentationInterceptStrategy.java
index 186fc2c..b144e1d 100644
--- a/camel-core/src/main/java/org/apache/camel/management/InstrumentationInterceptStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/InstrumentationInterceptStrategy.java
@@ -18,11 +18,10 @@ package org.apache.camel.management;
 
 import java.util.Map;
 
-import org.apache.camel.CamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.management.mbean.ManagedPerformanceCounter;
-import org.apache.camel.spi.InterceptStrategy;
+import org.apache.camel.spi.ManagementInterceptStrategy;
 import org.apache.camel.util.KeyValueHolder;
 
 /**
@@ -33,7 +32,7 @@ import org.apache.camel.util.KeyValueHolder;
  * This class looks up a map to determine which PerformanceCounter should go into the
  * InstrumentationProcessor for any particular target processor.
  */
-public class InstrumentationInterceptStrategy implements InterceptStrategy {
+public class InstrumentationInterceptStrategy implements ManagementInterceptStrategy {
 
     private Map<NamedNode, PerformanceCounter> registeredCounters;
     private final Map<Processor, KeyValueHolder<NamedNode, InstrumentationProcessor>> wrappedProcessors;
@@ -44,21 +43,22 @@ public class InstrumentationInterceptStrategy implements InterceptStrategy {
         this.wrappedProcessors = wrappedProcessors;
     }
 
-    public PerformanceCounter prepareProcessor(NamedNode definition, Processor target, InstrumentationProcessor advice) {
+    @Override
+    public InstrumentationProcessor<?> createProcessor(String type) {
+        return new DefaultInstrumentationProcessor(type);
+    }
+
+    @Override
+    public InstrumentationProcessor<?> createProcessor(NamedNode definition, Processor target) {
+        InstrumentationProcessor instrumentationProcessor = new DefaultInstrumentationProcessor(definition.getShortName(), target);
         PerformanceCounter counter = registeredCounters.get(definition);
         if (counter != null) {
             // add it to the mapping of wrappers so we can later change it to a
             // decorated counter when we register the processor
-            KeyValueHolder<NamedNode, InstrumentationProcessor> holder = new KeyValueHolder<>(definition, advice);
+            KeyValueHolder<NamedNode, InstrumentationProcessor> holder = new KeyValueHolder<>(definition, instrumentationProcessor);
             wrappedProcessors.put(target, holder);
         }
-        return counter;
-    }
-
-    public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition,
-                                                 Processor target, Processor nextTarget) throws Exception {
-        // no longer in use as we have optimised to avoid wrapping unless needed
-        return target;
+        return instrumentationProcessor;
     }
 
 }
diff --git a/camel-core/src/main/java/org/apache/camel/management/JmxNotificationEventNotifier.java b/camel-core/src/main/java/org/apache/camel/management/JmxNotificationEventNotifier.java
index db4c1b4..38b12cc 100644
--- a/camel-core/src/main/java/org/apache/camel/management/JmxNotificationEventNotifier.java
+++ b/camel-core/src/main/java/org/apache/camel/management/JmxNotificationEventNotifier.java
@@ -63,10 +63,6 @@ public class JmxNotificationEventNotifier extends EventNotifierSupport implement
         counter.set(0);
     }
 
-    protected void doStop() throws Exception {
-        // noop
-    }
-
     public String getSource() {
         return source;
     }
diff --git a/camel-core/src/main/java/org/apache/camel/management/LoggingEventNotifier.java b/camel-core/src/main/java/org/apache/camel/management/LoggingEventNotifier.java
index 8eb9832..42222d7 100644
--- a/camel-core/src/main/java/org/apache/camel/management/LoggingEventNotifier.java
+++ b/camel-core/src/main/java/org/apache/camel/management/LoggingEventNotifier.java
@@ -62,6 +62,4 @@ public class LoggingEventNotifier extends EventNotifierSupport {
         }
     }
 
-    protected void doStop() throws Exception {
-    }
 }
diff --git a/camel-core/src/main/java/org/apache/camel/management/ManagedCamelContextImpl.java b/camel-core/src/main/java/org/apache/camel/management/ManagedCamelContextImpl.java
new file mode 100644
index 0000000..a3bf6c3
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/management/ManagedCamelContextImpl.java
@@ -0,0 +1,104 @@
+/**
+ * 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.management;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Processor;
+import org.apache.camel.Route;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.api.management.ManagedCamelContext;
+import org.apache.camel.api.management.mbean.ManagedCamelContextMBean;
+import org.apache.camel.api.management.mbean.ManagedProcessorMBean;
+import org.apache.camel.api.management.mbean.ManagedRouteMBean;
+import org.apache.camel.model.ModelCamelContext;
+import org.apache.camel.model.ProcessorDefinition;
+import org.apache.camel.spi.ManagementStrategy;
+
+public class ManagedCamelContextImpl implements ManagedCamelContext {
+
+    private final CamelContext camelContext;
+
+    public ManagedCamelContextImpl(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    private ManagementStrategy getManagementStrategy() {
+        return camelContext.getManagementStrategy();
+    }
+
+    public <T extends ManagedProcessorMBean> T getManagedProcessor(String id, Class<T> type) {
+        // jmx must be enabled
+        if (getManagementStrategy().getManagementAgent() == null) {
+            return null;
+        }
+
+        Processor processor = camelContext.getProcessor(id);
+        ProcessorDefinition def = camelContext.adapt(ModelCamelContext.class).getProcessorDefinition(id);
+
+        // processor may be null if its anonymous inner class or as lambda
+        if (def != null) {
+            try {
+                ObjectName on = getManagementStrategy().getManagementObjectNameStrategy()
+                        .getObjectNameForProcessor(camelContext, processor, def);
+                return getManagementStrategy().getManagementAgent().newProxyClient(on, type);
+            } catch (MalformedObjectNameException e) {
+                throw RuntimeCamelException.wrapRuntimeCamelException(e);
+            }
+        }
+
+        return null;
+    }
+
+    public <T extends ManagedRouteMBean> T getManagedRoute(String routeId, Class<T> type) {
+        // jmx must be enabled
+        if (getManagementStrategy().getManagementAgent() == null) {
+            return null;
+        }
+
+        Route route = camelContext.getRoute(routeId);
+
+        if (route != null) {
+            try {
+                ObjectName on = getManagementStrategy().getManagementObjectNameStrategy().getObjectNameForRoute(route);
+                return getManagementStrategy().getManagementAgent().newProxyClient(on, type);
+            } catch (MalformedObjectNameException e) {
+                throw RuntimeCamelException.wrapRuntimeCamelException(e);
+            }
+        }
+
+        return null;
+    }
+
+    public ManagedCamelContextMBean getManagedCamelContext() {
+        // jmx must be enabled
+        if (getManagementStrategy().getManagementAgent() == null) {
+            return null;
+        }
+
+        try {
+            ObjectName on = getManagementStrategy().getManagementObjectNameStrategy()
+                    .getObjectNameForCamelContext(camelContext);
+            return getManagementStrategy().getManagementAgent().newProxyClient(on, ManagedCamelContextMBean.class);
+        } catch (MalformedObjectNameException e) {
+            throw RuntimeCamelException.wrapRuntimeCamelException(e);
+        }
+    }
+
+}
diff --git a/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java b/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
index a00e329..d5ce265 100644
--- a/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
@@ -19,154 +19,66 @@ package org.apache.camel.management;
 import javax.management.ObjectName;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Endpoint;
 import org.apache.camel.NamedNode;
-import org.apache.camel.management.mbean.ManagedBacklogDebugger;
-import org.apache.camel.management.mbean.ManagedBacklogTracer;
-import org.apache.camel.management.mbean.ManagedCamelContext;
-import org.apache.camel.management.mbean.ManagedCamelHealth;
-import org.apache.camel.management.mbean.ManagedClusterService;
-import org.apache.camel.management.mbean.ManagedComponent;
-import org.apache.camel.management.mbean.ManagedConsumer;
-import org.apache.camel.management.mbean.ManagedDataFormat;
-import org.apache.camel.management.mbean.ManagedEndpoint;
-import org.apache.camel.management.mbean.ManagedErrorHandler;
-import org.apache.camel.management.mbean.ManagedEventNotifier;
-import org.apache.camel.management.mbean.ManagedProcessor;
-import org.apache.camel.management.mbean.ManagedProducer;
-import org.apache.camel.management.mbean.ManagedRoute;
-import org.apache.camel.management.mbean.ManagedRouteController;
-import org.apache.camel.management.mbean.ManagedService;
-import org.apache.camel.management.mbean.ManagedThreadPool;
+import org.apache.camel.api.management.ManagedCamelContext;
+import org.apache.camel.impl.DefaultManagementStrategy;
 import org.apache.camel.spi.ManagementAgent;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.camel.spi.ManagementObjectNameStrategy;
+import org.apache.camel.spi.ManagementObjectStrategy;
 
 /**
  * A JMX capable {@link org.apache.camel.spi.ManagementStrategy} that Camel by default uses if possible.
  * <p/>
  * Camel detects whether its possible to use this JMX capable strategy and if <b>not</b> then Camel
- * will fallback to the {@link org.apache.camel.management.DefaultManagementStrategy} instead.
+ * will fallback to the {@link DefaultManagementStrategy} instead.
  *
  * @see org.apache.camel.spi.ManagementStrategy
- * @see org.apache.camel.management.DefaultManagementStrategy
+ * @see DefaultManagementStrategy
  */
 public class ManagedManagementStrategy extends DefaultManagementStrategy {
 
-    private static final Logger LOG = LoggerFactory.getLogger(ManagedManagementStrategy.class);
-
-    public ManagedManagementStrategy() {
-    }
-
-    public ManagedManagementStrategy(CamelContext camelContext, ManagementAgent managementAgent) {
-        setCamelContext(camelContext);
-        setManagementAgent(managementAgent);
+    public ManagedManagementStrategy(CamelContext context, ManagementAgent managementAgent) {
+        super(context, managementAgent);
+        context.setExtension(
+                ManagedCamelContext.class,
+                new ManagedCamelContextImpl(context));
+        // must add management lifecycle strategy
+        context.getLifecycleStrategies().add(0, new DefaultManagementLifecycleStrategy(context));
     }
 
     public void manageObject(Object managedObject) throws Exception {
-        manageNamedObject(managedObject, null);
-    }
-
-    public void manageNamedObject(Object managedObject, Object preferredName) throws Exception {
-        ObjectName objectName = getObjectName(managedObject, preferredName);
-
+        ObjectName objectName = getManagementObjectNameStrategy().getObjectName(managedObject);
         if (objectName != null) {
             getManagementAgent().register(managedObject, objectName);
         }
     }
 
-    public <T> T getManagedObjectName(Object managedObject, String customName, Class<T> nameType) throws Exception {
-        if (managedObject == null) {
-            return null;
-        }
-
-        ObjectName objectName = null;
-
-
-
-        if (managedObject instanceof ManagedCamelContext) {
-            ManagedCamelContext mcc = (ManagedCamelContext) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForCamelContext(mcc.getContext());
-        } else if (managedObject instanceof ManagedCamelHealth) {
-            ManagedCamelHealth mch = (ManagedCamelHealth) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForCamelHealth(mch.getContext());
-        } else if (managedObject instanceof ManagedRouteController) {
-            ManagedRouteController mrc = (ManagedRouteController) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForRouteController(mrc.getContext());
-        } else if (managedObject instanceof ManagedComponent) {
-            ManagedComponent mc = (ManagedComponent) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForComponent(mc.getComponent(), mc.getComponentName());
-        } else if (managedObject instanceof ManagedDataFormat) {
-            ManagedDataFormat md = (ManagedDataFormat) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForDataFormat(md.getContext(), md.getDataFormat());
-        } else if (managedObject instanceof ManagedEndpoint) {
-            ManagedEndpoint me = (ManagedEndpoint) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForEndpoint(me.getEndpoint());
-        } else if (managedObject instanceof Endpoint) {
-            objectName = getManagementObjectNameStrategy().getObjectNameForEndpoint((Endpoint) managedObject);
-        } else if (managedObject instanceof ManagedRoute) {
-            ManagedRoute mr = (ManagedRoute) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForRoute(mr.getRoute());
-        } else if (managedObject instanceof ManagedErrorHandler) {
-            ManagedErrorHandler meh = (ManagedErrorHandler) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForErrorHandler(meh.getRouteContext(), meh.getErrorHandler(), meh.getErrorHandlerBuilder());
-        } else if (managedObject instanceof ManagedProcessor) {
-            ManagedProcessor mp = (ManagedProcessor) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForProcessor(mp.getContext(), mp.getProcessor(), mp.getDefinition());
-        } else if (managedObject instanceof ManagedConsumer) {
-            ManagedConsumer ms = (ManagedConsumer) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForConsumer(ms.getContext(), ms.getConsumer());
-        } else if (managedObject instanceof ManagedProducer) {
-            ManagedProducer ms = (ManagedProducer) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForProducer(ms.getContext(), ms.getProducer());
-        } else if (managedObject instanceof ManagedBacklogTracer) {
-            ManagedBacklogTracer mt = (ManagedBacklogTracer) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForTracer(mt.getContext(), mt.getBacklogTracer());
-        } else if (managedObject instanceof ManagedBacklogDebugger) {
-            ManagedBacklogDebugger md = (ManagedBacklogDebugger) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForTracer(md.getContext(), md.getBacklogDebugger());
-        } else if (managedObject instanceof ManagedEventNotifier) {
-            ManagedEventNotifier men = (ManagedEventNotifier) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForEventNotifier(men.getContext(), men.getEventNotifier());
-        } else if (managedObject instanceof ManagedThreadPool) {
-            ManagedThreadPool mes = (ManagedThreadPool) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForThreadPool(mes.getContext(), mes.getThreadPool(), mes.getId(), mes.getSourceId());
-        } else if (managedObject instanceof ManagedClusterService) {
-            ManagedClusterService mcs = (ManagedClusterService) managedObject;
-            objectName = getManagementObjectNameStrategy().getObjectNameForClusterService(mcs.getContext(), mcs.getService());
-        } else if (managedObject instanceof ManagedService) {
-            // check for managed service should be last
-            ManagedService ms = (ManagedService) managedObject;
-            // skip endpoints as they are already managed
-            if (ms.getService() instanceof Endpoint) {
-                return null;
-            }
-            objectName = getManagementObjectNameStrategy().getObjectNameForService(ms.getContext(), ms.getService());
-        }
-
-        return nameType.cast(objectName);
-    }
-
     public void unmanageObject(Object managedObject) throws Exception {
-        ObjectName objectName = getManagedObjectName(managedObject, null, ObjectName.class);
-        unmanageNamedObject(objectName);
-    }
-
-    public void unmanageNamedObject(Object name) throws Exception {
-        ObjectName objectName = getObjectName(null, name);
+        ObjectName objectName = getManagementObjectNameStrategy().getObjectName(managedObject);
         if (objectName != null) {
             getManagementAgent().unregister(objectName);
         }
     }
 
-    public boolean isManaged(Object managedObject, Object name) {
+    public boolean isManaged(Object managedObject) {
+        try {
+            ObjectName name = getManagementObjectNameStrategy().getObjectName(managedObject);
+            if (name != null) {
+                return getManagementAgent().isRegistered(name);
+            }
+        } catch (Exception e) {
+            log.warn("Cannot check whether the managed object is registered. This exception will be ignored.", e);
+        }
+        return false;
+    }
+
+    public boolean isManagedName(Object name) {
         try {
-            ObjectName objectName = getObjectName(managedObject, name);
-            if (objectName != null) {
-                return getManagementAgent().isRegistered(objectName);
+            if (name instanceof ObjectName) {
+                return getManagementAgent().isRegistered((ObjectName) name);
             }
         } catch (Exception e) {
-            LOG.warn("Cannot check whether the managed object is registered. This exception will be ignored.", e);
+            log.warn("Cannot check whether the managed object is registered. This exception will be ignored.", e);
         }
         return false;
     }
@@ -176,24 +88,18 @@ public class ManagedManagementStrategy extends DefaultManagementStrategy {
         return true;
     }
 
-    private ObjectName getObjectName(Object managedObject, Object preferedName) throws Exception {
-        ObjectName objectName;
-
-        if (preferedName instanceof String) {
-            String customName = (String) preferedName;
-            objectName = getManagedObjectName(managedObject, customName, ObjectName.class);
-        } else if (preferedName instanceof ObjectName) {
-            objectName = (ObjectName) preferedName;
-        } else {
-            objectName = getManagedObjectName(managedObject, null, ObjectName.class);
-        }
-        return objectName;
-    }
-
     @Override
     protected void doStart() throws Exception {
-        LOG.info("JMX is enabled");
+        log.info("JMX is enabled");
         doStartManagementStrategy();
     }
 
+    protected ManagementObjectNameStrategy createManagementObjectNameStrategy(String domain) {
+        return new DefaultManagementObjectNameStrategy(domain);
+    }
+
+    protected ManagementObjectStrategy createManagementObjectStrategy() {
+        return new DefaultManagementObjectStrategy();
+    }
+
 }
diff --git a/camel-core/src/main/java/org/apache/camel/management/ManagementStrategyFactory.java b/camel-core/src/main/java/org/apache/camel/management/ManagementStrategyFactory.java
index 63ce2dd..64d8d44 100644
--- a/camel-core/src/main/java/org/apache/camel/management/ManagementStrategyFactory.java
+++ b/camel-core/src/main/java/org/apache/camel/management/ManagementStrategyFactory.java
@@ -17,6 +17,7 @@
 package org.apache.camel.management;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.impl.DefaultManagementStrategy;
 import org.apache.camel.spi.ManagementStrategy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -28,23 +29,14 @@ public class ManagementStrategyFactory {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     public ManagementStrategy create(CamelContext context, boolean disableJMX) {
-        ManagementStrategy answer;
-
-        if (disableJMX || Boolean.getBoolean(JmxSystemPropertyKeys.DISABLED)) {
-            answer = new DefaultManagementStrategy(context);
-        } else {
+        if (!disableJMX && !Boolean.getBoolean(JmxSystemPropertyKeys.DISABLED)) {
             try {
-                answer = new ManagedManagementStrategy(context, new DefaultManagementAgent(context));
-
-                // must add management lifecycle strategy
-                context.getLifecycleStrategies().add(0, new DefaultManagementLifecycleStrategy(context));
-
+                return new ManagedManagementStrategy(context, new DefaultManagementAgent(context));
             } catch (Exception e) {
                 log.warn("Cannot create JMX lifecycle strategy. Will fallback and disable JMX.", e);
-                answer = new DefaultManagementStrategy(context);
             }
         }
-        return answer;
+        return new DefaultManagementStrategy(context);
     }
 
 }
diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelHealth.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelHealth.java
index e176282..d7aadde 100644
--- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelHealth.java
+++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelHealth.java
@@ -63,7 +63,7 @@ public class ManagedCamelHealth implements ManagedCamelHealthMBean {
 
     @Override
     public Collection<String> getHealthChecksIDs() {
-        HealthCheckRegistry registry = context.getHealthCheckRegistry();
+        HealthCheckRegistry registry = HealthCheckRegistry.get(context);
         if (registry != null) {
             return registry.getCheckIDs();
         }
diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/RouteCoverageXmlParser.java b/camel-core/src/main/java/org/apache/camel/management/mbean/RouteCoverageXmlParser.java
index 654b063..e06a833 100644
--- a/camel-core/src/main/java/org/apache/camel/management/mbean/RouteCoverageXmlParser.java
+++ b/camel-core/src/main/java/org/apache/camel/management/mbean/RouteCoverageXmlParser.java
@@ -36,7 +36,7 @@ import org.xml.sax.helpers.DefaultHandler;
 import org.apache.camel.CamelContext;
 import org.apache.camel.api.management.mbean.ManagedProcessorMBean;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
-import org.apache.camel.management.ManagedCamelContext;
+import org.apache.camel.api.management.ManagedCamelContext;
 
 /**
  * An XML parser that uses SAX to enrich route stats in the route dump.
@@ -91,7 +91,7 @@ public final class RouteCoverageXmlParser {
                 if (id != null) {
                     try {
                         if ("route".equals(qName)) {
-                            ManagedRouteMBean route = camelContext.adapt(ManagedCamelContext.class).getManagedRoute(id, ManagedRouteMBean.class);
+                            ManagedRouteMBean route = camelContext.getExtension(ManagedCamelContext.class).getManagedRoute(id);
                             if (route != null) {
                                 long total = route.getExchangesTotal();
                                 el.setAttribute("exchangesTotal", "" + total);
@@ -103,7 +103,7 @@ public final class RouteCoverageXmlParser {
                             Element parent = elementStack.peek();
                             if (parent != null) {
                                 String routeId = parent.getAttribute("id");
-                                ManagedRouteMBean route = camelContext.adapt(ManagedCamelContext.class).getManagedRoute(routeId, ManagedRouteMBean.class);
+                                ManagedRouteMBean route = camelContext.getExtension(ManagedCamelContext.class).getManagedRoute(routeId);
                                 if (route != null) {
                                     long total = route.getExchangesTotal();
                                     el.setAttribute("exchangesTotal", "" + total);
@@ -114,7 +114,7 @@ public final class RouteCoverageXmlParser {
                                 }
                             }
                         } else {
-                            ManagedProcessorMBean processor = camelContext.adapt(ManagedCamelContext.class).getManagedProcessor(id, ManagedProcessorMBean.class);
+                            ManagedProcessorMBean processor = camelContext.getExtension(ManagedCamelContext.class).getManagedProcessor(id);
                             if (processor != null) {
                                 long total = processor.getExchangesTotal();
                                 el.setAttribute("exchangesTotal", "" + total);
diff --git a/camel-core/src/main/java/org/apache/camel/model/DynamicRouterDefinition.java b/camel-core/src/main/java/org/apache/camel/model/DynamicRouterDefinition.java
index 7f8dda6..f2307f6 100644
--- a/camel-core/src/main/java/org/apache/camel/model/DynamicRouterDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/DynamicRouterDefinition.java
@@ -170,7 +170,7 @@ public class DynamicRouterDefinition<Type extends ProcessorDefinition<Type>> ext
     }
     
     /**
-     * Sets the maximum size used by the {@link DefaultProducerCache} which is used
+     * Sets the maximum size used by the {@link org.apache.camel.spi.ProducerCache} which is used
      * to cache and reuse producers when using this dynamic router, when uris are reused.
      *
      * @param cacheSize  the cache size, use <tt>0</tt> for default cache size, or <tt>-1</tt> to turn cache off.
diff --git a/camel-core/src/main/java/org/apache/camel/model/EnrichDefinition.java b/camel-core/src/main/java/org/apache/camel/model/EnrichDefinition.java
index 69ee984..95011d2 100644
--- a/camel-core/src/main/java/org/apache/camel/model/EnrichDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/EnrichDefinition.java
@@ -188,7 +188,7 @@ public class EnrichDefinition extends NoOutputExpressionNode {
     }
 
     /**
-     * Sets the maximum size used by the {@link DefaultProducerCache} which is used
+     * Sets the maximum size used by the {@link org.apache.camel.spi.ProducerCache} which is used
      * to cache and reuse producer when uris are reused.
      *
      * @param cacheSize  the cache size, use <tt>0</tt> for default cache size, or <tt>-1</tt> to turn cache off.
diff --git a/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java
index b0ce0ae..d2e40ca 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java
@@ -31,9 +31,6 @@ import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.StatefulService;
 import org.apache.camel.StreamCache;
-import org.apache.camel.management.DelegatePerformanceCounter;
-import org.apache.camel.management.PerformanceCounter;
-import org.apache.camel.management.mbean.ManagedPerformanceCounter;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.ProcessorDefinitionHelper;
 import org.apache.camel.model.RouteDefinition;
@@ -83,7 +80,7 @@ import org.slf4j.LoggerFactory;
  */
 public class CamelInternalProcessor extends DelegateAsyncProcessor {
 
-    private final List<CamelInternalProcessorAdvice> advices = new ArrayList<>();
+    private final List<CamelInternalProcessorAdvice<?>> advices = new ArrayList<>();
 
     public CamelInternalProcessor() {
     }
@@ -97,7 +94,7 @@ public class CamelInternalProcessor extends DelegateAsyncProcessor {
      *
      * @param advice  the advice to add
      */
-    public void addAdvice(CamelInternalProcessorAdvice advice) {
+    public void addAdvice(CamelInternalProcessorAdvice<?> advice) {
         advices.add(advice);
         // ensure advices are sorted so they are in the order we want
         advices.sort(OrderedComparator.get());
@@ -111,8 +108,9 @@ public class CamelInternalProcessor extends DelegateAsyncProcessor {
      */
     public <T> T getAdvice(Class<T> type) {
         for (CamelInternalProcessorAdvice task : advices) {
-            if (type.isInstance(task)) {
-                return type.cast(task);
+            Object advice = CamelInternalProcessorAdvice.unwrap(task);
+            if (type.isInstance(advice)) {
+                return type.cast(advice);
             }
         }
         return null;
@@ -325,82 +323,6 @@ public class CamelInternalProcessor extends DelegateAsyncProcessor {
     }
 
     /**
-     * Advice for JMX instrumentation of the process being invoked.
-     * <p/>
-     * This advice keeps track of JMX metrics for performance statistics.
-     * <p/>
-     * The current implementation of this advice is only used for route level statistics. For processor levels
-     * they are still wrapped in the route processor chains.
-     */
-    public static class InstrumentationAdvice implements CamelInternalProcessorAdvice<StopWatch> {
-
-        private final Logger log = LoggerFactory.getLogger(getClass());
-        private PerformanceCounter counter;
-        private String type;
-
-        public InstrumentationAdvice(String type) {
-            this.type = type;
-        }
-
-        public void setCounter(Object counter) {
-            ManagedPerformanceCounter mpc = null;
-            if (counter instanceof ManagedPerformanceCounter) {
-                mpc = (ManagedPerformanceCounter) counter;
-            }
-
-            if (this.counter instanceof DelegatePerformanceCounter) {
-                ((DelegatePerformanceCounter) this.counter).setCounter(mpc);
-            } else if (mpc != null) {
-                this.counter = mpc;
-            } else if (counter instanceof PerformanceCounter) {
-                this.counter = (PerformanceCounter) counter;
-            }
-        }
-
-        protected void beginTime(Exchange exchange) {
-            counter.processExchange(exchange);
-        }
-
-        protected void recordTime(Exchange exchange, long duration) {
-            if (log.isTraceEnabled()) {
-                log.trace("{}Recording duration: {} millis for exchange: {}", type != null ? type + ": " : "", duration, exchange);
-            }
-
-            if (!exchange.isFailed() && exchange.getException() == null) {
-                counter.completedExchange(exchange, duration);
-            } else {
-                counter.failedExchange(exchange);
-            }
-        }
-
-        public String getType() {
-            return type;
-        }
-
-        public void setType(String type) {
-            this.type = type;
-        }
-
-        @Override
-        public StopWatch before(Exchange exchange) throws Exception {
-            // only record time if stats is enabled
-            StopWatch answer = counter != null && counter.isStatisticsEnabled() ? new StopWatch() : null;
-            if (answer != null) {
-                beginTime(exchange);
-            }
-            return answer;
-        }
-
-        @Override
-        public void after(Exchange exchange, StopWatch watch) throws Exception {
-            // record end time
-            if (watch != null) {
-                recordTime(exchange, watch.taken());
-            }
-        }
-    }
-
-    /**
      * Advice to keep the {@link InflightRepository} up to date.
      */
     public static class RouteInflightRepositoryAdvice implements CamelInternalProcessorAdvice {
diff --git a/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessorAdvice.java b/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessorAdvice.java
index a6c589a..9139e70 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessorAdvice.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/CamelInternalProcessorAdvice.java
@@ -17,6 +17,8 @@
 package org.apache.camel.processor;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.Ordered;
+import org.apache.camel.spi.ManagementInterceptStrategy.InstrumentationProcessor;
 
 /**
  * An advice (before and after) to execute cross cutting functionality in the Camel routing engine.
@@ -25,7 +27,7 @@ import org.apache.camel.Exchange;
  * {@link #after(org.apache.camel.Exchange, Object)} methods during routing in correct order.
  *
  * @param <T>
- * @see CamelInternalProcessor
+ * @see org.apache.camel.processor.CamelInternalProcessor
  */
 public interface CamelInternalProcessorAdvice<T> {
 
@@ -46,4 +48,53 @@ public interface CamelInternalProcessorAdvice<T> {
      * @throws Exception is thrown if error during the call.
      */
     void after(Exchange exchange, T data) throws Exception;
+
+    /**
+     * Wrap an InstrumentationProcessor into a CamelInternalProcessorAdvice
+     */
+    static <T> CamelInternalProcessorAdvice<T> wrap(InstrumentationProcessor<T> instrumentationProcessor) {
+
+        if (instrumentationProcessor instanceof CamelInternalProcessor) {
+            return (CamelInternalProcessorAdvice<T>) instrumentationProcessor;
+        } else {
+            return new CamelInternalProcessorAdviceWrapper<T>(instrumentationProcessor);
+        }
+    }
+
+    static Object unwrap(CamelInternalProcessorAdvice<?> advice) {
+        if (advice instanceof CamelInternalProcessorAdviceWrapper) {
+            return ((CamelInternalProcessorAdviceWrapper) advice).unwrap();
+        } else {
+            return advice;
+        }
+    }
+
+    class CamelInternalProcessorAdviceWrapper<T> implements CamelInternalProcessorAdvice<T>, Ordered {
+
+        final InstrumentationProcessor<T> instrumentationProcessor;
+
+        public CamelInternalProcessorAdviceWrapper(InstrumentationProcessor<T> instrumentationProcessor) {
+            this.instrumentationProcessor = instrumentationProcessor;
+        }
+
+        InstrumentationProcessor<T> unwrap() {
+            return instrumentationProcessor;
+        }
+
+        @Override
+        public int getOrder() {
+            return instrumentationProcessor.getOrder();
+        }
+
+        @Override
+        public T before(Exchange exchange) throws Exception {
+            return instrumentationProcessor.before(exchange);
+        }
+
+        @Override
+        public void after(Exchange exchange, T data) throws Exception {
+            instrumentationProcessor.after(exchange, data);
+        }
+    }
+
 }
diff --git a/camel-core/src/main/java/org/apache/camel/processor/InterceptorToAsyncProcessorBridge.java b/camel-core/src/main/java/org/apache/camel/processor/InterceptorToAsyncProcessorBridge.java
index c45f290..5ba23ed 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/InterceptorToAsyncProcessorBridge.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/InterceptorToAsyncProcessorBridge.java
@@ -41,18 +41,8 @@ public class InterceptorToAsyncProcessorBridge extends ServiceSupport implements
      * @param interceptor the interceptor to bridge
      */
     public InterceptorToAsyncProcessorBridge(Processor interceptor) {
-        this(interceptor, null);
-    }
-
-    /**
-     * Constructs the bridge
-     *
-     * @param interceptor the interceptor to bridge
-     * @param target the target
-     */
-    public InterceptorToAsyncProcessorBridge(Processor interceptor, AsyncProcessor target) {
         this.interceptor = AsyncProcessorConverterHelper.convert(interceptor);
-        this.target = target;
+        this.target = AsyncProcessorConverterHelper.convert(target);
     }
 
     /**
diff --git a/camel-core/src/main/java/org/apache/camel/processor/RestBindingAdvice.java b/camel-core/src/main/java/org/apache/camel/processor/RestBindingAdvice.java
index e694821..95ddb3d 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/RestBindingAdvice.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/RestBindingAdvice.java
@@ -36,7 +36,7 @@ import org.apache.camel.support.MessageHelper;
 import org.apache.camel.util.ObjectHelper;
 
 /**
- * A {@link org.apache.camel.processor.CamelInternalProcessorAdvice} that binds the REST DSL incoming
+ * A {@link CamelInternalProcessorAdvice} that binds the REST DSL incoming
  * and outgoing messages from sources of json or xml to Java Objects.
  * <p/>
  * The binding uses {@link org.apache.camel.spi.DataFormat} for the actual work to transform
diff --git a/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogDebugger.java b/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogDebugger.java
index ff58f45..3b7b44d 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogDebugger.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogDebugger.java
@@ -18,7 +18,6 @@ package org.apache.camel.processor.interceptor;
 
 import java.util.Date;
 import java.util.LinkedHashSet;
-import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -42,10 +41,9 @@ import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.ProcessorDefinitionHelper;
 import org.apache.camel.spi.CamelEvent.ExchangeCompletedEvent;
 import org.apache.camel.spi.CamelEvent.ExchangeEvent;
+import org.apache.camel.spi.CamelLogger;
 import org.apache.camel.spi.Condition;
 import org.apache.camel.spi.Debugger;
-import org.apache.camel.spi.InterceptStrategy;
-import org.apache.camel.spi.CamelLogger;
 import org.apache.camel.support.MessageHelper;
 import org.apache.camel.support.ServiceHelper;
 import org.apache.camel.support.ServiceSupport;
@@ -63,7 +61,7 @@ import org.apache.camel.support.ServiceSupport;
  * concurrency then sub-sequent {@link Exchange} will continue to be routed, if there breakpoint already holds a
  * suspended {@link Exchange}.
  */
-public class BacklogDebugger extends ServiceSupport implements InterceptStrategy {
+public class BacklogDebugger extends ServiceSupport {
 
     private long fallbackTimeout = 300;
     private final CamelContext camelContext;
@@ -105,16 +103,19 @@ public class BacklogDebugger extends ServiceSupport implements InterceptStrategy
         }
     }
 
-    public BacklogDebugger(CamelContext camelContext) {
+    private BacklogDebugger(CamelContext camelContext) {
         this.camelContext = camelContext;
-        DefaultDebugger debugger = new DefaultDebugger(camelContext);
-        this.debugger = debugger;
+        this.debugger = new DefaultDebugger(camelContext);
     }
 
-    @Override
-    @Deprecated
-    public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition, Processor target, Processor nextTarget) throws Exception {
-        throw new UnsupportedOperationException("Deprecated");
+    /**
+     * Creates a new backlog debugger.
+     *
+     * @param context Camel context
+     * @return a new backlog debugger
+     */
+    public static BacklogDebugger createDebugger(CamelContext context) {
+        return new BacklogDebugger(context);
     }
 
     /**
@@ -123,13 +124,7 @@ public class BacklogDebugger extends ServiceSupport implements InterceptStrategy
      * @return the backlog debugger or null if none can be found
      */
     public static BacklogDebugger getBacklogDebugger(CamelContext context) {
-        List<InterceptStrategy> list = context.getInterceptStrategies();
-        for (InterceptStrategy interceptStrategy : list) {
-            if (interceptStrategy instanceof BacklogDebugger) {
-                return (BacklogDebugger) interceptStrategy;
-            }
-        }
-        return null;
+        return context.hasService(BacklogDebugger.class);
     }
 
     public Debugger getDebugger() {
diff --git a/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java b/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java
index 6bf2563..808c8bc 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/interceptor/BacklogTracer.java
@@ -42,7 +42,7 @@ import org.apache.camel.util.StringHelper;
  * This tracer allows to store message tracers per node in the Camel routes. The tracers
  * is stored in a backlog queue (FIFO based) which allows to pull the traced messages on demand.
  */
-public final class BacklogTracer extends ServiceSupport implements InterceptStrategy {
+public final class BacklogTracer extends ServiceSupport {
 
     // lets limit the tracer to 10 thousand messages in total
     public static final int MAX_BACKLOG_SIZE = 10 * 1000;
@@ -67,12 +67,6 @@ public final class BacklogTracer extends ServiceSupport implements InterceptStra
         this.camelContext = camelContext;
     }
 
-    @Override
-    @Deprecated
-    public Processor wrapProcessorInInterceptors(CamelContext context, NamedNode definition, Processor target, Processor nextTarget) throws Exception {
-        throw new UnsupportedOperationException("Deprecated");
-    }
-
     /**
      * Creates a new backlog tracer.
      *
@@ -89,13 +83,7 @@ public final class BacklogTracer extends ServiceSupport implements InterceptStra
      * @return the backlog tracer or null if none can be found
      */
     public static BacklogTracer getBacklogTracer(CamelContext context) {
-        List<InterceptStrategy> list = context.getInterceptStrategies();
-        for (InterceptStrategy interceptStrategy : list) {
-            if (interceptStrategy instanceof BacklogTracer) {
-                return (BacklogTracer) interceptStrategy;
-            }
-        }
-        return null;
+        return context.getExtension(BacklogTracer.class);
     }
 
     /**
diff --git a/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultChannel.java b/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultChannel.java
index 746a6c5..40de8e6 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultChannel.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/interceptor/DefaultChannel.java
@@ -27,8 +27,6 @@ import org.apache.camel.CamelContextAware;
 import org.apache.camel.Channel;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
-import org.apache.camel.management.InstrumentationInterceptStrategy;
-import org.apache.camel.management.InstrumentationProcessor;
 import org.apache.camel.model.ModelChannel;
 import org.apache.camel.model.OnCompletionDefinition;
 import org.apache.camel.model.OnExceptionDefinition;
@@ -37,10 +35,12 @@ import org.apache.camel.model.ProcessorDefinitionHelper;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.RouteDefinitionHelper;
 import org.apache.camel.processor.CamelInternalProcessor;
+import org.apache.camel.processor.CamelInternalProcessorAdvice;
 import org.apache.camel.processor.InterceptorToAsyncProcessorBridge;
 import org.apache.camel.processor.RedeliveryErrorHandler;
 import org.apache.camel.processor.WrapProcessor;
 import org.apache.camel.spi.InterceptStrategy;
+import org.apache.camel.spi.ManagementInterceptStrategy;
 import org.apache.camel.spi.MessageHistoryFactory;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.support.OrderedComparator;
@@ -66,7 +66,7 @@ public class DefaultChannel extends CamelInternalProcessor implements ModelChann
     private Processor output;
     private ProcessorDefinition<?> definition;
     private ProcessorDefinition<?> childDefinition;
-    private InstrumentationProcessor instrumentationProcessor;
+    private ManagementInterceptStrategy.InstrumentationProcessor<?> instrumentationProcessor;
     private CamelContext camelContext;
     private RouteContext routeContext;
 
@@ -210,35 +210,25 @@ public class DefaultChannel extends CamelInternalProcessor implements ModelChann
 
         // setup instrumentation processor for management (jmx)
         // this is later used in postInitChannel as we need to setup the error handler later as well
-        InterceptStrategy managed = routeContext.getManagedInterceptStrategy();
-        if (managed instanceof InstrumentationInterceptStrategy) {
-            InstrumentationInterceptStrategy iis = (InstrumentationInterceptStrategy) managed;
-            instrumentationProcessor = new InstrumentationProcessor(targetOutputDef.getShortName(), target);
-            iis.prepareProcessor(targetOutputDef, target, instrumentationProcessor);
+        ManagementInterceptStrategy managed = routeContext.getManagementInterceptStrategy();
+        if (managed != null) {
+            instrumentationProcessor = managed.createProcessor(targetOutputDef, target);
         }
 
         // then wrap the output with the backlog and tracer (backlog first, as we do not want regular tracer to trace the backlog)
-        InterceptStrategy tracer = getOrCreateBacklogTracer();
-        camelContext.addService(tracer);
-        if (tracer instanceof BacklogTracer) {
-            BacklogTracer backlogTracer = (BacklogTracer) tracer;
-
-            RouteDefinition route = ProcessorDefinitionHelper.getRoute(definition);
-            boolean first = false;
-            if (route != null && !route.getOutputs().isEmpty()) {
-                first = route.getOutputs().get(0) == definition;
-            }
-
-            addAdvice(new BacklogTracerAdvice(backlogTracer, targetOutputDef, route, first));
-
-            // add debugger as well so we have both tracing and debugging out of the box
-            InterceptStrategy debugger = getOrCreateBacklogDebugger();
-            camelContext.addService(debugger);
-            if (debugger instanceof BacklogDebugger) {
-                BacklogDebugger backlogDebugger = (BacklogDebugger) debugger;
-                addAdvice(new BacklogDebuggerAdvice(backlogDebugger, target, targetOutputDef));
-            }
+        BacklogTracer tracer = getOrCreateBacklogTracer();
+        camelContext.setExtension(BacklogTracer.class, tracer);
+        RouteDefinition route = ProcessorDefinitionHelper.getRoute(definition);
+        boolean first = false;
+        if (route != null && !route.getOutputs().isEmpty()) {
+            first = route.getOutputs().get(0) == definition;
         }
+        addAdvice(new BacklogTracerAdvice(tracer, targetOutputDef, route, first));
+
+        // add debugger as well so we have both tracing and debugging out of the box
+        BacklogDebugger debugger = getOrCreateBacklogDebugger();
+        camelContext.addService(debugger);
+        addAdvice(new BacklogDebuggerAdvice(debugger, target, targetOutputDef));
 
         if (routeContext.isMessageHistory()) {
             // add message history advice
@@ -248,7 +238,7 @@ public class DefaultChannel extends CamelInternalProcessor implements ModelChann
 
         // sort interceptors according to ordered
         interceptors.sort(OrderedComparator.get());
-        // then reverse list so the first will be wrapped last, as it would then be first being invoked
+        // reverse list so the first will be wrapped last, as it would then be first being invoked
         Collections.reverse(interceptors);
         // wrap the output with the configured interceptors
         for (InterceptStrategy strategy : interceptors) {
@@ -312,46 +302,45 @@ public class DefaultChannel extends CamelInternalProcessor implements ModelChann
             }
             if (!redeliveryPossible) {
                 // optimise to use advice as we cannot redeliver
-                addAdvice(instrumentationProcessor);
+                addAdvice(CamelInternalProcessorAdvice.wrap(instrumentationProcessor));
             }
         }
     }
 
-    private InterceptStrategy getOrCreateBacklogTracer() {
-        InterceptStrategy tracer = BacklogTracer.getBacklogTracer(camelContext);
-        if (tracer == null) {
-            if (camelContext.getRegistry() != null) {
-                // lookup in registry
-                Map<String, BacklogTracer> map = camelContext.getRegistry().findByTypeWithName(BacklogTracer.class);
-                if (map.size() == 1) {
-                    tracer = map.values().iterator().next();
-                }
-            }
-            if (tracer == null) {
-                // fallback to use the default tracer
-                tracer = camelContext.getDefaultBacklogTracer();
+    private BacklogTracer getOrCreateBacklogTracer() {
+        BacklogTracer tracer = null;
+        if (camelContext.getRegistry() != null) {
+            // lookup in registry
+            Map<String, BacklogTracer> map = camelContext.getRegistry().findByTypeWithName(BacklogTracer.class);
+            if (map.size() == 1) {
+                tracer = map.values().iterator().next();
             }
         }
-
+        if (tracer == null) {
+            tracer = camelContext.getExtension(BacklogTracer.class);
+        }
+        if (tracer == null) {
+            tracer = BacklogTracer.createTracer(camelContext);
+        }
         return tracer;
     }
 
-    private InterceptStrategy getOrCreateBacklogDebugger() {
-        InterceptStrategy debugger = BacklogDebugger.getBacklogDebugger(camelContext);
-        if (debugger == null) {
-            if (camelContext.getRegistry() != null) {
-                // lookup in registry
-                Map<String, BacklogDebugger> map = camelContext.getRegistry().findByTypeWithName(BacklogDebugger.class);
-                if (map.size() == 1) {
-                    debugger = map.values().iterator().next();
-                }
-            }
-            if (debugger == null) {
-                // fallback to use the default debugger
-                debugger = camelContext.getDefaultBacklogDebugger();
+    private BacklogDebugger getOrCreateBacklogDebugger() {
+        BacklogDebugger debugger = null;
+        if (camelContext.getRegistry() != null) {
+            // lookup in registry
+            Map<String, BacklogDebugger> map = camelContext.getRegistry().findByTypeWithName(BacklogDebugger.class);
+            if (map.size() == 1) {
+                debugger = map.values().iterator().next();
             }
         }
-
+        if (debugger == null) {
+            debugger = camelContext.hasService(BacklogDebugger.class);
+        }
+        if (debugger == null) {
+            // fallback to use the default debugger
+            debugger = BacklogDebugger.createDebugger(camelContext);
+        }
         return debugger;
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/support/EventHelper.java b/camel-core/src/main/java/org/apache/camel/support/EventHelper.java
index fb29075..8fcc4e3 100644
--- a/camel-core/src/main/java/org/apache/camel/support/EventHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/support/EventHelper.java
@@ -17,13 +17,14 @@
 package org.apache.camel.support;
 
 import java.util.List;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
-import org.apache.camel.StatefulService;
 import org.apache.camel.spi.CamelEvent;
 import org.apache.camel.spi.EventFactory;
 import org.apache.camel.spi.EventNotifier;
@@ -42,1000 +43,168 @@ public final class EventHelper {
     }
 
     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;
-        }
-
-        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.createCamelContextStartingEvent(context);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
-    }
-
-    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;
-    }
-
-    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;
-    }
-
-    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;
-    }
-
-    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;
-    }
-
-    public static boolean notifyCamelContextStopFailed(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.createCamelContextStopFailureEvent(context, cause);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
-    }
-
-    public static boolean notifyServiceStopFailure(CamelContext context, Object service, 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.isIgnoreServiceEvents()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createServiceStopFailureEvent(context, service, cause);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
-    }
-
-    public static boolean notifyServiceStartupFailure(CamelContext context, Object service, 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.isIgnoreServiceEvents()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createServiceStartupFailureEvent(context, service, cause);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
-    }
-
-    public static boolean notifyRouteStarted(CamelContext context, Route route) {
-        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.isIgnoreRouteEvents()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createRouteStartedEvent(route);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
-    }
-
-    public static boolean notifyRouteStopped(CamelContext context, Route route) {
-        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.isIgnoreRouteEvents()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createRouteStoppedEvent(route);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
-    }
-
-    public static boolean notifyRouteAdded(CamelContext context, Route route) {
-        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.isIgnoreRouteEvents()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createRouteAddedEvent(route);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
-    }
-
-    public static boolean notifyRouteRemoved(CamelContext context, Route route) {
-        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.isIgnoreRouteEvents()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createRouteRemovedEvent(route);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
-    }
-
-    public static boolean notifyExchangeCreated(CamelContext context, Exchange exchange) {
-        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
-            // do not generate events for an notify event
-            return false;
-        }
-
-        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;
-        // optimise for loop using index access to avoid creating iterator object
-        for (int i = 0; i < notifiers.size(); i++) {
-            EventNotifier notifier = notifiers.get(i);
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeCreatedEvent()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createExchangeCreatedEvent(exchange);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
-    }
-
-    public static boolean notifyExchangeDone(CamelContext context, Exchange exchange) {
-        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
-            // do not generate events for an notify event
-            return false;
-        }
-
-        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;
-        // optimise for loop using index access to avoid creating iterator object
-        for (int i = 0; i < notifiers.size(); i++) {
-            EventNotifier notifier = notifiers.get(i);
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeCompletedEvent()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createExchangeCompletedEvent(exchange);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
-    }
-
-    public static boolean notifyExchangeFailed(CamelContext context, Exchange exchange) {
-        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
-            // do not generate events for an notify event
-            return false;
-        }
-
-        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;
-        // optimise for loop using index access to avoid creating iterator object
-        for (int i = 0; i < notifiers.size(); i++) {
-            EventNotifier notifier = notifiers.get(i);
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeFailedEvents()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createExchangeFailedEvent(exchange);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
-    }
-
-    public static boolean notifyExchangeFailureHandling(CamelContext context, Exchange exchange, Processor failureHandler,
-                                                     boolean deadLetterChannel, String deadLetterUri) {
-        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
-            // do not generate events for an notify event
-            return false;
-        }
-
-        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;
-        // optimise for loop using index access to avoid creating iterator object
-        for (int i = 0; i < notifiers.size(); i++) {
-            EventNotifier notifier = notifiers.get(i);
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeFailedEvents()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createExchangeFailureHandlingEvent(exchange, failureHandler, deadLetterChannel, deadLetterUri);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
-    }
-
-    public static boolean notifyExchangeFailureHandled(CamelContext context, Exchange exchange, Processor failureHandler,
-                                                    boolean deadLetterChannel, String deadLetterUri) {
-        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
-            // do not generate events for an notify event
-            return false;
-        }
-
-        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;
-        // optimise for loop using index access to avoid creating iterator object
-        for (int i = 0; i < notifiers.size(); i++) {
-            EventNotifier notifier = notifiers.get(i);
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeFailedEvents()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createExchangeFailureHandledEvent(exchange, failureHandler, deadLetterChannel, deadLetterUri);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
-    }
-
-    public static boolean notifyExchangeRedelivery(CamelContext context, Exchange exchange, int attempt) {
-        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
-            // do not generate events for an notify event
-            return false;
-        }
-
-        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;
-        // optimise for loop using index access to avoid creating iterator object
-        for (int i = 0; i < notifiers.size(); i++) {
-            EventNotifier notifier = notifiers.get(i);
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeFailedEvents()) {
-                continue;
-            }
-
-            if (event == null) {
-                // only create event once
-                event = factory.createExchangeRedeliveryEvent(exchange, attempt);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
+        return doNotify(context,
+                factory -> factory.createCamelContextStartingEvent(context),
+                EventNotifier::isIgnoreCamelContextEvents);
     }
 
-    public static boolean notifyExchangeSending(CamelContext context, Exchange exchange, Endpoint endpoint) {
-        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
-            // do not generate events for an notify event
-            return false;
-        }
-
-        ManagementStrategy management = context.getManagementStrategy();
-        if (management == null) {
-            return false;
-        }
+    public static boolean notifyCamelContextStarted(CamelContext context) {
+        return doNotify(context,
+                factory -> factory.createCamelContextStartedEvent(context),
+                EventNotifier::isIgnoreCamelContextEvents);
+    }
 
-        EventFactory factory = management.getEventFactory();
-        if (factory == null) {
-            return false;
-        }
+    public static boolean notifyCamelContextStartupFailed(CamelContext context, Throwable cause) {
+        return doNotify(context,
+                factory -> factory.createCamelContextStartupFailureEvent(context, cause),
+                EventNotifier::isIgnoreCamelContextEvents);
+    }
 
-        List<EventNotifier> notifiers = management.getEventNotifiers();
-        if (notifiers == null || notifiers.isEmpty()) {
-            return false;
-        }
+    public static boolean notifyCamelContextStopping(CamelContext context) {
+        return doNotify(context,
+                factory -> factory.createCamelContextStoppingEvent(context),
+                EventNotifier::isIgnoreCamelContextEvents);
+    }
 
-        boolean answer = false;
-        CamelEvent event = null;
-        // optimise for loop using index access to avoid creating iterator object
-        for (int i = 0; i < notifiers.size(); i++) {
-            EventNotifier notifier = notifiers.get(i);
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeSendingEvents()) {
-                continue;
-            }
+    public static boolean notifyCamelContextStopped(CamelContext context) {
+        return doNotify(context,
+                factory -> factory.createCamelContextStoppedEvent(context),
+                EventNotifier::isIgnoreCamelContextEvents);
+    }
 
-            if (event == null) {
-                // only create event once
-                event = factory.createExchangeSendingEvent(exchange, endpoint);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
+    public static boolean notifyCamelContextStopFailure(CamelContext context, Throwable cause) {
+        return doNotify(context,
+                factory -> factory.createCamelContextStopFailureEvent(context, cause),
+                EventNotifier::isIgnoreCamelContextEvents);
     }
 
-    public static boolean notifyExchangeSent(CamelContext context, Exchange exchange, Endpoint endpoint, long timeTaken) {
-        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
-            // do not generate events for an notify event
-            return false;
-        }
+    public static boolean notifyServiceStopFailure(CamelContext context, Object service, Throwable cause) {
+        return doNotify(context,
+                factory -> factory.createServiceStopFailureEvent(context, service, cause),
+                EventNotifier::isIgnoreServiceEvents);
+    }
 
-        ManagementStrategy management = context.getManagementStrategy();
-        if (management == null) {
-            return false;
-        }
+    public static boolean notifyServiceStartupFailure(CamelContext context, Object service, Throwable cause) {
+        return doNotify(context,
+                factory -> factory.createServiceStartupFailureEvent(context, service, cause),
+                EventNotifier::isIgnoreServiceEvents);
+    }
 
-        EventFactory factory = management.getEventFactory();
-        if (factory == null) {
-            return false;
-        }
+    public static boolean notifyRouteStarted(CamelContext context, Route route) {
+        return doNotify(context,
+                factory -> factory.createRouteStartedEvent(route),
+                EventNotifier::isIgnoreRouteEvents);
+    }
 
-        List<EventNotifier> notifiers = management.getEventNotifiers();
-        if (notifiers == null || notifiers.isEmpty()) {
-            return false;
-        }
+    public static boolean notifyRouteStopped(CamelContext context, Route route) {
+        return doNotify(context,
+                factory -> factory.createRouteStoppedEvent(route),
+                EventNotifier::isIgnoreRouteEvents);
+    }
 
-        boolean answer = false;
-        CamelEvent event = null;
-        // optimise for loop using index access to avoid creating iterator object
-        for (int i = 0; i < notifiers.size(); i++) {
-            EventNotifier notifier = notifiers.get(i);
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeSentEvents()) {
-                continue;
-            }
+    public static boolean notifyRouteAdded(CamelContext context, Route route) {
+        return doNotify(context,
+                factory -> factory.createRouteAddedEvent(route),
+                EventNotifier::isIgnoreRouteEvents);
+    }
 
-            if (event == null) {
-                // only create event once
-                event = factory.createExchangeSentEvent(exchange, endpoint, timeTaken);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
+    public static boolean notifyRouteRemoved(CamelContext context, Route route) {
+        return doNotify(context,
+                factory -> factory.createRouteRemovedEvent(route),
+                EventNotifier::isIgnoreRouteEvents);
     }
 
-    public static boolean notifyCamelContextSuspending(CamelContext context) {
-        ManagementStrategy management = context.getManagementStrategy();
-        if (management == null) {
-            return false;
-        }
+    public static boolean notifyExchangeCreated(CamelContext context, Exchange exchange) {
+        return doNotifyExchange(context, exchange,
+                factory -> factory.createExchangeCreatedEvent(exchange),
+                EventNotifier::isIgnoreExchangeCreatedEvent);
+    }
 
-        EventFactory factory = management.getEventFactory();
-        if (factory == null) {
-            return false;
-        }
+    public static boolean notifyExchangeDone(CamelContext context, Exchange exchange) {
+        return doNotifyExchange(context, exchange,
+                factory -> factory.createExchangeCompletedEvent(exchange),
+                EventNotifier::isIgnoreExchangeCompletedEvent);
+    }
 
-        List<EventNotifier> notifiers = management.getEventNotifiers();
-        if (notifiers == null || notifiers.isEmpty()) {
-            return false;
-        }
+    public static boolean notifyExchangeFailed(CamelContext context, Exchange exchange) {
+        return doNotifyExchange(context, exchange,
+                factory -> factory.createExchangeFailedEvent(exchange),
+                EventNotifier::isIgnoreExchangeFailedEvents);
+    }
 
-        boolean answer = false;
-        CamelEvent event = null;
-        for (EventNotifier notifier : notifiers) {
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreCamelContextEvents()) {
-                continue;
-            }
+    public static boolean notifyExchangeFailureHandling(CamelContext context, Exchange exchange, Processor failureHandler,
+                                                     boolean deadLetterChannel, String deadLetterUri) {
+        return doNotifyExchange(context, exchange,
+                factory -> factory.createExchangeFailureHandlingEvent(exchange, failureHandler, deadLetterChannel, deadLetterUri),
+                EventNotifier::isIgnoreExchangeFailedEvents);
+    }
 
-            if (event == null) {
-                // only create event once
-                event = factory.createCamelContextSuspendingEvent(context);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
+    public static boolean notifyExchangeFailureHandled(CamelContext context, Exchange exchange, Processor failureHandler,
+                                                    boolean deadLetterChannel, String deadLetterUri) {
+        return doNotifyExchange(context, exchange,
+                factory -> factory.createExchangeFailureHandledEvent(exchange, failureHandler, deadLetterChannel, deadLetterUri),
+                EventNotifier::isIgnoreExchangeFailedEvents);
     }
 
-    public static boolean notifyCamelContextSuspended(CamelContext context) {
-        ManagementStrategy management = context.getManagementStrategy();
-        if (management == null) {
-            return false;
-        }
+    public static boolean notifyExchangeRedelivery(CamelContext context, Exchange exchange, int attempt) {
+        return doNotifyExchange(context, exchange,
+                factory -> factory.createExchangeRedeliveryEvent(exchange, attempt),
+                EventNotifier::isIgnoreExchangeRedeliveryEvents);
+    }
 
-        EventFactory factory = management.getEventFactory();
-        if (factory == null) {
-            return false;
-        }
+    public static boolean notifyExchangeSending(CamelContext context, Exchange exchange, Endpoint endpoint) {
+        return doNotifyExchange(context, exchange,
+                factory -> factory.createExchangeSendingEvent(exchange, endpoint),
+                EventNotifier::isIgnoreExchangeSendingEvents);
+    }
 
-        List<EventNotifier> notifiers = management.getEventNotifiers();
-        if (notifiers == null || notifiers.isEmpty()) {
-            return false;
-        }
+    public static boolean notifyExchangeSent(CamelContext context, Exchange exchange, Endpoint endpoint, long timeTaken) {
+        return doNotifyExchange(context, exchange,
+                factory -> factory.createExchangeSentEvent(exchange, endpoint, timeTaken),
+                EventNotifier::isIgnoreExchangeSentEvents);
+    }
 
-        boolean answer = false;
-        CamelEvent event = null;
-        for (EventNotifier notifier : notifiers) {
-            if (notifier.isDisabled()) {
-                continue;
-            }
-            if (notifier.isIgnoreCamelContextEvents()) {
-                continue;
-            }
+    public static boolean notifyCamelContextSuspending(CamelContext context) {
+        return doNotify(context,
+                factory -> factory.createCamelContextSuspendingEvent(context),
+                EventNotifier::isIgnoreCamelContextEvents);
+    }
 
-            if (event == null) {
-                // only create event once
-                event = factory.createCamelContextSuspendedEvent(context);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
+    public static boolean notifyCamelContextSuspended(CamelContext context) {
+        return doNotify(context,
+                factory -> factory.createCamelContextSuspendedEvent(context),
+                EventNotifier::isIgnoreCamelContextEvents);
     }
 
     public static boolean notifyCamelContextResuming(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.createCamelContextResumingEvent(context);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
+        return doNotify(context,
+                factory -> factory.createCamelContextResumingEvent(context),
+                EventNotifier::isIgnoreCamelContextEvents);
     }
 
     public static boolean notifyCamelContextResumed(CamelContext context) {
-        ManagementStrategy management = context.getManagementStrategy();
-        if (management == null) {
-            return false;
-        }
+        return doNotify(context,
+                factory -> factory.createCamelContextResumedEvent(context),
+                EventNotifier::isIgnoreCamelContextEvents);
+    }
 
-        EventFactory factory = management.getEventFactory();
-        if (factory == null) {
-            return false;
-        }
+    public static boolean notifyCamelContextResumeFailed(CamelContext context, Throwable cause) {
+        return doNotify(context,
+                factory -> factory.createCamelContextResumeFailureEvent(context, cause),
+                EventNotifier::isIgnoreCamelContextEvents);
+    }
 
-        List<EventNotifier> notifiers = management.getEventNotifiers();
-        if (notifiers == null || notifiers.isEmpty()) {
+    private static boolean doNotifyExchange(CamelContext context, Exchange exchange, Function<EventFactory, CamelEvent> eventSupplier, Predicate<EventNotifier> notifierFilter) {
+        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
+            // do not generate events for an notify event
             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.createCamelContextResumedEvent(context);
-                if (event == null) {
-                    // factory could not create event so exit
-                    return false;
-                }
-            }
-            answer |= doNotifyEvent(notifier, event);
-        }
-        return answer;
+        return doNotify(context,
+                eventSupplier,
+                notifierFilter.or(EventNotifier::isIgnoreExchangeEvents));
     }
 
-    public static boolean notifyCamelContextResumeFailed(CamelContext context, Throwable cause) {
+    private static boolean doNotify(CamelContext context, Function<EventFactory, CamelEvent> eventSupplier, Predicate<EventNotifier> notifierFilter) {
         ManagementStrategy management = context.getManagementStrategy();
         if (management == null) {
             return false;
@@ -1057,13 +226,13 @@ public final class EventHelper {
             if (notifier.isDisabled()) {
                 continue;
             }
-            if (notifier.isIgnoreCamelContextEvents()) {
+            if (notifierFilter.test(notifier)) {
                 continue;
             }
 
             if (event == null) {
                 // only create event once
-                event = factory.createCamelContextResumeFailureEvent(context, cause);
+                event = eventSupplier.apply(factory);
                 if (event == null) {
                     // factory could not create event so exit
                     return false;
@@ -1076,11 +245,7 @@ public final class EventHelper {
 
     private static boolean doNotifyEvent(EventNotifier notifier, CamelEvent event) {
         // only notify if notifier is started
-        boolean started = true;
-        if (notifier instanceof StatefulService) {
-            started = ((StatefulService) notifier).isStarted();
-        }
-        if (!started) {
+        if (!ServiceHelper.isStarted(notifier)) {
             LOG.debug("Ignoring notifying event {}. The EventNotifier has not been started yet: {}", event, notifier);
             return false;
         }
diff --git a/camel-core/src/main/java/org/apache/camel/support/EventNotifierSupport.java b/camel-core/src/main/java/org/apache/camel/support/EventNotifierSupport.java
index e4175af..4e94793 100644
--- a/camel-core/src/main/java/org/apache/camel/support/EventNotifierSupport.java
+++ b/camel-core/src/main/java/org/apache/camel/support/EventNotifierSupport.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.support;
 
+import org.apache.camel.spi.CamelEvent;
 import org.apache.camel.spi.EventNotifier;
 
 /**
@@ -39,6 +40,11 @@ public abstract class EventNotifierSupport extends ServiceSupport implements Eve
     }
 
     @Override
+    public boolean isEnabled(CamelEvent event) {
+        return true;
+    }
+
+    @Override
     public boolean isDisabled() {
         return false;
     }
diff --git a/camel-core/src/main/java/org/apache/camel/support/ProcessorEndpoint.java b/camel-core/src/main/java/org/apache/camel/support/ProcessorEndpoint.java
index 8dd5687..75f6e01 100644
--- a/camel-core/src/main/java/org/apache/camel/support/ProcessorEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/support/ProcessorEndpoint.java
@@ -29,10 +29,10 @@ import org.apache.camel.Producer;
  * consumers.
  * <p/>
  * <br/>Implementors beware that this endpoint creates producers and consumers which
- * doesn't allow you full control of its lifecycle as a {@link org.apache.camel.Service}
+ * do not allow full control of their lifecycle as {@link org.apache.camel.Service}
  * or {@link org.apache.camel.SuspendableService} would do.
- * If your producers/consumers need more control of its lifecycle it is advised instead to extend
- * {@link DefaultEndpoint}, {@link DefaultProducer}
+ * If your producers/consumers need more control oover their lifecycle it is advised
+ * instead to extend {@link DefaultEndpoint}, {@link DefaultProducer}
  * and {@link DefaultConsumer}.
  */
 public class ProcessorEndpoint extends DefaultPollingEndpoint {
diff --git a/camel-core/src/main/java/org/apache/camel/throttling/ThrottlingInflightRoutePolicy.java b/camel-core/src/main/java/org/apache/camel/throttling/ThrottlingInflightRoutePolicy.java
index 5ecfa27..e398985 100644
--- a/camel-core/src/main/java/org/apache/camel/throttling/ThrottlingInflightRoutePolicy.java
+++ b/camel-core/src/main/java/org/apache/camel/throttling/ThrottlingInflightRoutePolicy.java
@@ -290,16 +290,6 @@ public class ThrottlingInflightRoutePolicy extends RoutePolicySupport implements
         }
 
         @Override
-        protected void doStart() throws Exception {
-            // noop
-        }
-
-        @Override
-        protected void doStop() throws Exception {
-            // noop
-        }
-
-        @Override
         public String toString() {
             return "ContextScopedEventNotifier";
         }
diff --git a/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java b/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java
index effa10f..e61d378 100644
--- a/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java
+++ b/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java
@@ -98,6 +98,7 @@ 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);
@@ -182,7 +183,11 @@ public abstract class ContextTestSupport extends TestSupport {
     }
 
     protected CamelContext createCamelContext() throws Exception {
-        CamelContext context = new DefaultCamelContext(createRegistry());
+        DefaultCamelContext context = new DefaultCamelContext(false);
+        if (!useJmx()) {
+            context.disableJMX();
+        }
+        context.setRegistry(createRegistry());
         context.setLoadTypeConverters(isLoadTypeConverters());
         return context;
     }
diff --git a/camel-core/src/test/java/org/apache/camel/builder/BuilderWithScopesTest.java b/camel-core/src/test/java/org/apache/camel/builder/BuilderWithScopesTest.java
index 09fb06a..b9d54d5 100644
--- a/camel-core/src/test/java/org/apache/camel/builder/BuilderWithScopesTest.java
+++ b/camel-core/src/test/java/org/apache/camel/builder/BuilderWithScopesTest.java
@@ -88,8 +88,9 @@ public class BuilderWithScopesTest extends TestSupport {
     protected void runTest(RouteBuilder builder, List<String> expected, String header) throws Exception {
 
         order.clear();
-        CamelContext container = new DefaultCamelContext();
+        DefaultCamelContext container = new DefaultCamelContext(false);
         container.disableJMX();
+        container.init();
 
         container.addRoutes(builder);
         container.start();
diff --git a/camel-core/src/test/java/org/apache/camel/component/direct/DirectNoMultipleConsumersTest.java b/camel-core/src/test/java/org/apache/camel/component/direct/DirectNoMultipleConsumersTest.java
index 4c492f3..7a4b1db 100644
--- a/camel-core/src/test/java/org/apache/camel/component/direct/DirectNoMultipleConsumersTest.java
+++ b/camel-core/src/test/java/org/apache/camel/component/direct/DirectNoMultipleConsumersTest.java
@@ -30,7 +30,7 @@ public class DirectNoMultipleConsumersTest extends TestSupport {
 
     @Test
     public void testNoMultipleConsumersTest() throws Exception {
-        CamelContext container = new DefaultCamelContext();
+        CamelContext container = new DefaultCamelContext(false);
         container.disableJMX();
 
         container.addRoutes(new RouteBuilder() {
diff --git a/camel-core/src/test/java/org/apache/camel/impl/CamelCustomDefaultThreadPoolProfileTest.java b/camel-core/src/test/java/org/apache/camel/impl/CamelCustomDefaultThreadPoolProfileTest.java
index 9938881..2d7228c 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/CamelCustomDefaultThreadPoolProfileTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/CamelCustomDefaultThreadPoolProfileTest.java
@@ -37,7 +37,10 @@ public class CamelCustomDefaultThreadPoolProfileTest extends ContextTestSupport
         profile.setAllowCoreThreadTimeOut(true);
         profile.setRejectedPolicy(ThreadPoolRejectedPolicy.Abort);
 
-        camel.getExecutorServiceManager().setDefaultThreadPoolProfile(profile);
+        DefaultExecutorServiceManager executorServiceManager = new DefaultExecutorServiceManager(camel);
+        executorServiceManager.setDefaultThreadPoolProfile(profile);
+        camel.setExecutorServiceManager(executorServiceManager);
+
         return camel;
     }
 
diff --git a/camel-core/src/test/java/org/apache/camel/impl/CustomThreadPoolFactoryTest.java b/camel-core/src/test/java/org/apache/camel/impl/CustomThreadPoolFactoryTest.java
index 6d79e98..c27301d 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/CustomThreadPoolFactoryTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/CustomThreadPoolFactoryTest.java
@@ -35,7 +35,9 @@ public class CustomThreadPoolFactoryTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.getExecutorServiceManager().setThreadPoolFactory(factory);
+        DefaultExecutorServiceManager executorServiceManager = new DefaultExecutorServiceManager(context);
+        executorServiceManager.setThreadPoolFactory(factory);
+        context.setExecutorServiceManager(executorServiceManager);
         return context;
     }
 
diff --git a/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextAutoStartupTest.java b/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextAutoStartupTest.java
index 06d85b4..fe4f9fe 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextAutoStartupTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextAutoStartupTest.java
@@ -27,7 +27,8 @@ public class DefaultCamelContextAutoStartupTest extends TestSupport {
 
     @Test
     public void testAutoStartupFalseContextStart() throws Exception {
-        DefaultCamelContext camel = new DefaultCamelContext(new SimpleRegistry());
+        DefaultCamelContext camel = new DefaultCamelContext(false);
+        camel.setRegistry(new SimpleRegistry());
         camel.disableJMX();
         camel.setAutoStartup(false);
 
@@ -61,7 +62,8 @@ public class DefaultCamelContextAutoStartupTest extends TestSupport {
 
     @Test
     public void testAutoStartupFalseRouteStart() throws Exception {
-        DefaultCamelContext camel = new DefaultCamelContext(new SimpleRegistry());
+        DefaultCamelContext camel = new DefaultCamelContext(false);
+        camel.setRegistry(new SimpleRegistry());
         camel.disableJMX();
         camel.setAutoStartup(false);
 
@@ -95,7 +97,8 @@ public class DefaultCamelContextAutoStartupTest extends TestSupport {
 
     @Test
     public void testAutoStartupTrue() throws Exception {
-        DefaultCamelContext camel = new DefaultCamelContext(new SimpleRegistry());
+        DefaultCamelContext camel = new DefaultCamelContext(false);
+        camel.setRegistry(new SimpleRegistry());
         camel.disableJMX();
         camel.setAutoStartup(true);
 
@@ -123,7 +126,8 @@ public class DefaultCamelContextAutoStartupTest extends TestSupport {
 
     @Test
     public void testAutoStartupFalseRouteOverride() throws Exception {
-        DefaultCamelContext camel = new DefaultCamelContext(new SimpleRegistry());
+        DefaultCamelContext camel = new DefaultCamelContext(false);
+        camel.setRegistry(new SimpleRegistry());
         camel.disableJMX();
         camel.setAutoStartup(false);
 
diff --git a/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java b/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java
index 8f6fa78..8db3669 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java
@@ -42,7 +42,7 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testAutoCreateComponentsOn() {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
         Component component = ctx.getComponent("bean");
         assertNotNull(component);
@@ -51,7 +51,7 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testAutoCreateComponentsOff() {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
         ctx.setAutoCreateComponents(false);
         Component component = ctx.getComponent("bean");
@@ -60,7 +60,7 @@ public class DefaultCamelContextTest extends TestSupport {
     
     @Test
     public void testAutoStartComponentsOff() throws Exception {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
         ctx.start();
 
@@ -82,8 +82,9 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testCreateDefaultUuidGenerator() {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
+        ctx.init();
         UuidGenerator uuidGenerator = ctx.getUuidGenerator();
         assertNotNull(uuidGenerator);
         assertEquals(uuidGenerator.getClass(), DefaultUuidGenerator.class);
@@ -91,7 +92,7 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testGetComponents() throws Exception {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
         Component component = ctx.getComponent("bean");
         assertNotNull(component);
@@ -103,7 +104,7 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testGetEndpoint() throws Exception {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
         Endpoint endpoint = ctx.getEndpoint("log:foo");
         assertNotNull(endpoint);
@@ -137,7 +138,7 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testRemoveEndpoint() throws Exception {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
         ctx.getEndpoint("log:foo");
         ctx.getEndpoint("log:bar");
@@ -166,7 +167,7 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testGetEndpointNotFound() throws Exception {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
         try {
             ctx.getEndpoint("xxx:foo");
@@ -178,7 +179,7 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testGetEndpointUnknownComponentNoScheme() throws Exception {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
         try {
             CamelContextHelper.getMandatoryEndpoint(ctx, "unknownname");
@@ -190,7 +191,7 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testRestartCamelContext() throws Exception {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
         ctx.addRoutes(new RouteBuilder() {
             @Override
@@ -212,8 +213,9 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testName() {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
+        ctx.init();
         assertNotNull("Should have a default name", ctx.getName());
         ctx.setName("foo");
         assertEquals("foo", ctx.getName());
@@ -224,14 +226,14 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testVersion() {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
         assertNotNull("Should have a version", ctx.getVersion());
     }
 
     @Test
     public void testHasComponent() {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
         assertNull(ctx.hasComponent("log"));
 
@@ -241,7 +243,7 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testGetComponent() {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
         ctx.addComponent("log", new LogComponent());
 
@@ -258,7 +260,7 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testHasEndpoint() throws Exception {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
         ctx.getEndpoint("mock://foo");
 
@@ -278,7 +280,7 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testGetRouteById() throws Exception {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
         ctx.disableJMX();
 
         // should not throw NPE (CAMEL-3198)
@@ -304,7 +306,8 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testSuspend() throws Exception {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
+        ctx.disableJMX();
 
         assertEquals(false, ctx.isStarted());
         assertEquals(false, ctx.isSuspended());
@@ -328,7 +331,8 @@ public class DefaultCamelContextTest extends TestSupport {
 
     @Test
     public void testResume() throws Exception {
-        DefaultCamelContext ctx = new DefaultCamelContext();
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
+        ctx.disableJMX();
 
         assertEquals(false, ctx.isStarted());
         assertEquals(false, ctx.isSuspended());
diff --git a/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierEventsTest.java b/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierEventsTest.java
index 9bce692..f05a20a 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierEventsTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierEventsTest.java
@@ -62,18 +62,6 @@ public class EventNotifierEventsTest extends ContextTestSupport {
             public void notify(CamelEvent event) throws Exception {
                 events.add(event);
             }
-
-            public boolean isEnabled(CamelEvent event) {
-                return true;
-            }
-
-            @Override
-            protected void doStart() throws Exception {
-            }
-
-            @Override
-            protected void doStop() throws Exception {
-            }
         });
         return context;
     }
diff --git a/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierExchangeCompletedTest.java b/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierExchangeCompletedTest.java
index bfb3d34..c0204c7 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierExchangeCompletedTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierExchangeCompletedTest.java
@@ -56,14 +56,6 @@ public class EventNotifierExchangeCompletedTest extends ContextTestSupport {
                 // should be from a specific endpoint or route
                 // just return true for the events you like
             }
-
-            protected void doStart() throws Exception {
-                // noop
-            }
-
-            protected void doStop() throws Exception {
-                // noop
-            }
         });
         return context;
     }
diff --git a/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierExchangeSentTest.java b/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierExchangeSentTest.java
index 24962ac..8e07860 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierExchangeSentTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierExchangeSentTest.java
@@ -52,10 +52,6 @@ public class EventNotifierExchangeSentTest extends ContextTestSupport {
                 events.add(event);
             }
 
-            public boolean isEnabled(CamelEvent event) {
-                return true;
-            }
-
             @Override
             protected void doStart() throws Exception {
                 // filter out unwanted events
@@ -67,10 +63,6 @@ public class EventNotifierExchangeSentTest extends ContextTestSupport {
                 setIgnoreExchangeFailedEvents(true);
                 setIgnoreExchangeRedeliveryEvents(true);
             }
-
-            @Override
-            protected void doStop() throws Exception {
-            }
         });
         return context;
     }
diff --git a/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierFailureHandledEventsTest.java b/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierFailureHandledEventsTest.java
index a30e4d3..4f45c1a 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierFailureHandledEventsTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierFailureHandledEventsTest.java
@@ -61,18 +61,6 @@ public class EventNotifierFailureHandledEventsTest extends ContextTestSupport {
             public void notify(CamelEvent event) throws Exception {
                 events.add(event);
             }
-
-            public boolean isEnabled(CamelEvent event) {
-                return true;
-            }
-
-            @Override
-            protected void doStart() throws Exception {
-            }
-
-            @Override
-            protected void doStop() throws Exception {
-            }
         });
         return context;
     }
diff --git a/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierRedeliveryEventsTest.java b/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierRedeliveryEventsTest.java
index bd0754e..eb61344 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierRedeliveryEventsTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierRedeliveryEventsTest.java
@@ -59,20 +59,12 @@ public class EventNotifierRedeliveryEventsTest extends ContextTestSupport {
                 events.add(event);
             }
 
-            public boolean isEnabled(CamelEvent event) {
-                return true;
-            }
-
             @Override
             protected void doStart() throws Exception {
                 setIgnoreCamelContextEvents(true);
                 setIgnoreRouteEvents(true);
                 setIgnoreServiceEvents(true);
             }
-
-            @Override
-            protected void doStop() throws Exception {
-            }
         });
         return context;
     }
diff --git a/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierServiceStoppingFailedEventTest.java b/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierServiceStoppingFailedEventTest.java
index 5d3260e..142e86d 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierServiceStoppingFailedEventTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierServiceStoppingFailedEventTest.java
@@ -46,6 +46,7 @@ public class EventNotifierServiceStoppingFailedEventTest extends ContextTestSupp
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
+        context.init();
         context.addService(new MyService("A", false));
         context.addService(new MyService("B", true));
         context.addService(new MyService("C", false));
@@ -54,18 +55,6 @@ public class EventNotifierServiceStoppingFailedEventTest extends ContextTestSupp
             public void notify(CamelEvent event) throws Exception {
                 events.add(event);
             }
-
-            public boolean isEnabled(CamelEvent event) {
-                return true;
-            }
-
-            @Override
-            protected void doStart() throws Exception {
-            }
-
-            @Override
-            protected void doStop() throws Exception {
-            }
         });
         return context;
     }
diff --git a/camel-core/src/test/java/org/apache/camel/impl/event/MultipleEventNotifierEventsTest.java b/camel-core/src/test/java/org/apache/camel/impl/event/MultipleEventNotifierEventsTest.java
index ada378c..c1c521d 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/event/MultipleEventNotifierEventsTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/event/MultipleEventNotifierEventsTest.java
@@ -65,38 +65,18 @@ public class MultipleEventNotifierEventsTest extends ContextTestSupport {
             public void notify(CamelEvent event) throws Exception {
                 events.add(event);
             }
-
-            public boolean isEnabled(CamelEvent event) {
-                return true;
-            }
-
-            @Override
-            protected void doStart() throws Exception {
-            }
-
-            @Override
-            protected void doStop() throws Exception {
-            }
         });
         context.getManagementStrategy().addEventNotifier(new EventNotifierSupport() {
             public void notify(CamelEvent event) throws Exception {
                 events2.add(event);
             }
 
-            public boolean isEnabled(CamelEvent event) {
-                return true;
-            }
-
             @Override
             protected void doStart() throws Exception {
                 setIgnoreCamelContextEvents(true);
                 setIgnoreServiceEvents(true);
                 setIgnoreRouteEvents(true);
             }
-
-            @Override
-            protected void doStop() throws Exception {
-            }
         });
         return context;
     }
diff --git a/camel-core/src/test/java/org/apache/camel/impl/health/DefaultHealthCheckServiceTest.java b/camel-core/src/test/java/org/apache/camel/impl/health/DefaultHealthCheckServiceTest.java
index d7bd42e..72d18aa 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/health/DefaultHealthCheckServiceTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/health/DefaultHealthCheckServiceTest.java
@@ -24,6 +24,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.health.HealthCheck;
+import org.apache.camel.health.HealthCheckRegistry;
 import org.apache.camel.health.HealthCheckResultBuilder;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.junit.Assert;
@@ -52,7 +53,7 @@ public class DefaultHealthCheckServiceTest {
             });
 
             context = new DefaultCamelContext();
-            context.setHealthCheckRegistry(registry);
+            context.setExtension(HealthCheckRegistry.class, registry);
             context.addService(service);
             context.start();
 
diff --git a/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierIssueTest.java b/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierIssueTest.java
index 1a9769c..2ff5bc7 100644
--- a/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierIssueTest.java
+++ b/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierIssueTest.java
@@ -57,6 +57,7 @@ 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/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierTwoIssueTest.java b/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierTwoIssueTest.java
index 304e3e3..65cdb2c 100644
--- a/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierTwoIssueTest.java
+++ b/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierTwoIssueTest.java
@@ -59,6 +59,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/AddEventNotifierTest.java b/camel-core/src/test/java/org/apache/camel/management/AddEventNotifierTest.java
index a4e1405..1deb46e 100644
--- a/camel-core/src/test/java/org/apache/camel/management/AddEventNotifierTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/AddEventNotifierTest.java
@@ -52,18 +52,6 @@ public class AddEventNotifierTest extends ContextTestSupport {
             public void notify(CamelEvent event) throws Exception {
                 events.add(event);
             }
-
-            public boolean isEnabled(CamelEvent event) {
-                return true;
-            }
-
-            @Override
-            protected void doStart() throws Exception {
-            }
-
-            @Override
-            protected void doStop() throws Exception {
-            }
         };
         // must add notifier as a service so its started
         context.addService(notifier);
diff --git a/camel-core/src/test/java/org/apache/camel/management/CamelContextDisableJmxTest.java b/camel-core/src/test/java/org/apache/camel/management/CamelContextDisableJmxTest.java
index 2898840..17fa605 100644
--- a/camel-core/src/test/java/org/apache/camel/management/CamelContextDisableJmxTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/CamelContextDisableJmxTest.java
@@ -26,7 +26,7 @@ public class CamelContextDisableJmxTest extends Assert {
 
     @Test
     public void testDisableJmx() throws Exception {
-        CamelContext context = new DefaultCamelContext();
+        CamelContext context = new DefaultCamelContext(false);
         context.disableJMX();
         context.start();
 
diff --git a/camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationOnlyRegisterProcessorWithCustomIdTest.java b/camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationOnlyRegisterProcessorWithCustomIdTest.java
index 66d5c8e..2acbbf7 100644
--- a/camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationOnlyRegisterProcessorWithCustomIdTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationOnlyRegisterProcessorWithCustomIdTest.java
@@ -25,6 +25,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.DefaultCamelContext;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -72,6 +73,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedAggregateControllerTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedAggregateControllerTest.java
index 2d5f331..a3df28c 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedAggregateControllerTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedAggregateControllerTest.java
@@ -20,6 +20,7 @@ import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.api.management.mbean.ManagedAggregateProcessorMBean;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.processor.aggregate.AggregateController;
@@ -160,7 +161,7 @@ public class ManagedAggregateControllerTest extends ManagementTestSupport {
         assertEquals(1, pending.intValue());
 
         // we can also use the client mbean
-        ManagedAggregateProcessorMBean client = context.adapt(ManagedCamelContext.class).getManagedProcessor("myAggregator", ManagedAggregateProcessorMBean.class);
+        ManagedAggregateProcessorMBean client = context.getExtension(ManagedCamelContext.class).getManagedProcessor("myAggregator", ManagedAggregateProcessorMBean.class);
         assertNotNull(client);
 
         assertEquals(1, client.getCompletedByForce());
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextEmptyRouteTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextEmptyRouteTest.java
index 48d458b..70715b0 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextEmptyRouteTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextEmptyRouteTest.java
@@ -29,6 +29,7 @@ public class ManagedCamelContextEmptyRouteTest 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("20-#name#");
         return context;
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextPropertiesTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextPropertiesTest.java
index 805d722..8444291 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextPropertiesTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextPropertiesTest.java
@@ -30,6 +30,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextRestartTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextRestartTest.java
index 24f6a027..baa3dfb 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextRestartTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextRestartTest.java
@@ -43,10 +43,6 @@ public class ManagedCamelContextRestartTest extends ManagementTestSupport {
                 // Empty.
             }
             @Override
-            public boolean isEnabled(CamelEvent event) {
-                return true;
-            }
-            @Override
             protected void doStart() throws Exception {
                 starts++;
             }
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java
index e13035c..f46c126 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java
@@ -25,6 +25,7 @@ import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.api.management.mbean.ManagedCamelContextMBean;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
@@ -36,6 +37,7 @@ 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;
@@ -48,7 +50,7 @@ public class ManagedCamelContextTest extends ManagementTestSupport {
             return;
         }
 
-        ManagedCamelContextMBean client = context.adapt(ManagedCamelContext.class).getManagedCamelContext();
+        ManagedCamelContextMBean client = context.getExtension(ManagedCamelContext.class).getManagedCamelContext();
         assertNotNull(client);
 
         assertEquals("camel-1", client.getCamelId());
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedComponentTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedComponentTest.java
index a4c4523..e602b95 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedComponentTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedComponentTest.java
@@ -45,6 +45,7 @@ public class ManagedComponentTest extends ManagementTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
+        context.init();
         context.getManagementStrategy().getManagementAgent().setCreateConnector(true);
         context.addComponent("my-verifiable-component", new MyVerifiableComponent());
         context.addComponent("direct", new DirectComponent());
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedDynamicRouterTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedDynamicRouterTest.java
index 9318c2c..038541f 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedDynamicRouterTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedDynamicRouterTest.java
@@ -32,6 +32,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedEndpointUtilizationStatisticsTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedEndpointUtilizationStatisticsTest.java
index afe5628..6435a5b 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedEndpointUtilizationStatisticsTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedEndpointUtilizationStatisticsTest.java
@@ -29,6 +29,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedEnricherTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedEnricherTest.java
index e50ff8c..d4a5fda 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedEnricherTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedEnricherTest.java
@@ -32,6 +32,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedInlinedProcessorTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedInlinedProcessorTest.java
index 63f198d..84381bc 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedInlinedProcessorTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedInlinedProcessorTest.java
@@ -21,6 +21,7 @@ import javax.management.ObjectName;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.api.management.mbean.ManagedProcessorMBean;
 import org.apache.camel.builder.RouteBuilder;
 import org.junit.Test;
@@ -44,7 +45,7 @@ public class ManagedInlinedProcessorTest extends ManagementTestSupport {
         Long counter = (Long) mbeanServer.getAttribute(on, "ExchangesCompleted");
         assertEquals(1L, counter.longValue());
 
-        ManagedProcessorMBean mb = context.adapt(ManagedCamelContext.class).getManagedProcessor("custom", ManagedProcessorMBean.class);
+        ManagedProcessorMBean mb = context.getExtension(ManagedCamelContext.class).getManagedProcessor("custom");
         assertNotNull(mb);
         assertEquals(1L, mb.getExchangesCompleted());
     }
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedListComponentsTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedListComponentsTest.java
index cddddc2..05a4787 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedListComponentsTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedListComponentsTest.java
@@ -29,6 +29,7 @@ public class ManagedListComponentsTest 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("20-#name#");
         return context;
@@ -37,6 +38,7 @@ public class ManagedListComponentsTest extends ManagementTestSupport {
     @Test
     public void testListComponents() throws Exception {
         // JMX tests dont work well on AIX CI servers (hangs them)
+        context.init();
         if (isPlatform("aix")) {
             return;
         }
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java
index b62b01d..1145461 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java
@@ -28,6 +28,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternIncludeHostNameTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternIncludeHostNameTest.java
index 14afd0f..61350cb 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternIncludeHostNameTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternIncludeHostNameTest.java
@@ -28,6 +28,7 @@ public class ManagedNamePatternIncludeHostNameTest extends ManagementTestSupport
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
+        context.init();
         DefaultManagementObjectNameStrategy naming = (DefaultManagementObjectNameStrategy)context.getManagementStrategy().getManagementObjectNameStrategy();
         naming.setHostName("localhost");
         context.getManagementStrategy().getManagementAgent().setIncludeHostName(true);
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java
index 0a1be7c..c4073fc 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java
@@ -28,6 +28,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedPollEnricherTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedPollEnricherTest.java
index cf94729..cae5496 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedPollEnricherTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedPollEnricherTest.java
@@ -32,6 +32,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedProducerRecipientListRegisterAlwaysTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedProducerRecipientListRegisterAlwaysTest.java
index 5d54acb..9915321 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedProducerRecipientListRegisterAlwaysTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedProducerRecipientListRegisterAlwaysTest.java
@@ -32,6 +32,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
index 7d58ee9..83350bd 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
@@ -33,6 +33,7 @@ public class ManagedProducerRouteAddRemoveRegisterAlwaysTest extends ManagementT
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
+        context.init();
         context.getManagementStrategy().getManagementAgent().setRegisterAlways(true);
         return context;
     }
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedRecipientListTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedRecipientListTest.java
index d14a19b..20dad86 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedRecipientListTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedRecipientListTest.java
@@ -32,6 +32,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedRouteSuspendAndResumeTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedRouteSuspendAndResumeTest.java
index fcf953e..b501cf2 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedRouteSuspendAndResumeTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedRouteSuspendAndResumeTest.java
@@ -23,6 +23,7 @@ import javax.management.ObjectName;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.ServiceStatus;
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.api.management.mbean.ManagedSuspendableRouteMBean;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
@@ -88,7 +89,7 @@ public class ManagedRouteSuspendAndResumeTest extends ManagementTestSupport {
         // this time the file is consumed
         mock.assertIsSatisfied();
 
-        ManagedSuspendableRouteMBean route = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedSuspendableRouteMBean.class);
+        ManagedSuspendableRouteMBean route = context.getExtension(ManagedCamelContext.class).getManagedRoute("foo", ManagedSuspendableRouteMBean.class);
         assertNotNull(route);
 
         assertEquals(2, route.getExchangesCompleted());
diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedRoutingSlipTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedRoutingSlipTest.java
index 1007f6a..05db4d6 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedRoutingSlipTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedRoutingSlipTest.java
@@ -32,6 +32,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedSanitizeTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedSanitizeTest.java
index e17b23c..9b987a6 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedSanitizeTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedSanitizeTest.java
@@ -28,6 +28,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedSendDynamicProcessorTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedSendDynamicProcessorTest.java
index e9d1cac..f050615 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedSendDynamicProcessorTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedSendDynamicProcessorTest.java
@@ -32,6 +32,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedStatisticsLevelOffTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedStatisticsLevelOffTest.java
index dbc62e1..a2da62a 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedStatisticsLevelOffTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedStatisticsLevelOffTest.java
@@ -32,6 +32,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedStatisticsLevelRoutesOnlyTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedStatisticsLevelRoutesOnlyTest.java
index 941989a..63d3c11 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedStatisticsLevelRoutesOnlyTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedStatisticsLevelRoutesOnlyTest.java
@@ -31,7 +31,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/ManagedWireTapTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedWireTapTest.java
index 91b21cb..7db1660 100644
--- a/camel-core/src/test/java/org/apache/camel/management/ManagedWireTapTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/ManagedWireTapTest.java
@@ -32,6 +32,7 @@ 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/camel-core/src/test/java/org/apache/camel/management/RemoveEventNotifierTest.java b/camel-core/src/test/java/org/apache/camel/management/RemoveEventNotifierTest.java
index 9cd573e..95acb4a 100644
--- a/camel-core/src/test/java/org/apache/camel/management/RemoveEventNotifierTest.java
+++ b/camel-core/src/test/java/org/apache/camel/management/RemoveEventNotifierTest.java
@@ -49,18 +49,6 @@ public class RemoveEventNotifierTest extends ContextTestSupport {
             public void notify(CamelEvent event) throws Exception {
                 events.add(event);
             }
-
-            public boolean isEnabled(CamelEvent event) {
-                return true;
-            }
-
-            @Override
-            protected void doStart() throws Exception {
-            }
-
-            @Override
-            protected void doStop() throws Exception {
-            }
         };
         context.getManagementStrategy().addEventNotifier(notifier);
 
diff --git a/camel-core/src/test/java/org/apache/camel/processor/EventNotifierExchangeSentExampleTest.java b/camel-core/src/test/java/org/apache/camel/processor/EventNotifierExchangeSentExampleTest.java
index 8a42e67..1bfdb7c 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/EventNotifierExchangeSentExampleTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/EventNotifierExchangeSentExampleTest.java
@@ -27,6 +27,7 @@ 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/camel-core/src/test/java/org/apache/camel/processor/MyLoggingSentEventNotifer.java b/camel-core/src/test/java/org/apache/camel/processor/MyLoggingSentEventNotifer.java
index d958be7..e8c6ebd 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/MyLoggingSentEventNotifer.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/MyLoggingSentEventNotifer.java
@@ -32,17 +32,5 @@ public class MyLoggingSentEventNotifer extends EventNotifierSupport {
 
     }
 
-    public boolean isEnabled(CamelEvent event) {
-        return true;
-    }
-
-    protected void doStart() throws Exception {
-        // noop
-    }
-
-    protected void doStop() throws Exception {
-        // noop
-    }
-
 }
 // END SNIPPET: e1
diff --git a/camel-core/src/test/java/org/apache/camel/processor/MySentEventNotifier.java b/camel-core/src/test/java/org/apache/camel/processor/MySentEventNotifier.java
index 1ee8d5d..2769eff 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/MySentEventNotifier.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/MySentEventNotifier.java
@@ -37,16 +37,4 @@ public class MySentEventNotifier extends EventNotifierSupport {
         }
     }
 
-    public boolean isEnabled(CamelEvent event) {
-        return true;
-    }
-
-    protected void doStart() throws Exception {
-        // noop
-    }
-
-    protected void doStop() throws Exception {
-        // noop
-    }
-
 }
diff --git a/camel-core/src/test/java/org/apache/camel/processor/ProducerTemplateDisableEventNotifierTest.java b/camel-core/src/test/java/org/apache/camel/processor/ProducerTemplateDisableEventNotifierTest.java
index 34887d1..26f040b 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/ProducerTemplateDisableEventNotifierTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/ProducerTemplateDisableEventNotifierTest.java
@@ -30,6 +30,7 @@ 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/camel-core/src/test/java/org/apache/camel/processor/SplitterUseOriginalNotPropagateExceptionTest.java b/camel-core/src/test/java/org/apache/camel/processor/SplitterUseOriginalNotPropagateExceptionTest.java
index 347c103..95ef715 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/SplitterUseOriginalNotPropagateExceptionTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/SplitterUseOriginalNotPropagateExceptionTest.java
@@ -32,6 +32,7 @@ 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/camel-core/src/test/java/org/apache/camel/processor/UnitOfWorkProducerTest.java b/camel-core/src/test/java/org/apache/camel/processor/UnitOfWorkProducerTest.java
index 25a52fb..b8e6f4a 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/UnitOfWorkProducerTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/UnitOfWorkProducerTest.java
@@ -44,14 +44,6 @@ public class UnitOfWorkProducerTest extends ContextTestSupport {
             public boolean isEnabled(CamelEvent event) {
                 return event instanceof ExchangeCompletedEvent;
             }
-
-            @Override
-            protected void doStart() throws Exception {
-            }
-
-            @Override
-            protected void doStop() throws Exception {
-            }
         });
         return context;
     }
diff --git a/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointEventNotifierSendingTest.java b/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointEventNotifierSendingTest.java
index d195735..5adff5f 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointEventNotifierSendingTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointEventNotifierSendingTest.java
@@ -70,10 +70,6 @@ public class AsyncEndpointEventNotifierSendingTest extends ContextTestSupport {
             @Override
             protected void doStart() throws Exception {
             }
-
-            @Override
-            protected void doStop() throws Exception {
-            }
         });
         return context;
     }
diff --git a/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointEventNotifierTest.java b/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointEventNotifierTest.java
index ad619a8..0c593ea 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointEventNotifierTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointEventNotifierTest.java
@@ -72,14 +72,6 @@ public class AsyncEndpointEventNotifierTest extends ContextTestSupport {
                 }
                 return false;
             }
-
-            @Override
-            protected void doStart() throws Exception {
-            }
-
-            @Override
-            protected void doStop() throws Exception {
-            }
         });
         return context;
     }
diff --git a/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherAsyncUnhandledExceptionTest.java b/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherAsyncUnhandledExceptionTest.java
index 3ed4e1f..52fcea4 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherAsyncUnhandledExceptionTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherAsyncUnhandledExceptionTest.java
@@ -62,6 +62,7 @@ public class EnricherAsyncUnhandledExceptionTest extends ContextTestSupport {
 
     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/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherSendEventTest.java b/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherSendEventTest.java
index f631ecf..99a6ea9 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherSendEventTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherSendEventTest.java
@@ -16,14 +16,13 @@
  */
 package org.apache.camel.processor.enricher;
 
-import java.util.EventObject;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.management.DefaultManagementStrategy;
+import org.apache.camel.impl.DefaultManagementStrategy;
 import org.apache.camel.processor.async.MyAsyncComponent;
 import org.apache.camel.spi.CamelEvent;
 import org.apache.camel.spi.CamelEvent.ExchangeSendingEvent;
@@ -55,6 +54,7 @@ public class EnricherSendEventTest extends ContextTestSupport {
     
     protected CamelContext createCamelContext() throws Exception {
         CamelContext camelContext = super.createCamelContext();
+        camelContext.init();
         ShutdownStrategy shutdownStrategy = camelContext.getShutdownStrategy();
         camelContext.addComponent("async", new MyAsyncComponent());
         
@@ -103,19 +103,6 @@ public class EnricherSendEventTest extends ContextTestSupport {
                 exchangeSentEvent.incrementAndGet();
             }
         }
-
-        @Override
-        public boolean isEnabled(CamelEvent event) {
-            return true;
-        }
-
-        @Override
-        protected void doStart() throws Exception {
-        }
-
-        @Override
-        protected void doStop() throws Exception {
-        }
     }
 
 
diff --git a/camel-core/src/test/java/org/apache/camel/processor/routingslip/DynamicRouterEventNotifierTest.java b/camel-core/src/test/java/org/apache/camel/processor/routingslip/DynamicRouterEventNotifierTest.java
index 7d57743..d0581bd 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/routingslip/DynamicRouterEventNotifierTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/routingslip/DynamicRouterEventNotifierTest.java
@@ -35,6 +35,7 @@ public class DynamicRouterEventNotifierTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
+        context.init();
         context.getManagementStrategy().addEventNotifier(notifier);
         return context;
     }
@@ -95,16 +96,6 @@ public class DynamicRouterEventNotifierTest extends ContextTestSupport {
             return event instanceof ExchangeSendingEvent || event instanceof ExchangeSentEvent;
         }
 
-        @Override
-        protected void doStart() throws Exception {
-            // noop
-        }
-
-        @Override
-        protected void doStop() throws Exception {
-            // noop
-        }
-
         public int getSending() {
             return sending;
         }
diff --git a/camel-core/src/test/java/org/apache/camel/processor/routingslip/RecipientListEventNotifierTest.java b/camel-core/src/test/java/org/apache/camel/processor/routingslip/RecipientListEventNotifierTest.java
index b1e10d5..d811177 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/routingslip/RecipientListEventNotifierTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/routingslip/RecipientListEventNotifierTest.java
@@ -32,6 +32,7 @@ public class RecipientListEventNotifierTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
+        context.init();
         context.getManagementStrategy().addEventNotifier(notifier);
         return context;
     }
@@ -78,16 +79,6 @@ public class RecipientListEventNotifierTest extends ContextTestSupport {
             return event instanceof ExchangeSendingEvent || event instanceof ExchangeSentEvent;
         }
 
-        @Override
-        protected void doStart() throws Exception {
-            // noop
-        }
-
-        @Override
-        protected void doStop() throws Exception {
-            // noop
-        }
-
         public int getSending() {
             return sending;
         }
diff --git a/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipEventNotifierTest.java b/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipEventNotifierTest.java
index ba55a70..e17da41 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipEventNotifierTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipEventNotifierTest.java
@@ -32,6 +32,7 @@ public class RoutingSlipEventNotifierTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
+        context.init();
         context.getManagementStrategy().addEventNotifier(notifier);
         return context;
     }
@@ -79,16 +80,6 @@ public class RoutingSlipEventNotifierTest extends ContextTestSupport {
             return event instanceof ExchangeSendingEvent || event instanceof ExchangeSentEvent;
         }
 
-        @Override
-        protected void doStart() throws Exception {
-            // noop
-        }
-
-        @Override
-        protected void doStop() throws Exception {
-            // noop
-        }
-
         public int getSending() {
             return sending;
         }
diff --git a/camel-core/src/test/java/org/apache/camel/runtimecatalog/impl/JSonSchemaHelperTest.java b/camel-core/src/test/java/org/apache/camel/runtimecatalog/impl/JSonSchemaHelperTest.java
index 4e42f02..4e5d5a0 100644
--- a/camel-core/src/test/java/org/apache/camel/runtimecatalog/impl/JSonSchemaHelperTest.java
+++ b/camel-core/src/test/java/org/apache/camel/runtimecatalog/impl/JSonSchemaHelperTest.java
@@ -20,6 +20,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
 import org.apache.camel.runtimecatalog.impl.JSonSchemaHelper;
 import org.junit.Test;
 
@@ -27,7 +28,7 @@ public class JSonSchemaHelperTest extends ContextTestSupport {
 
     @Test
     public void testParseJsonSchemaMustBeOrdered() throws Exception {
-        String json = context.getRuntimeCamelCatalog().componentJSonSchema("bean");
+        String json = context.getExtension(RuntimeCamelCatalog.class).componentJSonSchema("bean");
         assertNotNull(json);
 
         List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("component", json, false);
diff --git a/camel-core/src/test/java/org/apache/camel/runtimecatalog/impl/RuntimeCamelCatalogTest.java b/camel-core/src/test/java/org/apache/camel/runtimecatalog/impl/RuntimeCamelCatalogTest.java
index 8444a7c..e03b575 100644
--- a/camel-core/src/test/java/org/apache/camel/runtimecatalog/impl/RuntimeCamelCatalogTest.java
+++ b/camel-core/src/test/java/org/apache/camel/runtimecatalog/impl/RuntimeCamelCatalogTest.java
@@ -46,7 +46,7 @@ public class RuntimeCamelCatalogTest {
 
     @Test
     public void testFromCamelContext() throws Exception {
-        String schema = new DefaultCamelContext().getRuntimeCamelCatalog().modelJSonSchema("choice");
+        String schema = new DefaultCamelContext().getExtension(RuntimeCamelCatalog.class).modelJSonSchema("choice");
         assertNotNull(schema);
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/management/ManagedCamelContext.java b/camel-management-api/src/main/java/org/apache/camel/api/management/ManagedCamelContext.java
similarity index 73%
rename from camel-core/src/main/java/org/apache/camel/management/ManagedCamelContext.java
rename to camel-management-api/src/main/java/org/apache/camel/api/management/ManagedCamelContext.java
index 4de1dd8..e5fba73 100644
--- a/camel-core/src/main/java/org/apache/camel/management/ManagedCamelContext.java
+++ b/camel-management-api/src/main/java/org/apache/camel/api/management/ManagedCamelContext.java
@@ -14,14 +14,29 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.management;
+package org.apache.camel.api.management;
 
-import org.apache.camel.CamelContext;
 import org.apache.camel.api.management.mbean.ManagedCamelContextMBean;
 import org.apache.camel.api.management.mbean.ManagedProcessorMBean;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 
-public interface ManagedCamelContext extends CamelContext {
+public interface ManagedCamelContext {
+
+    /**
+     * Gets the managed Camel CamelContext client api
+     */
+    ManagedCamelContextMBean getManagedCamelContext();
+
+    /**
+     * Gets the managed processor client api from any of the routes which with the given id
+     *
+     * @param id id of the processor
+     * @return the processor or <tt>null</tt> if not found
+     */
+    default ManagedProcessorMBean getManagedProcessor(String id) {
+        return getManagedProcessor(id, ManagedProcessorMBean.class);
+    }
+
     /**
      * Gets the managed processor client api from any of the routes which with the given id
      *
@@ -36,15 +51,20 @@ public interface ManagedCamelContext extends CamelContext {
      * Gets the managed route client api with the given route id
      *
      * @param routeId id of the route
-     * @param type the managed route type from the {@link org.apache.camel.api.management.mbean} package.
      * @return the route or <tt>null</tt> if not found
-     * @throws IllegalArgumentException if the type is not compliant
      */
-    <T extends ManagedRouteMBean> T getManagedRoute(String routeId, Class<T> type);
+    default ManagedRouteMBean getManagedRoute(String routeId) {
+        return getManagedRoute(routeId, ManagedRouteMBean.class);
+    }
 
     /**
-     * Gets the managed Camel CamelContext client api
+     * Gets the managed route client api with the given route id
+     *
+     * @param routeId id of the route
+     * @param type the managed route type from the {@link org.apache.camel.api.management.mbean} package.
+     * @return the route or <tt>null</tt> if not found
+     * @throws IllegalArgumentException if the type is not compliant
      */
-    ManagedCamelContextMBean getManagedCamelContext();
+    <T extends ManagedRouteMBean> T getManagedRoute(String routeId, Class<T> type);
 
 }
diff --git a/components/camel-beanstalk/src/test/java/org/apache/camel/component/beanstalk/EndpointTest.java b/components/camel-beanstalk/src/test/java/org/apache/camel/component/beanstalk/EndpointTest.java
index f425e20..5b850bd 100644
--- a/components/camel-beanstalk/src/test/java/org/apache/camel/component/beanstalk/EndpointTest.java
+++ b/components/camel-beanstalk/src/test/java/org/apache/camel/component/beanstalk/EndpointTest.java
@@ -31,7 +31,7 @@ public class EndpointTest {
 
     @Before
     public void setUp() throws Exception {
-        context = new DefaultCamelContext();
+        context = new DefaultCamelContext(false);
         context.disableJMX();
         context.start();
     }
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 febcc48..013baef 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
@@ -93,7 +93,7 @@ public class BlueprintCamelContext extends DefaultCamelContext implements Servic
         this.blueprintContainer = blueprintContainer;
     }
    
-    public void init() throws Exception {
+    public void doInit() {
         log.trace("init {}", this);
 
         // add service listener so we can be notified when blueprint container is done
diff --git a/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextPublisher.java b/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextPublisher.java
index 560b6b8..567607f 100644
--- a/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextPublisher.java
+++ b/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextPublisher.java
@@ -79,14 +79,6 @@ public class OsgiCamelContextPublisher extends EventNotifierSupport {
     }
 
     @Override
-    protected void doStart() throws Exception {
-    }
-
-    @Override
-    protected void doStop() throws Exception {
-    }
-
-    @Override
     protected void doShutdown() throws Exception {
         // clear and unregister any left-over registration (which should not happen)
         if (!registrations.isEmpty()) {
diff --git a/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java b/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
index 865f8b9..3bc35a4 100644
--- a/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
+++ b/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
@@ -52,7 +52,7 @@ import org.apache.camel.health.HealthCheckRepository;
 import org.apache.camel.health.HealthCheckService;
 import org.apache.camel.management.DefaultManagementAgent;
 import org.apache.camel.management.DefaultManagementLifecycleStrategy;
-import org.apache.camel.management.DefaultManagementStrategy;
+import org.apache.camel.impl.DefaultManagementStrategy;
 import org.apache.camel.management.ManagedManagementStrategy;
 import org.apache.camel.model.ContextScanDefinition;
 import org.apache.camel.model.FromDefinition;
@@ -83,6 +83,7 @@ import org.apache.camel.model.validator.ValidatorsDefinition;
 import org.apache.camel.processor.interceptor.BacklogTracer;
 import org.apache.camel.processor.interceptor.HandleFault;
 import org.apache.camel.runtimecatalog.JSonSchemaResolver;
+import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
 import org.apache.camel.spi.ClassResolver;
 import org.apache.camel.spi.Debugger;
@@ -192,7 +193,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         BacklogTracer backlogTracer = getBeanForType(BacklogTracer.class);
         if (backlogTracer != null) {
             LOG.info("Using custom BacklogTracer: {}", backlogTracer);
-            getContext().addInterceptStrategy(backlogTracer);
+            getContext().addService(backlogTracer);
         }
         HandleFault handleFault = getBeanForType(HandleFault.class);
         if (handleFault != null) {
@@ -242,7 +243,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         JSonSchemaResolver jsonSchemaResolver = getBeanForType(JSonSchemaResolver.class);
         if (jsonSchemaResolver != null) {
             LOG.info("Using custom JSonSchemaResolver: {}", jsonSchemaResolver);
-            getContext().getRuntimeCamelCatalog().setJSonSchemaResolver(jsonSchemaResolver);
+            getContext().getExtension(RuntimeCamelCatalog.class).setJSonSchemaResolver(jsonSchemaResolver);
         }
         // custom type converters defined as <bean>s
         Map<String, TypeConverters> typeConverters = getContext().getRegistry().findByTypeWithName(TypeConverters.class);
@@ -341,9 +342,9 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         if (healthCheckRegistry != null) {
             healthCheckRegistry.setCamelContext(getContext());
             LOG.info("Using HealthCheckRegistry: {}", healthCheckRegistry);
-            getContext().setHealthCheckRegistry(healthCheckRegistry);
+            getContext().setExtension(HealthCheckRegistry.class, healthCheckRegistry);
         } else {
-            healthCheckRegistry = getContext().getHealthCheckRegistry();
+            healthCheckRegistry = HealthCheckRegistry.get(getContext());
             healthCheckRegistry.setCamelContext(getContext());
         }
         // Health check repository
diff --git a/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConsumer.java b/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConsumer.java
index 9c8a80b..ace7400 100644
--- a/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConsumer.java
+++ b/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConsumer.java
@@ -46,10 +46,9 @@ public class CouchbaseConsumer extends DefaultScheduledPollConsumer {
         this.view = client.getView(endpoint.getDesignDocumentName(), endpoint.getViewName());
         this.query = new Query();
         init();
-
     }
 
-    private void init() {
+    protected void doInit() {
 
         query.setIncludeDocs(true);
 
diff --git a/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpSendDynamicAware.java b/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpSendDynamicAware.java
index 86fb192..473d434 100644
--- a/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpSendDynamicAware.java
+++ b/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpSendDynamicAware.java
@@ -53,7 +53,7 @@ public class HttpSendDynamicAware implements SendDynamicAware {
 
     @Override
     public DynamicAwareEntry prepare(Exchange exchange, String uri) throws Exception {
-        RuntimeCamelCatalog catalog = exchange.getContext().getRuntimeCamelCatalog();
+        RuntimeCamelCatalog catalog = exchange.getContext().getExtension(RuntimeCamelCatalog.class);
         Map<String, String> properties = catalog.endpointProperties(uri);
         Map<String, String> lenient = catalog.endpointLenientProperties(uri);
         return new DynamicAwareEntry(uri, properties, lenient);
@@ -82,7 +82,7 @@ public class HttpSendDynamicAware implements SendDynamicAware {
                     params.remove("path");
                 }
             }
-            RuntimeCamelCatalog catalog = exchange.getContext().getRuntimeCamelCatalog();
+            RuntimeCamelCatalog catalog = exchange.getContext().getExtension(RuntimeCamelCatalog.class);
             return catalog.asEndpointUri(scheme, params, false);
         } else {
             // no need for optimisation
diff --git a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringDifferTest.java b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringDifferTest.java
index 712d383..45e2cd0 100644
--- a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringDifferTest.java
+++ b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringDifferTest.java
@@ -19,7 +19,7 @@ package org.apache.camel.component.jmx;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.management.ManagedCamelContext;
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
 
@@ -37,19 +37,19 @@ public class CamelJmxConsumerObserveAttributeMatchStringDifferTest extends Camel
         getMockEndpoint("mock:result").message(0).body().contains("<attributeName>Tracing</attributeName>");
 
         // change the attribute so JMX triggers but should be filtered
-        ManagedRouteMBean mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
+        ManagedRouteMBean mr = context.getExtension(ManagedCamelContext.class).getManagedRoute("foo");
         mr.setStatisticsEnabled(true);
 
         // change the attribute so JMX triggers
-        mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
+        mr = context.getExtension(ManagedCamelContext.class).getManagedRoute("foo");
         mr.setTracing(true);
 
         // change the attribute so JMX triggers
-        mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
+        mr = context.getExtension(ManagedCamelContext.class).getManagedRoute("foo");
         mr.setTracing(false);
 
         // change the attribute so JMX triggers
-        mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
+        mr = context.getExtension(ManagedCamelContext.class).getManagedRoute("foo");
         mr.setTracing(true);
 
         assertMockEndpointsSatisfied();
diff --git a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringTest.java b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringTest.java
index b25ba88..1b56455 100644
--- a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringTest.java
+++ b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeMatchStringTest.java
@@ -19,7 +19,7 @@ package org.apache.camel.component.jmx;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.management.ManagedCamelContext;
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
 
@@ -37,19 +37,19 @@ public class CamelJmxConsumerObserveAttributeMatchStringTest extends CamelTestSu
         getMockEndpoint("mock:result").message(0).body().contains("<attributeName>Tracing</attributeName>");
 
         // change the attribute so JMX triggers but should be filtered
-        ManagedRouteMBean mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
+        ManagedRouteMBean mr = context.getExtension(ManagedCamelContext.class).getManagedRoute("foo");
         mr.setStatisticsEnabled(true);
 
         // change the attribute so JMX triggers
-        mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
+        mr = context.getExtension(ManagedCamelContext.class).getManagedRoute("foo");
         mr.setTracing(true);
 
         // change the attribute so JMX triggers
-        mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
+        mr = context.getExtension(ManagedCamelContext.class).getManagedRoute("foo");
         mr.setTracing(false);
 
         // change the attribute so JMX triggers
-        mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
+        mr = context.getExtension(ManagedCamelContext.class).getManagedRoute("foo");
         mr.setTracing(true);
 
         assertMockEndpointsSatisfied();
diff --git a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeTest.java b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeTest.java
index 2d39942..ae7dd13 100644
--- a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeTest.java
+++ b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerObserveAttributeTest.java
@@ -19,7 +19,7 @@ package org.apache.camel.component.jmx;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.management.ManagedCamelContext;
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
 
@@ -37,11 +37,11 @@ public class CamelJmxConsumerObserveAttributeTest extends CamelTestSupport {
         getMockEndpoint("mock:result").message(0).body().contains("<attributeName>Tracing</attributeName>");
 
         // change the attribute so JMX triggers but should be filtered
-        ManagedRouteMBean mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
+        ManagedRouteMBean mr = context.getExtension(ManagedCamelContext.class).getManagedRoute("foo");
         mr.setStatisticsEnabled(true);
 
         // change the attribute so JMX triggers
-        mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
+        mr = context.getExtension(ManagedCamelContext.class).getManagedRoute("foo");
         mr.setTracing(true);
 
         assertMockEndpointsSatisfied();
diff --git a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerTest.java b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerTest.java
index da283a6..0f44e40 100644
--- a/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerTest.java
+++ b/components/camel-jmx/src/test/java/org/apache/camel/component/jmx/CamelJmxConsumerTest.java
@@ -19,7 +19,7 @@ package org.apache.camel.component.jmx;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.management.ManagedCamelContext;
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
 
@@ -36,7 +36,7 @@ public class CamelJmxConsumerTest extends CamelTestSupport {
         getMockEndpoint("mock:result").message(0).body().contains("<newValue>true</newValue>");
 
         // change the attribute so JMX triggers
-        ManagedRouteMBean mr = context.adapt(ManagedCamelContext.class).getManagedRoute("foo", ManagedRouteMBean.class);
+        ManagedRouteMBean mr = context.getExtension(ManagedCamelContext.class).getManagedRoute("foo");
         mr.setTracing(true);
 
         assertMockEndpointsSatisfied();
diff --git a/components/camel-reactive-streams/src/main/java/org/apache/camel/component/reactive/streams/engine/DefaultCamelReactiveStreamsService.java b/components/camel-reactive-streams/src/main/java/org/apache/camel/component/reactive/streams/engine/DefaultCamelReactiveStreamsService.java
index d172fa1..bbac464 100644
--- a/components/camel-reactive-streams/src/main/java/org/apache/camel/component/reactive/streams/engine/DefaultCamelReactiveStreamsService.java
+++ b/components/camel-reactive-streams/src/main/java/org/apache/camel/component/reactive/streams/engine/DefaultCamelReactiveStreamsService.java
@@ -86,7 +86,7 @@ public class DefaultCamelReactiveStreamsService extends ServiceSupport implement
         return ReactiveStreamsConstants.DEFAULT_SERVICE_NAME;
     }
 
-    private void init() {
+    protected void doInit() {
         if (this.workerPool == null) {
             this.workerPool = context.getExecutorServiceManager().newThreadPool(
                 this,
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java
index 7df790f..4e584d0 100644
--- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java
@@ -343,7 +343,7 @@ public class CamelAutoConfiguration {
     static void afterPropertiesSet(ApplicationContext applicationContext, CamelContext camelContext) throws Exception {
         final ManagementStrategy managementStrategy = camelContext.getManagementStrategy();
 
-        registerPropertyForBeanType(applicationContext, BacklogTracer.class, camelContext::addInterceptStrategy);
+        registerPropertyForBeanType(applicationContext, BacklogTracer.class, bt -> camelContext.setExtension(BacklogTracer.class, bt));
         registerPropertyForBeanType(applicationContext, HandleFault.class, camelContext::addInterceptStrategy);
         registerPropertyForBeanType(applicationContext, InflightRepository.class, camelContext::setInflightRepository);
         registerPropertyForBeanType(applicationContext, AsyncProcessorAwaitManager.class, camelContext::setAsyncProcessorAwaitManager);
@@ -397,9 +397,9 @@ public class CamelAutoConfiguration {
         if (healthCheckRegistry != null) {
             healthCheckRegistry.setCamelContext(camelContext);
             LOG.info("Using HealthCheckRegistry: {}", healthCheckRegistry);
-            camelContext.setHealthCheckRegistry(healthCheckRegistry);
+            camelContext.setExtension(HealthCheckRegistry.class, healthCheckRegistry);
         } else {
-            healthCheckRegistry = camelContext.getHealthCheckRegistry();
+            healthCheckRegistry = HealthCheckRegistry.get(camelContext);
             healthCheckRegistry.setCamelContext(camelContext);
         }
 
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpoint.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpoint.java
index f2a4d7d..7dceb96 100644
--- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpoint.java
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpoint.java
@@ -34,7 +34,7 @@ import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.StatefulService;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.api.management.mbean.RouteError;
-import org.apache.camel.management.ManagedCamelContext;
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RouteDefinition;
@@ -160,7 +160,7 @@ public class CamelRoutesEndpoint {
 
     private void resetRoute(String id) {
         try {
-            ManagedRouteMBean managedRouteMBean = camelContext.adapt(ManagedCamelContext.class).getManagedRoute(id, ManagedRouteMBean.class);
+            ManagedRouteMBean managedRouteMBean = camelContext.getExtension(ManagedCamelContext.class).getManagedRoute(id);
             if (managedRouteMBean != null) {
                 managedRouteMBean.reset(true);
             }
@@ -284,7 +284,7 @@ public class CamelRoutesEndpoint {
             super(route);
 
             if (camelContext.getManagementStrategy().getManagementAgent() != null) {
-                this.routeDetails = new RouteDetails(camelContext.adapt(ManagedCamelContext.class).getManagedRoute(route.getId(), ManagedRouteMBean.class));
+                this.routeDetails = new RouteDetails(camelContext.getExtension(ManagedCamelContext.class).getManagedRoute(route.getId()));
             }
         }
 
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/model/RouteDetailsInfo.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/model/RouteDetailsInfo.java
index a7a51fe..f25bad9 100644
--- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/model/RouteDetailsInfo.java
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/model/RouteDetailsInfo.java
@@ -19,8 +19,7 @@ package org.apache.camel.spring.boot.model;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Route;
-import org.apache.camel.api.management.mbean.ManagedRouteMBean;
-import org.apache.camel.management.ManagedCamelContext;
+import org.apache.camel.api.management.ManagedCamelContext;
 
 /**
  * Container for exposing {@link org.apache.camel.Route} information
@@ -35,7 +34,7 @@ public class RouteDetailsInfo extends RouteInfo {
         super(route);
 
         if (camelContext.getManagementStrategy().getManagementAgent() != null) {
-            this.routeDetails = new RouteDetails(camelContext.adapt(ManagedCamelContext.class).getManagedRoute(route.getId(), ManagedRouteMBean.class));
+            this.routeDetails = new RouteDetails(camelContext.getExtension(ManagedCamelContext.class).getManagedRoute(route.getId()));
         }
     }
 
diff --git a/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/health/HealthCheckRegistryTest.java b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/health/HealthCheckRegistryTest.java
index 485bd3c..1544220 100644
--- a/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/health/HealthCheckRegistryTest.java
+++ b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/health/HealthCheckRegistryTest.java
@@ -20,6 +20,7 @@ import java.util.Collection;
 import java.util.Optional;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.health.HealthCheckRegistry;
 import org.apache.camel.health.HealthCheckRepository;
 import org.apache.camel.impl.health.RegistryRepository;
 import org.apache.camel.impl.health.RoutePerformanceCounterEvaluators;
@@ -57,7 +58,7 @@ public class HealthCheckRegistryTest extends Assert {
 
     @Test
     public void testRepositories() {
-        Collection<HealthCheckRepository> repos = context.getHealthCheckRegistry().getRepositories();
+        Collection<HealthCheckRepository> repos = HealthCheckRegistry.get(context).getRepositories();
 
         Assert.assertNotNull(repos);
         Assert.assertEquals(2, repos.size());
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 1233302..8ca938d 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
@@ -63,9 +63,11 @@ public class SpringCamelContext extends DefaultCamelContext implements Lifecycle
     private boolean shutdownEager = true;
 
     public SpringCamelContext() {
+        setManagementMBeanAssembler(new SpringManagementMBeanAssembler(this));
     }
 
     public SpringCamelContext(ApplicationContext applicationContext) {
+        this();
         setApplicationContext(applicationContext);
     }
 
@@ -235,12 +237,6 @@ public class SpringCamelContext extends DefaultCamelContext implements Lifecycle
         }
     }
 
-    @Override
-    protected ManagementMBeanAssembler createManagementMBeanAssembler() {
-        // use a spring mbean assembler
-        return new SpringManagementMBeanAssembler(this);
-    }
-
     protected EventEndpoint createEventEndpoint() {
         return getEndpoint("spring-event:default", EventEndpoint.class);
     }
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/health/HealthCheckRegistryTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/health/HealthCheckRegistryTest.java
index dd483bb..2dd85df 100644
--- a/components/camel-spring/src/test/java/org/apache/camel/spring/health/HealthCheckRegistryTest.java
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/health/HealthCheckRegistryTest.java
@@ -20,6 +20,7 @@ import java.util.Collection;
 import java.util.Optional;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.health.HealthCheckRegistry;
 import org.apache.camel.health.HealthCheckRepository;
 import org.apache.camel.impl.health.RegistryRepository;
 import org.apache.camel.impl.health.RoutePerformanceCounterEvaluators;
@@ -35,7 +36,7 @@ public class HealthCheckRegistryTest {
     @Test
     public void testRepositories() {
         CamelContext context = createContext("org/apache/camel/spring/health/HealthCheckRegistryTest.xml");
-        Collection<HealthCheckRepository> repos = context.getHealthCheckRegistry().getRepositories();
+        Collection<HealthCheckRepository> repos = HealthCheckRegistry.get(context).getRepositories();
 
         Assert.assertNotNull(repos);
         Assert.assertEquals(2, repos.size());
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/management/MyEventNotifier.java b/components/camel-spring/src/test/java/org/apache/camel/spring/management/MyEventNotifier.java
index b40be29..73231d1 100644
--- a/components/camel-spring/src/test/java/org/apache/camel/spring/management/MyEventNotifier.java
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/management/MyEventNotifier.java
@@ -30,19 +30,8 @@ public class MyEventNotifier extends EventNotifierSupport {
         events.add(event);
     }
 
-    public boolean isEnabled(CamelEvent event) {
-        return true;
-    }
-
     public List<CamelEvent> getEvents() {
         return events;
     }
 
-    @Override
-    protected void doStart() throws Exception {
-    }
-
-    @Override
-    protected void doStop() throws Exception {
-    }
 }
diff --git a/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/health/HealthCheckRegistryTest.java b/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/health/HealthCheckRegistryTest.java
index 706574b..7aa82f3 100644
--- a/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/health/HealthCheckRegistryTest.java
+++ b/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/health/HealthCheckRegistryTest.java
@@ -19,6 +19,7 @@ package org.apache.camel.test.blueprint.health;
 import java.util.Collection;
 import java.util.Optional;
 
+import org.apache.camel.health.HealthCheckRegistry;
 import org.apache.camel.health.HealthCheckRepository;
 import org.apache.camel.impl.health.RegistryRepository;
 import org.apache.camel.impl.health.RoutePerformanceCounterEvaluators;
@@ -35,7 +36,7 @@ public class HealthCheckRegistryTest extends CamelBlueprintTestSupport {
 
     @Test
     public void testRepositories() {
-        Collection<HealthCheckRepository> repos = context.getHealthCheckRegistry().getRepositories();
+        Collection<HealthCheckRepository> repos = HealthCheckRegistry.get(context).getRepositories();
 
         Assert.assertNotNull(repos);
         Assert.assertEquals(2, repos.size());
diff --git a/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/CamelAnnotationsHandler.java b/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/CamelAnnotationsHandler.java
index ba74630..c9074c3 100644
--- a/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/CamelAnnotationsHandler.java
+++ b/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/CamelAnnotationsHandler.java
@@ -25,6 +25,7 @@ import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.api.management.mbean.ManagedCamelContextMBean;
 import org.apache.camel.component.properties.PropertiesComponent;
 import org.apache.camel.impl.DefaultDebugger;
@@ -108,7 +109,7 @@ public final class CamelAnnotationsHandler {
                     RouteCoverageDumper.dumpRouteCoverage(camelContext, testClass.getName(), testMethodName);
 
                     // reset JMX statistics
-                    ManagedCamelContextMBean managedCamelContext = camelContext.getManagedCamelContext();
+                    ManagedCamelContextMBean managedCamelContext = camelContext.getExtension(ManagedCamelContext.class).getManagedCamelContext();
                     if (managedCamelContext != null) {
                         LOGGER.debug("Resetting JMX statistics for RouteCoverage");
                         managedCamelContext.reset(true);
diff --git a/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/RouteCoverageDumper.java b/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/RouteCoverageDumper.java
index b4ba2fb..1ffc244 100644
--- a/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/RouteCoverageDumper.java
+++ b/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/RouteCoverageDumper.java
@@ -24,7 +24,7 @@ import java.io.OutputStream;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.api.management.mbean.ManagedCamelContextMBean;
-import org.apache.camel.management.ManagedCamelContext;
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.util.IOHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -44,7 +44,7 @@ public final class RouteCoverageDumper {
             String dir = "target/camel-route-coverage";
             String name = testClassName + "-" + testName + ".xml";
 
-            ManagedCamelContextMBean managedCamelContext = context.adapt(ManagedCamelContext.class).getManagedCamelContext();
+            ManagedCamelContextMBean managedCamelContext = context.getExtension(ManagedCamelContext.class).getManagedCamelContext();
             if (managedCamelContext == null) {
                 LOG.warn("Cannot dump route coverage to file as JMX is not enabled. Override useJmx() method to enable JMX in the unit test classes.");
             } else {
diff --git a/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringRunnerDisableJmxInheritedOverrideTest.java b/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringRunnerDisableJmxInheritedOverrideTest.java
index 473ec04..429db93 100644
--- a/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringRunnerDisableJmxInheritedOverrideTest.java
+++ b/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringRunnerDisableJmxInheritedOverrideTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.camel.test.spring;
 
-import org.apache.camel.management.DefaultManagementStrategy;
+import org.apache.camel.impl.DefaultManagementStrategy;
 
 import org.junit.Test;
 import static org.junit.Assert.assertEquals;
diff --git a/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringRunnerPlainTest.java b/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringRunnerPlainTest.java
index 39b2d88..06ce8f5 100644
--- a/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringRunnerPlainTest.java
+++ b/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringRunnerPlainTest.java
@@ -24,7 +24,7 @@ import org.apache.camel.Produce;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.ServiceStatus;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.management.DefaultManagementStrategy;
+import org.apache.camel.impl.DefaultManagementStrategy;
 import org.apache.camel.util.StopWatch;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/components/camel-test/src/main/java/org/apache/camel/test/junit4/CamelTestSupport.java b/components/camel-test/src/main/java/org/apache/camel/test/junit4/CamelTestSupport.java
index 7446a65..6f353ad 100644
--- a/components/camel-test/src/main/java/org/apache/camel/test/junit4/CamelTestSupport.java
+++ b/components/camel-test/src/main/java/org/apache/camel/test/junit4/CamelTestSupport.java
@@ -75,7 +75,7 @@ import org.apache.camel.impl.DefaultDebugger;
 import org.apache.camel.impl.InterceptSendToMockEndpointStrategy;
 import org.apache.camel.impl.JndiRegistry;
 import org.apache.camel.management.JmxSystemPropertyKeys;
-import org.apache.camel.management.ManagedCamelContext;
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.RouteDefinition;
@@ -433,7 +433,7 @@ public abstract class CamelTestSupport extends TestSupport {
             String dir = "target/camel-route-coverage";
             String name = className + "-" + getTestMethodName() + ".xml";
 
-            ManagedCamelContextMBean managedCamelContext = context != null ? context.adapt(ManagedCamelContext.class).getManagedCamelContext() : null;
+            ManagedCamelContextMBean managedCamelContext = context != null ? context.getExtension(ManagedCamelContext.class).getManagedCamelContext() : null;
             if (managedCamelContext == null) {
                 log.warn("Cannot dump route coverage to file as JMX is not enabled. Override useJmx() method to enable JMX in the unit test classes.");
             } else {
@@ -529,7 +529,7 @@ public abstract class CamelTestSupport extends TestSupport {
 
         // log processor coverage for each route
         for (Route route : context.getRoutes()) {
-            ManagedRouteMBean managedRoute = context.adapt(ManagedCamelContext.class).getManagedRoute(route.getId(), ManagedRouteMBean.class);
+            ManagedRouteMBean managedRoute = context.getExtension(ManagedCamelContext.class).getManagedRoute(route.getId());
             if (managedRoute.getExchangesTotal() == 0) {
                 uncoveredRoutes.add(route.getId());
             }
@@ -581,7 +581,7 @@ public abstract class CamelTestSupport extends TestSupport {
             String name = objectName.getKeyProperty("name");
             name = ObjectName.unquote(name);
 
-            ManagedProcessorMBean managedProcessor = context.adapt(ManagedCamelContext.class).getManagedProcessor(name, ManagedProcessorMBean.class);
+            ManagedProcessorMBean managedProcessor = context.getExtension(ManagedCamelContext.class).getManagedProcessor(name);
 
             if (managedProcessor != null) {
                 if (processorsForRoute.get(routeId) == null) {
diff --git a/examples/camel-example-cdi-test/src/test/java/org/apache/camel/example/cdi/test/CustomContextTest.java b/examples/camel-example-cdi-test/src/test/java/org/apache/camel/example/cdi/test/CustomContextTest.java
index 0665808..eb08b73 100644
--- a/examples/camel-example-cdi-test/src/test/java/org/apache/camel/example/cdi/test/CustomContextTest.java
+++ b/examples/camel-example-cdi-test/src/test/java/org/apache/camel/example/cdi/test/CustomContextTest.java
@@ -23,7 +23,7 @@ import javax.enterprise.inject.Default;
 import org.apache.camel.CamelContext;
 import org.apache.camel.cdi.ContextName;
 import org.apache.camel.impl.DefaultCamelContext;
-import org.apache.camel.management.DefaultManagementStrategy;
+import org.apache.camel.impl.DefaultManagementStrategy;
 import org.apache.camel.test.cdi.CamelCdiRunner;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
index 58b746a..7144478 100644
--- a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
+++ b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
@@ -38,7 +38,7 @@ import org.apache.camel.Route;
 import org.apache.camel.ServiceStatus;
 import org.apache.camel.StatefulService;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
-import org.apache.camel.management.ManagedCamelContext;
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RouteDefinition;
@@ -278,7 +278,7 @@ public abstract class AbstractLocalCamelController extends AbstractCamelControll
                         row.put("routeId", route.getId());
                         row.put("state", getRouteState(route));
                         row.put("uptime", route.getUptime());
-                        ManagedRouteMBean mr = context.adapt(ManagedCamelContext.class).getManagedRoute(route.getId(), ManagedRouteMBean.class);
+                        ManagedRouteMBean mr = context.getExtension(ManagedCamelContext.class).getManagedRoute(route.getId());
                         if (mr != null) {
                             row.put("exchangesTotal", "" + mr.getExchangesTotal());
                             row.put("exchangesInflight", "" + mr.getExchangesInflight());
diff --git a/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/internal/CamelControllerImpl.java b/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/internal/CamelControllerImpl.java
index 0c6bd1f..7c08466 100644
--- a/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/internal/CamelControllerImpl.java
+++ b/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/internal/CamelControllerImpl.java
@@ -25,7 +25,7 @@ import java.util.Map;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.commands.AbstractLocalCamelController;
-import org.apache.camel.management.ManagedCamelContext;
+import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.karaf.shell.api.action.lifecycle.Reference;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
@@ -86,10 +86,10 @@ public class CamelControllerImpl extends AbstractLocalCamelController {
             row.put("name", camelContext.getName());
             row.put("state", camelContext.getStatus().name());
             row.put("uptime", camelContext.getUptime());
-            if (camelContext.adapt(ManagedCamelContext.class).getManagedCamelContext() != null) {
-                row.put("exchangesTotal", "" + camelContext.adapt(ManagedCamelContext.class).getManagedCamelContext().getExchangesTotal());
-                row.put("exchangesInflight", "" + camelContext.adapt(ManagedCamelContext.class).getManagedCamelContext().getExchangesInflight());
-                row.put("exchangesFailed", "" + camelContext.adapt(ManagedCamelContext.class).getManagedCamelContext().getExchangesFailed());
+            if (camelContext.getExtension(ManagedCamelContext.class).getManagedCamelContext() != null) {
+                row.put("exchangesTotal", "" + camelContext.getExtension(ManagedCamelContext.class).getManagedCamelContext().getExchangesTotal());
+                row.put("exchangesInflight", "" + camelContext.getExtension(ManagedCamelContext.class).getManagedCamelContext().getExchangesInflight());
+                row.put("exchangesFailed", "" + camelContext.getExtension(ManagedCamelContext.class).getManagedCamelContext().getExchangesFailed());
             } else {
                 row.put("exchangesTotal", "0");
                 row.put("exchangesInflight", "0");