You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2019/05/21 07:25:56 UTC

[camel] branch master updated: CAMEL-13456 (#2935)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 4c040c6  CAMEL-13456 (#2935)
4c040c6 is described below

commit 4c040c6f6e0ee5d875ebf1989e0181ac64dd53ce
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue May 21 09:25:51 2019 +0200

    CAMEL-13456 (#2935)
    
    * CAMEL-13456: CamelContext - Move API that are not related to end users to an ExtendedCamelContext
    
    * Add maven repo to atlassian so camel-jira-starter can build
---
 MIGRATION.md                                       |   7 +
 .../camel/component/aws/xray/XRayTracer.java       |   3 +-
 .../apache/camel/component/bean/MethodInfo.java    |   8 +-
 .../apache/camel/component/bean/ProxyHelper.java   |   3 +-
 .../org/apache/camel/cdi/test/NoTCCLSetTest.java   |   3 +-
 .../cxf/CxfGreeterCXFMessageRouterTest.java        |   4 +-
 .../camel/component/file/GenericFileEndpoint.java  |   3 +-
 .../hystrix/processor/HystrixReifier.java          |   3 +-
 .../apache/camel/component/log/LogEndpoint.java    |   3 +-
 .../camel/opentracing/OpenTracingTracer.java       |   3 +-
 .../reactive/streams/ReactiveStreamsHelper.java    |   3 +-
 .../camel/component/rest/RestApiEndpoint.java      |   3 +-
 .../apache/camel/component/rest/RestEndpoint.java  |   3 +-
 .../component/salesforce/SalesforceComponent.java  |   3 +-
 .../apache/camel/component/seda/SedaEndpoint.java  |   3 +-
 .../camel/spring/boot/CamelAutoConfiguration.java  |  19 +-
 .../spring/boot/LogListenerDiscoveryTest.java      |   3 +-
 .../DefaultPackageResolverConfigureTest.java       |   3 +-
 .../camel/test/spring/CamelAnnotationsHandler.java |   6 +-
 .../test/spring/CamelSpringTestContextLoader.java  |   5 +-
 .../apache/camel/test/junit4/CamelTestSupport.java |   5 +-
 .../main/java/org/apache/camel/CamelContext.java   | 284 +------------------
 .../org/apache/camel/ExtendedCamelContext.java     | 308 +++++++++++++++++++++
 .../impl/converter/BaseTypeConverterRegistry.java  |   3 +-
 .../camel/impl/engine/AbstractCamelContext.java    |   5 +-
 .../camel/impl/engine/AbstractDynamicRegistry.java |   5 +-
 .../impl/engine/BeanProcessorFactoryResolver.java  |   3 +-
 .../impl/engine/BeanProxyFactoryResolver.java      |   3 +-
 .../impl/engine/DefaultComponentResolver.java      |   3 +-
 .../impl/engine/DefaultDataFormatResolver.java     |   3 +-
 .../apache/camel/impl/engine/DefaultInjector.java  |   3 +-
 .../camel/impl/engine/DefaultLanguageResolver.java |   5 +-
 .../camel/impl/engine/DefaultNodeIdFactory.java    |   1 -
 .../camel/impl/engine/DefaultProcessorFactory.java |   5 +-
 .../impl/engine/HeadersMapFactoryResolver.java     |   3 +-
 .../impl/engine/RestRegistryFactoryResolver.java   |   3 +-
 .../impl/engine/SubscribeMethodProcessor.java      |   4 +-
 .../camel/processor/CamelInternalProcessor.java    |   3 +-
 .../camel/processor/SendDynamicAwareResolver.java  |   3 +-
 .../processor/SharedCamelInternalProcessor.java    |   3 +-
 .../camel/processor/interceptor/HandleFault.java   |   3 +-
 .../impl/cloud/DefaultServiceCallProcessor.java    |   3 +-
 .../impl/cloud/ServiceCallProcessorFactory.java    |   3 +-
 .../camel/core/osgi/utils/BundleContextUtils.java  |  26 --
 .../core/xml/AbstractCamelContextFactoryBean.java  |  35 +--
 .../camel/builder/AdviceWithRouteBuilder.java      |   7 +-
 .../camel/builder/ErrorHandlerBuilderRef.java      |   3 +-
 .../org/apache/camel/builder/ProxyBuilder.java     |   3 +-
 .../org/apache/camel/builder/RouteBuilder.java     |   5 +-
 .../camel/impl/CamelPostProcessorHelper.java       |   5 +-
 .../camel/impl/DefaultExecutorServiceManager.java  |   5 +-
 .../java/org/apache/camel/impl/DefaultModel.java   |   3 +-
 .../org/apache/camel/impl/DefaultRouteContext.java |   5 +-
 .../apache/camel/impl/ReloadStrategySupport.java   |   3 +-
 .../java/org/apache/camel/impl/RouteService.java   |   3 +-
 .../java/org/apache/camel/main/MainSupport.java    |  21 +-
 .../java/org/apache/camel/model/ModelHelper.java   |   3 +-
 .../model/RestContextRefDefinitionHelper.java      |   3 +-
 .../model/RouteContextRefDefinitionHelper.java     |   3 +-
 .../apache/camel/model/RouteDefinitionHelper.java  |   9 +-
 .../cloud/ServiceCallExpressionConfiguration.java  |   3 +-
 .../ServiceCallServiceChooserConfiguration.java    |   3 +-
 .../ServiceCallServiceDiscoveryConfiguration.java  |   3 +-
 .../ServiceCallServiceFilterConfiguration.java     |   3 +-
 ...erviceCallServiceLoadBalancerConfiguration.java |   3 +-
 .../apache/camel/model/rest/RestDefinition.java    |   3 +-
 .../errorhandler/RedeliveryErrorHandler.java       |   5 +-
 .../java/org/apache/camel/reifier/BeanReifier.java |   3 +-
 .../reifier/InterceptSendToEndpointReifier.java    |   3 +-
 .../java/org/apache/camel/reifier/LogReifier.java  |   3 +-
 .../org/apache/camel/reifier/ProcessorReifier.java |  22 +-
 .../org/apache/camel/reifier/RouteReifier.java     |   5 +-
 .../java/org/apache/camel/reifier/StepReifier.java |   3 +-
 .../camel/builder/ContextErrorHandlerTest.java     |   3 +-
 .../camel/builder/ErrorHandlerBuilderRefTest.java  |   3 +-
 .../camel/component/ComponentDiscoveryTest.java    |  60 ----
 .../camel/component/log/LogListenerTest.java       |   3 +-
 .../camel/impl/BeanInjectRouteBuilderTest.java     |   3 +-
 .../CamelContextAddRestDefinitionsFromXmlTest.java |   3 +-
 ...CamelContextAddRouteDefinitionsFromXmlTest.java |   3 +-
 .../CamelProduceInterfaceEventNotifierTest.java    |   3 +-
 .../org/apache/camel/impl/CustomIdFactoryTest.java |   7 +-
 .../camel/impl/CustomUnitOfWorkFactoryTest.java    |   3 +-
 .../impl/DefaultCamelBeanPostProcessorTest.java    |   3 +-
 ...erceptSendToMockEndpointStrategyCustomTest.java |   3 +-
 .../InterceptSendToMockEndpointStrategyTest.java   |   5 +-
 .../camel/impl/model/RouteIdFactoryTest.java       |   3 +-
 .../issues/AdviceWithStartTargetIssueTest.java     |   3 +-
 ...ScopedOnExceptionMultipleRouteBuildersTest.java |   3 +-
 .../issues/DynamicRouterWithInterceptorTest.java   |   3 +-
 .../issues/OnExceptionContinuedIssueTest.java      |   3 +-
 .../issues/RecipientListWithInterceptorTest.java   |   3 +-
 ...ScopedOnExceptionMultipleRouteBuildersTest.java |   3 +-
 .../issues/RoutingSlipWithInterceptorTest.java     |   3 +-
 .../camel/issues/SplitWithInterceptorTest.java     |   3 +-
 ...ryCatchInterceptSendToAllEndpointIssueTest.java |   3 +-
 .../apache/camel/issues/TwoTimerWithJMXIssue.java  |   3 +-
 .../processor/CustomProcessorFactoryTest.java      |   3 +-
 .../camel/processor/FaultRetryRouteTest.java       |   3 +-
 .../org/apache/camel/processor/FaultRouteTest.java |   3 +-
 .../apache/camel/processor/LogEipListenerTest.java |   3 +-
 .../camel/processor/PipelineStepWithEventTest.java |   3 +-
 .../AsyncEndpointCustomAsyncInterceptorTest.java   |   3 +-
 .../async/AsyncEndpointCustomInterceptorTest.java  |   3 +-
 .../processor/async/AsyncEndpointPolicyTest.java   |   3 +-
 .../AsyncProcessorAwaitManagerInterruptTest.java   |  17 +-
 ...sorAwaitManagerInterruptWithRedeliveryTest.java |  17 +-
 .../async/AsyncProcessorAwaitManagerTest.java      |  15 +-
 .../ParentChildInterceptStrategyTest.java          |   3 +-
 .../AuditInterceptorAsyncDelegateIssueTest.java    |   3 +-
 .../AuditInterceptorDelegateIssueTest.java         |   3 +-
 .../CustomInterceptorRouteWithChildOutputTest.java |   3 +-
 .../InterceptorStrategyNotOrderedTest.java         |   5 +-
 .../InterceptorStrategyOrderedTest.java            |   5 +-
 .../camel/management/DefaultManagementAgent.java   |   3 +-
 .../management/JmxManagementLifecycleStrategy.java |   3 +-
 .../management/mbean/ManagedCamelContext.java      |   3 +-
 .../camel/management/mbean/ManagedProcessor.java   |   5 +-
 .../apache/camel/support/AsyncProcessorHelper.java |   3 +-
 .../camel/support/AsyncProcessorSupport.java       |   3 +-
 .../apache/camel/support/CamelContextHelper.java   | 124 +--------
 .../apache/camel/support/DefaultAsyncProducer.java |   3 +-
 .../org/apache/camel/support/DefaultConsumer.java  |   3 +-
 .../modules/ROOT/pages/delay-interceptor.adoc      |  14 +-
 .../commands/AbstractLocalCamelController.java     |  24 +-
 .../components-starter/camel-jira-starter/pom.xml  |   8 +
 .../itest/issues/IntercepFromAndStrategyTest.java  |   3 +-
 127 files changed, 668 insertions(+), 720 deletions(-)

diff --git a/MIGRATION.md b/MIGRATION.md
index c8766a8..4ff7b5d 100644
--- a/MIGRATION.md
+++ b/MIGRATION.md
@@ -21,6 +21,7 @@ In Camel 2.x camel-core was one JAR file, which now has been splitup into many J
 - camel-caffeine-lrucache
 - camel-cloud
 - camel-core
+- camel-jaxp
 - camel-management-api
 - camel-management-impl
 - camel-support
@@ -155,6 +156,12 @@ In Camel 2.x we have deprecated `getProperties` on `CamelContext` in favour of `
     </globalOptions>
 
 
+### Extended CamelContext
+
+The APIs on `CamelContext` has been reducded a bit to focus on relevant API for Camel end users. The advanced use-cases and for SPI and component developers, then some of the APIs from `CamelContext` has been moved to `ExtendedCamelContext` which you can access via adapt:
+
+    ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
+
 ### Main class
 
 The `Main` class from `camel-core`, `camel-spring` and `camel-cdi` has been modified to only support a single `CamelContext` which was really its intention, but there was some old crufy code for multiple Camels. The method `getCamelContextMap` has been removed, and there is just a `getCamelContext` method now.
diff --git a/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/XRayTracer.java b/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/XRayTracer.java
index 4093aab..9b07b73 100644
--- a/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/XRayTracer.java
+++ b/components/camel-aws-xray/src/main/java/org/apache/camel/component/aws/xray/XRayTracer.java
@@ -34,6 +34,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Route;
 import org.apache.camel.RuntimeCamelException;
@@ -131,7 +132,7 @@ public class XRayTracer extends ServiceSupport implements RoutePolicyFactory, St
             tracingStrategy = new NoopTracingStrategy();
         }
 
-        camelContext.addInterceptStrategy(tracingStrategy);
+        camelContext.adapt(ExtendedCamelContext.class).addInterceptStrategy(tracingStrategy);
 
         log.debug("Starting XRay tracer");
     }
diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/MethodInfo.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/MethodInfo.java
index 8a7a443..8296fe9 100644
--- a/components/camel-bean/src/main/java/org/apache/camel/component/bean/MethodInfo.java
+++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/MethodInfo.java
@@ -38,6 +38,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
 import org.apache.camel.Expression;
 import org.apache.camel.ExpressionEvaluationException;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Message;
 import org.apache.camel.NoTypeConversionAvailableException;
 import org.apache.camel.Pattern;
@@ -56,7 +57,6 @@ import org.slf4j.LoggerFactory;
 
 import static org.apache.camel.util.ObjectHelper.asString;
 
-
 /**
  * Information about a method to be used for invocation.
  */
@@ -124,7 +124,7 @@ public class MethodInfo {
         org.apache.camel.RoutingSlip routingSlipAnnotation =
             (org.apache.camel.RoutingSlip)collectedMethodAnnotation.get(org.apache.camel.RoutingSlip.class);
         if (routingSlipAnnotation != null && matchContext(routingSlipAnnotation.context())) {
-            routingSlip = camelContext.getAnnotationBasedProcessorFactory().createRoutingSlip(camelContext, routingSlipAnnotation);
+            routingSlip = camelContext.adapt(ExtendedCamelContext.class).getAnnotationBasedProcessorFactory().createRoutingSlip(camelContext, routingSlipAnnotation);
             // add created routingSlip as a service so we have its lifecycle managed
             try {
                 camelContext.addService(routingSlip);
@@ -137,7 +137,7 @@ public class MethodInfo {
             (org.apache.camel.DynamicRouter)collectedMethodAnnotation.get(org.apache.camel.DynamicRouter.class);
         if (dynamicRouterAnnotation != null
                 && matchContext(dynamicRouterAnnotation.context())) {
-            dynamicRouter = camelContext.getAnnotationBasedProcessorFactory().createDynamicRouter(camelContext, dynamicRouterAnnotation);
+            dynamicRouter = camelContext.adapt(ExtendedCamelContext.class).getAnnotationBasedProcessorFactory().createDynamicRouter(camelContext, dynamicRouterAnnotation);
             // add created dynamicRouter as a service so we have its lifecycle managed
             try {
                 camelContext.addService(dynamicRouter);
@@ -150,7 +150,7 @@ public class MethodInfo {
             (org.apache.camel.RecipientList)collectedMethodAnnotation.get(org.apache.camel.RecipientList.class);
         if (recipientListAnnotation != null
                 && matchContext(recipientListAnnotation.context())) {
-            recipientList = camelContext.getAnnotationBasedProcessorFactory().createRecipientList(camelContext, recipientListAnnotation);
+            recipientList = camelContext.adapt(ExtendedCamelContext.class).getAnnotationBasedProcessorFactory().createRecipientList(camelContext, recipientListAnnotation);
             // add created recipientList as a service so we have its lifecycle managed
             try {
                 camelContext.addService(recipientList);
diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/ProxyHelper.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/ProxyHelper.java
index 51b8848..0192c08 100644
--- a/components/camel-bean/src/main/java/org/apache/camel/component/bean/ProxyHelper.java
+++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/ProxyHelper.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.bean;
 import java.lang.reflect.Proxy;
 
 import org.apache.camel.Endpoint;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Producer;
 
 /**
@@ -51,7 +52,7 @@ public final class ProxyHelper {
      * Creates a Proxy which sends the exchange to the endpoint.
      */
     public static <T> T createProxy(Endpoint endpoint, boolean binding, ClassLoader cl, Class<T>[] interfaceClasses, MethodInfoCache methodCache) throws Exception {
-        Producer producer = endpoint.getCamelContext().getDeferServiceFactory().createProducer(endpoint);
+        Producer producer = endpoint.getCamelContext().adapt(ExtendedCamelContext.class).getDeferServiceFactory().createProducer(endpoint);
         return createProxyObject(endpoint, binding, producer, cl, interfaceClasses, methodCache);
     }
 
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/NoTCCLSetTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/NoTCCLSetTest.java
index 1ce1b07..fd0f04c 100644
--- a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/NoTCCLSetTest.java
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/NoTCCLSetTest.java
@@ -22,6 +22,7 @@ import javax.enterprise.event.Observes;
 import javax.inject.Inject;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.cdi.CdiCamelConfiguration;
 import org.apache.camel.cdi.CdiCamelExtension;
 import org.jboss.arquillian.container.test.api.Deployment;
@@ -54,7 +55,7 @@ public class NoTCCLSetTest {
     @Test
     public void verifyNoTCCLFallbackClassLoader() {
         assertThat(camelContext, is(notNullValue()));
-        Set<ClassLoader> classLoaders = camelContext.getPackageScanClassResolver().getClassLoaders();
+        Set<ClassLoader> classLoaders = camelContext.adapt(ExtendedCamelContext.class).getPackageScanClassResolver().getClassLoaders();
         assertThat(classLoaders.size(), is(1));
         assertThat(classLoaders.iterator().next(), is(CamelContext.class.getClassLoader()));
     }
diff --git a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfGreeterCXFMessageRouterTest.java b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfGreeterCXFMessageRouterTest.java
index bb78553..daeb941 100644
--- a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfGreeterCXFMessageRouterTest.java
+++ b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfGreeterCXFMessageRouterTest.java
@@ -18,7 +18,6 @@ package org.apache.camel.component.cxf;
 
 import javax.xml.ws.Endpoint;
 
-import org.apache.camel.builder.NoErrorHandlerBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.hello_world_soap_http.GreeterImpl;
 import org.junit.AfterClass;
@@ -48,7 +47,8 @@ public class CxfGreeterCXFMessageRouterTest extends AbstractCXFGreeterRouterTest
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                context.setErrorHandlerFactory(new NoErrorHandlerBuilder());
+                errorHandler(noErrorHandler());
+
                 from("cxf:bean:routerEndpoint?dataFormat=CXF_MESSAGE&publishedEndpointUrl=http://www.simple.com/services/test")
                     .to("cxf:bean:serviceEndpoint?dataFormat=CXF_MESSAGE");
             }
diff --git a/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java b/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
index f326ed9..01cd8f9 100644
--- a/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
+++ b/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileEndpoint.java
@@ -32,6 +32,7 @@ import org.apache.camel.Component;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.ExpressionIllegalSyntaxException;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.Message;
 import org.apache.camel.Predicate;
@@ -274,7 +275,7 @@ public abstract class GenericFileEndpoint<T> extends ScheduledPollEndpoint imple
     protected GenericFileProcessStrategy<T> createGenericFileStrategy() {
         Class<?> factory = null;
         try {
-            FactoryFinder finder = getCamelContext().getFactoryFinder("META-INF/services/org/apache/camel/component/");
+            FactoryFinder finder = getCamelContext().adapt(ExtendedCamelContext.class).getFactoryFinder("META-INF/services/org/apache/camel/component/");
             log.trace("Using FactoryFinder: {}", finder);
             factory = finder.findClass(getScheme(), "strategy.factory.", CamelContext.class);
         } catch (ClassNotFoundException e) {
diff --git a/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixReifier.java b/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixReifier.java
index 5cb2a1d..a0d2981 100644
--- a/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixReifier.java
+++ b/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixReifier.java
@@ -27,6 +27,7 @@ import com.netflix.hystrix.HystrixCommandProperties;
 import com.netflix.hystrix.HystrixThreadPoolKey;
 import com.netflix.hystrix.HystrixThreadPoolProperties;
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.model.HystrixConfigurationDefinition;
 import org.apache.camel.model.HystrixDefinition;
@@ -55,7 +56,7 @@ public class HystrixReifier extends ProcessorReifier<HystrixDefinition> {
         }
 
         final HystrixConfigurationDefinition config = buildHystrixConfiguration(routeContext.getCamelContext());
-        final String id = definition.idOrCreate(routeContext.getCamelContext().getNodeIdFactory());
+        final String id = definition.idOrCreate(routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getNodeIdFactory());
 
         // group and thread pool keys to use they can be configured on configRef and config, so look there first, and if none then use default
         String groupKey = config.getGroupKey();
diff --git a/components/camel-log/src/main/java/org/apache/camel/component/log/LogEndpoint.java b/components/camel-log/src/main/java/org/apache/camel/component/log/LogEndpoint.java
index d59449f..5c53d5d 100644
--- a/components/camel-log/src/main/java/org/apache/camel/component/log/LogEndpoint.java
+++ b/components/camel-log/src/main/java/org/apache/camel/component/log/LogEndpoint.java
@@ -17,6 +17,7 @@
 package org.apache.camel.component.log;
 
 import org.apache.camel.Component;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
@@ -140,7 +141,7 @@ public class LogEndpoint extends ProcessorEndpoint {
             Long groupDelay = getGroupDelay();
             answer = new ThroughputLogger(camelLogger, this.getCamelContext(), getGroupInterval(), groupDelay, groupActiveOnly);
         } else {
-            answer = new CamelLogProcessor(camelLogger, localFormatter, getMaskingFormatter(), getCamelContext().getLogListeners());
+            answer = new CamelLogProcessor(camelLogger, localFormatter, getMaskingFormatter(), getCamelContext().adapt(ExtendedCamelContext.class).getLogListeners());
         }
         // the logger is the processor
         setProcessor(answer);
diff --git a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java
index 3795cac..b336c14 100644
--- a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java
+++ b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java
@@ -33,6 +33,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Route;
 import org.apache.camel.RuntimeCamelException;
@@ -168,7 +169,7 @@ public class OpenTracingTracer extends ServiceSupport implements RoutePolicyFact
         if (!camelContext.getRoutePolicyFactories().contains(this)) {
             camelContext.addRoutePolicyFactory(this);
         }
-        camelContext.addLogListener(logListener);
+        camelContext.adapt(ExtendedCamelContext.class).addLogListener(logListener);
 
         if (tracer == null) {
             Set<Tracer> tracers = camelContext.getRegistry().findByType(Tracer.class);
diff --git a/components/camel-reactive-streams/src/main/java/org/apache/camel/component/reactive/streams/ReactiveStreamsHelper.java b/components/camel-reactive-streams/src/main/java/org/apache/camel/component/reactive/streams/ReactiveStreamsHelper.java
index 4083691..40f7b54 100644
--- a/components/camel-reactive-streams/src/main/java/org/apache/camel/component/reactive/streams/ReactiveStreamsHelper.java
+++ b/components/camel-reactive-streams/src/main/java/org/apache/camel/component/reactive/streams/ReactiveStreamsHelper.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.reactive.streams;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.component.reactive.streams.api.CamelReactiveStreamsService;
 import org.apache.camel.component.reactive.streams.api.CamelReactiveStreamsServiceFactory;
 import org.apache.camel.component.reactive.streams.api.DispatchCallback;
@@ -112,7 +113,7 @@ public final class ReactiveStreamsHelper {
     @SuppressWarnings("unchecked")
     public static CamelReactiveStreamsServiceFactory resolveServiceFactory(CamelContext context, String serviceType) {
         try {
-            FactoryFinder finder = context.getFactoryFinder(ReactiveStreamsConstants.SERVICE_PATH);
+            FactoryFinder finder = context.adapt(ExtendedCamelContext.class).getFactoryFinder(ReactiveStreamsConstants.SERVICE_PATH);
             Class<?> serviceClass = finder.findClass(serviceType);
 
             return (CamelReactiveStreamsServiceFactory)context.getInjector().newInstance(serviceClass);
diff --git a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestApiEndpoint.java b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestApiEndpoint.java
index 4d39bea..410b63f 100644
--- a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestApiEndpoint.java
+++ b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestApiEndpoint.java
@@ -22,6 +22,7 @@ import java.util.Set;
 import org.apache.camel.Component;
 import org.apache.camel.Consumer;
 import org.apache.camel.ExchangePattern;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.NoSuchBeanException;
 import org.apache.camel.Processor;
@@ -147,7 +148,7 @@ public class RestApiEndpoint extends DefaultEndpoint {
                 name = DEFAULT_API_COMPONENT_NAME;
             }
             try {
-                FactoryFinder finder = getCamelContext().getFactoryFinder(RESOURCE_PATH);
+                FactoryFinder finder = getCamelContext().adapt(ExtendedCamelContext.class).getFactoryFinder(RESOURCE_PATH);
                 Object instance = finder.newInstance(name);
                 if (instance instanceof RestApiProcessorFactory) {
                     factory = (RestApiProcessorFactory) instance;
diff --git a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
index 44a5792..414716b 100644
--- a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
+++ b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
@@ -22,6 +22,7 @@ import java.util.Set;
 import org.apache.camel.Component;
 import org.apache.camel.Consumer;
 import org.apache.camel.ExchangePattern;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.NoSuchBeanException;
 import org.apache.camel.Processor;
@@ -284,7 +285,7 @@ public class RestEndpoint extends DefaultEndpoint {
             log.debug("Discovering camel-swagger-java on classpath for using api-doc: {}", apiDoc);
             // lookup on classpath using factory finder to automatic find it (just add camel-swagger-java to classpath etc)
             try {
-                FactoryFinder finder = getCamelContext().getFactoryFinder(RESOURCE_PATH);
+                FactoryFinder finder = getCamelContext().adapt(ExtendedCamelContext.class).getFactoryFinder(RESOURCE_PATH);
                 Object instance = finder.newInstance(DEFAULT_API_COMPONENT_NAME);
                 if (instance instanceof RestProducerFactory) {
                     // this factory from camel-swagger-java will facade the http component in use
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java
index 328306a..cd0d9f0 100644
--- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceComponent.java
@@ -27,6 +27,7 @@ import java.util.regex.Pattern;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.SSLContextParametersAware;
 import org.apache.camel.TypeConverter;
 import org.apache.camel.component.salesforce.api.SalesforceException;
@@ -288,7 +289,7 @@ public class SalesforceComponent extends DefaultComponent implements SSLContextP
 
     private Map<String, Class<?>> parsePackages() {
         Map<String, Class<?>> result = new HashMap<>();
-        Set<Class<?>> classes = getCamelContext().getPackageScanClassResolver().
+        Set<Class<?>> classes = getCamelContext().adapt(ExtendedCamelContext.class).getPackageScanClassResolver().
                 findImplementations(AbstractSObjectBase.class, packages);
         for (Class<?> aClass : classes) {
             // findImplementations also returns AbstractSObjectBase for some reason!!!
diff --git a/components/camel-seda/src/main/java/org/apache/camel/component/seda/SedaEndpoint.java b/components/camel-seda/src/main/java/org/apache/camel/component/seda/SedaEndpoint.java
index 783f8f2..54507a2 100644
--- a/components/camel-seda/src/main/java/org/apache/camel/component/seda/SedaEndpoint.java
+++ b/components/camel-seda/src/main/java/org/apache/camel/component/seda/SedaEndpoint.java
@@ -29,6 +29,7 @@ import org.apache.camel.AsyncProcessor;
 import org.apache.camel.Component;
 import org.apache.camel.Consumer;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.MultipleConsumersSupport;
 import org.apache.camel.PollingConsumer;
 import org.apache.camel.Processor;
@@ -235,7 +236,7 @@ public class SedaEndpoint extends DefaultEndpoint implements AsyncEndpoint, Brow
             }
             // create multicast processor
             multicastStarted = false;
-            consumerMulticastProcessor = getCamelContext().createMulticast(processors, multicastExecutor, false);
+            consumerMulticastProcessor = getCamelContext().adapt(ExtendedCamelContext.class).createMulticast(processors, multicastExecutor, false);
         }
     }
 
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 8ec9f2a..4ef98a2 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
@@ -28,6 +28,7 @@ import java.util.function.Predicate;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ConsumerTemplate;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.FluentProducerTemplate;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.TypeConverters;
@@ -216,7 +217,7 @@ public class CamelAutoConfiguration {
             camelContext.getManagementStrategy().getManagementAgent().setCreateConnector(config.isJmxCreateConnector());
         }
 
-        camelContext.setPackageScanClassResolver(new FatJarPackageScanClassResolver());
+        camelContext.adapt(ExtendedCamelContext.class).setPackageScanClassResolver(new FatJarPackageScanClassResolver());
 
         // tracing
         camelContext.setTracing(config.isTracing());
@@ -351,13 +352,13 @@ public class CamelAutoConfiguration {
         final ManagementStrategy managementStrategy = camelContext.getManagementStrategy();
 
         registerPropertyForBeanType(applicationContext, BacklogTracer.class, bt -> camelContext.setExtension(BacklogTracer.class, bt));
-        registerPropertyForBeanType(applicationContext, HandleFault.class, camelContext::addInterceptStrategy);
+        registerPropertyForBeanType(applicationContext, HandleFault.class, camelContext.adapt(ExtendedCamelContext.class)::addInterceptStrategy);
         registerPropertyForBeanType(applicationContext, InflightRepository.class, camelContext::setInflightRepository);
-        registerPropertyForBeanType(applicationContext, AsyncProcessorAwaitManager.class, camelContext::setAsyncProcessorAwaitManager);
+        registerPropertyForBeanType(applicationContext, AsyncProcessorAwaitManager.class, camelContext.adapt(ExtendedCamelContext.class)::setAsyncProcessorAwaitManager);
         registerPropertyForBeanType(applicationContext, ManagementStrategy.class, camelContext::setManagementStrategy);
         registerPropertyForBeanType(applicationContext, ManagementObjectNameStrategy.class, managementStrategy::setManagementObjectNameStrategy);
         registerPropertyForBeanType(applicationContext, EventFactory.class, managementStrategy::setEventFactory);
-        registerPropertyForBeanType(applicationContext, UnitOfWorkFactory.class, camelContext::setUnitOfWorkFactory);
+        registerPropertyForBeanType(applicationContext, UnitOfWorkFactory.class, camelContext.adapt(ExtendedCamelContext.class)::setUnitOfWorkFactory);
         registerPropertyForBeanType(applicationContext, RuntimeEndpointRegistry.class, camelContext::setRuntimeEndpointRegistry);
 
         registerPropertiesForBeanTypes(applicationContext, TypeConverters.class, camelContext.getTypeConverterRegistry()::addTypeConverters);
@@ -365,12 +366,12 @@ public class CamelAutoConfiguration {
         final Predicate<EventNotifier> containsEventNotifier = managementStrategy.getEventNotifiers()::contains;
         registerPropertiesForBeanTypesWithCondition(applicationContext, EventNotifier.class, containsEventNotifier.negate(), managementStrategy::addEventNotifier);
 
-        registerPropertiesForBeanTypes(applicationContext, EndpointStrategy.class, camelContext::addRegisterEndpointCallback);
+        registerPropertiesForBeanTypes(applicationContext, EndpointStrategy.class, camelContext.adapt(ExtendedCamelContext.class)::registerEndpointCallback);
 
         registerPropertyForBeanType(applicationContext, ShutdownStrategy.class, camelContext::setShutdownStrategy);
         
-        final Predicate<InterceptStrategy> containsInterceptStrategy = camelContext.getInterceptStrategies()::contains;
-        registerPropertiesForBeanTypesWithCondition(applicationContext, InterceptStrategy.class, containsInterceptStrategy.negate(), camelContext::addInterceptStrategy);
+        final Predicate<InterceptStrategy> containsInterceptStrategy = camelContext.adapt(ExtendedCamelContext.class).getInterceptStrategies()::contains;
+        registerPropertiesForBeanTypesWithCondition(applicationContext, InterceptStrategy.class, containsInterceptStrategy.negate(), camelContext.adapt(ExtendedCamelContext.class)::addInterceptStrategy);
 
         final Predicate<LifecycleStrategy> containsLifecycleStrategy = camelContext.getLifecycleStrategies()::contains;
         registerPropertiesForBeanTypesWithCondition(applicationContext, LifecycleStrategy.class, containsLifecycleStrategy.negate(), camelContext::addLifecycleStrategy);
@@ -416,8 +417,8 @@ public class CamelAutoConfiguration {
         registerPropertyForBeanType(applicationContext, RouteController.class, camelContext::setRouteController);
         registerPropertyForBeanType(applicationContext, UuidGenerator.class, camelContext::setUuidGenerator);
 
-        final Predicate<LogListener> containsLogListener = camelContext.getLogListeners()::contains;
-        registerPropertiesForBeanTypesWithCondition(applicationContext, LogListener.class, containsLogListener.negate(), camelContext::addLogListener);
+        final Predicate<LogListener> containsLogListener = camelContext.adapt(ExtendedCamelContext.class).getLogListeners()::contains;
+        registerPropertiesForBeanTypesWithCondition(applicationContext, LogListener.class, containsLogListener.negate(), camelContext.adapt(ExtendedCamelContext.class)::addLogListener);
 
         registerPropertyForBeanType(applicationContext, ExecutorServiceManager.class, camelContext::setExecutorServiceManager);
 
diff --git a/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/LogListenerDiscoveryTest.java b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/LogListenerDiscoveryTest.java
index 3cda2f9..6040e8f 100644
--- a/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/LogListenerDiscoveryTest.java
+++ b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/LogListenerDiscoveryTest.java
@@ -18,6 +18,7 @@ package org.apache.camel.spring.boot;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.spi.CamelLogger;
 import org.apache.camel.spi.LogListener;
 import org.junit.Test;
@@ -46,7 +47,7 @@ public class LogListenerDiscoveryTest {
 
     @Test
     public void testUuidDiscovery() {
-        assertThat(camelContext.getLogListeners()).contains(logListener);
+        assertThat(camelContext.adapt(ExtendedCamelContext.class).getLogListeners()).contains(logListener);
     }
 
     @Component
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/config/DefaultPackageResolverConfigureTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/config/DefaultPackageResolverConfigureTest.java
index 774815c..2757650 100644
--- a/components/camel-spring/src/test/java/org/apache/camel/spring/config/DefaultPackageResolverConfigureTest.java
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/config/DefaultPackageResolverConfigureTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.spring.config;
 
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.impl.engine.DefaultPackageScanClassResolver;
 import org.apache.camel.spring.SpringTestSupport;
 import org.junit.Test;
@@ -30,7 +31,7 @@ public class DefaultPackageResolverConfigureTest extends SpringTestSupport {
 
     @Test
     public void testSetAcceptableSchema() throws Exception {
-        DefaultPackageScanClassResolver resolver = (DefaultPackageScanClassResolver)context.getPackageScanClassResolver();
+        DefaultPackageScanClassResolver resolver = (DefaultPackageScanClassResolver)context.adapt(ExtendedCamelContext.class).getPackageScanClassResolver();
         assertNotNull(resolver);
         // just check the accept schema
         assertTrue("We should accept the test:!", resolver.isAcceptableScheme("test://test"));
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 ca57e89..d28eb14 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.ExtendedCamelContext;
 import org.apache.camel.api.management.JmxSystemPropertyKeys;
 import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.api.management.mbean.ManagedCamelContextMBean;
@@ -54,7 +55,6 @@ public final class CamelAnnotationsHandler {
     /**
      * Handles @ExcludeRoutes to make it easier to exclude other routes when testing with Spring Boot.
      *
-     * @param context the initialized Spring context
      * @param testClass the test class being executed
      */
     public static void handleExcludeRoutesForSpringBoot(Class<?> testClass) {
@@ -247,7 +247,7 @@ public final class CamelAnnotationsHandler {
                 public void execute(String contextName, SpringCamelContext camelContext)
                         throws Exception {
                     LOGGER.info("Enabling auto mocking of endpoints matching pattern [{}] on CamelContext with name [{}].", mockEndpoints, contextName);
-                    camelContext.addRegisterEndpointCallback(new InterceptSendToMockEndpointStrategy(mockEndpoints));
+                    camelContext.adapt(ExtendedCamelContext.class).registerEndpointCallback(new InterceptSendToMockEndpointStrategy(mockEndpoints));
                 }
             });
         }
@@ -270,7 +270,7 @@ public final class CamelAnnotationsHandler {
                     // resolve the property place holders of the mockEndpoints
                     String mockEndpointsValue = camelContext.resolvePropertyPlaceholders(mockEndpoints);
                     LOGGER.info("Enabling auto mocking and skipping of endpoints matching pattern [{}] on CamelContext with name [{}].", mockEndpointsValue, contextName);
-                    camelContext.addRegisterEndpointCallback(new InterceptSendToMockEndpointStrategy(mockEndpointsValue, true));
+                    camelContext.adapt(ExtendedCamelContext.class).registerEndpointCallback(new InterceptSendToMockEndpointStrategy(mockEndpointsValue, true));
                 }
             });
         }
diff --git a/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/CamelSpringTestContextLoader.java b/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/CamelSpringTestContextLoader.java
index 3548068..df4d626 100644
--- a/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/CamelSpringTestContextLoader.java
+++ b/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/CamelSpringTestContextLoader.java
@@ -27,6 +27,7 @@ import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.api.management.JmxSystemPropertyKeys;
 import org.apache.camel.impl.engine.InterceptSendToMockEndpointStrategy;
 import org.apache.camel.processor.interceptor.DefaultDebugger;
@@ -407,7 +408,7 @@ public class CamelSpringTestContextLoader extends AbstractContextLoader {
                 public void execute(String contextName, SpringCamelContext camelContext)
                     throws Exception {
                     LOG.info("Enabling auto mocking of endpoints matching pattern [{}] on CamelContext with name [{}].", mockEndpoints, contextName);
-                    camelContext.addRegisterEndpointCallback(new InterceptSendToMockEndpointStrategy(mockEndpoints));
+                    camelContext.adapt(ExtendedCamelContext.class).registerEndpointCallback(new InterceptSendToMockEndpointStrategy(mockEndpoints));
                 }
             });
         }
@@ -431,7 +432,7 @@ public class CamelSpringTestContextLoader extends AbstractContextLoader {
                     // resovle the property place holders of the mockEndpoints 
                     String mockEndpointsValue = camelContext.resolvePropertyPlaceholders(mockEndpoints);
                     LOG.info("Enabling auto mocking and skipping of endpoints matching pattern [{}] on CamelContext with name [{}].", mockEndpointsValue, contextName);
-                    camelContext.addRegisterEndpointCallback(new InterceptSendToMockEndpointStrategy(mockEndpointsValue, true));
+                    camelContext.adapt(ExtendedCamelContext.class).registerEndpointCallback(new InterceptSendToMockEndpointStrategy(mockEndpointsValue, true));
                 }
             });
         }
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 4f67f3e..d74f0ab 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
@@ -50,6 +50,7 @@ import org.apache.camel.ConsumerTemplate;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.FluentProducerTemplate;
 import org.apache.camel.Message;
 import org.apache.camel.NamedNode;
@@ -364,11 +365,11 @@ public abstract class CamelTestSupport extends TestSupport {
         // enable auto mocking if enabled
         String pattern = isMockEndpoints();
         if (pattern != null) {
-            context.addRegisterEndpointCallback(new InterceptSendToMockEndpointStrategy(pattern));
+            context.adapt(ExtendedCamelContext.class).registerEndpointCallback(new InterceptSendToMockEndpointStrategy(pattern));
         }
         pattern = isMockEndpointsAndSkip();
         if (pattern != null) {
-            context.addRegisterEndpointCallback(new InterceptSendToMockEndpointStrategy(pattern, true));
+            context.adapt(ExtendedCamelContext.class).registerEndpointCallback(new InterceptSendToMockEndpointStrategy(pattern, true));
         }
 
         // configure properties component (mandatory for testing)
diff --git a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
index 5712d40..32695cf 100644
--- a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
+++ b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
@@ -20,41 +20,22 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.ScheduledExecutorService;
-
-import org.apache.camel.spi.AnnotationBasedProcessorFactory;
-import org.apache.camel.spi.AsyncProcessorAwaitManager;
-import org.apache.camel.spi.BeanProcessorFactory;
-import org.apache.camel.spi.BeanProxyFactory;
-import org.apache.camel.spi.CamelBeanPostProcessor;
+
 import org.apache.camel.spi.CamelContextNameStrategy;
 import org.apache.camel.spi.ClassResolver;
 import org.apache.camel.spi.DataFormat;
-import org.apache.camel.spi.DataFormatResolver;
 import org.apache.camel.spi.DataType;
 import org.apache.camel.spi.Debugger;
-import org.apache.camel.spi.DeferServiceFactory;
 import org.apache.camel.spi.EndpointRegistry;
-import org.apache.camel.spi.EndpointStrategy;
 import org.apache.camel.spi.ExecutorServiceManager;
-import org.apache.camel.spi.FactoryFinder;
-import org.apache.camel.spi.FactoryFinderResolver;
 import org.apache.camel.spi.HeadersMapFactory;
 import org.apache.camel.spi.InflightRepository;
 import org.apache.camel.spi.Injector;
-import org.apache.camel.spi.InterceptStrategy;
 import org.apache.camel.spi.Language;
 import org.apache.camel.spi.LifecycleStrategy;
-import org.apache.camel.spi.LogListener;
-import org.apache.camel.spi.ManagementMBeanAssembler;
 import org.apache.camel.spi.ManagementNameStrategy;
 import org.apache.camel.spi.ManagementStrategy;
 import org.apache.camel.spi.MessageHistoryFactory;
-import org.apache.camel.spi.ModelJAXBContextFactory;
-import org.apache.camel.spi.NodeIdFactory;
-import org.apache.camel.spi.PackageScanClassResolver;
-import org.apache.camel.spi.ProcessorFactory;
 import org.apache.camel.spi.PropertiesComponent;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.spi.ReloadStrategy;
@@ -62,14 +43,12 @@ import org.apache.camel.spi.RestConfiguration;
 import org.apache.camel.spi.RestRegistry;
 import org.apache.camel.spi.RouteController;
 import org.apache.camel.spi.RoutePolicyFactory;
-import org.apache.camel.spi.RouteStartupOrder;
 import org.apache.camel.spi.RuntimeEndpointRegistry;
 import org.apache.camel.spi.ShutdownStrategy;
 import org.apache.camel.spi.StreamCachingStrategy;
 import org.apache.camel.spi.Transformer;
 import org.apache.camel.spi.TransformerRegistry;
 import org.apache.camel.spi.TypeConverterRegistry;
-import org.apache.camel.spi.UnitOfWorkFactory;
 import org.apache.camel.spi.UuidGenerator;
 import org.apache.camel.spi.Validator;
 import org.apache.camel.spi.ValidatorRegistry;
@@ -97,6 +76,8 @@ import org.apache.camel.support.jsse.SSLContextParameters;
  * <p/>
  * End users are advised to use suspend/resume. Using stop is for shutting down Camel and it's not guaranteed that
  * when it's being started again using the start method that Camel will operate consistently.
+ * <p/>
+ * For more advanced APIs with {@link CamelContext} see {@link ExtendedCamelContext}, which you can obtain via the adapt method.
  */
 public interface CamelContext extends StatefulService, RuntimeConfiguration {
 
@@ -477,10 +458,10 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
     Endpoint hasEndpoint(String uri);
 
     /**
-     * Adds the endpoint to the {@link org.apache.camel.spi.EndpointRegistry} using the given URI.
+     * Adds and starts the endpoint to the {@link org.apache.camel.spi.EndpointRegistry} using the given URI.
      *
      * @param uri      the URI to be used to resolve this endpoint
-     * @param endpoint the endpoint to be added to the registry
+     * @param endpoint the endpoint to be started and added to the registry
      * @return the old endpoint that was previously registered or <tt>null</tt> if none was registered
      * @throws Exception if the new endpoint could not be started or the old endpoint could not be stopped
      */
@@ -508,16 +489,6 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
      */
     Collection<Endpoint> removeEndpoints(String pattern) throws Exception;
 
-    /**
-     * Registers a {@link org.apache.camel.spi.EndpointStrategy callback} to allow you to do custom
-     * logic when an {@link Endpoint} is about to be registered to the {@link org.apache.camel.spi.EndpointRegistry}.
-     * <p/>
-     * When a callback is added it will be executed on the already registered endpoints allowing you to catch-up
-     *
-     * @param strategy callback to be invoked
-     */
-    void addRegisterEndpointCallback(EndpointStrategy strategy);
-
     // Route Management Methods
     //-----------------------------------------------------------------------
 
@@ -572,16 +543,6 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
     Collection<RestConfiguration> getRestConfigurations();
 
     /**
-     * Returns the order in which the route inputs was started.
-     * <p/>
-     * The order may not be according to the startupOrder defined on the route.
-     * For example a route could be started manually later, or new routes added at runtime.
-     *
-     * @return a list in the order how routes was started
-     */
-    List<RouteStartupOrder> getRouteStartupOrder();
-
-    /**
      * Returns the current routes in this CamelContext
      *
      * @return the current routes
@@ -654,29 +615,6 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
      */
     boolean removeRoute(String routeId) throws Exception;
 
-    /**
-     * Method to signal to {@link CamelContext} that the process to initialize setup routes is in progress.
-     *
-     * @param done <tt>false</tt> to start the process, call again with <tt>true</tt> to signal its done.
-     * @see #isSetupRoutes()
-     */
-    void setupRoutes(boolean done);
-
-    /**
-     * Indicates whether current thread is setting up route(s) as part of starting Camel from spring/blueprint.
-     * <p/>
-     * This can be useful to know by {@link LifecycleStrategy} or the likes, in case
-     * they need to react differently.
-     * <p/>
-     * As the startup procedure of {@link CamelContext} is slightly different when using plain Java versus
-     * Spring or Blueprint, then we need to know when Spring/Blueprint is setting up the routes, which
-     * can happen after the {@link CamelContext} itself is in started state, due the asynchronous event nature
-     * of especially Blueprint.
-     *
-     * @return <tt>true</tt> if current thread is setting up route(s), or <tt>false</tt> if not.
-     */
-    boolean isSetupRoutes();
-
     // Properties
     //-----------------------------------------------------------------------
 
@@ -725,20 +663,6 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
     Injector getInjector();
 
     /**
-     * Returns the bean post processor used to do any bean customization.
-     *
-     * @return the bean post processor.
-     */
-    CamelBeanPostProcessor getBeanPostProcessor();
-
-    /**
-     * Returns the management mbean assembler
-     *
-     * @return the mbean assembler
-     */
-    ManagementMBeanAssembler getManagementMBeanAssembler();
-
-    /**
      * Returns the lifecycle strategies used to handle lifecycle notifications
      *
      * @return the lifecycle strategies
@@ -912,50 +836,6 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
     ConsumerTemplate createConsumerTemplate(int maximumCacheSize);
 
     /**
-     * Creates a new multicast processor which sends an exchange to all the processors.
-     *
-     * @param processors the list of processors to send to
-     * @param executor the executor to use
-     * @return a multicasting processor
-     */
-    AsyncProcessor createMulticast(Collection<Processor> processors,
-                                   ExecutorService executor, boolean shutdownExecutorService);
-
-    /**
-     * Adds the given interceptor strategy
-     *
-     * @param interceptStrategy the strategy
-     */
-    void addInterceptStrategy(InterceptStrategy interceptStrategy);
-
-    /**
-     * Gets the interceptor strategies
-     *
-     * @return the list of current interceptor strategies
-     */
-    List<InterceptStrategy> getInterceptStrategies();
-
-    /**
-     * Gets the default error handler builder which is inherited by the routes
-     *
-     * @return the builder
-     */
-    ErrorHandlerFactory getErrorHandlerFactory();
-
-    /**
-     * Sets the default error handler builder which is inherited by the routes
-     *
-     * @param errorHandlerFactory the builder
-     */
-    void setErrorHandlerFactory(ErrorHandlerFactory errorHandlerFactory);
-
-    /**
-     * Gets the default shared thread pool for error handlers which
-     * leverages this for asynchronous redelivery tasks.
-     */
-    ScheduledExecutorService getErrorHandlerExecutorService();
-
-    /**
      * Resolve a data format given its name
      *
      * @param name the data format name or a reference to it in the {@link Registry}
@@ -972,20 +852,6 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
     DataFormat createDataFormat(String name);
 
     /**
-     * Gets the current data format resolver
-     *
-     * @return the resolver
-     */
-    DataFormatResolver getDataFormatResolver();
-
-    /**
-     * Sets a custom data format resolver
-     *
-     * @param dataFormatResolver the resolver
-     */
-    void setDataFormatResolver(DataFormatResolver dataFormatResolver);
-
-    /**
      * Resolve a transformer given a scheme
      *
      * @param model data model name.
@@ -1059,29 +925,6 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
     String getGlobalOption(String key);
 
     /**
-     * Gets the default FactoryFinder which will be used for the loading the factory class from META-INF
-     *
-     * @return the default factory finder
-     */
-    FactoryFinder getDefaultFactoryFinder();
-
-    /**
-     * Sets the factory finder resolver to use.
-     *
-     * @param resolver the factory finder resolver
-     */
-    void setFactoryFinderResolver(FactoryFinderResolver resolver);
-
-    /**
-     * Gets the FactoryFinder which will be used for the loading the factory class from META-INF in the given path
-     *
-     * @param path the META-INF path
-     * @return the factory finder
-     * @throws NoFactoryAvailableException is thrown if a factory could not be found
-     */
-    FactoryFinder getFactoryFinder(String path) throws NoFactoryAvailableException;
-
-    /**
      * Returns the class resolver to be used for loading/lookup of classes.
      *
      * @return the resolver
@@ -1096,34 +939,6 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
     void setClassResolver(ClassResolver resolver);
 
     /**
-     * Returns the package scanning class resolver
-     *
-     * @return the resolver
-     */
-    PackageScanClassResolver getPackageScanClassResolver();
-
-    /**
-     * Sets the package scanning class resolver to use
-     *
-     * @param resolver the resolver
-     */
-    void setPackageScanClassResolver(PackageScanClassResolver resolver);
-
-    /**
-     * Uses a custom node id factory when generating auto assigned ids to the nodes in the route definitions
-     *
-     * @param factory custom factory to use
-     */
-    void setNodeIdFactory(NodeIdFactory factory);
-
-    /**
-     * Gets the node id factory
-     *
-     * @return the node id factory
-     */
-    NodeIdFactory getNodeIdFactory();
-
-    /**
      * Gets the management strategy
      *
      * @return the management strategy
@@ -1147,13 +962,6 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
     void disableJMX() throws IllegalStateException;
 
     /**
-     * Setup management according to whether JMX is enabled or disabled.
-     *
-     * @param options optional parameters to configure {@link org.apache.camel.spi.ManagementAgent}.
-     */
-    void setupManagement(Map<String, Object> options);
-
-    /**
      * Gets the inflight repository
      *
      * @return the repository
@@ -1168,20 +976,6 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
     void setInflightRepository(InflightRepository repository);
 
     /**
-     * Gets the {@link org.apache.camel.AsyncProcessor} await manager.
-     *
-     * @return the manager
-     */
-    AsyncProcessorAwaitManager getAsyncProcessorAwaitManager();
-
-    /**
-     * Sets a custom  {@link org.apache.camel.AsyncProcessor} await manager.
-     *
-     * @param manager the manager
-     */
-    void setAsyncProcessorAwaitManager(AsyncProcessorAwaitManager manager);
-
-    /**
      * Gets the application CamelContext class loader which may be helpful for running camel in other containers
      *
      * @return the application CamelContext class loader
@@ -1224,20 +1018,6 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
     void setExecutorServiceManager(ExecutorServiceManager executorServiceManager);
 
     /**
-     * Gets the current {@link org.apache.camel.spi.ProcessorFactory}
-     *
-     * @return the factory, can be <tt>null</tt> if no custom factory has been set
-     */
-    ProcessorFactory getProcessorFactory();
-
-    /**
-     * Sets a custom {@link org.apache.camel.spi.ProcessorFactory}
-     *
-     * @param processorFactory the custom factory
-     */
-    void setProcessorFactory(ProcessorFactory processorFactory);
-
-    /**
      * Gets the current {@link org.apache.camel.spi.MessageHistoryFactory}
      *
      * @return the factory
@@ -1382,16 +1162,6 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
     void setStreamCachingStrategy(StreamCachingStrategy streamCachingStrategy);
 
     /**
-     * Gets the {@link UnitOfWorkFactory} to use.
-     */
-    UnitOfWorkFactory getUnitOfWorkFactory();
-
-    /**
-     * Sets a custom {@link UnitOfWorkFactory} to use.
-     */
-    void setUnitOfWorkFactory(UnitOfWorkFactory unitOfWorkFactory);
-
-    /**
      * Gets the {@link org.apache.camel.spi.RuntimeEndpointRegistry} to use, or <tt>null</tt> if none is in use.
      */
     RuntimeEndpointRegistry getRuntimeEndpointRegistry();
@@ -1426,20 +1196,6 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
     List<RoutePolicyFactory> getRoutePolicyFactories();
 
     /**
-     * Returns the JAXB Context factory used to create Models.
-     *
-     * @return the JAXB Context factory used to create Models.
-     */
-    ModelJAXBContextFactory getModelJAXBContextFactory();
-
-    /**
-     * Sets a custom JAXB Context factory to be used
-     *
-     * @param modelJAXBContextFactory a JAXB Context factory
-     */
-    void setModelJAXBContextFactory(ModelJAXBContextFactory modelJAXBContextFactory);
-
-    /**
      * Returns the {@link ReloadStrategy} if in use.
      *
      * @return the strategy, or <tt>null</tt> if none has been configured.
@@ -1452,16 +1208,6 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
     void setReloadStrategy(ReloadStrategy reloadStrategy);
 
     /**
-     * Gets a list of {@link LogListener}.
-     */
-    Set<LogListener> getLogListeners();
-
-    /**
-     * Adds a {@link LogListener}.
-     */
-    void addLogListener(LogListener listener);
-
-    /**
      * Sets the global SSL context parameters.
      */
     void setSSLContextParameters(SSLContextParameters sslContextParameters);
@@ -1481,24 +1227,4 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
      */
     void setHeadersMapFactory(HeadersMapFactory factory);
 
-    /**
-     * Gets the {@link DeferServiceFactory} to use.
-     */
-    DeferServiceFactory getDeferServiceFactory();
-
-    /**
-     * Gets the {@link AnnotationBasedProcessorFactory} to use.
-     */
-    AnnotationBasedProcessorFactory getAnnotationBasedProcessorFactory();
-
-    /**
-     * Gets the {@link BeanProxyFactory} to use.
-     */
-    BeanProxyFactory getBeanProxyFactory();
-
-    /**
-     * Gets the {@link BeanProcessorFactory} to use.
-     */
-    BeanProcessorFactory getBeanProcessorFactory();
-
 }
diff --git a/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java b/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
new file mode 100644
index 0000000..d8cc8e9
--- /dev/null
+++ b/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
@@ -0,0 +1,308 @@
+/*
+ * 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;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
+
+import org.apache.camel.spi.AnnotationBasedProcessorFactory;
+import org.apache.camel.spi.AsyncProcessorAwaitManager;
+import org.apache.camel.spi.BeanProcessorFactory;
+import org.apache.camel.spi.BeanProxyFactory;
+import org.apache.camel.spi.CamelBeanPostProcessor;
+import org.apache.camel.spi.DataFormatResolver;
+import org.apache.camel.spi.DeferServiceFactory;
+import org.apache.camel.spi.EndpointStrategy;
+import org.apache.camel.spi.FactoryFinder;
+import org.apache.camel.spi.FactoryFinderResolver;
+import org.apache.camel.spi.InterceptStrategy;
+import org.apache.camel.spi.LifecycleStrategy;
+import org.apache.camel.spi.LogListener;
+import org.apache.camel.spi.ManagementMBeanAssembler;
+import org.apache.camel.spi.ModelJAXBContextFactory;
+import org.apache.camel.spi.NodeIdFactory;
+import org.apache.camel.spi.PackageScanClassResolver;
+import org.apache.camel.spi.ProcessorFactory;
+import org.apache.camel.spi.RouteStartupOrder;
+import org.apache.camel.spi.UnitOfWorkFactory;
+
+/**
+ * Extended {@link CamelContext} which contains the methods and APIs that are not primary intended for Camel end users
+ * but for SPI, custom components, or more advanced used-cases with Camel.
+ */
+public interface ExtendedCamelContext extends CamelContext {
+
+    /**
+     * Method to signal to {@link CamelContext} that the process to initialize setup routes is in progress.
+     *
+     * @param done <tt>false</tt> to start the process, call again with <tt>true</tt> to signal its done.
+     * @see #isSetupRoutes()
+     */
+    void setupRoutes(boolean done);
+
+    /**
+     * Indicates whether current thread is setting up route(s) as part of starting Camel from spring/blueprint.
+     * <p/>
+     * This can be useful to know by {@link LifecycleStrategy} or the likes, in case
+     * they need to react differently.
+     * <p/>
+     * As the startup procedure of {@link CamelContext} is slightly different when using plain Java versus
+     * Spring or Blueprint, then we need to know when Spring/Blueprint is setting up the routes, which
+     * can happen after the {@link CamelContext} itself is in started state, due the asynchronous event nature
+     * of especially Blueprint.
+     *
+     * @return <tt>true</tt> if current thread is setting up route(s), or <tt>false</tt> if not.
+     */
+    boolean isSetupRoutes();
+
+    /**
+     * Registers a {@link org.apache.camel.spi.EndpointStrategy callback} to allow you to do custom
+     * logic when an {@link Endpoint} is about to be registered to the {@link org.apache.camel.spi.EndpointRegistry}.
+     * <p/>
+     * When a callback is registered it will be executed on the already registered endpoints allowing you to catch-up
+     *
+     * @param strategy callback to be invoked
+     */
+    void registerEndpointCallback(EndpointStrategy strategy);
+
+    /**
+     * Returns the order in which the route inputs was started.
+     * <p/>
+     * The order may not be according to the startupOrder defined on the route.
+     * For example a route could be started manually later, or new routes added at runtime.
+     *
+     * @return a list in the order how routes was started
+     */
+    List<RouteStartupOrder> getRouteStartupOrder();
+
+    /**
+     * Returns the bean post processor used to do any bean customization.
+     *
+     * @return the bean post processor.
+     */
+    CamelBeanPostProcessor getBeanPostProcessor();
+
+    /**
+     * Returns the management mbean assembler
+     *
+     * @return the mbean assembler
+     */
+    ManagementMBeanAssembler getManagementMBeanAssembler();
+
+    /**
+     * Creates a new multicast processor which sends an exchange to all the processors.
+     *
+     * @param processors the list of processors to send to
+     * @param executor the executor to use
+     * @return a multicasting processor
+     */
+    AsyncProcessor createMulticast(Collection<Processor> processors,
+                                   ExecutorService executor, boolean shutdownExecutorService);
+
+    /**
+     * Gets the default error handler builder which is inherited by the routes
+     *
+     * @return the builder
+     */
+    ErrorHandlerFactory getErrorHandlerFactory();
+
+    /**
+     * Sets the default error handler builder which is inherited by the routes
+     *
+     * @param errorHandlerFactory the builder
+     */
+    void setErrorHandlerFactory(ErrorHandlerFactory errorHandlerFactory);
+
+    /**
+     * Uses a custom node id factory when generating auto assigned ids to the nodes in the route definitions
+     *
+     * @param factory custom factory to use
+     */
+    void setNodeIdFactory(NodeIdFactory factory);
+
+    /**
+     * Gets the node id factory
+     *
+     * @return the node id factory
+     */
+    NodeIdFactory getNodeIdFactory();
+
+    /**
+     * Gets the current data format resolver
+     *
+     * @return the resolver
+     */
+    DataFormatResolver getDataFormatResolver();
+
+    /**
+     * Sets a custom data format resolver
+     *
+     * @param dataFormatResolver the resolver
+     */
+    void setDataFormatResolver(DataFormatResolver dataFormatResolver);
+
+    /**
+     * Returns the package scanning class resolver
+     *
+     * @return the resolver
+     */
+    PackageScanClassResolver getPackageScanClassResolver();
+
+    /**
+     * Sets the package scanning class resolver to use
+     *
+     * @param resolver the resolver
+     */
+    void setPackageScanClassResolver(PackageScanClassResolver resolver);
+
+    /**
+     * Gets the default FactoryFinder which will be used for the loading the factory class from META-INF
+     *
+     * @return the default factory finder
+     */
+    FactoryFinder getDefaultFactoryFinder();
+
+    /**
+     * Gets the FactoryFinder which will be used for the loading the factory class from META-INF in the given path
+     *
+     * @param path the META-INF path
+     * @return the factory finder
+     * @throws NoFactoryAvailableException is thrown if a factory could not be found
+     */
+    FactoryFinder getFactoryFinder(String path) throws NoFactoryAvailableException;
+
+    /**
+     * Sets the factory finder resolver to use.
+     *
+     * @param resolver the factory finder resolver
+     */
+    void setFactoryFinderResolver(FactoryFinderResolver resolver);
+
+    /**
+     * Gets the current {@link org.apache.camel.spi.ProcessorFactory}
+     *
+     * @return the factory, can be <tt>null</tt> if no custom factory has been set
+     */
+    ProcessorFactory getProcessorFactory();
+
+    /**
+     * Sets a custom {@link org.apache.camel.spi.ProcessorFactory}
+     *
+     * @param processorFactory the custom factory
+     */
+    void setProcessorFactory(ProcessorFactory processorFactory);
+
+    /**
+     * Returns the JAXB Context factory used to create Models.
+     *
+     * @return the JAXB Context factory used to create Models.
+     */
+    ModelJAXBContextFactory getModelJAXBContextFactory();
+
+    /**
+     * Sets a custom JAXB Context factory to be used
+     *
+     * @param modelJAXBContextFactory a JAXB Context factory
+     */
+    void setModelJAXBContextFactory(ModelJAXBContextFactory modelJAXBContextFactory);
+
+    /**
+     * Gets the {@link DeferServiceFactory} to use.
+     */
+    DeferServiceFactory getDeferServiceFactory();
+
+    /**
+     * Gets the {@link UnitOfWorkFactory} to use.
+     */
+    UnitOfWorkFactory getUnitOfWorkFactory();
+
+    /**
+     * Sets a custom {@link UnitOfWorkFactory} to use.
+     */
+    void setUnitOfWorkFactory(UnitOfWorkFactory unitOfWorkFactory);
+
+    /**
+     * Gets the {@link AnnotationBasedProcessorFactory} to use.
+     */
+    AnnotationBasedProcessorFactory getAnnotationBasedProcessorFactory();
+
+    /**
+     * Gets the {@link BeanProxyFactory} to use.
+     */
+    BeanProxyFactory getBeanProxyFactory();
+
+    /**
+     * Gets the {@link BeanProcessorFactory} to use.
+     */
+    BeanProcessorFactory getBeanProcessorFactory();
+
+    /**
+     * Gets the default shared thread pool for error handlers which
+     * leverages this for asynchronous redelivery tasks.
+     */
+    ScheduledExecutorService getErrorHandlerExecutorService();
+
+    /**
+     * Adds the given interceptor strategy
+     *
+     * @param interceptStrategy the strategy
+     */
+    void addInterceptStrategy(InterceptStrategy interceptStrategy);
+
+    /**
+     * Gets the interceptor strategies
+     *
+     * @return the list of current interceptor strategies
+     */
+    List<InterceptStrategy> getInterceptStrategies();
+
+    /**
+     * Setup management according to whether JMX is enabled or disabled.
+     *
+     * @param options optional parameters to configure {@link org.apache.camel.spi.ManagementAgent}.
+     */
+    void setupManagement(Map<String, Object> options);
+
+    /**
+     * Gets a list of {@link LogListener}.
+     */
+    Set<LogListener> getLogListeners();
+
+    /**
+     * Adds a {@link LogListener}.
+     */
+    void addLogListener(LogListener listener);
+
+    /**
+     * Gets the {@link org.apache.camel.AsyncProcessor} await manager.
+     *
+     * @return the manager
+     */
+    AsyncProcessorAwaitManager getAsyncProcessorAwaitManager();
+
+    /**
+     * Sets a custom {@link org.apache.camel.AsyncProcessor} await manager.
+     *
+     * @param manager the manager
+     */
+    void setAsyncProcessorAwaitManager(AsyncProcessorAwaitManager manager);
+
+}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
index 6ff79f5..622e69c 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
@@ -37,6 +37,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.NoTypeConversionAvailableException;
@@ -653,7 +654,7 @@ public abstract class BaseTypeConverterRegistry extends ServiceSupport implement
             injector = camelContext.getInjector();
         }
         if (resolver == null && camelContext != null) {
-            resolver = camelContext.getPackageScanClassResolver();
+            resolver = camelContext.adapt(ExtendedCamelContext.class).getPackageScanClassResolver();
         }
         initTypeConverterLoaders();
 
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 83a5c28..f266eb1 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -50,6 +50,7 @@ import org.apache.camel.Consumer;
 import org.apache.camel.ConsumerTemplate;
 import org.apache.camel.Endpoint;
 import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.ExtendedStartupListener;
 import org.apache.camel.FailedToStartRouteException;
 import org.apache.camel.FluentProducerTemplate;
@@ -161,7 +162,7 @@ import static org.apache.camel.spi.UnitOfWork.MDC_CAMEL_CONTEXT_ID;
 /**
  * Represents the context used to configure routes and the policies to use.
  */
-public abstract class AbstractCamelContext extends ServiceSupport implements CamelContext, Suspendable {
+public abstract class AbstractCamelContext extends ServiceSupport implements ExtendedCamelContext, Suspendable {
 
     public enum Initialization {
         Eager, Default, Lazy
@@ -801,7 +802,7 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Cam
         }
     }
 
-    public void addRegisterEndpointCallback(EndpointStrategy strategy) {
+    public void registerEndpointCallback(EndpointStrategy strategy) {
         if (!endpointStrategies.contains(strategy)) {
             // let it be invoked for already registered endpoints so it can
             // catch-up.
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractDynamicRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractDynamicRegistry.java
index 0901e23..e3bf709 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractDynamicRegistry.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractDynamicRegistry.java
@@ -25,6 +25,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.StaticService;
 import org.apache.camel.support.LRUCache;
 import org.apache.camel.support.LRUCacheFactory;
@@ -64,7 +65,7 @@ public class AbstractDynamicRegistry<K, V> extends AbstractMap<K, V>  implements
         V answer = staticMap.get(o);
         if (answer == null) {
             answer = dynamicMap.get(o);
-            if (answer != null && (context.isSetupRoutes() || context.getRouteController().isStartingRoutes())) {
+            if (answer != null && (context.adapt(ExtendedCamelContext.class).isSetupRoutes() || context.getRouteController().isStartingRoutes())) {
                 dynamicMap.remove(o);
                 staticMap.put((K) o, answer);
             }
@@ -90,7 +91,7 @@ public class AbstractDynamicRegistry<K, V> extends AbstractMap<K, V>  implements
         }
 
         // we want transformers to be static if they are part of setting up or starting routes
-        if (context.isSetupRoutes() || context.getRouteController().isStartingRoutes()) {
+        if (context.adapt(ExtendedCamelContext.class).isSetupRoutes() || context.getRouteController().isStartingRoutes()) {
             answer = staticMap.put(key, transformer);
         } else {
             answer = dynamicMap.put(key, transformer);
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProcessorFactoryResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProcessorFactoryResolver.java
index a57f5bb..01934ff 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProcessorFactoryResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProcessorFactoryResolver.java
@@ -19,6 +19,7 @@ package org.apache.camel.impl.engine;
 import java.io.IOException;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.spi.BeanProcessorFactory;
 import org.apache.camel.spi.FactoryFinder;
 import org.slf4j.Logger;
@@ -63,7 +64,7 @@ public class BeanProcessorFactoryResolver {
 
     private Class<?> findFactory(String name, CamelContext context) throws ClassNotFoundException, IOException {
         if (factoryFinder == null) {
-            factoryFinder = context.getFactoryFinder(RESOURCE_PATH);
+            factoryFinder = context.adapt(ExtendedCamelContext.class).getFactoryFinder(RESOURCE_PATH);
         }
         return factoryFinder.findClass(name);
     }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProxyFactoryResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProxyFactoryResolver.java
index e50278f..b53e1a8 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProxyFactoryResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProxyFactoryResolver.java
@@ -19,6 +19,7 @@ package org.apache.camel.impl.engine;
 import java.io.IOException;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.spi.BeanProxyFactory;
 import org.apache.camel.spi.FactoryFinder;
 import org.slf4j.Logger;
@@ -63,7 +64,7 @@ public class BeanProxyFactoryResolver {
 
     private Class<?> findFactory(String name, CamelContext context) throws ClassNotFoundException, IOException {
         if (factoryFinder == null) {
-            factoryFinder = context.getFactoryFinder(RESOURCE_PATH);
+            factoryFinder = context.adapt(ExtendedCamelContext.class).getFactoryFinder(RESOURCE_PATH);
         }
         return factoryFinder.findClass(name);
     }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultComponentResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultComponentResolver.java
index 6c6fd90..a847bd9 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultComponentResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultComponentResolver.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Component;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.spi.ComponentResolver;
 import org.apache.camel.spi.FactoryFinder;
@@ -76,7 +77,7 @@ public class DefaultComponentResolver implements ComponentResolver {
 
     private Class<?> findComponent(String name, CamelContext context) throws ClassNotFoundException, IOException {
         if (factoryFinder == null) {
-            factoryFinder = context.getFactoryFinder(RESOURCE_PATH);
+            factoryFinder = context.adapt(ExtendedCamelContext.class).getFactoryFinder(RESOURCE_PATH);
         }
         return factoryFinder.findClass(name);
     }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultDataFormatResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultDataFormatResolver.java
index a0a207b..378d428 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultDataFormatResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultDataFormatResolver.java
@@ -17,6 +17,7 @@
 package org.apache.camel.impl.engine;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.DataFormatFactory;
@@ -69,7 +70,7 @@ public class DefaultDataFormatResolver implements DataFormatResolver {
         Class<?> type = null;
         try {
             if (dataformatFactory == null) {
-                dataformatFactory = context.getFactoryFinder(DATAFORMAT_RESOURCE_PATH);
+                dataformatFactory = context.adapt(ExtendedCamelContext.class).getFactoryFinder(DATAFORMAT_RESOURCE_PATH);
             }
             type = dataformatFactory.findClass(name);
         } catch (NoFactoryAvailableException e) {
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInjector.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInjector.java
index c85a956..76f583b 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInjector.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInjector.java
@@ -17,6 +17,7 @@
 package org.apache.camel.impl.engine;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spi.CamelBeanPostProcessor;
 import org.apache.camel.spi.Injector;
@@ -35,7 +36,7 @@ public class DefaultInjector implements Injector  {
     private final CamelBeanPostProcessor postProcessor;
 
     public DefaultInjector(CamelContext context) {
-        postProcessor = context.getBeanPostProcessor();
+        postProcessor = context.adapt(ExtendedCamelContext.class).getBeanPostProcessor();
     }
 
     @Override
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultLanguageResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultLanguageResolver.java
index c8166ce..511fac9 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultLanguageResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultLanguageResolver.java
@@ -17,6 +17,7 @@
 package org.apache.camel.impl.engine;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.NoSuchLanguageException;
 import org.apache.camel.spi.FactoryFinder;
@@ -92,14 +93,14 @@ public class DefaultLanguageResolver implements LanguageResolver {
 
     protected Class<?> findLanguage(String name, CamelContext context) throws Exception {
         if (languageFactory == null) {
-            languageFactory = context.getFactoryFinder(LANGUAGE_RESOURCE_PATH);
+            languageFactory = context.adapt(ExtendedCamelContext.class).getFactoryFinder(LANGUAGE_RESOURCE_PATH);
         }
         return languageFactory.findClass(name);
     }
 
     protected Class<?> findLanguageResolver(String name, CamelContext context) throws Exception {
         if (languageResolver == null) {
-            languageResolver = context.getFactoryFinder(LANGUAGE_RESOLVER_RESOURCE_PATH);
+            languageResolver = context.adapt(ExtendedCamelContext.class).getFactoryFinder(LANGUAGE_RESOLVER_RESOURCE_PATH);
         }
         return languageResolver.findClass(name);
     }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultNodeIdFactory.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultNodeIdFactory.java
index 45d15ca..e75b473 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultNodeIdFactory.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultNodeIdFactory.java
@@ -42,7 +42,6 @@ public class DefaultNodeIdFactory implements NodeIdFactory {
         return nodeCounters.computeIfAbsent(key, k -> new AtomicInteger(0));
     }
 
-
     /**
      * Helper method for test purposes that allows tests to start clean (made protected 
      *  to ensure that it is not called accidentally)
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProcessorFactory.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProcessorFactory.java
index 161e26c..69e93a0 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProcessorFactory.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProcessorFactory.java
@@ -21,6 +21,7 @@ import java.util.Map;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ExchangePattern;
 import org.apache.camel.Expression;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.Processor;
@@ -47,7 +48,7 @@ public class DefaultProcessorFactory implements ProcessorFactory {
     @Override
     public Processor createChildProcessor(RouteContext routeContext, NamedNode definition, boolean mandatory) throws Exception {
         String name = definition.getClass().getSimpleName();
-        FactoryFinder finder = routeContext.getCamelContext().getFactoryFinder(RESOURCE_PATH);
+        FactoryFinder finder = routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getFactoryFinder(RESOURCE_PATH);
         try {
             if (finder != null) {
                 Object object = finder.newInstance(name);
@@ -66,7 +67,7 @@ public class DefaultProcessorFactory implements ProcessorFactory {
     @Override
     public Processor createProcessor(RouteContext routeContext, NamedNode definition) throws Exception {
         String name = definition.getClass().getSimpleName();
-        FactoryFinder finder = routeContext.getCamelContext().getFactoryFinder(RESOURCE_PATH);
+        FactoryFinder finder = routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getFactoryFinder(RESOURCE_PATH);
         try {
             if (finder != null) {
                 Object object = finder.newInstance(name);
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/HeadersMapFactoryResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/HeadersMapFactoryResolver.java
index 8935a21..daa4825 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/HeadersMapFactoryResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/HeadersMapFactoryResolver.java
@@ -19,6 +19,7 @@ package org.apache.camel.impl.engine;
 import java.io.IOException;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.spi.FactoryFinder;
 import org.apache.camel.spi.HeadersMapFactory;
 import org.slf4j.Logger;
@@ -66,7 +67,7 @@ public class HeadersMapFactoryResolver {
 
     private Class<?> findFactory(String name, CamelContext context) throws ClassNotFoundException, IOException {
         if (factoryFinder == null) {
-            factoryFinder = context.getFactoryFinder(RESOURCE_PATH);
+            factoryFinder = context.adapt(ExtendedCamelContext.class).getFactoryFinder(RESOURCE_PATH);
         }
         return factoryFinder.findClass(name);
     }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/RestRegistryFactoryResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/RestRegistryFactoryResolver.java
index 5b0d9e4..ad74fcf 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/RestRegistryFactoryResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/RestRegistryFactoryResolver.java
@@ -19,6 +19,7 @@ package org.apache.camel.impl.engine;
 import java.io.IOException;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.spi.FactoryFinder;
 import org.apache.camel.spi.RestRegistryFactory;
 import org.slf4j.Logger;
@@ -65,7 +66,7 @@ public class RestRegistryFactoryResolver {
 
     private Class<?> findFactory(String name, CamelContext context) throws ClassNotFoundException, IOException {
         if (factoryFinder == null) {
-            factoryFinder = context.getFactoryFinder(RESOURCE_PATH);
+            factoryFinder = context.adapt(ExtendedCamelContext.class).getFactoryFinder(RESOURCE_PATH);
         }
         return factoryFinder.findClass(name);
     }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/SubscribeMethodProcessor.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/SubscribeMethodProcessor.java
index 683efd3..b010417 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/SubscribeMethodProcessor.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/SubscribeMethodProcessor.java
@@ -26,6 +26,7 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.AsyncProcessor;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Navigate;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
@@ -53,7 +54,8 @@ public final class SubscribeMethodProcessor extends AsyncProcessorSupport implem
     }
 
     public void addMethod(final Object pojo, final Method method, final Endpoint endpoint, String predicate) throws Exception {
-        Processor answer = endpoint.getCamelContext().getBeanProcessorFactory().createBeanProcessor(endpoint.getCamelContext(), pojo, method);
+        Processor answer = endpoint.getCamelContext().adapt(ExtendedCamelContext.class)
+                .getBeanProcessorFactory().createBeanProcessor(endpoint.getCamelContext(), pojo, method);
         // must ensure the consumer is being executed in an unit of work so synchronization callbacks etc is invoked
         CamelInternalProcessor internal = new CamelInternalProcessor(answer);
         internal.addAdvice(new CamelInternalProcessor.UnitOfWorkProcessorAdvice(null));
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java b/core/camel-base/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java
index 5f92420..519bacd 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/CamelInternalProcessor.java
@@ -25,6 +25,7 @@ import java.util.concurrent.RejectedExecutionException;
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.MessageHistory;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Ordered;
@@ -561,7 +562,7 @@ public class CamelInternalProcessor extends DelegateAsyncProcessor {
         }
 
         protected UnitOfWork createUnitOfWork(Exchange exchange) {
-            return exchange.getContext().getUnitOfWorkFactory().createUnitOfWork(exchange);
+            return exchange.getContext().adapt(ExtendedCamelContext.class).getUnitOfWorkFactory().createUnitOfWork(exchange);
         }
 
     }
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/SendDynamicAwareResolver.java b/core/camel-base/src/main/java/org/apache/camel/processor/SendDynamicAwareResolver.java
index 9025c18..5d3222a 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/SendDynamicAwareResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/SendDynamicAwareResolver.java
@@ -19,6 +19,7 @@ package org.apache.camel.processor;
 import java.io.IOException;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.spi.FactoryFinder;
 import org.apache.camel.spi.SendDynamicAware;
 import org.slf4j.Logger;
@@ -61,7 +62,7 @@ public class SendDynamicAwareResolver {
 
     private Class<?> findFactory(String name, CamelContext context) throws ClassNotFoundException, IOException {
         if (factoryFinder == null) {
-            factoryFinder = context.getFactoryFinder(RESOURCE_PATH);
+            factoryFinder = context.adapt(ExtendedCamelContext.class).getFactoryFinder(RESOURCE_PATH);
         }
         return factoryFinder.findClass(name);
     }
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/SharedCamelInternalProcessor.java b/core/camel-base/src/main/java/org/apache/camel/processor/SharedCamelInternalProcessor.java
index c918cb1..ac698d4 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/SharedCamelInternalProcessor.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/SharedCamelInternalProcessor.java
@@ -25,6 +25,7 @@ import java.util.concurrent.RejectedExecutionException;
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.AsyncProcessor;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Ordered;
 import org.apache.camel.Processor;
 import org.apache.camel.Service;
@@ -82,7 +83,7 @@ public class SharedCamelInternalProcessor {
      * Synchronous API
      */
     public void process(Exchange exchange, AsyncProcessor processor, Processor resultProcessor) {
-        final AsyncProcessorAwaitManager awaitManager = exchange.getContext().getAsyncProcessorAwaitManager();
+        final AsyncProcessorAwaitManager awaitManager = exchange.getContext().adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager();
         awaitManager.process(new AsyncProcessor() {
             @Override
             public boolean process(Exchange exchange, AsyncCallback callback) {
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/HandleFault.java b/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/HandleFault.java
index b0d1da4..5f3d3a6 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/HandleFault.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/HandleFault.java
@@ -19,6 +19,7 @@ package org.apache.camel.processor.interceptor;
 import java.util.List;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.spi.InterceptStrategy;
@@ -42,7 +43,7 @@ public final class HandleFault implements InterceptStrategy {
      * @return the stream cache or null if none can be found
      */
     public static HandleFault getHandleFault(CamelContext context) {
-        List<InterceptStrategy> list = context.getInterceptStrategies();
+        List<InterceptStrategy> list = context.adapt(ExtendedCamelContext.class).getInterceptStrategies();
         for (InterceptStrategy interceptStrategy : list) {
             if (interceptStrategy instanceof HandleFault) {
                 return (HandleFault)interceptStrategy;
diff --git a/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallProcessor.java b/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallProcessor.java
index 5603f19..6d438e3 100644
--- a/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallProcessor.java
+++ b/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallProcessor.java
@@ -25,6 +25,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
 import org.apache.camel.Expression;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
 import org.apache.camel.cloud.ServiceCallConstants;
@@ -130,7 +131,7 @@ public class DefaultServiceCallProcessor extends AsyncProcessorSupport {
         args.put("expression", expression);
         args.put("exchangePattern", exchangePattern);
 
-        Processor send = camelContext.getProcessorFactory().createProcessor(camelContext, "SendDynamicProcessor", args);
+        Processor send = camelContext.adapt(ExtendedCamelContext.class).getProcessorFactory().createProcessor(camelContext, "SendDynamicProcessor", args);
         processor = AsyncProcessorConverterHelper.convert(send);
 
         // Start services if needed
diff --git a/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/ServiceCallProcessorFactory.java b/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/ServiceCallProcessorFactory.java
index 54f422a..5016a03 100644
--- a/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/ServiceCallProcessorFactory.java
+++ b/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/ServiceCallProcessorFactory.java
@@ -23,6 +23,7 @@ import java.util.function.Supplier;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Expression;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.cloud.ServiceChooser;
 import org.apache.camel.cloud.ServiceChooserAware;
@@ -383,7 +384,7 @@ public class ServiceCallProcessorFactory extends TypedProcessorFactory<ServiceCa
 
                 try {
                     // Then use Service factory.
-                    type = camelContext.getFactoryFinder(ServiceCallDefinitionConstants.RESOURCE_PATH).findClass(lookupName);
+                    type = camelContext.adapt(ExtendedCamelContext.class).getFactoryFinder(ServiceCallDefinitionConstants.RESOURCE_PATH).findClass(lookupName);
                 } catch (Exception e) {
                 }
 
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/utils/BundleContextUtils.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/utils/BundleContextUtils.java
index 3e73507..781c98a 100644
--- a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/utils/BundleContextUtils.java
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/utils/BundleContextUtils.java
@@ -16,18 +16,8 @@
  */
 package org.apache.camel.core.osgi.utils;
 
-import java.io.IOException;
 import java.lang.reflect.Method;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.Map;
-import java.util.Properties;
-import java.util.SortedMap;
-import java.util.TreeMap;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.LoadPropertiesException;
-import org.apache.camel.support.CamelContextHelper;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 
@@ -74,20 +64,4 @@ public final class BundleContextUtils {
         return null;
     }
 
-    /**
-     * Finds the components available on the bundle context and camel context
-     */
-    public static Map<String, Properties> findComponents(BundleContext bundleContext, CamelContext camelContext)
-        throws IOException, LoadPropertiesException {
-
-        SortedMap<String, Properties> answer = new TreeMap<>();
-        Bundle[] bundles = bundleContext.getBundles();
-        for (Bundle bundle : bundles) {
-            Enumeration<URL> iter = bundle.getResources(CamelContextHelper.COMPONENT_DESCRIPTOR);
-            SortedMap<String, Properties> map = CamelContextHelper.findComponents(camelContext, iter);
-            answer.putAll(map);
-        }
-        return answer;
-    }
-
 }
diff --git a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
index 94f2de6..bde2086 100644
--- a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
+++ b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
@@ -30,6 +30,7 @@ import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelException;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.ManagementStatisticsLevel;
 import org.apache.camel.RoutesBuilder;
@@ -165,7 +166,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         PackageScanClassResolver packageResolver = getBeanForType(PackageScanClassResolver.class);
         if (packageResolver != null) {
             LOG.info("Using custom PackageScanClassResolver: {}", packageResolver);
-            getContext().setPackageScanClassResolver(packageResolver);
+            getContext().adapt(ExtendedCamelContext.class).setPackageScanClassResolver(packageResolver);
         }
 
         // also set type converter registry as early as possible
@@ -202,7 +203,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         HandleFault handleFault = getBeanForType(HandleFault.class);
         if (handleFault != null) {
             LOG.info("Using custom HandleFault: {}", handleFault);
-            getContext().addInterceptStrategy(handleFault);
+            getContext().adapt(ExtendedCamelContext.class).addInterceptStrategy(handleFault);
         }
         InflightRepository inflightRepository = getBeanForType(InflightRepository.class);
         if (inflightRepository != null) {
@@ -212,7 +213,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         AsyncProcessorAwaitManager asyncProcessorAwaitManager = getBeanForType(AsyncProcessorAwaitManager.class);
         if (asyncProcessorAwaitManager != null) {
             LOG.info("Using custom AsyncProcessorAwaitManager: {}", asyncProcessorAwaitManager);
-            getContext().setAsyncProcessorAwaitManager(asyncProcessorAwaitManager);
+            getContext().adapt(ExtendedCamelContext.class).setAsyncProcessorAwaitManager(asyncProcessorAwaitManager);
         }
         ManagementStrategy managementStrategy = getBeanForType(ManagementStrategy.class);
         if (managementStrategy != null) {
@@ -232,7 +233,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         UnitOfWorkFactory unitOfWorkFactory = getBeanForType(UnitOfWorkFactory.class);
         if (unitOfWorkFactory != null) {
             LOG.info("Using custom UnitOfWorkFactory: {}", unitOfWorkFactory);
-            getContext().setUnitOfWorkFactory(unitOfWorkFactory);
+            getContext().adapt(ExtendedCamelContext.class).setUnitOfWorkFactory(unitOfWorkFactory);
         }
         RuntimeEndpointRegistry runtimeEndpointRegistry = getBeanForType(RuntimeEndpointRegistry.class);
         if (runtimeEndpointRegistry != null) {
@@ -276,7 +277,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
             for (Entry<String, EndpointStrategy> entry : endpointStrategies.entrySet()) {
                 EndpointStrategy strategy = entry.getValue();
                 LOG.info("Using custom EndpointStrategy with id: {} and implementation: {}", entry.getKey(), strategy);
-                getContext().addRegisterEndpointCallback(strategy);
+                getContext().adapt(ExtendedCamelContext.class).registerEndpointCallback(strategy);
             }
         }
         // shutdown
@@ -291,9 +292,9 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
             for (Entry<String, InterceptStrategy> entry : interceptStrategies.entrySet()) {
                 InterceptStrategy strategy = entry.getValue();
                 // do not add if already added, for instance a tracer that is also an InterceptStrategy class
-                if (!getContext().getInterceptStrategies().contains(strategy)) {
+                if (!getContext().adapt(ExtendedCamelContext.class).getInterceptStrategies().contains(strategy)) {
                     LOG.info("Using custom InterceptStrategy with id: {} and implementation: {}", entry.getKey(), strategy);
-                    getContext().addInterceptStrategy(strategy);
+                    getContext().adapt(ExtendedCamelContext.class).addInterceptStrategy(strategy);
                 }
             }
         }
@@ -380,9 +381,9 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         if (logListeners != null && !logListeners.isEmpty()) {
             for (Map.Entry<String, LogListener> entry : logListeners.entrySet()) {
                 LogListener logListener = entry.getValue();
-                if (!getContext().getLogListeners().contains(logListener)) {
+                if (!getContext().adapt(ExtendedCamelContext.class).getLogListeners().contains(logListener)) {
                     LOG.info("Using custom LogListener with id: {} and implementation: {}", entry.getKey(), logListener);
-                    getContext().addLogListener(logListener);
+                    getContext().adapt(ExtendedCamelContext.class).addLogListener(logListener);
                 }
             }
         }
@@ -411,7 +412,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
             LOG.debug("Setting up routes");
 
             // mark that we are setting up routes
-            getContext().setupRoutes(false);
+            getContext().adapt(ExtendedCamelContext.class).setupRoutes(false);
 
             // must init route refs before we prepare the routes below
             initRouteRefs();
@@ -462,7 +463,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
             installRoutes();
 
             // and we are now finished setting up the routes
-            getContext().setupRoutes(true);
+            getContext().adapt(ExtendedCamelContext.class).setupRoutes(true);
         }
     }
 
@@ -553,7 +554,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
                 properties.put("statisticsLevel", msLevel);
             }
 
-            getContext().setupManagement(properties);
+            getContext().adapt(ExtendedCamelContext.class).setupManagement(properties);
         }
     }
 
@@ -867,7 +868,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
             context.setHandleFault(CamelContextHelper.parseBoolean(context, getHandleFault()));
         }
         if (getErrorHandlerRef() != null) {
-            context.setErrorHandlerFactory(new ErrorHandlerBuilderRef(getErrorHandlerRef()));
+            context.adapt(ExtendedCamelContext.class).setErrorHandlerFactory(new ErrorHandlerBuilderRef(getErrorHandlerRef()));
         }
         if (getAutoStartup() != null) {
             context.setAutoStartup(CamelContextHelper.parseBoolean(context, getAutoStartup()));
@@ -1113,7 +1114,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         ModelJAXBContextFactory modelJAXBContextFactory = getBeanForType(ModelJAXBContextFactory.class);
         if (modelJAXBContextFactory != null) {
             LOG.info("Using custom ModelJAXBContextFactory: {}", modelJAXBContextFactory);
-            getContext().setModelJAXBContextFactory(modelJAXBContextFactory);
+            getContext().adapt(ExtendedCamelContext.class).setModelJAXBContextFactory(modelJAXBContextFactory);
         }
         ClassResolver classResolver = getBeanForType(ClassResolver.class);
         if (classResolver != null) {
@@ -1123,7 +1124,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         FactoryFinderResolver factoryFinderResolver = getBeanForType(FactoryFinderResolver.class);
         if (factoryFinderResolver != null) {
             LOG.info("Using custom FactoryFinderResolver: {}", factoryFinderResolver);
-            getContext().setFactoryFinderResolver(factoryFinderResolver);
+            getContext().adapt(ExtendedCamelContext.class).setFactoryFinderResolver(factoryFinderResolver);
         }
         ExecutorServiceManager executorServiceStrategy = getBeanForType(ExecutorServiceManager.class);
         if (executorServiceStrategy != null) {
@@ -1138,7 +1139,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         ProcessorFactory processorFactory = getBeanForType(ProcessorFactory.class);
         if (processorFactory != null) {
             LOG.info("Using custom ProcessorFactory: {}", processorFactory);
-            getContext().setProcessorFactory(processorFactory);
+            getContext().adapt(ExtendedCamelContext.class).setProcessorFactory(processorFactory);
         }
         Debugger debugger = getBeanForType(Debugger.class);
         if (debugger != null) {
@@ -1153,7 +1154,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         NodeIdFactory nodeIdFactory = getBeanForType(NodeIdFactory.class);
         if (nodeIdFactory != null) {
             LOG.info("Using custom NodeIdFactory: {}", nodeIdFactory);
-            getContext().setNodeIdFactory(nodeIdFactory);
+            getContext().adapt(ExtendedCamelContext.class).setNodeIdFactory(nodeIdFactory);
         }
         StreamCachingStrategy streamCachingStrategy = getBeanForType(StreamCachingStrategy.class);
         if (streamCachingStrategy != null) {
diff --git a/core/camel-core/src/main/java/org/apache/camel/builder/AdviceWithRouteBuilder.java b/core/camel-core/src/main/java/org/apache/camel/builder/AdviceWithRouteBuilder.java
index 1b7fee6..c7c19b9 100644
--- a/core/camel-core/src/main/java/org/apache/camel/builder/AdviceWithRouteBuilder.java
+++ b/core/camel-core/src/main/java/org/apache/camel/builder/AdviceWithRouteBuilder.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.camel.Endpoint;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.impl.engine.InterceptSendToMockEndpointStrategy;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.RouteDefinition;
@@ -73,7 +74,7 @@ public abstract class AdviceWithRouteBuilder extends RouteBuilder {
      * @throws Exception can be thrown if error occurred
      */
     public void mockEndpoints() throws Exception {
-        getContext().addRegisterEndpointCallback(new InterceptSendToMockEndpointStrategy(null));
+        getContext().adapt(ExtendedCamelContext.class).registerEndpointCallback(new InterceptSendToMockEndpointStrategy(null));
     }
 
     /**
@@ -85,7 +86,7 @@ public abstract class AdviceWithRouteBuilder extends RouteBuilder {
      */
     public void mockEndpoints(String... pattern) throws Exception {
         for (String s : pattern) {
-            getContext().addRegisterEndpointCallback(new InterceptSendToMockEndpointStrategy(s));
+            getContext().adapt(ExtendedCamelContext.class).registerEndpointCallback(new InterceptSendToMockEndpointStrategy(s));
         }
     }
 
@@ -98,7 +99,7 @@ public abstract class AdviceWithRouteBuilder extends RouteBuilder {
      */
     public void mockEndpointsAndSkip(String... pattern) throws Exception {
         for (String s : pattern) {
-            getContext().addRegisterEndpointCallback(new InterceptSendToMockEndpointStrategy(s, true));
+            getContext().adapt(ExtendedCamelContext.class).registerEndpointCallback(new InterceptSendToMockEndpointStrategy(s, true));
         }
     }
 
diff --git a/core/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java b/core/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java
index d7aa51f..8cfcec2 100644
--- a/core/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java
+++ b/core/camel-core/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java
@@ -22,6 +22,7 @@ import java.util.Map;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.model.OnExceptionDefinition;
 import org.apache.camel.model.RouteDefinition;
@@ -157,7 +158,7 @@ public class ErrorHandlerBuilderRef extends ErrorHandlerBuilderSupport {
     }
 
     protected static ErrorHandlerFactory lookupErrorHandlerBuilder(CamelContext camelContext) {
-        ErrorHandlerFactory answer = camelContext.getErrorHandlerFactory();
+        ErrorHandlerFactory answer = camelContext.adapt(ExtendedCamelContext.class).getErrorHandlerFactory();
         if (answer instanceof ErrorHandlerBuilderRef) {
             ErrorHandlerBuilderRef other = (ErrorHandlerBuilderRef) answer;
             String otherRef = other.getRef();
diff --git a/core/camel-core/src/main/java/org/apache/camel/builder/ProxyBuilder.java b/core/camel-core/src/main/java/org/apache/camel/builder/ProxyBuilder.java
index 263135a..4c861d8 100644
--- a/core/camel-core/src/main/java/org/apache/camel/builder/ProxyBuilder.java
+++ b/core/camel-core/src/main/java/org/apache/camel/builder/ProxyBuilder.java
@@ -18,6 +18,7 @@ package org.apache.camel.builder;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.spi.BeanProxyFactory;
 import org.apache.camel.util.ObjectHelper;
 
@@ -81,7 +82,7 @@ public final class ProxyBuilder {
     public <T> T build(Class<T>... interfaceClasses) throws Exception {
         ObjectHelper.notNull(endpoint, "endpoint");
         // use proxy service
-        BeanProxyFactory factory = camelContext.getBeanProxyFactory();
+        BeanProxyFactory factory = camelContext.adapt(ExtendedCamelContext.class).getBeanProxyFactory();
         if (factory == null) {
             throw new IllegalArgumentException("Cannot find BeanProxyFactory. Make sure camel-bean is on the classpath.");
         }
diff --git a/core/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java b/core/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
index 668e2c2..fade2e4 100644
--- a/core/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
+++ b/core/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
@@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Route;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.model.FromDefinition;
@@ -427,8 +428,8 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
         if (initialized.compareAndSet(false, true)) {
             // Set the CamelContext ErrorHandler here
             CamelContext camelContext = getContext();
-            if (camelContext.getErrorHandlerFactory() instanceof ErrorHandlerBuilder) {
-                setErrorHandlerBuilder((ErrorHandlerBuilder) camelContext.getErrorHandlerFactory());
+            if (camelContext.adapt(ExtendedCamelContext.class).getErrorHandlerFactory() instanceof ErrorHandlerBuilder) {
+                setErrorHandlerBuilder((ErrorHandlerBuilder) camelContext.adapt(ExtendedCamelContext.class).getErrorHandlerFactory());
             }
             configure();
             // mark all route definitions as custom prepared because
diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/CamelPostProcessorHelper.java b/core/camel-core/src/main/java/org/apache/camel/impl/CamelPostProcessorHelper.java
index 8432d25..569b924 100644
--- a/core/camel-core/src/main/java/org/apache/camel/impl/CamelPostProcessorHelper.java
+++ b/core/camel-core/src/main/java/org/apache/camel/impl/CamelPostProcessorHelper.java
@@ -26,6 +26,7 @@ import org.apache.camel.Consumer;
 import org.apache.camel.ConsumerTemplate;
 import org.apache.camel.DelegateEndpoint;
 import org.apache.camel.Endpoint;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.FluentProducerTemplate;
 import org.apache.camel.IsSingleton;
 import org.apache.camel.MultipleConsumersSupport;
@@ -251,7 +252,7 @@ public class CamelPostProcessorHelper implements CamelContextAware {
                     // lets create a proxy
                     try {
                         // use proxy service
-                        BeanProxyFactory factory = endpoint.getCamelContext().getBeanProxyFactory();
+                        BeanProxyFactory factory = endpoint.getCamelContext().adapt(ExtendedCamelContext.class).getBeanProxyFactory();
                         if (factory == null) {
                             throw new IllegalArgumentException("Cannot find BeanProxyFactory. Make sure camel-bean is on the classpath.");
                         }
@@ -400,7 +401,7 @@ public class CamelPostProcessorHelper implements CamelContextAware {
      */
     protected Producer createInjectionProducer(Endpoint endpoint, Object bean, String beanName) {
         try {
-            return endpoint.getCamelContext().getDeferServiceFactory().createProducer(endpoint);
+            return endpoint.getCamelContext().adapt(ExtendedCamelContext.class).getDeferServiceFactory().createProducer(endpoint);
         } catch (Exception e) {
             throw RuntimeCamelException.wrapRuntimeCamelException(e);
         }
diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultExecutorServiceManager.java b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultExecutorServiceManager.java
index d0b4534..532fd68 100644
--- a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultExecutorServiceManager.java
+++ b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultExecutorServiceManager.java
@@ -30,6 +30,7 @@ import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.StaticService;
 import org.apache.camel.model.OptionalIdentifiedDefinition;
@@ -500,7 +501,7 @@ public class DefaultExecutorServiceManager extends ServiceSupport implements Exe
 
         // extract id from source
         if (source instanceof NamedNode) {
-            id = ((OptionalIdentifiedDefinition<?>) source).idOrCreate(this.camelContext.getNodeIdFactory());
+            id = ((OptionalIdentifiedDefinition<?>) source).idOrCreate(this.camelContext.adapt(ExtendedCamelContext.class).getNodeIdFactory());
             // and let source be the short name of the pattern
             sourceId = ((NamedNode) source).getShortName();
         } else if (source instanceof String) {
@@ -525,7 +526,7 @@ public class DefaultExecutorServiceManager extends ServiceSupport implements Exe
         if (source instanceof ProcessorDefinition) {
             RouteDefinition route = ProcessorDefinitionHelper.getRoute((ProcessorDefinition<?>) source);
             if (route != null) {
-                routeId = route.idOrCreate(this.camelContext.getNodeIdFactory());
+                routeId = route.idOrCreate(this.camelContext.adapt(ExtendedCamelContext.class).getNodeIdFactory());
             }
         }
 
diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultModel.java b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultModel.java
index 56b4f86..a639d38 100644
--- a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultModel.java
+++ b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultModel.java
@@ -27,6 +27,7 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.FailedToStartRouteException;
 import org.apache.camel.Route;
 import org.apache.camel.impl.engine.AbstractCamelContext;
@@ -108,7 +109,7 @@ public class DefaultModel implements Model {
 
     public synchronized RouteDefinition getRouteDefinition(String id) {
         for (RouteDefinition route : routeDefinitions) {
-            if (route.idOrCreate(camelContext.getNodeIdFactory()).equals(id)) {
+            if (route.idOrCreate(camelContext.adapt(ExtendedCamelContext.class).getNodeIdFactory()).equals(id)) {
                 return route;
             }
         }
diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
index 2c9663d..061adbe 100644
--- a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
+++ b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
@@ -25,6 +25,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.NoSuchEndpointException;
 import org.apache.camel.Processor;
@@ -83,7 +84,7 @@ public class DefaultRouteContext implements RouteContext {
         this.camelContext = camelContext;
         this.route = route;
         this.from = from;
-        this.routeId = route.idOrCreate(camelContext.getNodeIdFactory());
+        this.routeId = route.idOrCreate(camelContext.adapt(ExtendedCamelContext.class).getNodeIdFactory());
     }
 
     public Endpoint getEndpoint() {
@@ -168,7 +169,7 @@ public class DefaultRouteContext implements RouteContext {
             Processor target = Pipeline.newInstance(getCamelContext(), eventDrivenProcessors);
 
             // force creating the route id so its known ahead of the route is started
-            String routeId = route.idOrCreate(getCamelContext().getNodeIdFactory());
+            String routeId = route.idOrCreate(getCamelContext().adapt(ExtendedCamelContext.class).getNodeIdFactory());
 
             // and wrap it in a unit of work so the UoW is on the top, so the entire route will be in the same UoW
             CamelInternalProcessor internal = new CamelInternalProcessor(target);
diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/ReloadStrategySupport.java b/core/camel-core/src/main/java/org/apache/camel/impl/ReloadStrategySupport.java
index 81cf3f8..3e0ade7 100644
--- a/core/camel-core/src/main/java/org/apache/camel/impl/ReloadStrategySupport.java
+++ b/core/camel-core/src/main/java/org/apache/camel/impl/ReloadStrategySupport.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.camel.ExtendedCamelContext;
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
@@ -139,7 +140,7 @@ public abstract class ReloadStrategySupport extends ServiceSupport implements Re
                 // collect route ids and force assign ids if not in use
                 for (RouteDefinition route : routes) {
                     unassignedRouteIds |= !route.hasCustomIdAssigned();
-                    String id = route.idOrCreate(camelContext.getNodeIdFactory());
+                    String id = route.idOrCreate(camelContext.adapt(ExtendedCamelContext.class).getNodeIdFactory());
                     csb.append(id);
                 }
                 log.debug("Reloading routes: [{}] from XML resource: {}", csb, name);
diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/RouteService.java b/core/camel-core/src/main/java/org/apache/camel/impl/RouteService.java
index b4e02e6..9cde665 100644
--- a/core/camel-core/src/main/java/org/apache/camel/impl/RouteService.java
+++ b/core/camel-core/src/main/java/org/apache/camel/impl/RouteService.java
@@ -19,6 +19,7 @@ package org.apache.camel.impl;
 import java.util.List;
 
 import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.Service;
@@ -76,7 +77,7 @@ public class RouteService extends BaseRouteService {
         // the XML DSL will configure error handlers using refs, so we need this additional test
         if (routeDefinition.getErrorHandlerRef() != null) {
             ErrorHandlerFactory routeScoped = getRouteContext().getErrorHandlerFactory();
-            ErrorHandlerFactory contextScoped = getCamelContext().getErrorHandlerFactory();
+            ErrorHandlerFactory contextScoped = getCamelContext().adapt(ExtendedCamelContext.class).getErrorHandlerFactory();
             return routeScoped != null && contextScoped != null && routeScoped == contextScoped;
         }
 
diff --git a/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java b/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
index b4152b3..a7869dd 100644
--- a/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
+++ b/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
@@ -41,6 +41,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.Component;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.TypeConverters;
 import org.apache.camel.builder.RouteBuilder;
@@ -726,7 +727,7 @@ public abstract class MainSupport extends ServiceSupport {
     protected void loadRouteBuilders(CamelContext camelContext) throws Exception {
         // lets use Camel's bean post processor on any existing route builder classes
         // so the instance has some support for dependency injection
-        CamelBeanPostProcessor postProcessor = camelContext.getBeanPostProcessor();
+        CamelBeanPostProcessor postProcessor = camelContext.adapt(ExtendedCamelContext.class).getBeanPostProcessor();
         for (RouteBuilder routeBuilder : getRouteBuilders()) {
             postProcessor.postProcessBeforeInitialization(routeBuilder, routeBuilder.getClass().getName());
             postProcessor.postProcessAfterInitialization(routeBuilder, routeBuilder.getClass().getName());
@@ -750,7 +751,7 @@ public abstract class MainSupport extends ServiceSupport {
     protected void loadConfigurations(CamelContext camelContext) throws Exception {
         // lets use Camel's bean post processor on any existing configuration classes
         // so the instance has some support for dependency injection
-        CamelBeanPostProcessor postProcessor = camelContext.getBeanPostProcessor();
+        CamelBeanPostProcessor postProcessor = camelContext.adapt(ExtendedCamelContext.class).getBeanPostProcessor();
         for (Object configuration : getConfigurations()) {
             postProcessor.postProcessBeforeInitialization(configuration, configuration.getClass().getName());
             postProcessor.postProcessAfterInitialization(configuration, configuration.getClass().getName());
@@ -985,13 +986,13 @@ public abstract class MainSupport extends ServiceSupport {
         final ManagementStrategy managementStrategy = camelContext.getManagementStrategy();
 
         registerPropertyForBeanType(registry, BacklogTracer.class, bt -> camelContext.setExtension(BacklogTracer.class, bt));
-        registerPropertyForBeanType(registry, HandleFault.class, camelContext::addInterceptStrategy);
+        registerPropertyForBeanType(registry, HandleFault.class, camelContext.adapt(ExtendedCamelContext.class)::addInterceptStrategy);
         registerPropertyForBeanType(registry, InflightRepository.class, camelContext::setInflightRepository);
-        registerPropertyForBeanType(registry, AsyncProcessorAwaitManager.class, camelContext::setAsyncProcessorAwaitManager);
+        registerPropertyForBeanType(registry, AsyncProcessorAwaitManager.class, camelContext.adapt(ExtendedCamelContext.class)::setAsyncProcessorAwaitManager);
         registerPropertyForBeanType(registry, ManagementStrategy.class, camelContext::setManagementStrategy);
         registerPropertyForBeanType(registry, ManagementObjectNameStrategy.class, managementStrategy::setManagementObjectNameStrategy);
         registerPropertyForBeanType(registry, EventFactory.class, managementStrategy::setEventFactory);
-        registerPropertyForBeanType(registry, UnitOfWorkFactory.class, camelContext::setUnitOfWorkFactory);
+        registerPropertyForBeanType(registry, UnitOfWorkFactory.class, camelContext.adapt(ExtendedCamelContext.class)::setUnitOfWorkFactory);
         registerPropertyForBeanType(registry, RuntimeEndpointRegistry.class, camelContext::setRuntimeEndpointRegistry);
 
         registerPropertiesForBeanTypes(registry, TypeConverters.class, camelContext.getTypeConverterRegistry()::addTypeConverters);
@@ -999,12 +1000,12 @@ public abstract class MainSupport extends ServiceSupport {
         final Predicate<EventNotifier> containsEventNotifier = managementStrategy.getEventNotifiers()::contains;
         registerPropertiesForBeanTypesWithCondition(registry, EventNotifier.class, containsEventNotifier.negate(), managementStrategy::addEventNotifier);
 
-        registerPropertiesForBeanTypes(registry, EndpointStrategy.class, camelContext::addRegisterEndpointCallback);
+        registerPropertiesForBeanTypes(registry, EndpointStrategy.class, camelContext.adapt(ExtendedCamelContext.class)::registerEndpointCallback);
 
         registerPropertyForBeanType(registry, ShutdownStrategy.class, camelContext::setShutdownStrategy);
 
-        final Predicate<InterceptStrategy> containsInterceptStrategy = camelContext.getInterceptStrategies()::contains;
-        registerPropertiesForBeanTypesWithCondition(registry, InterceptStrategy.class, containsInterceptStrategy.negate(), camelContext::addInterceptStrategy);
+        final Predicate<InterceptStrategy> containsInterceptStrategy = camelContext.adapt(ExtendedCamelContext.class).getInterceptStrategies()::contains;
+        registerPropertiesForBeanTypesWithCondition(registry, InterceptStrategy.class, containsInterceptStrategy.negate(), camelContext.adapt(ExtendedCamelContext.class)::addInterceptStrategy);
 
         final Predicate<LifecycleStrategy> containsLifecycleStrategy = camelContext.getLifecycleStrategies()::contains;
         registerPropertiesForBeanTypesWithCondition(registry, LifecycleStrategy.class, containsLifecycleStrategy.negate(), camelContext::addLifecycleStrategy);
@@ -1050,8 +1051,8 @@ public abstract class MainSupport extends ServiceSupport {
         registerPropertyForBeanType(registry, RouteController.class, camelContext::setRouteController);
         registerPropertyForBeanType(registry, UuidGenerator.class, camelContext::setUuidGenerator);
 
-        final Predicate<LogListener> containsLogListener = camelContext.getLogListeners()::contains;
-        registerPropertiesForBeanTypesWithCondition(registry, LogListener.class, containsLogListener.negate(), camelContext::addLogListener);
+        final Predicate<LogListener> containsLogListener = camelContext.adapt(ExtendedCamelContext.class).getLogListeners()::contains;
+        registerPropertiesForBeanTypesWithCondition(registry, LogListener.class, containsLogListener.negate(), camelContext.adapt(ExtendedCamelContext.class)::addLogListener);
 
         registerPropertyForBeanType(registry, ExecutorServiceManager.class, camelContext::setExecutorServiceManager);
 
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java b/core/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
index 5a7f399..3c375a3 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
@@ -36,6 +36,7 @@ import javax.xml.bind.Unmarshaller;
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.TransformerException;
 
+import org.apache.camel.ExtendedCamelContext;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
@@ -340,7 +341,7 @@ public final class ModelHelper {
     }
 
     private static JAXBContext getJAXBContext(CamelContext context) throws JAXBException {
-        ModelJAXBContextFactory factory = context.getModelJAXBContextFactory();
+        ModelJAXBContextFactory factory = context.adapt(ExtendedCamelContext.class).getModelJAXBContextFactory();
         return factory.newJAXBContext();
     }
 
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/RestContextRefDefinitionHelper.java b/core/camel-core/src/main/java/org/apache/camel/model/RestContextRefDefinitionHelper.java
index cb47f78..0f0e7a7 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/RestContextRefDefinitionHelper.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/RestContextRefDefinitionHelper.java
@@ -30,6 +30,7 @@ import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.model.language.NamespaceAwareExpression;
 import org.apache.camel.model.rest.RestDefinition;
@@ -92,7 +93,7 @@ public final class RestContextRefDefinitionHelper {
     private static synchronized JAXBContext getOrCreateJAXBContext(final CamelContext camelContext) throws JAXBException {
         if (jaxbContext == null) {
             // must use classloader from CamelContext to have JAXB working
-            jaxbContext = camelContext.getModelJAXBContextFactory().newJAXBContext();
+            jaxbContext = camelContext.adapt(ExtendedCamelContext.class).getModelJAXBContextFactory().newJAXBContext();
         }
         return jaxbContext;
     }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/RouteContextRefDefinitionHelper.java b/core/camel-core/src/main/java/org/apache/camel/model/RouteContextRefDefinitionHelper.java
index 967390e..45d570c 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/RouteContextRefDefinitionHelper.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/RouteContextRefDefinitionHelper.java
@@ -30,6 +30,7 @@ import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.model.language.NamespaceAwareExpression;
 import org.apache.camel.support.CamelContextHelper;
@@ -89,7 +90,7 @@ public final class RouteContextRefDefinitionHelper {
 
     private static synchronized JAXBContext getOrCreateJAXBContext(final CamelContext camelContext) throws JAXBException {
         if (jaxbContext == null) {
-            jaxbContext = camelContext.getModelJAXBContextFactory().newJAXBContext();
+            jaxbContext = camelContext.adapt(ExtendedCamelContext.class).getModelJAXBContextFactory().newJAXBContext();
         }
         return jaxbContext;
     }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java b/core/camel-core/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java
index afbc382..62cc273 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java
@@ -29,6 +29,7 @@ import java.util.Set;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.model.rest.RestDefinition;
@@ -166,7 +167,7 @@ public final class RouteDefinitionHelper {
                 boolean done = false;
                 String id = null;
                 while (!done) {
-                    id = route.idOrCreate(context.getNodeIdFactory());
+                    id = route.idOrCreate(context.adapt(ExtendedCamelContext.class).getNodeIdFactory());
                     done = !customIds.contains(id);
                 }
                 route.setId(id);
@@ -184,7 +185,7 @@ public final class RouteDefinitionHelper {
             if (rest != null && route.isRest()) {
                 VerbDefinition verb = findVerbDefinition(rest, route.getInput().getUri());
                 if (verb != null) {
-                    String id = verb.idOrCreate(context.getNodeIdFactory());
+                    String id = verb.idOrCreate(context.adapt(ExtendedCamelContext.class).getNodeIdFactory());
                     if (!verb.getUsedForGeneratingNodeId()) {
                         id = route.getId();
                     }
@@ -448,7 +449,7 @@ public final class RouteDefinitionHelper {
             // let the route inherit the error handler builder from camel context if none already set
 
             // must clone to avoid side effects while building routes using multiple RouteBuilders
-            ErrorHandlerFactory builder = context.getErrorHandlerFactory();
+            ErrorHandlerFactory builder = context.adapt(ExtendedCamelContext.class).getErrorHandlerFactory();
             if (builder != null) {
                 if (builder instanceof ErrorHandlerBuilder) {
                     builder = ((ErrorHandlerBuilder) builder).cloneBuilder();
@@ -694,7 +695,7 @@ public final class RouteDefinitionHelper {
      */
     public static void forceAssignIds(CamelContext context, final ProcessorDefinition processor) {
         // force id on the child
-        processor.idOrCreate(context.getNodeIdFactory());
+        processor.idOrCreate(context.adapt(ExtendedCamelContext.class).getNodeIdFactory());
 
         // if there was a custom id assigned, then make sure to support property placeholders
         if (processor.hasCustomIdAssigned()) {
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
index b52cb24..32d203c 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
@@ -32,6 +32,7 @@ import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceCallConstants;
 import org.apache.camel.cloud.ServiceExpressionFactory;
@@ -226,7 +227,7 @@ public class ServiceCallExpressionConfiguration extends IdentifiedType implement
                 Class<?> type;
                 try {
                     // Then use Service factory.
-                    type = camelContext.getFactoryFinder(ServiceCallDefinitionConstants.RESOURCE_PATH).findClass(factoryKey);
+                    type = camelContext.adapt(ExtendedCamelContext.class).getFactoryFinder(ServiceCallDefinitionConstants.RESOURCE_PATH).findClass(factoryKey);
                 } catch (Exception e) {
                     throw new NoFactoryAvailableException(ServiceCallDefinitionConstants.RESOURCE_PATH + factoryKey, e);
                 }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
index 550169f..313f15d 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
@@ -29,6 +29,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceChooser;
 import org.apache.camel.cloud.ServiceChooserFactory;
@@ -144,7 +145,7 @@ public class ServiceCallServiceChooserConfiguration extends IdentifiedType imple
             Class<?> type;
             try {
                 // Then use Service factory.
-                type = camelContext.getFactoryFinder(ServiceCallDefinitionConstants.RESOURCE_PATH).findClass(factoryKey);
+                type = camelContext.adapt(ExtendedCamelContext.class).getFactoryFinder(ServiceCallDefinitionConstants.RESOURCE_PATH).findClass(factoryKey);
             } catch (Exception e) {
                 throw new NoFactoryAvailableException(ServiceCallDefinitionConstants.RESOURCE_PATH + factoryKey, e);
             }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
index 2ff3978..57c4ec4 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
@@ -30,6 +30,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceDiscovery;
 import org.apache.camel.cloud.ServiceDiscoveryFactory;
@@ -151,7 +152,7 @@ public class ServiceCallServiceDiscoveryConfiguration extends IdentifiedType imp
             Class<?> type;
             try {
                 // Then use Service factory.
-                type = camelContext.getFactoryFinder(ServiceCallDefinitionConstants.RESOURCE_PATH).findClass(factoryKey);
+                type = camelContext.adapt(ExtendedCamelContext.class).getFactoryFinder(ServiceCallDefinitionConstants.RESOURCE_PATH).findClass(factoryKey);
             } catch (Exception e) {
                 throw new NoFactoryAvailableException(ServiceCallDefinitionConstants.RESOURCE_PATH + factoryKey, e);
             }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
index 1c3112e..a0465a3 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
@@ -29,6 +29,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceFilter;
 import org.apache.camel.cloud.ServiceFilterFactory;
@@ -144,7 +145,7 @@ public class ServiceCallServiceFilterConfiguration extends IdentifiedType implem
             Class<?> type;
             try {
                 // Then use Service factory.
-                type = camelContext.getFactoryFinder(ServiceCallDefinitionConstants.RESOURCE_PATH).findClass(factoryKey);
+                type = camelContext.adapt(ExtendedCamelContext.class).getFactoryFinder(ServiceCallDefinitionConstants.RESOURCE_PATH).findClass(factoryKey);
             } catch (Exception e) {
                 throw new NoFactoryAvailableException(ServiceCallDefinitionConstants.RESOURCE_PATH + factoryKey, e);
             }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
index 65a5468..6e42e34e 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
@@ -29,6 +29,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoFactoryAvailableException;
 import org.apache.camel.cloud.ServiceLoadBalancer;
 import org.apache.camel.cloud.ServiceLoadBalancerFactory;
@@ -144,7 +145,7 @@ public class ServiceCallServiceLoadBalancerConfiguration extends IdentifiedType
             Class<?> type;
             try {
                 // Then use Service factory.
-                type = camelContext.getFactoryFinder(ServiceCallDefinitionConstants.RESOURCE_PATH).findClass(factoryKey);
+                type = camelContext.adapt(ExtendedCamelContext.class).getFactoryFinder(ServiceCallDefinitionConstants.RESOURCE_PATH).findClass(factoryKey);
             } catch (Exception e) {
                 throw new NoFactoryAvailableException(ServiceCallDefinitionConstants.RESOURCE_PATH + factoryKey, e);
             }
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/rest/RestDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/rest/RestDefinition.java
index eb22f4b..314e17c 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/rest/RestDefinition.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/rest/RestDefinition.java
@@ -32,6 +32,7 @@ import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.model.OptionalIdentifiedDefinition;
 import org.apache.camel.model.ProcessorDefinition;
@@ -732,7 +733,7 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
 
         String routeId = configuration.getApiContextRouteId();
         if (routeId == null) {
-            routeId = answer.idOrCreate(camelContext.getNodeIdFactory());
+            routeId = answer.idOrCreate(camelContext.adapt(ExtendedCamelContext.class).getNodeIdFactory());
         }
         options.put("routeId", routeId);
         if (configuration.getComponent() != null && !configuration.getComponent().isEmpty()) {
diff --git a/core/camel-core/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java b/core/camel-core/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java
index 876b25a..f65cb63 100644
--- a/core/camel-core/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java
+++ b/core/camel-core/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java
@@ -29,6 +29,7 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.AsyncProcessor;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.Message;
 import org.apache.camel.Navigate;
@@ -95,7 +96,7 @@ public abstract class RedeliveryErrorHandler extends ErrorHandlerSupport impleme
         ObjectHelper.notNull(redeliveryPolicy, "RedeliveryPolicy", this);
 
         this.camelContext = camelContext;
-        this.awaitManager = camelContext.getAsyncProcessorAwaitManager();
+        this.awaitManager = camelContext.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager();
         this.redeliveryProcessor = redeliveryProcessor;
         this.deadLetter = deadLetter;
         this.output = output;
@@ -1299,7 +1300,7 @@ public abstract class RedeliveryErrorHandler extends ErrorHandlerSupport impleme
         if (redeliveryEnabled) {
             if (executorService == null) {
                 // use default shared executor service
-                executorService = camelContext.getErrorHandlerExecutorService();
+                executorService = camelContext.adapt(ExtendedCamelContext.class).getErrorHandlerExecutorService();
             }
             if (log.isDebugEnabled()) {
                 log.debug("Using ExecutorService: {} for redeliveries on error handler: {}", executorService, this);
diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/BeanReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/BeanReifier.java
index 67c0617..7b1a1d0 100644
--- a/core/camel-core/src/main/java/org/apache/camel/reifier/BeanReifier.java
+++ b/core/camel-core/src/main/java/org/apache/camel/reifier/BeanReifier.java
@@ -17,6 +17,7 @@
 package org.apache.camel.reifier;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.model.BeanDefinition;
 import org.apache.camel.model.ProcessorDefinition;
@@ -38,7 +39,7 @@ class BeanReifier extends ProcessorReifier<BeanDefinition> {
         String beanType = definition.getBeanType();
         Class<?> beanClass = definition.getBeanClass();
 
-        return camelContext.getBeanProcessorFactory().createBeanProcessor(camelContext,
+        return camelContext.adapt(ExtendedCamelContext.class).getBeanProcessorFactory().createBeanProcessor(camelContext,
                 bean, beanType, beanClass, ref, method, isCacheBean());
     }
 
diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/InterceptSendToEndpointReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/InterceptSendToEndpointReifier.java
index aff3369..0751905 100644
--- a/core/camel-core/src/main/java/org/apache/camel/reifier/InterceptSendToEndpointReifier.java
+++ b/core/camel-core/src/main/java/org/apache/camel/reifier/InterceptSendToEndpointReifier.java
@@ -20,6 +20,7 @@ import java.util.List;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.impl.engine.DefaultInterceptSendToEndpoint;
 import org.apache.camel.model.InterceptSendToEndpointDefinition;
@@ -44,7 +45,7 @@ class InterceptSendToEndpointReifier extends ProcessorReifier<InterceptSendToEnd
         final String matchURI = definition.getUri();
 
         // register endpoint callback so we can proxy the endpoint
-        routeContext.getCamelContext().addRegisterEndpointCallback(new EndpointStrategy() {
+        routeContext.getCamelContext().adapt(ExtendedCamelContext.class).registerEndpointCallback(new EndpointStrategy() {
             public Endpoint registerEndpoint(String uri, Endpoint endpoint) {
                 if (endpoint instanceof DefaultInterceptSendToEndpoint) {
                     // endpoint already decorated
diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/LogReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/LogReifier.java
index d4d8a8e..337e13d 100644
--- a/core/camel-core/src/main/java/org/apache/camel/reifier/LogReifier.java
+++ b/core/camel-core/src/main/java/org/apache/camel/reifier/LogReifier.java
@@ -20,6 +20,7 @@ import java.util.Map;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.Processor;
 import org.apache.camel.model.LogDefinition;
@@ -87,7 +88,7 @@ class LogReifier extends ProcessorReifier<LogDefinition> {
         LoggingLevel level = definition.getLoggingLevel() != null ? definition.getLoggingLevel() : LoggingLevel.INFO;
         CamelLogger camelLogger = new CamelLogger(logger, level, definition.getMarker());
 
-        return new LogProcessor(exp, camelLogger, getMaskingFormatter(routeContext), routeContext.getCamelContext().getLogListeners());
+        return new LogProcessor(exp, camelLogger, getMaskingFormatter(routeContext), routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getLogListeners());
     }
 
     private MaskingFormatter getMaskingFormatter(RouteContext routeContext) {
diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/ProcessorReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
index 9cce0d2..9d1b615 100644
--- a/core/camel-core/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
+++ b/core/camel-core/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
@@ -25,6 +25,7 @@ import java.util.function.Function;
 
 import org.apache.camel.Channel;
 import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.model.AggregateDefinition;
 import org.apache.camel.model.BeanDefinition;
@@ -222,8 +223,9 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> {
     protected Processor createChildProcessor(RouteContext routeContext, boolean mandatory) throws Exception {
         Processor children = null;
         // at first use custom factory
-        if (routeContext.getCamelContext().getProcessorFactory() != null) {
-            children = routeContext.getCamelContext().getProcessorFactory().createChildProcessor(routeContext, definition, mandatory);
+        if (routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getProcessorFactory() != null) {
+            children = routeContext.getCamelContext().adapt(ExtendedCamelContext.class)
+                    .getProcessorFactory().createChildProcessor(routeContext, definition, mandatory);
         }
         // fallback to default implementation if factory did not create the child
         if (children == null) {
@@ -279,7 +281,7 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> {
         channel.setNextProcessor(processor);
 
         // add interceptor strategies to the channel must be in this order: camel context, route context, local
-        addInterceptStrategies(routeContext, channel, routeContext.getCamelContext().getInterceptStrategies());
+        addInterceptStrategies(routeContext, channel, routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getInterceptStrategies());
         addInterceptStrategies(routeContext, channel, routeContext.getInterceptStrategies());
         addInterceptStrategies(routeContext, channel, definition.getInterceptStrategies());
 
@@ -448,7 +450,7 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> {
 
             // inject id
             if (processor instanceof IdAware) {
-                String id = output.idOrCreate(routeContext.getCamelContext().getNodeIdFactory());
+                String id = output.idOrCreate(routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getNodeIdFactory());
                 ((IdAware) processor).setId(id);
             }
 
@@ -476,8 +478,9 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> {
     protected Processor createProcessor(RouteContext routeContext, ProcessorDefinition<?> output) throws Exception {
         Processor processor = null;
         // at first use custom factory
-        if (routeContext.getCamelContext().getProcessorFactory() != null) {
-            processor = routeContext.getCamelContext().getProcessorFactory().createProcessor(routeContext, output);
+        if (routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getProcessorFactory() != null) {
+            processor = routeContext.getCamelContext().adapt(ExtendedCamelContext.class)
+                    .getProcessorFactory().createProcessor(routeContext, output);
         }
         // fallback to default implementation if factory did not create the processor
         if (processor == null) {
@@ -527,8 +530,9 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> {
         }
 
         // at first use custom factory
-        if (routeContext.getCamelContext().getProcessorFactory() != null) {
-            processor = routeContext.getCamelContext().getProcessorFactory().createProcessor(routeContext, definition);
+        if (routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getProcessorFactory() != null) {
+            processor = routeContext.getCamelContext().adapt(ExtendedCamelContext.class)
+                    .getProcessorFactory().createProcessor(routeContext, definition);
         }
         // fallback to default implementation if factory did not create the processor
         if (processor == null) {
@@ -537,7 +541,7 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> {
 
         // inject id
         if (processor instanceof IdAware) {
-            String id = definition.idOrCreate(routeContext.getCamelContext().getNodeIdFactory());
+            String id = definition.idOrCreate(routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getNodeIdFactory());
             ((IdAware) processor).setId(id);
         }
 
diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/RouteReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/RouteReifier.java
index 2f6ca2a..9932134 100644
--- a/core/camel-core/src/main/java/org/apache/camel/reifier/RouteReifier.java
+++ b/core/camel-core/src/main/java/org/apache/camel/reifier/RouteReifier.java
@@ -23,6 +23,7 @@ import java.util.StringTokenizer;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.FailedToCreateRouteException;
 import org.apache.camel.NoSuchEndpointException;
 import org.apache.camel.Processor;
@@ -89,7 +90,7 @@ public class RouteReifier extends ProcessorReifier<RouteDefinition> {
 
     public Route createRoute(CamelContext camelContext) throws Exception {
         @SuppressWarnings("deprecation")
-        ErrorHandlerFactory handler = camelContext.getErrorHandlerFactory();
+        ErrorHandlerFactory handler = camelContext.adapt(ExtendedCamelContext.class).getErrorHandlerFactory();
         if (handler != null) {
             definition.setErrorHandlerBuilderIfNull(handler);
         }
@@ -161,7 +162,7 @@ public class RouteReifier extends ProcessorReifier<RouteDefinition> {
         // we must check the error handler on builder is not the same as on camel context, as that would be the default
         // context scoped error handler, in case no error handlers was configured
         if (builder.getRouteCollection().getErrorHandlerFactory() != null
-                && camelContext.getErrorHandlerFactory() != builder.getRouteCollection().getErrorHandlerFactory()) {
+                && camelContext.adapt(ExtendedCamelContext.class).getErrorHandlerFactory() != builder.getRouteCollection().getErrorHandlerFactory()) {
             throw new IllegalArgumentException("You can not advice with error handlers. Remove the error handlers from the route builder.");
         }
 
diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/StepReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/StepReifier.java
index 2960c5f..71d8880 100644
--- a/core/camel-core/src/main/java/org/apache/camel/reifier/StepReifier.java
+++ b/core/camel-core/src/main/java/org/apache/camel/reifier/StepReifier.java
@@ -18,6 +18,7 @@ package org.apache.camel.reifier;
 
 import java.util.List;
 
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.StepDefinition;
@@ -37,7 +38,7 @@ class StepReifier extends ProcessorReifier<StepDefinition> {
 
     @Override
     protected Processor createCompositeProcessor(RouteContext routeContext, List<Processor> list) throws Exception {
-        String stepId = definition.idOrCreate(routeContext.getCamelContext().getNodeIdFactory());
+        String stepId = definition.idOrCreate(routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getNodeIdFactory());
         return StepProcessor.newInstance(routeContext.getCamelContext(), list, stepId);
     }
 }
diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/ContextErrorHandlerTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/ContextErrorHandlerTest.java
index b625a39..fd72b23 100644
--- a/core/camel-core/src/test/java/org/apache/camel/builder/ContextErrorHandlerTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/builder/ContextErrorHandlerTest.java
@@ -21,6 +21,7 @@ import java.util.List;
 import org.apache.camel.Channel;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Endpoint;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.impl.engine.EventDrivenConsumerRoute;
@@ -41,7 +42,7 @@ public class ContextErrorHandlerTest extends ContextTestSupport {
         redeliveryPolicy.setUseExponentialBackOff(true);
         DeadLetterChannelBuilder deadLetterChannelBuilder = new DeadLetterChannelBuilder("mock:error");
         deadLetterChannelBuilder.setRedeliveryPolicy(redeliveryPolicy);
-        context.setErrorHandlerFactory(deadLetterChannelBuilder);
+        context.adapt(ExtendedCamelContext.class).setErrorHandlerFactory(deadLetterChannelBuilder);
     }
 
     protected void startCamelContext() throws Exception {
diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerBuilderRefTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerBuilderRefTest.java
index 726d919..2479629 100644
--- a/core/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerBuilderRefTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerBuilderRefTest.java
@@ -22,6 +22,7 @@ import java.util.UUID;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.impl.JndiRegistry;
 import org.junit.Test;
 
@@ -43,7 +44,7 @@ public class ErrorHandlerBuilderRefTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.setErrorHandlerFactory(errorHandlerBuilderRef);
+        context.adapt(ExtendedCamelContext.class).setErrorHandlerFactory(errorHandlerBuilderRef);
         return context;
     }
     
diff --git a/core/camel-core/src/test/java/org/apache/camel/component/ComponentDiscoveryTest.java b/core/camel-core/src/test/java/org/apache/camel/component/ComponentDiscoveryTest.java
deleted file mode 100644
index 7295423..0000000
--- a/core/camel-core/src/test/java/org/apache/camel/component/ComponentDiscoveryTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component;
-
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.SortedMap;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.impl.DefaultCamelContext;
-import org.apache.camel.support.CamelContextHelper;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Test we can auto discover components on the classpath
- */
-public class ComponentDiscoveryTest {
-    private static final Logger LOG = LoggerFactory.getLogger(ComponentDiscoveryTest.class);
-
-    @Test
-    public void testComponentDiscovery() throws Exception {
-        CamelContext context = new DefaultCamelContext();
-
-        SortedMap<String, Properties> map = CamelContextHelper.findComponents(context);
-        assertNotNull("Should never return null", map);
-        assertTrue("Component map should never be empty", !map.isEmpty());
-        
-        String[] expectedComponentNames = {"file", "vm"};
-        for (String expectedName : expectedComponentNames) {
-            Properties properties = map.get(expectedName);
-            assertTrue("Component map contain component: " + expectedName, properties != null);
-        }
-
-        Set<Map.Entry<String, Properties>> entries = map.entrySet();
-        for (Map.Entry<String, Properties> entry : entries) {
-            LOG.info("Found component {} with properties: {}", entry.getKey(), entry.getValue());
-        }
-    }
-
-}
diff --git a/core/camel-core/src/test/java/org/apache/camel/component/log/LogListenerTest.java b/core/camel-core/src/test/java/org/apache/camel/component/log/LogListenerTest.java
index 17d2c24..2e14387 100644
--- a/core/camel-core/src/test/java/org/apache/camel/component/log/LogListenerTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/component/log/LogListenerTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.component.log;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.impl.DefaultCamelContext;
@@ -34,7 +35,7 @@ public class LogListenerTest {
         CamelContext context = createCamelContext();
         MockEndpoint mock = context.getEndpoint("mock:foo", MockEndpoint.class);
         mock.expectedMessageCount(1);
-        context.addLogListener((exchange, camelLogger, message) -> {
+        context.adapt(ExtendedCamelContext.class).addLogListener((exchange, camelLogger, message) -> {
             Assert.assertEquals("Exchange[ExchangePattern: InOnly, BodyType: String, Body: hello]", message);
             listenerFired = true;
             return message + " - modified by listener";
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/BeanInjectRouteBuilderTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/BeanInjectRouteBuilderTest.java
index 21c8a27..2aa96ae 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/BeanInjectRouteBuilderTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/BeanInjectRouteBuilderTest.java
@@ -20,6 +20,7 @@ import org.apache.camel.BeanInject;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.CamelBeanPostProcessor;
@@ -42,7 +43,7 @@ public class BeanInjectRouteBuilderTest extends ContextTestSupport {
         CamelContext context = super.createCamelContext();
 
         // manual post process us as ContextTestSupport in camel-core doesn't do that out of the box
-        CamelBeanPostProcessor post = context.getBeanPostProcessor();
+        CamelBeanPostProcessor post = context.adapt(ExtendedCamelContext.class).getBeanPostProcessor();
         post.postProcessBeforeInitialization(this, "MyRoute");
         post.postProcessAfterInitialization(this, "MyRoute");
         return context;
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRestDefinitionsFromXmlTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRestDefinitionsFromXmlTest.java
index 8a5844c..82a82cb 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRestDefinitionsFromXmlTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRestDefinitionsFromXmlTest.java
@@ -23,6 +23,7 @@ import javax.xml.bind.JAXBException;
 import javax.xml.bind.Unmarshaller;
 
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.rest.DummyRestConsumerFactory;
 import org.apache.camel.component.rest.DummyRestProcessorFactory;
@@ -47,7 +48,7 @@ public class CamelContextAddRestDefinitionsFromXmlTest extends ContextTestSuppor
     @Before
     public void setUp() throws Exception {
         super.setUp();
-        jaxbContext = context.getModelJAXBContextFactory().newJAXBContext();
+        jaxbContext = context.adapt(ExtendedCamelContext.class).getModelJAXBContextFactory().newJAXBContext();
     }
 
     protected Object parseUri(String uri) throws JAXBException {
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRouteDefinitionsFromXmlTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRouteDefinitionsFromXmlTest.java
index 13ab63d..cda3d8e 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRouteDefinitionsFromXmlTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRouteDefinitionsFromXmlTest.java
@@ -23,6 +23,7 @@ import javax.xml.bind.Unmarshaller;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.RouteDefinition;
@@ -37,7 +38,7 @@ public class CamelContextAddRouteDefinitionsFromXmlTest extends ContextTestSuppo
     @Before
     public void setUp() throws Exception {
         super.setUp();
-        jaxbContext = context.getModelJAXBContextFactory().newJAXBContext();
+        jaxbContext = context.adapt(ExtendedCamelContext.class).getModelJAXBContextFactory().newJAXBContext();
     }
 
     protected Object parseUri(String uri) throws JAXBException {
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/CamelProduceInterfaceEventNotifierTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/CamelProduceInterfaceEventNotifierTest.java
index 48eb89e..5b549b0 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/CamelProduceInterfaceEventNotifierTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/CamelProduceInterfaceEventNotifierTest.java
@@ -21,6 +21,7 @@ import java.util.List;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Produce;
 import org.apache.camel.spi.CamelBeanPostProcessor;
 import org.apache.camel.spi.CamelEvent;
@@ -76,7 +77,7 @@ public class CamelProduceInterfaceEventNotifierTest extends ContextTestSupport {
     @Before
     public void setUp() throws Exception {
         super.setUp();
-        postProcessor = context.getBeanPostProcessor();
+        postProcessor = context.adapt(ExtendedCamelContext.class).getBeanPostProcessor();
     }
 
     interface FooService {
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/CustomIdFactoryTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/CustomIdFactoryTest.java
index 6bcb218..699e901 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/CustomIdFactoryTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/CustomIdFactoryTest.java
@@ -19,6 +19,7 @@ package org.apache.camel.impl;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -58,14 +59,14 @@ public class CustomIdFactoryTest extends ContextTestSupport {
             @Override
             public void configure() throws Exception {
                 // use our own id factory so we can generate the keys we like to use
-                context.setNodeIdFactory(new NodeIdFactory() {
+                context.adapt(ExtendedCamelContext.class).setNodeIdFactory(new NodeIdFactory() {
                     public String createId(NamedNode definition) {
                         return "#" + definition.getShortName() + ++counter + "#";
                     }
                 });
 
                 // add our debugger so we can debug camel routes when we send in messages
-                context.addInterceptStrategy(new MyDebuggerCheckingId());
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(new MyDebuggerCheckingId());
 
                 // a little content based router so we got 2 paths to route at runtime
                 from("direct:start")
@@ -117,7 +118,7 @@ public class CustomIdFactoryTest extends ContextTestSupport {
 
             // MUST DO THIS
             // force id creation as sub nodes have lazy assigned ids
-            ((OptionalIdentifiedDefinition<?>) definition).idOrCreate(context.getNodeIdFactory());
+            ((OptionalIdentifiedDefinition<?>) definition).idOrCreate(context.adapt(ExtendedCamelContext.class).getNodeIdFactory());
 
             return new DelegateProcessor(target) {
                 @Override
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/CustomUnitOfWorkFactoryTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/CustomUnitOfWorkFactoryTest.java
index ad1e3f1..877d390 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/CustomUnitOfWorkFactoryTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/CustomUnitOfWorkFactoryTest.java
@@ -20,6 +20,7 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.engine.DefaultUnitOfWork;
@@ -32,7 +33,7 @@ public class CustomUnitOfWorkFactoryTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.setUnitOfWorkFactory(new MyUnitOfWorkFactory());
+        context.adapt(ExtendedCamelContext.class).setUnitOfWorkFactory(new MyUnitOfWorkFactory());
         return context;
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelBeanPostProcessorTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelBeanPostProcessorTest.java
index 0c9b282..e27c206 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelBeanPostProcessorTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelBeanPostProcessorTest.java
@@ -19,6 +19,7 @@ package org.apache.camel.impl;
 import org.apache.camel.BindToRegistry;
 import org.apache.camel.Consume;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Produce;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.spi.CamelBeanPostProcessor;
@@ -58,7 +59,7 @@ public class DefaultCamelBeanPostProcessorTest extends ContextTestSupport {
     @Before
     public void setUp() throws Exception {
         super.setUp();
-        postProcessor = context.getBeanPostProcessor();
+        postProcessor = context.adapt(ExtendedCamelContext.class).getBeanPostProcessor();
     }
 
     @BindToRegistry
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/InterceptSendToMockEndpointStrategyCustomTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/InterceptSendToMockEndpointStrategyCustomTest.java
index 9ecf81a..7ff8bf5 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/InterceptSendToMockEndpointStrategyCustomTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/InterceptSendToMockEndpointStrategyCustomTest.java
@@ -18,6 +18,7 @@ package org.apache.camel.impl;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Endpoint;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Producer;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.engine.InterceptSendToMockEndpointStrategy;
@@ -38,7 +39,7 @@ public class InterceptSendToMockEndpointStrategyCustomTest extends ContextTestSu
 
     @Test
     public void testAdvisedMockEndpoints() throws Exception {
-        context.addRegisterEndpointCallback(new MyStrategy());
+        context.adapt(ExtendedCamelContext.class).registerEndpointCallback(new MyStrategy());
         context.addRoutes(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/InterceptSendToMockEndpointStrategyTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/InterceptSendToMockEndpointStrategyTest.java
index fe6e5dc..f51e106 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/InterceptSendToMockEndpointStrategyTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/InterceptSendToMockEndpointStrategyTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.impl;
 
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.engine.InterceptSendToMockEndpointStrategy;
 import org.junit.Test;
@@ -25,7 +26,7 @@ public class InterceptSendToMockEndpointStrategyTest extends ContextTestSupport
 
     @Test
     public void testAdvisedMockEndpoints() throws Exception {
-        context.addRegisterEndpointCallback(new InterceptSendToMockEndpointStrategy());
+        context.adapt(ExtendedCamelContext.class).registerEndpointCallback(new InterceptSendToMockEndpointStrategy());
         context.addRoutes(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
@@ -58,7 +59,7 @@ public class InterceptSendToMockEndpointStrategyTest extends ContextTestSupport
 
     @Test
     public void testAdvisedMockEndpointsWithPattern() throws Exception {
-        context.addRegisterEndpointCallback(new InterceptSendToMockEndpointStrategy("log*"));
+        context.adapt(ExtendedCamelContext.class).registerEndpointCallback(new InterceptSendToMockEndpointStrategy("log*"));
         context.addRoutes(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/model/RouteIdFactoryTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/model/RouteIdFactoryTest.java
index 621804d..5bc0d17 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/model/RouteIdFactoryTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/model/RouteIdFactoryTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.impl.model;
 
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.rest.DummyRestConsumerFactory;
 import org.apache.camel.component.rest.DummyRestProcessorFactory;
@@ -39,7 +40,7 @@ public class RouteIdFactoryTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                context.setNodeIdFactory(new RouteIdFactory());
+                context.adapt(ExtendedCamelContext.class).setNodeIdFactory(new RouteIdFactory());
                 from("direct:start1?timeout=30000").to("mock:result");
                 from("direct:start2").to("mock:result");
                 rest("/say/hello").get("/bar").to("mock:result");
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/AdviceWithStartTargetIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/AdviceWithStartTargetIssueTest.java
index 1d4c9fc..0f56c6c 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/AdviceWithStartTargetIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/AdviceWithStartTargetIssueTest.java
@@ -19,6 +19,7 @@ package org.apache.camel.issues;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -60,7 +61,7 @@ public class AdviceWithStartTargetIssueTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                getContext().addInterceptStrategy(new ContainerWideInterceptor());
+                getContext().adapt(ExtendedCamelContext.class).addInterceptStrategy(new ContainerWideInterceptor());
 
                 from("direct:start").to("mock:foo").to("mock:result");
             }
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionMultipleRouteBuildersTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionMultipleRouteBuildersTest.java
index 1632898..27f7672 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionMultipleRouteBuildersTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionMultipleRouteBuildersTest.java
@@ -18,6 +18,7 @@ package org.apache.camel.issues;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.junit.Test;
@@ -51,7 +52,7 @@ public class ContextScopedOnExceptionMultipleRouteBuildersTest extends ContextTe
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.setErrorHandlerFactory(new DeadLetterChannelBuilder("mock:dead"));
+        context.adapt(ExtendedCamelContext.class).setErrorHandlerFactory(new DeadLetterChannelBuilder("mock:dead"));
         return context;
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/DynamicRouterWithInterceptorTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/DynamicRouterWithInterceptorTest.java
index ad2a71d..0f21364 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/DynamicRouterWithInterceptorTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/DynamicRouterWithInterceptorTest.java
@@ -21,6 +21,7 @@ import org.apache.camel.Body;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Header;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
@@ -103,7 +104,7 @@ public class DynamicRouterWithInterceptorTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() {
-                context.addInterceptStrategy(interceptStrategy);
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(interceptStrategy);
 
                 from("direct:start")
                     .dynamicRouter(method(DynamicRouterWithInterceptorTest.class, "slip"))
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionContinuedIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionContinuedIssueTest.java
index 8194078..68b065f 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionContinuedIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionContinuedIssueTest.java
@@ -18,6 +18,7 @@ package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.DefaultErrorHandlerBuilder;
@@ -37,7 +38,7 @@ public class OnExceptionContinuedIssueTest extends ContextTestSupport {
         defaultErrorHandlerBuilder.redeliveryDelay(0); // run fast
         defaultErrorHandlerBuilder.maximumRedeliveries(2);
 
-        context.setErrorHandlerFactory(defaultErrorHandlerBuilder);
+        context.adapt(ExtendedCamelContext.class).setErrorHandlerFactory(defaultErrorHandlerBuilder);
         context.addRoutes(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/RecipientListWithInterceptorTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/RecipientListWithInterceptorTest.java
index 0d6efcd..4b0d486 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/RecipientListWithInterceptorTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/RecipientListWithInterceptorTest.java
@@ -20,6 +20,7 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -101,7 +102,7 @@ public class RecipientListWithInterceptorTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() {
-                context.addInterceptStrategy(interceptStrategy);
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(interceptStrategy);
 
                 from("direct:start")
                     .recipientList(header("slip"))
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/RouteScopedOnExceptionMultipleRouteBuildersTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/RouteScopedOnExceptionMultipleRouteBuildersTest.java
index 0f2ca93..66cb4d8 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/RouteScopedOnExceptionMultipleRouteBuildersTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/RouteScopedOnExceptionMultipleRouteBuildersTest.java
@@ -18,6 +18,7 @@ package org.apache.camel.issues;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.DefaultCamelContext;
@@ -53,7 +54,7 @@ public class RouteScopedOnExceptionMultipleRouteBuildersTest extends ContextTest
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = new DefaultCamelContext(createRegistry());
-        context.setErrorHandlerFactory(new DeadLetterChannelBuilder("mock:dead"));
+        context.adapt(ExtendedCamelContext.class).setErrorHandlerFactory(new DeadLetterChannelBuilder("mock:dead"));
         return context;
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/RoutingSlipWithInterceptorTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/RoutingSlipWithInterceptorTest.java
index acc0cfe..bf336ea 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/RoutingSlipWithInterceptorTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/RoutingSlipWithInterceptorTest.java
@@ -20,6 +20,7 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -101,7 +102,7 @@ public class RoutingSlipWithInterceptorTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() {
-                context.addInterceptStrategy(interceptStrategy);
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(interceptStrategy);
 
                 from("direct:start")
                     .routingSlip(header("slip"))
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/SplitWithInterceptorTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/SplitWithInterceptorTest.java
index e4fbb8ea..9fb12cb 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/SplitWithInterceptorTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/SplitWithInterceptorTest.java
@@ -20,6 +20,7 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -97,7 +98,7 @@ public class SplitWithInterceptorTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() {
-                context.addInterceptStrategy(interceptStrategy);
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(interceptStrategy);
 
                 from("direct:start")
                     .split(body().tokenize(","))
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ThreadsDoTryCatchInterceptSendToAllEndpointIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ThreadsDoTryCatchInterceptSendToAllEndpointIssueTest.java
index 1ebe4ca..164b0ef 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ThreadsDoTryCatchInterceptSendToAllEndpointIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ThreadsDoTryCatchInterceptSendToAllEndpointIssueTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.engine.InterceptSendToMockEndpointStrategy;
 import org.junit.Test;
@@ -41,7 +42,7 @@ public class ThreadsDoTryCatchInterceptSendToAllEndpointIssueTest extends Contex
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         // mock all endpoints
-        context.addRegisterEndpointCallback(new InterceptSendToMockEndpointStrategy("*"));
+        context.adapt(ExtendedCamelContext.class).registerEndpointCallback(new InterceptSendToMockEndpointStrategy("*"));
 
         return new RouteBuilder() {
             @Override
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/TwoTimerWithJMXIssue.java b/core/camel-core/src/test/java/org/apache/camel/issues/TwoTimerWithJMXIssue.java
index 11c288d..7ddc20d 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/TwoTimerWithJMXIssue.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/TwoTimerWithJMXIssue.java
@@ -18,6 +18,7 @@ package org.apache.camel.issues;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -50,7 +51,7 @@ public class TwoTimerWithJMXIssue extends ContextTestSupport {
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             public void configure() throws Exception {
-                context.addInterceptStrategy(new MyTracer());
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(new MyTracer());
 
                 from("timer://kickoff_1?period=250").from("timer://kickoff_2?period=250&delay=10").to("mock:result");
             }
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/CustomProcessorFactoryTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/CustomProcessorFactoryTest.java
index 6f97c5a..986df4b 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/CustomProcessorFactoryTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/CustomProcessorFactoryTest.java
@@ -20,6 +20,7 @@ import java.util.Map;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -38,7 +39,7 @@ public class CustomProcessorFactoryTest extends ContextTestSupport {
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
         // register our custom factory
-        context.setProcessorFactory(new MyFactory());
+        context.adapt(ExtendedCamelContext.class).setProcessorFactory(new MyFactory());
         return context;
     }
     // END SNIPPET: e1
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/FaultRetryRouteTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/FaultRetryRouteTest.java
index ac071be..f99c8d6 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/FaultRetryRouteTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/FaultRetryRouteTest.java
@@ -18,6 +18,7 @@ package org.apache.camel.processor;
 import org.apache.camel.CamelException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -65,7 +66,7 @@ public class FaultRetryRouteTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() {
-                getContext().addInterceptStrategy(new HandleFault());
+                getContext().adapt(ExtendedCamelContext.class).addInterceptStrategy(new HandleFault());
 
                 errorHandler(
                     deadLetterChannel("mock:error")
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/FaultRouteTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/FaultRouteTest.java
index ef6c04b..d96d0a7 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/FaultRouteTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/FaultRouteTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.processor;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
@@ -81,7 +82,7 @@ public class FaultRouteTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() {
-                getContext().addInterceptStrategy(new HandleFault());
+                getContext().adapt(ExtendedCamelContext.class).addInterceptStrategy(new HandleFault());
 
                 from("direct:start").to("mock:a").to("mock:b");
             }
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/LogEipListenerTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/LogEipListenerTest.java
index a2c79db..977abd8 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/LogEipListenerTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/LogEipListenerTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.processor;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.impl.DefaultCamelContext;
@@ -34,7 +35,7 @@ public class LogEipListenerTest {
         CamelContext context = createCamelContext();
         MockEndpoint mock = context.getEndpoint("mock:foo", MockEndpoint.class);
         mock.expectedMessageCount(1);
-        context.addLogListener((exchange, camelLogger, message) -> {
+        context.adapt(ExtendedCamelContext.class).addLogListener((exchange, camelLogger, message) -> {
             Assert.assertEquals("Got hello", message);
             listenerFired = true;
             return message + " - modified by listener";
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/PipelineStepWithEventTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/PipelineStepWithEventTest.java
index dd6c0fe..101e748 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/PipelineStepWithEventTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/PipelineStepWithEventTest.java
@@ -24,6 +24,7 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -92,7 +93,7 @@ public class PipelineStepWithEventTest extends ContextTestSupport {
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.addInterceptStrategy(new MyInterceptStrategy());
+        context.adapt(ExtendedCamelContext.class).addInterceptStrategy(new MyInterceptStrategy());
         // register the event listener
         context.addService(listener);
         return context;
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomAsyncInterceptorTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomAsyncInterceptorTest.java
index 34f85a9..f83121d 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomAsyncInterceptorTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomAsyncInterceptorTest.java
@@ -22,6 +22,7 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -57,7 +58,7 @@ public class AsyncEndpointCustomAsyncInterceptorTest extends ContextTestSupport
             @Override
             public void configure() throws Exception {
                 context.addComponent("async", new MyAsyncComponent());
-                context.addInterceptStrategy(interceptor);
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(interceptor);
 
                 from("direct:start")
                         .to("mock:before")
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomInterceptorTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomInterceptorTest.java
index 23fe866..b5063e0 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomInterceptorTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointCustomInterceptorTest.java
@@ -22,6 +22,7 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -63,7 +64,7 @@ public class AsyncEndpointCustomInterceptorTest extends ContextTestSupport {
             @Override
             public void configure() throws Exception {
                 context.addComponent("async", new MyAsyncComponent());
-                context.addInterceptStrategy(interceptor);
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(interceptor);
 
                 from("direct:start")
                         .to("mock:before")
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointPolicyTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointPolicyTest.java
index 76f4598..bc8c4e6 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointPolicyTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncEndpointPolicyTest.java
@@ -22,6 +22,7 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.AsyncProcessor;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -132,7 +133,7 @@ public class AsyncEndpointPolicyTest extends ContextTestSupport {
                 }
 
                 public void process(Exchange exchange) throws Exception {
-                    final AsyncProcessorAwaitManager awaitManager = exchange.getContext().getAsyncProcessorAwaitManager();
+                    final AsyncProcessorAwaitManager awaitManager = exchange.getContext().adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager();
                     awaitManager.process(this, exchange);
                 }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncProcessorAwaitManagerInterruptTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncProcessorAwaitManagerInterruptTest.java
index 11cb701..9ce4a5e 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncProcessorAwaitManagerInterruptTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncProcessorAwaitManagerInterruptTest.java
@@ -22,6 +22,7 @@ import java.util.concurrent.RejectedExecutionException;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
@@ -31,9 +32,9 @@ public class AsyncProcessorAwaitManagerInterruptTest extends ContextTestSupport
 
     @Test
     public void testAsyncAwaitInterrupt() throws Exception {
-        context.getAsyncProcessorAwaitManager().getStatistics().setStatisticsEnabled(true);
+        context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().getStatistics().setStatisticsEnabled(true);
 
-        assertEquals(0, context.getAsyncProcessorAwaitManager().size());
+        assertEquals(0, context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().size());
 
         getMockEndpoint("mock:before").expectedBodiesReceived("Hello Camel");
         getMockEndpoint("mock:after").expectedBodiesReceived("Bye Camel");
@@ -48,9 +49,9 @@ public class AsyncProcessorAwaitManagerInterruptTest extends ContextTestSupport
 
         assertMockEndpointsSatisfied();
 
-        assertEquals(0, context.getAsyncProcessorAwaitManager().size());
-        assertEquals(1, context.getAsyncProcessorAwaitManager().getStatistics().getThreadsBlocked());
-        assertEquals(1, context.getAsyncProcessorAwaitManager().getStatistics().getThreadsInterrupted());
+        assertEquals(0, context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().size());
+        assertEquals(1, context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().getStatistics().getThreadsBlocked());
+        assertEquals(1, context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().getStatistics().getThreadsInterrupted());
     }
 
     @Override
@@ -67,16 +68,16 @@ public class AsyncProcessorAwaitManagerInterruptTest extends ContextTestSupport
                         .process(new Processor() {
                             @Override
                             public void process(Exchange exchange) throws Exception {
-                                int size = context.getAsyncProcessorAwaitManager().size();
+                                int size = context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().size();
                                 log.info("async inflight: {}", size);
                                 assertEquals(1, size);
 
-                                Collection<AsyncProcessorAwaitManager.AwaitThread> threads = context.getAsyncProcessorAwaitManager().browse();
+                                Collection<AsyncProcessorAwaitManager.AwaitThread> threads = context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().browse();
                                 AsyncProcessorAwaitManager.AwaitThread thread = threads.iterator().next();
 
                                 // lets interrupt it
                                 String id = thread.getExchange().getExchangeId();
-                                context.getAsyncProcessorAwaitManager().interrupt(id);
+                                context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().interrupt(id);
                             }
                         })
                         .transform(constant("Hi Camel"))
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncProcessorAwaitManagerInterruptWithRedeliveryTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncProcessorAwaitManagerInterruptWithRedeliveryTest.java
index edf2dc4..52f7ba1 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncProcessorAwaitManagerInterruptWithRedeliveryTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncProcessorAwaitManagerInterruptWithRedeliveryTest.java
@@ -24,6 +24,7 @@ import javax.naming.Context;
 
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
 import org.apache.camel.support.jndi.JndiContext;
@@ -48,9 +49,9 @@ public class AsyncProcessorAwaitManagerInterruptWithRedeliveryTest extends Conte
 
     @Test
     public void testAsyncAwaitInterrupt() throws Exception {
-        context.getAsyncProcessorAwaitManager().getStatistics().setStatisticsEnabled(true);
+        context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().getStatistics().setStatisticsEnabled(true);
 
-        assertEquals(0, context.getAsyncProcessorAwaitManager().size());
+        assertEquals(0, context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().size());
 
         getMockEndpoint("mock:before").expectedBodiesReceived("Hello Camel");
         getMockEndpoint("mock:result").expectedMessageCount(0);
@@ -70,9 +71,9 @@ public class AsyncProcessorAwaitManagerInterruptWithRedeliveryTest extends Conte
         // Check we have not reached the full 5 re-deliveries
         verify(bean, atMost(4)).callMe();
 
-        assertEquals(0, context.getAsyncProcessorAwaitManager().size());
-        assertEquals(1, context.getAsyncProcessorAwaitManager().getStatistics().getThreadsBlocked());
-        assertEquals(1, context.getAsyncProcessorAwaitManager().getStatistics().getThreadsInterrupted());
+        assertEquals(0, context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().size());
+        assertEquals(1, context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().getStatistics().getThreadsBlocked());
+        assertEquals(1, context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().getStatistics().getThreadsInterrupted());
     }
 
     private void createThreadToInterrupt() {
@@ -85,15 +86,15 @@ public class AsyncProcessorAwaitManagerInterruptWithRedeliveryTest extends Conte
             }
 
             // Get our blocked thread
-            int size = context.getAsyncProcessorAwaitManager().size();
+            int size = context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().size();
             assertEquals(1, size);
 
-            Collection<AsyncProcessorAwaitManager.AwaitThread> threads = context.getAsyncProcessorAwaitManager().browse();
+            Collection<AsyncProcessorAwaitManager.AwaitThread> threads = context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().browse();
             AsyncProcessorAwaitManager.AwaitThread thread = threads.iterator().next();
 
             // Interrupt it
             String id = thread.getExchange().getExchangeId();
-            context.getAsyncProcessorAwaitManager().interrupt(id);
+            context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().interrupt(id);
         }).start();
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncProcessorAwaitManagerTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncProcessorAwaitManagerTest.java
index fcdd516..3fee03e 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncProcessorAwaitManagerTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/async/AsyncProcessorAwaitManagerTest.java
@@ -20,6 +20,7 @@ import java.util.Collection;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
@@ -29,9 +30,9 @@ public class AsyncProcessorAwaitManagerTest extends ContextTestSupport {
 
     @Test
     public void testAsyncAwait() throws Exception {
-        context.getAsyncProcessorAwaitManager().getStatistics().setStatisticsEnabled(true);
+        context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().getStatistics().setStatisticsEnabled(true);
 
-        assertEquals(0, context.getAsyncProcessorAwaitManager().size());
+        assertEquals(0, context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().size());
 
         getMockEndpoint("mock:before").expectedBodiesReceived("Hello Camel");
         getMockEndpoint("mock:after").expectedBodiesReceived("Bye Camel");
@@ -42,9 +43,9 @@ public class AsyncProcessorAwaitManagerTest extends ContextTestSupport {
 
         assertMockEndpointsSatisfied();
 
-        assertEquals(0, context.getAsyncProcessorAwaitManager().size());
-        assertEquals(1, context.getAsyncProcessorAwaitManager().getStatistics().getThreadsBlocked());
-        assertEquals(0, context.getAsyncProcessorAwaitManager().getStatistics().getThreadsInterrupted());
+        assertEquals(0, context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().size());
+        assertEquals(1, context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().getStatistics().getThreadsBlocked());
+        assertEquals(0, context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().getStatistics().getThreadsInterrupted());
     }
 
     @Override
@@ -61,11 +62,11 @@ public class AsyncProcessorAwaitManagerTest extends ContextTestSupport {
                         .process(new Processor() {
                             @Override
                             public void process(Exchange exchange) throws Exception {
-                                int size = context.getAsyncProcessorAwaitManager().size();
+                                int size = context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().size();
                                 log.info("async inflight: {}", size);
                                 assertEquals(1, size);
 
-                                Collection<AsyncProcessorAwaitManager.AwaitThread> threads = context.getAsyncProcessorAwaitManager().browse();
+                                Collection<AsyncProcessorAwaitManager.AwaitThread> threads = context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager().browse();
                                 AsyncProcessorAwaitManager.AwaitThread thread = threads.iterator().next();
 
                                 long wait = thread.getWaitDuration();
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/intercept/ParentChildInterceptStrategyTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/intercept/ParentChildInterceptStrategyTest.java
index b86f2d5..0761a0a 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/intercept/ParentChildInterceptStrategyTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/intercept/ParentChildInterceptStrategyTest.java
@@ -21,6 +21,7 @@ import java.util.List;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -64,7 +65,7 @@ public class ParentChildInterceptStrategyTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                context.addInterceptStrategy(new MyParentChildInterceptStrategy());
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(new MyParentChildInterceptStrategy());
 
                 from("direct:start").routeId("route")
                     .to("mock:a").id("task-a")
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorAsyncDelegateIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorAsyncDelegateIssueTest.java
index ddf5bde..971f752 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorAsyncDelegateIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorAsyncDelegateIssueTest.java
@@ -19,6 +19,7 @@ import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -71,7 +72,7 @@ public class AuditInterceptorAsyncDelegateIssueTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                getContext().addInterceptStrategy(strategy);
+                getContext().adapt(ExtendedCamelContext.class).addInterceptStrategy(strategy);
 
                 onException(IllegalArgumentException.class)
                         .handled(true)
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorDelegateIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorDelegateIssueTest.java
index 9d75287..259cc28 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorDelegateIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/AuditInterceptorDelegateIssueTest.java
@@ -18,6 +18,7 @@ package org.apache.camel.processor.interceptor;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -70,7 +71,7 @@ public class AuditInterceptorDelegateIssueTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                getContext().addInterceptStrategy(strategy);
+                getContext().adapt(ExtendedCamelContext.class).addInterceptStrategy(strategy);
 
                 onException(IllegalArgumentException.class)
                         .handled(true)
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/CustomInterceptorRouteWithChildOutputTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/CustomInterceptorRouteWithChildOutputTest.java
index e15842a..cdacf14 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/CustomInterceptorRouteWithChildOutputTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/CustomInterceptorRouteWithChildOutputTest.java
@@ -21,6 +21,7 @@ import java.util.List;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -62,7 +63,7 @@ public class CustomInterceptorRouteWithChildOutputTest extends ContextTestSuppor
             @Override
             public void configure() throws Exception {
                 // add our custom interceptor
-                context.addInterceptStrategy(myInterceptor);
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(myInterceptor);
 
                 from("direct:start")
                     .split(body().tokenize(","))
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyNotOrderedTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyNotOrderedTest.java
index c872cb2..9cd9950 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyNotOrderedTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyNotOrderedTest.java
@@ -19,6 +19,7 @@ package org.apache.camel.processor.interceptor;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
@@ -43,8 +44,8 @@ public class InterceptorStrategyNotOrderedTest extends ContextTestSupport {
             @Override
             public void configure() throws Exception {
                 // interceptors should be invoked in the default order they are added
-                context.addInterceptStrategy(new FooInterceptStrategy());
-                context.addInterceptStrategy(new BarInterceptStrategy());
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(new FooInterceptStrategy());
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(new BarInterceptStrategy());
 
                 from("direct:start").to("mock:result");
             }
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyOrderedTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyOrderedTest.java
index 6b2b524..55c2e64 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyOrderedTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/interceptor/InterceptorStrategyOrderedTest.java
@@ -19,6 +19,7 @@ package org.apache.camel.processor.interceptor;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Ordered;
 import org.apache.camel.Processor;
@@ -44,8 +45,8 @@ public class InterceptorStrategyOrderedTest extends ContextTestSupport {
             @Override
             public void configure() throws Exception {
                 // interceptors should be invoked according to how they are ordered
-                context.addInterceptStrategy(new BarInterceptStrategy());
-                context.addInterceptStrategy(new FooInterceptStrategy());
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(new BarInterceptStrategy());
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(new FooInterceptStrategy());
 
                 from("direct:start").to("mock:result");
             }
diff --git a/core/camel-management-impl/src/main/java/org/apache/camel/management/DefaultManagementAgent.java b/core/camel-management-impl/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
index e35ca5a..0906df0 100644
--- a/core/camel-management-impl/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
+++ b/core/camel-management-impl/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
@@ -44,6 +44,7 @@ import javax.management.remote.JMXServiceURL;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.ManagementStatisticsLevel;
 import org.apache.camel.api.management.JmxSystemPropertyKeys;
 import org.apache.camel.spi.ManagementAgent;
@@ -393,7 +394,7 @@ public class DefaultManagementAgent extends ServiceSupport implements Management
         }
 
         // ensure assembler is started
-        assembler = camelContext.getManagementMBeanAssembler();
+        assembler = camelContext.adapt(ExtendedCamelContext.class).getManagementMBeanAssembler();
         if (assembler == null) {
             assembler = new DefaultManagementMBeanAssembler(camelContext);
         }
diff --git a/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java b/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
index 58f3d0ab..606acd6 100644
--- a/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
+++ b/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
@@ -37,6 +37,7 @@ import org.apache.camel.Component;
 import org.apache.camel.Consumer;
 import org.apache.camel.Endpoint;
 import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.ManagementStatisticsLevel;
 import org.apache.camel.NamedNode;
 import org.apache.camel.NonManagedService;
@@ -916,7 +917,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
         }
 
         // always register if we are setting up routes
-        if (getCamelContext().isSetupRoutes()) {
+        if (getCamelContext().adapt(ExtendedCamelContext.class).isSetupRoutes()) {
             return true;
         }
 
diff --git a/core/camel-management-impl/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java b/core/camel-management-impl/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java
index 22fa65e..a5a6272 100644
--- a/core/camel-management-impl/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java
+++ b/core/camel-management-impl/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java
@@ -31,6 +31,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
+import org.apache.camel.ExtendedCamelContext;
 import org.w3c.dom.Document;
 
 import org.apache.camel.CamelContext;
@@ -119,7 +120,7 @@ public class ManagedCamelContext extends ManagedPerformanceCounter implements Ti
     }
 
     public String getPackageScanClassResolver() {
-        return context.getPackageScanClassResolver().getClass().getName();
+        return context.adapt(ExtendedCamelContext.class).getPackageScanClassResolver().getClass().getName();
     }
 
     public String getApplicationContextClassName() {
diff --git a/core/camel-management-impl/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java b/core/camel-management-impl/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java
index ac60b5b..c7186ad 100644
--- a/core/camel-management-impl/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java
+++ b/core/camel-management-impl/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java
@@ -17,6 +17,7 @@
 package org.apache.camel.management.mbean;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.ServiceStatus;
@@ -45,14 +46,14 @@ public class ManagedProcessor extends ManagedPerformanceCounter implements Manag
         this.context = context;
         this.processor = processor;
         this.definition = definition;
-        this.id = definition.idOrCreate(context.getNodeIdFactory());
+        this.id = definition.idOrCreate(context.adapt(ExtendedCamelContext.class).getNodeIdFactory());
         StepDefinition step;
         if (definition instanceof StepDefinition) {
             step = (StepDefinition) definition;
         } else {
             step = ProcessorDefinitionHelper.findFirstParentOfType(StepDefinition.class, definition, true);
         }
-        this.stepId = step != null ? step.idOrCreate(context.getNodeIdFactory()) : null;
+        this.stepId = step != null ? step.idOrCreate(context.adapt(ExtendedCamelContext.class).getNodeIdFactory()) : null;
     }
 
     @Override
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/AsyncProcessorHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/AsyncProcessorHelper.java
index 167077f..45c1f72 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/AsyncProcessorHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/AsyncProcessorHelper.java
@@ -18,6 +18,7 @@ package org.apache.camel.support;
 
 import org.apache.camel.AsyncProcessor;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
 
 /**
@@ -42,7 +43,7 @@ public final class AsyncProcessorHelper {
      * @throws Exception can be thrown if waiting is interrupted
      */
     public static void process(final AsyncProcessor processor, final Exchange exchange) throws Exception {
-        final AsyncProcessorAwaitManager awaitManager = exchange.getContext().getAsyncProcessorAwaitManager();
+        final AsyncProcessorAwaitManager awaitManager = exchange.getContext().adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager();
         awaitManager.process(processor, exchange);
     }
 
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/AsyncProcessorSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/AsyncProcessorSupport.java
index 828c66d..42a8827 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/AsyncProcessorSupport.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/AsyncProcessorSupport.java
@@ -20,6 +20,7 @@ import java.util.concurrent.CompletableFuture;
 
 import org.apache.camel.AsyncProcessor;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
 import org.apache.camel.support.service.ServiceSupport;
 
@@ -35,7 +36,7 @@ public abstract class AsyncProcessorSupport extends ServiceSupport implements As
 
     @Override
     public void process(Exchange exchange) throws Exception {
-        AsyncProcessorAwaitManager awaitManager = exchange.getContext().getAsyncProcessorAwaitManager();
+        AsyncProcessorAwaitManager awaitManager = exchange.getContext().adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager();
         awaitManager.process(this, exchange);
     }
 
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/CamelContextHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/CamelContextHelper.java
index d63da74..b275b9e 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/CamelContextHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/CamelContextHelper.java
@@ -16,33 +16,21 @@
  */
 package org.apache.camel.support;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
-import java.util.SortedMap;
-import java.util.StringTokenizer;
-import java.util.TreeMap;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Component;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
-import org.apache.camel.LoadPropertiesException;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.NoSuchBeanException;
 import org.apache.camel.NoSuchEndpointException;
-import org.apache.camel.spi.ClassResolver;
 import org.apache.camel.spi.RouteStartupOrder;
-import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 import static org.apache.camel.util.ObjectHelper.isNotEmpty;
 import static org.apache.camel.util.ObjectHelper.notNull;
 
@@ -50,12 +38,8 @@ import static org.apache.camel.util.ObjectHelper.notNull;
  * A number of helper methods
  */
 public final class CamelContextHelper {
-    public static final String COMPONENT_BASE = "META-INF/services/org/apache/camel/component/";
-    public static final String COMPONENT_DESCRIPTOR = "META-INF/services/org/apache/camel/component.properties";
     public static final String MODEL_DOCUMENTATION_PREFIX = "org/apache/camel/model/";
 
-    private static final Logger LOG = LoggerFactory.getLogger(CamelContextHelper.class);
-
     /**
      * Utility classes should not have a public constructor.
      */
@@ -481,108 +465,6 @@ public final class CamelContextHelper {
     }
 
     /**
-     * Finds all possible Components on the classpath, already registered in {@link org.apache.camel.CamelContext},
-     * and from the {@link org.apache.camel.spi.Registry}.
-     */
-    public static SortedMap<String, Properties> findComponents(CamelContext camelContext) throws LoadPropertiesException {
-        ClassResolver resolver = camelContext.getClassResolver();
-        LOG.debug("Finding all components using class resolver: {}", resolver);
-        Enumeration<URL> iter = resolver.loadAllResourcesAsURL(COMPONENT_DESCRIPTOR);
-        return findComponents(camelContext, iter);
-    }
-
-    public static SortedMap<String, Properties> findComponents(CamelContext camelContext, Enumeration<URL> componentDescriptionIter)
-        throws LoadPropertiesException {
-
-        SortedMap<String, Properties> map = new TreeMap<>();
-        while (componentDescriptionIter != null && componentDescriptionIter.hasMoreElements()) {
-            URL url = componentDescriptionIter.nextElement();
-            LOG.trace("Finding components in url: {}", url);
-            try {
-                Properties properties = new Properties();
-                properties.load(url.openStream());
-                String names = properties.getProperty("components");
-                if (names != null) {
-                    StringTokenizer tok = new StringTokenizer(names);
-                    while (tok.hasMoreTokens()) {
-                        String name = tok.nextToken();
-
-                        // try to find the class name for this component
-                        String className = null;
-                        InputStream is = null;
-                        try {
-                            // now load the component name resource so we can grab its properties and the class name
-                            Enumeration<URL> urls = camelContext.getClassResolver().loadAllResourcesAsURL(COMPONENT_BASE + name);
-                            if (urls != null && urls.hasMoreElements()) {
-                                is = urls.nextElement().openStream();
-                            }
-                            if (is != null) {
-                                Properties compProperties = new Properties();
-                                compProperties.load(is);
-                                if (!compProperties.isEmpty()) {
-                                    className = compProperties.getProperty("class");
-                                }
-                            }
-                        } catch (Exception e) {
-                            // ignore
-                        } finally {
-                            IOHelper.close(is);
-                        }
-
-                        // inherit properties we loaded first, as it has maven details
-                        Properties prop = new Properties();
-                        prop.putAll(properties);
-                        if (camelContext.hasComponent(name) != null) {
-                            prop.put("component", camelContext.getComponent(name));
-                        }
-                        if (className != null) {
-                            prop.put("class", className);
-                        }
-                        prop.put("name", name);
-                        map.put(name, prop);
-                    }
-                }
-            } catch (IOException e) {
-                throw new LoadPropertiesException(url, e);
-            }
-        }
-
-        // lets see what other components are registered on camel context
-        List<String> names = camelContext.getComponentNames();
-        for (String name : names) {
-            if (!map.containsKey(name)) {
-                Component component = camelContext.getComponent(name);
-                if (component != null) {
-                    Properties properties = new Properties();
-                    properties.put("component", component);
-                    properties.put("class", component.getClass().getName());
-                    properties.put("name", name);
-                    // override default component if name clash
-                    map.put(name, properties);
-                }
-            }
-        }
-
-        // lets see what other components are in the registry
-        Map<String, Component> beanMap = camelContext.getRegistry().findByTypeWithName(Component.class);
-        Set<Map.Entry<String, Component>> entries = beanMap.entrySet();
-        for (Map.Entry<String, Component> entry : entries) {
-            String name = entry.getKey();
-            if (!map.containsKey(name)) {
-                Component component = entry.getValue();
-                if (component != null) {
-                    Properties properties = new Properties();
-                    properties.put("component", component);
-                    properties.put("class", component.getClass().getName());
-                    properties.put("name", name);
-                    map.put(name, properties);
-                }
-            }
-        }
-        return map;
-    }
-
-    /**
      * Gets the route startup order for the given route id
      *
      * @param camelContext  the camel context
@@ -590,7 +472,7 @@ public final class CamelContextHelper {
      * @return the startup order, or <tt>0</tt> if not possible to determine
      */
     public static int getRouteStartupOrder(CamelContext camelContext, String routeId) {
-        for (RouteStartupOrder order : camelContext.getRouteStartupOrder()) {
+        for (RouteStartupOrder order : camelContext.adapt(ExtendedCamelContext.class).getRouteStartupOrder()) {
             if (order.getRoute().getId().equals(routeId)) {
                 return order.getStartupOrder();
             }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultAsyncProducer.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultAsyncProducer.java
index 14ff478..4d71e4f 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultAsyncProducer.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultAsyncProducer.java
@@ -21,6 +21,7 @@ import java.util.concurrent.CompletableFuture;
 import org.apache.camel.AsyncProducer;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
 
 /**
@@ -34,7 +35,7 @@ public abstract class DefaultAsyncProducer extends DefaultProducer implements As
     }
 
     public void process(Exchange exchange) throws Exception {
-        AsyncProcessorAwaitManager awaitManager = exchange.getContext().getAsyncProcessorAwaitManager();
+        AsyncProcessorAwaitManager awaitManager = exchange.getContext().adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager();
         awaitManager.process(this, exchange);
     }
 
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultConsumer.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultConsumer.java
index b6eadb5..ad24ea5 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultConsumer.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultConsumer.java
@@ -20,6 +20,7 @@ import org.apache.camel.AsyncProcessor;
 import org.apache.camel.Consumer;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.RouteAware;
@@ -81,7 +82,7 @@ public class DefaultConsumer extends ServiceSupport implements Consumer, RouteAw
             exchange.setFromRouteId(route.getId());
         }
 
-        UnitOfWork uow = endpoint.getCamelContext().getUnitOfWorkFactory().createUnitOfWork(exchange);
+        UnitOfWork uow = endpoint.getCamelContext().adapt(ExtendedCamelContext.class).getUnitOfWorkFactory().createUnitOfWork(exchange);
         exchange.setUnitOfWork(uow);
         uow.start();
         return uow;
diff --git a/docs/user-manual/modules/ROOT/pages/delay-interceptor.adoc b/docs/user-manual/modules/ROOT/pages/delay-interceptor.adoc
index cb5e239..5cc91c1 100644
--- a/docs/user-manual/modules/ROOT/pages/delay-interceptor.adoc
+++ b/docs/user-manual/modules/ROOT/pages/delay-interceptor.adoc
@@ -32,19 +32,7 @@ Just set the delay attribute of the camelContext tag as shown below:
 [[DelayInterceptor-ConfiguringusingJava]]
 ==== Configuring using Java
 
-You can add the delayer interceptor in the RouteBulder as shown below:
-
-[source,java]
-------------------------------------------------------------------
-    public void configure() throws Exception {
-        // add the delay interceptor to delay each step 200 millis
-        getContext().addInterceptStrategy(new Delayer(200));
-
-       ... // regular routes here
-    }
-------------------------------------------------------------------
-
-In *Camel 2.0* its a bit easier as you can just do
+You can add the delayer interceptor in the RouteBulder:
 
 [source,java]
 -----------------------------
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 69050fa..c07c598 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
@@ -20,11 +20,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Properties;
 import java.util.Set;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
@@ -32,8 +30,8 @@ import javax.management.openmbean.CompositeData;
 import javax.management.openmbean.TabularData;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.CatalogCamelContext;
 import org.apache.camel.Endpoint;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Route;
 import org.apache.camel.ServiceStatus;
 import org.apache.camel.StatefulService;
@@ -50,7 +48,6 @@ import org.apache.camel.spi.RestRegistry;
 import org.apache.camel.spi.RuntimeEndpointRegistry;
 import org.apache.camel.spi.Transformer;
 import org.apache.camel.spi.Validator;
-import org.apache.camel.support.JSonSchemaHelper;
 
 /**
  * Abstract {@link org.apache.camel.commands.LocalCamelController} that implementators should extend when implementing
@@ -88,7 +85,7 @@ public abstract class AbstractLocalCamelController extends AbstractCamelControll
             answer.put("logMask", context.isLogMask());
             answer.put("shutdownTimeout", context.getShutdownStrategy().getTimeUnit().toSeconds(context.getShutdownStrategy().getTimeout()));
             answer.put("classResolver", context.getClassResolver().toString());
-            answer.put("packageScanClassResolver", context.getPackageScanClassResolver().toString());
+            answer.put("packageScanClassResolver", context.adapt(ExtendedCamelContext.class).getPackageScanClassResolver().toString());
             answer.put("applicationContextClassLoader", context.getApplicationContextClassLoader().toString());
             answer.put("headersMapFactory", context.getHeadersMapFactory().toString());
 
@@ -119,14 +116,15 @@ public abstract class AbstractLocalCamelController extends AbstractCamelControll
             answer.put("typeConverter.failedCounter", context.getTypeConverterRegistry().getStatistics().getFailedCounter());
 
             // add async processor await manager details
-            answer.put("asyncProcessorAwaitManager.size", context.getAsyncProcessorAwaitManager().size());
-            answer.put("asyncProcessorAwaitManager.statisticsEnabled", context.getAsyncProcessorAwaitManager().getStatistics().isStatisticsEnabled());
-            answer.put("asyncProcessorAwaitManager.threadsBlocked", context.getAsyncProcessorAwaitManager().getStatistics().getThreadsBlocked());
-            answer.put("asyncProcessorAwaitManager.threadsInterrupted", context.getAsyncProcessorAwaitManager().getStatistics().getThreadsInterrupted());
-            answer.put("asyncProcessorAwaitManager.totalDuration", context.getAsyncProcessorAwaitManager().getStatistics().getTotalDuration());
-            answer.put("asyncProcessorAwaitManager.minDuration", context.getAsyncProcessorAwaitManager().getStatistics().getMinDuration());
-            answer.put("asyncProcessorAwaitManager.maxDuration", context.getAsyncProcessorAwaitManager().getStatistics().getMaxDuration());
-            answer.put("asyncProcessorAwaitManager.meanDuration", context.getAsyncProcessorAwaitManager().getStatistics().getMeanDuration());
+            ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
+            answer.put("asyncProcessorAwaitManager.size", ecc.getAsyncProcessorAwaitManager().size());
+            answer.put("asyncProcessorAwaitManager.statisticsEnabled", ecc.getAsyncProcessorAwaitManager().getStatistics().isStatisticsEnabled());
+            answer.put("asyncProcessorAwaitManager.threadsBlocked", ecc.getAsyncProcessorAwaitManager().getStatistics().getThreadsBlocked());
+            answer.put("asyncProcessorAwaitManager.threadsInterrupted", ecc.getAsyncProcessorAwaitManager().getStatistics().getThreadsInterrupted());
+            answer.put("asyncProcessorAwaitManager.totalDuration", ecc.getAsyncProcessorAwaitManager().getStatistics().getTotalDuration());
+            answer.put("asyncProcessorAwaitManager.minDuration", ecc.getAsyncProcessorAwaitManager().getStatistics().getMinDuration());
+            answer.put("asyncProcessorAwaitManager.maxDuration", ecc.getAsyncProcessorAwaitManager().getStatistics().getMaxDuration());
+            answer.put("asyncProcessorAwaitManager.meanDuration", ecc.getAsyncProcessorAwaitManager().getStatistics().getMeanDuration());
 
             // add stream caching details if enabled
             if (context.getStreamCachingStrategy().isEnabled()) {
diff --git a/platforms/spring-boot/components-starter/camel-jira-starter/pom.xml b/platforms/spring-boot/components-starter/camel-jira-starter/pom.xml
index ad3d0d5..f0e29d4 100644
--- a/platforms/spring-boot/components-starter/camel-jira-starter/pom.xml
+++ b/platforms/spring-boot/components-starter/camel-jira-starter/pom.xml
@@ -58,4 +58,12 @@
     </dependency>
     <!--END OF GENERATED CODE-->
   </dependencies>
+
+  <repositories>
+    <repository>
+      <id>atlassian-public</id>
+      <url>https://packages.atlassian.com/maven-external</url>
+    </repository>
+  </repositories>
+
 </project>
diff --git a/tests/camel-itest/src/test/java/org/apache/camel/itest/issues/IntercepFromAndStrategyTest.java b/tests/camel-itest/src/test/java/org/apache/camel/itest/issues/IntercepFromAndStrategyTest.java
index f013a2e..2c21051 100644
--- a/tests/camel-itest/src/test/java/org/apache/camel/itest/issues/IntercepFromAndStrategyTest.java
+++ b/tests/camel-itest/src/test/java/org/apache/camel/itest/issues/IntercepFromAndStrategyTest.java
@@ -17,6 +17,7 @@
 package org.apache.camel.itest.issues;
 
 import org.apache.camel.EndpointInject;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Produce;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.builder.RouteBuilder;
@@ -52,7 +53,7 @@ public class IntercepFromAndStrategyTest extends CamelTestSupport {
             public void configure() throws Exception {
                 // add a dummy strategy
                 // removing this line the test works
-                context.addInterceptStrategy(new DummyInterceptor());
+                context.adapt(ExtendedCamelContext.class).addInterceptStrategy(new DummyInterceptor());
                 // intercet from
                 interceptFrom("direct:start").log("Intercepted").to("mock:intercepted");